If you live on the cutting edge of the world of iPhone, as I apparently do, you sometimes cut yourself. That’s what happened to me today. After experimenting with several different methods of installing ringtones over the past week or so (see previous posting)—including Ambrosia’s iToner, Rogue Amoeba’s MakeiPhoneRingtone, manually-applied hacks, and (of course) Apple’s newly activated iTunes Store method—things began to fall apart.
First, iToner listed ringtones that had I had previously deleted from iTunes. Worse, when I attempted to add new tones, an error message appeared.
Other ringtones, added with MakeiPhoneRingtone, would not copy to the iPhone when I attempted to sync in iTunes, resulting in an error message instead. [Update Sept. 13: This problem may have been more due to a bug in the MakeiPhoneRingtone software, supposedly fixed in the just released 1.1 version.]
Making matters worse, some custom ringtones that had supposedly successfully transferred to my iPhone would not show up in the iPhone’s Ringtones list.
None of the simple solutions (such as restarting the iPhone) worked. I could find no sure solutions on the Web. I was on the verge of pulling out the precious few hairs that still remain on my head. Fortunately, before resorting to this, I found a solution. Here’s what I did:
1. I had previously hacked my iPhone (using AppTappInstaller) and had installed OpenSSH. This allowed me to wirelessly connect to my iPhone from my Mac, using an SFTP connection in Fetch. To do this yourself, you’ll need your iPhone’s Wi-Fi IP address, username (root) and password (dottie, unless you have changed it).
2. Connect to your iPhone in Fetch (or whatever SFTP tool you use) and navigate to: /var/root/Media/iTunes_Control/iTunes/. In this directory you should find a file called Ringtones.plist.
3. Copy this file to your Mac’s desktop. Open the file in a .plist file editor, such as Apple’s Property List Editor (on your drive if you installed Apple’s Developer tools).
4. Check each of the items listed under the Ringtones property of this file. The sub-properties of each item will, in turn, tell you the name of each song.
This file supposedly lists all installed ringtones. However, it appeared to be a bit messed up for me, which turned out to be the source of my problems. In particular, it still listed ringtones that I had previously deleted from iTunes, even though I had synced the iPhone since doing the deletions.
To fix this problem, it may have been sufficient to simply delete the .plist file from the iPhone. But I tried something a bit more cautious:
5. Navigate back a bit to: /var/root/Media/iTunes_Control/Ringtones
In this directory you will find the actually installed ringtones.
6. Compare the directory listing to the .plist file listing. Where they are different, delete the items from the .plist file that are not in the Ringtones directory—until the two lists match. Save the modified .plist file.
7. Using Fetch again, copy the modified .plist file back to its original location on the iPhone. It replaces the unmodified copy. You can now quit Fetch.
8. Launch iTunes and connect the iPhone. Go to the iPhone’s Ringtones tab.. Although it may not be necessary, select to remove all the listed ringtones and click Apply. Then selected to re-add the ringtones and click Apply again. The iPhone should now be synced and all the listed ringtones in iTunes should be correctly installed.
At this point, I returned to iToner. It now correctly listed the iTunes-installed ringtones and allowed me to add new ones without error. On the iPhone itself, both the iTunes-installed and iToner-installed ringtones were correctly included in the Ringtones list. All was well. Whew!