On earlier firmwares, SpringBoard needs to be patched to show a customized carrier logo. This has changed since firmware 1.1.3, now Apple has natively support the customized carrier settings (including logos) through carrier bundles.
Terms
Because Apple uses difference terms in carrier bundles and in frameworks, to avoid confusion, we use the following terms in this article:
A carrier stands for a role that issues the current SIM
An operator stands for the SIM’s current mobile service provider
NOTE: A carrier may have more than one operators. A carrier can issue multiple types of SIMs for each operator, SIMs are identified by MCC/MNC pairs in bundles. While in roaming, the carrier stays the same, the operator changes depending on the carrier’s roaming agreement.
Carrier Bundles
A carrier bundle defines all carrier / operator related settings, this includes but not limited to carrier logo. You can define one bundle for one carrier, if no bundle is defined for a carrier, iPhone uses the default bundle Unknown.bundle. Just as described earlier, one carrier may have multiple operators, so a bundle can serve multiple operators.
All carrier bundles are stored at /System/Library/Carrier Bundles/ folder. For example, the bundle ATT_US.bundle is for carrier AT&T, it has two operators, at&t and cingular. Because Apple only officially defines very few carrier bundles, we need to add bundles for our own local carriers if we want to customize carrier / operator settings.
To define a bundle, an easy way is to make modifications based on an existing bundle. In the following descriptions, I’ll make the following assumptions:
Bundle name: THE_CARRIER.bundle
Local carrier is The Carrier
The Carrier only has one operator, named The Operator
MCC/MNC for The Operator is 12345
Our logos are Default_CARRIER_THE_OPERATOR.png and FSO_CARRIER_THE_OPERATOR.png
The Operator only offers voice support service, the service number is 10086
The Operator has no stock
The Operator APN is the_apn, username is the_user, password is the_pass
The Operator doesn’t support VoiceMail
Step 1: Create Bundle
First copy a current bundle to a new name, I’ll copy from ATT_US.bundle to THE_CARRIER.bundle:
cd /System/Library/Carrier\ Bundles cp -r ATT_US.bundle THE_CARRIER.bundle
Step 2: Modify Bundle
Before modification, make sure you have a good text editor that can retain Unix text file format (Notepad and Wordpad are NOT okay). Unix users don’t have this potential EOL related issue.
Now the most important part, modify the bundle to suit your local carrier. Two files need to be modified: Info.plist and carrier.plist. Open Info.plist, it has the following contents:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>ATT_US</string>
<key>CFBundleIdentifier</key>
<string>com.apple.ATT_US</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
</dict>
</plist>
Change the highlighted part to your bundle base name (folder name without suffix), so replace the ATT_US with THE_CARRIER in two places.
Now open the carrier.plist file, this file describes all the operator details, so it’s a bit long:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BookmarkURLs</key>
<array>
<dict>
<key>BookmarkName</key>
<string>AT&T MyAccount</string>
<key>BookmarkURL</key>
<string>https://www.wireless.att.com/my-account</string>
</dict>
</array>
<key>CarrierName</key>
<string>AT&T</string>
<key>IntlDataRoamingSwitch</key>
<true/>
<key>MyAccountURL</key>
<string>https://www.wireless.att.com/my-account</string>
<key>MyAccountURLTitle</key>
<string>AT&T MyAccount</string>
<key>Services</key>
<array>
<dict>
<key>ServiceCode</key>
<string>*225#</string>
<key>ServiceName</key>
<string>Check Bill Balance</string>
</dict>
<dict>
<key>ServiceCode</key>
<string>411</string>
<key>ServiceName</key>
<string>Directory Assistance</string>
</dict>
<dict>
<key>ServiceCode
<string>*729</string>
<key>ServiceName</key>
<string>Pay My Bill</string>
</dict>
<dict>
<key>ServiceCode</key>
<string>*646#</string>
<key>ServiceName</key>
<string>View My Minutes</string>
</dict>
<dict>
<key>ServiceCode</key>
<string>*08</string>
<key>ServiceName</key>
<string>Voice Connect</string>
</dict>
</array>
<key>ShowCallForwarded</key>
<false/>
<key>ShowCallForwarding</key>
<false/>
<key>ShowDialAssist</key>
<true/>
<key>ShowTTY</key>
<true/>
<key>StatusBarImages</key>
<array>
<dict>
<key>AllowPrefixMatching</key>
<false/>
<key>CarrierName</key>
<string>at&t</string>
<key>DefaultImage</key>
<string>Default_CARRIER_ATT.png</string>
<key>FullScreenOpaqueImage</key>
<string>FSO_CARRIER_ATT.png</string>
</dict>
<dict>
<key>AllowPrefixMatching</key>
<false/>
<key>CarrierName</key>
<string>cingular</string>
<key>DefaultImage</key>
<string>Default_CARRIER_CINGULAR.png</string>
<key>FullScreenOpaqueImage</key>
<string>FSO_CARRIER_CINGULAR.png</string>
</dict>
</array>
<key>StockSymboli</key>
<array>
<dict>
<key>name</key>
<string>AT&T</string>
<key>symbol</key>
<string>T</string>
</dict>
</array>
<key>SupportedSIMs</key>
<array>
<string>310150</string>
<string>310170</string>
<string>310180</string>
<string>310380</string>
<string>310410</string>
<string>310980</string>
<string>311180</string>
</array>
<key>SupportsNITZ</key>
<true/>
<key>VVMIgnoresIntlDataRoaming</key>
<true/>
<key>VisualVoicemailServiceName</key>
<string>ACDS</string>
<key>apns</key>
<array>
<dict>
<key>apn</key>
<string>wap.cingular</string>
<key>password</key>
<string>pass</string>
<key>username</key>
<string>user</string>
</dict>
<dict>
<key>apn</key>
<string>acds.voicemail</string>
<key>password</key>
<string>pass</string>
<key>username</key>
<string>pass</string>
</dict>
</array>
<key>voicemail_context</key>
<integer>1</integer>
</dict>
</plist>
The highlighted parts need to be modified, items in red are for informative purpose and are mostly displayed in Settings -> Phone (scroll down to bottom) and in MobileSafari bookmarks, the cyan items are vital and must be set correctly:
StatusBarImage
CarrierName: your current operator name, shown at Settings -> Carrier.
DefaultImage & FullScreenOpaqueImage: carrier logo file names
NOTE: Spaces in operator name must be removed. If you carrier has multiple operators, you may add extra items, to add a new operator, repeat the following block:
<dict> <key>AllowPrefixMatching</key> <false/> <key>CarrierName</key> <string>at&t</string> <key>DefaultImage</key> <string>Default_CARRIER_ATT.png</string> <key>FullScreenOpaqueImage</key> <string>FSO_CARRIER_ATT.png</string> </dict>
and modify it accordingly.
StokSymbol
name: stock name
SupportedSIMs
Each item represents a MCC/MNC pair, you must fill in the correct MCC/MNC, otherwise the bundle will not be associated. To find out your MCC/MNC, check This Article.
UPDATE: The accurate way to determine your current MCC/MNC is to query the baseband. Get the utility sendmodem, put it into /usr/bin folder, then login to your phone, enter the following command:
chmod 755 /usr/bin/sendmodem sendmodem 'AT+COPS?'
The result is like this:
Sending command to modem: AT -.+ AT OK Sending command to modem: AT+COPS? -...+ AT+COPS? +COPS: 0,2,"46000" OK
In the above output, the MCC/MNC is 46000.
apns
apn: apn
password: password
username: username
There’re two items, one is for EDGE/GPRS, the other is for VoiceMail, if you don’t have VoiceMail, you may remove the extra item.
Finally, we need to add a key AlloeEDGEEditing, otherwise, there will be no EDGE item in Settings -> Network settings.
Based on our previous assumptions, here’s the modified carrier.plist (you can remove all those useless items as I do on this new carrier.plist):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BookmarkURLs</key>
<array>
<dict>
<key>BookmarkName</key>
<string>The Carrier Account Page</string>
<key>BookmarkURL</key>
<string>https://www.thecarrier.com/account</string>
</dict>
</array>
<key>CarrierName</key>
<string>The Carrier</string>
<key>IntlDataRoamingSwitch</key>
<true/>
<key>MyAccountURL</key>
<string>https://www.thecarrier.com/account</string>
<key>MyAccountURLTitle</key>
<string>The Carrier Account Page</string>
<key>Services</key>
<array>
<dict>
<key>ServiceCode</key>
<string>10086</string>
<key>ServiceName</key>
<string>Voice Support</string>
</dict>
</array>
<key>AllowEDGEEditing</key>
<true/>
<key>ShowCallForwarded</key>
<false/>
<key>ShowCallForwarding</key>
<false/>
<key>ShowDialAssist</key>
<true/>
<key>ShowTTY</key>
<true/>
<key>StatusBarImages</key>
<array>
<dict>
<key>AllowPrefixMatching</key>
<false/>
<key>CarrierName</key>
<string>TheOperator</string>
<key>DefaultImage</key>
<string>Default_CARRIER_THE_OPERATOR.png</string>
<key>FullScreenOpaqueImage</key>
<string>FSO_CARRIER_THE_OPERATOR.png</string>
</dict>
</array>
<key>SupportedSIMs</key>
<array>
<string>12345</string>
</array>
<key>SupportsNITZ</key>
<true/>
<key>VVMIgnoresIntlDataRoaming</key>
<true/>
<key>VisualVoicemailServiceName</key>
<string>ACDS</string>
<key>apns</key>
<array>
<dict>
<key>apn</key>
<string>the_apn</string>
<key>password</key>
<string>the_pass</string>
<key>username</key>
<string>the_user</string>
</dict>
</array>
<key>voicemail_context</key>
<integer>1</integer>
</dict>
</plist>
Now the bundle is ready, we need to create a MCC/MNC symbolic link:
cd /System/Library/Carrier\ Bundles ln -s /System/Library/Carrier\ Bundles/THE_CARRIER.bundle 12345
UPDATE: If your carrier has multiple operators, you need to add symbolic links for all of your operators.
Step 3: Activate Bundle
Now take the following steps to activate our bundle:
1. Insert your AT&T SIM (coming with your iPhone) and reboot once
2. Insert your local SIM and reboot once
Now iPhone should be displaying your customized logos.
TroubleShooting
If your logo is not displayed, login to iPhone to check the following folders:
There must be four symbolic links, each folder has two:/var/mobile/Library /var/mobile/Library/Preferences
In folder /var/mobile/Library:Carrier Bundle.bundle -> /System/Library/Carrier Bundles/12345 Operator Bundle.bundle -> /System/Library/Carrier Bundles/12345In folder /var/mobile/Library/Preferences:
com.apple.carrier.plist -> /System/Library/Carrier Bundles/12345/carrier.plist com.apple.operator.plist -> /System/Library/Carrier Bundles/12345/carrier.plist
If Carrier Bundle.bundle points to Unknown.bundle then your carrier is not detected, go back to check your bundle and MCC/MNC symbolic carefully.
If there are only two carrier symbolic links:
Carrier Bundle.bundle -> /System/Library/Carrier Bundles/12345 com.apple.carrier.plist -> /System/Library/Carrier Bundles/12345/carrier.plist
and missing Opeator Bundle.bundle and com.apple.operator.plist symbolic links, then you might have encountered an issue that your operator cannot be detected, check This Article for details.
Thanks flying out to Arnaldo who described some important concepts for me.

9 Comments
Nice tip. Worked like a charm. I was able to activate the bundle by just removing the four existing symlinks and rebooting. No need for the original AT&T sim.
hi george
I am on window can u suggest me a plist edtior or point me how to edit Info.plist and carrier.plist.
with the winscp internal text editor these 2 files is not readable/understandable.
To edit a plist on Windows, you have to convert it to XML text file, you may plutil (use search) to convert it (on iPhone), then transfer the converted files to Windows, and use UltraEdit to edit it (don’t let it convert file format), if you’re familiar with Vi, there’s a Windows version, check it @ http://www.vim.org/.
it’s work
Thanks a lot
:)
Did you try this on 1.1.4
Everything works on my phone like settings,custom URLs and etc.
But the carrier image doesn’t change :(
Yep, should work on 1.1.4 w/o problem, mine works fine.
Hi George,
Your information is very very useful.
I’m going to take this a little bit further by collecting all carrier.bundles around the world and package it up and make it available on installer.app
u wanna be part of this?
http://code.google.com/p/worldbundle/
thanks
Hi,
I’m using an iMac, I can SSH into iPhone successfully.
But when I use vi editor, the .plist files open up in an encrypted format.
Please guide me how to edit them.
Thanx & Regards.
Anil
You need to convert it to XML. Try searching plutil