As you know to distribute the applications in App Store or even to debug them on real device according to Apple you have to pay $99 to achieve the provisiong and distribution certificate.
But of course as you know, there are always other ways to achieve the similar result. But 1st. your device has to be jailbroken and 2nd. you can distribute your app only among jailbroken devices via Cydia, Icy or less friendly through SSH. It has advantages and disadvantage. Not all iPhones and iPod touches are jailbroken (I guess maybe 10% are), but you don’t have to obey the rules from Apple about submitted apps and you don’t have to wait at least one week for the review result.
Tasks you need to do only once (for developer):
- Jailbreak your iPhone
- Install LDID (Link Identity Editor), Mobile Termial and OpenSSH from Cydia
- Go to /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.sdk/
I personally tested in on 3.0 that’s why I put that in bold, if you are going to built your app on a higher SDK, go to the appropriate directory. - Open the SDKSettings.plist in your favorite editor (I recommend Property List Editor in Utilities) and in Root -> DefaultProperties set CODE_SIGNING_REQUIRED = NO. BTW check if AD_HOC_CODE_SIGNING_ALLOWED equals NO and CODE_SIGNING_ENTITLEMENTS is blank.
- Save the file.
Please remember: modification of above .plist file simply allows you to build the package without signing it, so from now, you are able both to built package for Cydia and AppStore submission. Of course for App Store submission you provide a Distribution profile, for Cydia “Don’t Code Sign” in your project info under Build, Code Signing, Code Signing Identity, Any iPhone OS Device.
Tasks you need to do for every package (developer):
- Build your project without signing it (Don’t Code Sign).
- SSH your bundle to /Applications on your device. You can use Fugu for Mac or WinSCP for Windows.
- Now you have to fake-sign it to make it working. Open Mobile Terminal and type:
su root
you will be asked for password, by default: alpine. Next:
ldid -S /Applications/My\ Project\ Name.app/My\ Project\ Name
make sure every space in name comes with the backslash before - If any error occurs, it means that you have provided wrong file path or didn’t built it with “Don’t Code Sign”.
- Now you can test your application, how it works on real device with full touch control, accelerometer and device’s performance, it’s really different from the Simulator.
- If everything works correctly download the file that you modified with ldid – it’s the file named exactly the same as your project without any extensions, and replace it with original from your bundle.
- Now you can distribute it in your own way.


I’ve been reading a few posts and actually and enjoy your writing. I’m just starting up my own blog and only hope that I can write as well and give the reader so much insight.
[..] A little unrelated, but I quite simply liked this site post [..]
Hi. Thanks for this. It helped so much! I bookmarked fer sure lol. Anyways I get an error when doing fake signing.
./minimal/mapping.h(54): _assert(2:false)
I dont know what I did wrong. I saw you said to do su root. then it brought /var/mobile root#
so do I put the .app files into the mobile/Applications/ or
straight into the first Application folder where like Cydia.app and install0us.app is?
That is what I am confused of. I cant wait to figure it out and then I can test my application
Thanks again for this tutorial
That was stimulating . I like your finesse that you put into your writing . Please do continue with more like this.
I can’t modify SDKSettings.plist. It tells me the The document “SDKSettings.plist” could not be saved.
Resolved
how?
It’s quite difficult to open, modify, and save system files. That’s why the easiest way to accomplish it is to copy the .plist file to your desktop, modify the copy (from desktop), and later, drag and drop it to the original location. While dragging Mac OS X will want to copy this file rather than move it (it’s ok), and when you release the mouse button you will have to authenticate using administrator password.
Later you can just delete the copy from your desktop.
Hello, I tried the above steps on 3.2.1 version of Xcode and I installed LDID from Cydia and I built my code with “Don’t Code Sign” but I get this: “util/ldid.cpp(567): _assert(0:arch != NULL)” in Mobile Terminal.
My iphone OS is 3.1.2 and I build in Xcode with the 3.1.2 SDK.
Thanks
Chris
Also, it seems I can’t edit the SDKSettings.plist file. even if I set my settings to read&write. I can’t seem to set code_signing_required to NO. Maybe its something in the lastest SDK?
I guess most of your project will also work for 3.0. If you are going to distribute your application in Cydia, you should use the lowest possible version of iPhone OS.
Go to info of your project, and change the base SDK to 3.0 (if it works under 3.0 – debug it properly). Than you have to edit SDKSettings.plist in 3.0 SDK and build without code signing and it should work
.
the LDID tool is not compatible with any SDK higher than 3.0, that’s why you received the “util/ldid.cpp(567): _assert(0:arch != NULL)” error. It’s saying that the architecture is null, so it isn’t supported. The same error occurs when the actual architecture setting in Xcode is changed from “standard” (armv6) to “optimized” (armv6, armv7), because they’re handled in a different way. (Apple probably fixed this?)
Hope this helps!
I’m doing all this on a 3.1.2 dev/phone and i’m just wondering which option should I use to build the project, or does it not matter and I just go and grab the myApp.app file and copy it over. Also i’m using iphonebrowser not openSSH is this ok? When I run ldid I think it works, but my app just starts to load then goes right back to springboard.
I always used OpenSSH. The only option you need to build the projects is not to sign you bundle. Just read the tutorial, everything is pretty explained.
Chris
Hi,
I’ve been trying to do this on Xcode 3.2.1 using the 3.0 sdk framework. It doesn’t work.
I get this error:
CodeSign error: code signing is required for product type ‘Application’ in SDK ‘Device – iPhone OS 3.0′
Do you have an idea on how to fix this?
Change the above entries for every 3.x just to make it clear. Remember to restart your code.