How can I deploy an iPhone application from Xcode to a real iPhone device?

270,169

Solution 1

It sounds like the application isn't signed. Download ldid from Cydia and then use it like so: ldid -S /Applications/AccelerometerGraph.app/AccelerometerGraph

Also be sure that the binary is marked as executable: chmod +x /Applications/AccelerometerGraph.app/AccelerometerGraph

Solution 2

I've used a mix of two howtos: Jason's and alex's. With the second we have the advantage of being able to debug. I'll mostly just copy both below (and simplify alex's):

Update Jan 2012: this still works on SDK 4.2.1 and iOS 5.0.1 - I've just tested it all on a new computer and device!


1. Create Self-Signed Certificate

Patch your iPhone SDK to allow the use of this certificate:

  1. Launch Keychain Access.app. With no items selected, from the Keychain menu select Certificate Assistant, then Create a Certificate.

    • Name: iPhone Developer
    • Certificate Type: Code Signing
    • Let me override defaults: Yes
  2. Click Continue

    • Validity: 3650 days
  3. Click Continue

  4. Blank out the Email address field.

  5. Click Continue until complete.

    You should see "This root certificate is not trusted". This is expected.

  6. Set the iPhone SDK to allow the self-signed certificate to be used:

    sudo /usr/bin/sed -i .bak 's/XCiPhoneOSCodeSignContext/XCCodeSignContext/' /Developer/Platforms/iPhoneOS.platform/Info.plist
    

    If you have Xcode open, restart it for this change to take effect.

And if you're on iOS 5, that's it! Try it now! It may not allow debugging, but the app will be there!

I was very surprised by this because, as you should know, I've got no idea on what all those hackings are all about! All I did was improving a little bit what I found elsewhere, as I pointed.

So yeah, the whole method doesn't work the same way anymore and I couldn't bother to find a new one... Except for this, which uses a tool called Theos but I couldn't go through the whole process.

Finally, if you need to uninstall it for whatever reason, check the end of this post. In my case, I had to because I couldn't figure out why all of the blue this whole method stopped working, and I couldn't care anymore since we've already got the long waited license. (Freaking DUNS number takes so long...)

.

.


.

.

.

2. Enable Xcode's to Build on Jailbroken Device

  1. On your jailbroken iPhone, install the app AppSync by adding source ** http://repo.hackyouriphone.org**

  2. Remove SDK requirements for code sign and entitlements (I'm loving sed!):

    sudo /usr/bin/sed -i .bak '/_REQUIRED/N;s/YES/NO/' /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/SDKSettings.plist
    
  3. Pay attention to the iPhoneOS5.0.sdk part. If you're, for instance, using iOS 4.2 SDK, just replace it accordingly:

    sudo /usr/bin/sed -i .bak '/_REQUIRED/N;s/YES/NO/' /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/SDKSettings.plist
    
  4. Conclude the requirement removal through patching Xcode. This means binary editing:

    cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
    dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
    printf "\xc3\x26\x00\x00" >> working
    /bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
    /bin/mv working iPhoneOS\ Build\ System\ Support
    chmod a+x iPhoneOS\ Build\ System\ Support
    

    If you have Xcode open, restart it for this change (and last one) to take effect.

  5. Open "Project>Edit Project Settings" (from the menu). Click on the "Build" tab. Find "Code Signing Identity" and its child "Any iPhoneOS Device" in the list, and set both to the entry "Don't Code Sign":

    alt text

    After this feel free to undo step 3. At least in my case it went just fine.

  6. Setting Xcode to code sign with our custom made self-signed certificate (the first how-to). This step can probably be skipped if you don't want to be able to debug:

    mkdir /Developer/iphoneentitlements401
    cd /Developer/iphoneentitlements401
    curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
    mv gen_entitlements.txt gen_entitlements.py
    chmod 777 gen_entitlements.py
    

    Plug your iPhone in and open Xcode. Open Window>Organizer. Select the device from the list on the left hand side, and click "Use for development." You'll be prompted for a provisioning website login, click cancel. It's there to make legitimate provisioning easier, but doesn't make illegitimate not-provisioning more difficult.

    Now You have to do this last part for every new project you make. Go to the menu Project > New Build Phase > New Run Script Build Phase. In the window, copy/paste this:

    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
    /Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
    codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
    fi
    

.

.


.

.

Uninstalling

For the 1st part:

sudo mv -f /Developer/Platforms/iPhoneOS.platform/Info.plist.bak /Developer/Platforms/iPhoneOS.platform/Info.plist

For the 2nd part:

sudo mv -f /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/SDKSettings.plist.bak /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/SDKSettings.plist
sudo mv -f iPhoneOS\ Build\ System\ Support.original iPhoneOS\ Build\ System\ Support

in case you did do the step 3 instead of 2, simply modify it accordingly as well:

sudo mv -f /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/SDKSettings.plist.bak /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/SDKSettings.plist

for the rest, is just reverting what you did on XCode and deleting /Developer/iphoneentitlements401/gen_entitlements.py if you want:

sudo rm -f /Developer/iphoneentitlements401/gen_entitlements.py

Solution 3

Free Provisioning after Xcode 7

In order to test your app on a real device rather than pay the Apple Developer fee (or jailbreak your device), you can use the new free provisioning that Xcode 7 and iOS 9 supports.

Here are the steps taken more or less from the documentation (which is pretty good, so give it a read):

1. Add your Apple ID in Xcode

Go to XCode > Preferences > Accounts tab > Add button (+) > Add Apple ID. See the docs for more help.

enter image description here

2. Click the General tab in the Project Navigator

enter image description here

3. Choose your Apple ID from the Team popup menu.

enter image description here

4. Connect your device and choose it in the scheme menu.

enter image description here

5. Click the Fix Issues button

enter image description here

If you get an error about the bundle name being invalid, change it to something unique.

6. Run your app

In Xcode, click the Build and run button.

enter image description here

7. Trust the app developer in the device settings

After running your app, you will get a security error because the app you want to run is not from the App Store.

enter image description here

On your device, go to Settings > General > Profile > your-Apple-ID-name > Trust your-Apple-ID-name > Trust.

8. Run your app on your device again.

That's it. You can now run your own (or any other apps that you have the source code for) without having to dish out the $99 dollars. Thank you, Apple, for finally allowing this.

Solution 4

You can't, not if you are talking about applications built with the official SDK and deploying straight from xcode.

Solution 5

You'll have to jailbreak your device.

Share:
270,169

Related videos on Youtube

DFG
Author by

DFG

Java, Ruby, C++

Updated on May 21, 2020

Comments

  • DFG
    DFG about 4 years

    How can I deploy an iPhone application from Xcode to real iPhone device without having a US$99 Apple certificate?

    • Dan Walker
      Dan Walker over 15 years
      See this answer to a question I asked earlier for a very good guide on how to put it on your jailbroken iPhone.
    • philfreo
      philfreo over 14 years
    • Suragch
      Suragch over 8 years
      Xcode 7 has free provisioning now so there is no need to sign up for an Apple Developer Account in order to test apps on a real device. See this answer for more details.
  • NewtoProgramming
    NewtoProgramming over 14 years
    The OP does not have a signing certificate or provisioning profile. These instructions are for members if the $99 iPhone Developer Program but don't address the question of how to run on the device without signing up for the program.
  • esqew
    esqew about 14 years
    Yes, you'll need to jailbreak your device for this method to work. (obviously)
  • esqew
    esqew about 14 years
    Follow @rpetrich's method and SSH the executable into the device's /Applications folder, it should work after a reboot/respring.
  • cregox
    cregox over 13 years
    also a perfect guide, with a different approach from @Dan... I used both, tho.
  • Dan L.
    Dan L. over 13 years
    how do you launch the command ldid -S ...? do you need a SSH console for that? is there any free way to get a SSH client on a jailbroken IPhone?
  • rpetrich
    rpetrich over 13 years
    tanderson: there is an ldid package in Cydia and you can compile one for OS X
  • cregox
    cregox over 13 years
    Yes you can add up team members. There's a limit of 200 devices per year.
  • Akshay
    Akshay over 13 years
    Cawas - Do you know how to add a member to your apple id ?
  • cregox
    cregox over 13 years
    we only get notifications if you add the @ before the name. As you said yourself, you have to first get a Paying Account. Then it should be really simple because I couldn't find any tutorial on how to do it. I never did it myself, tho.
  • cregox
    cregox about 13 years
    rpetrich I believe his questions is how to type and use the command, not how to acquire the pack. @tanderson you can go through Open SSH (and then connect to the phone from your desktop) or a Terminal inside iPhone itself. Both apps are free downloads from Cydia. With SSH you have the advantage you can also use it to simply copy your app to the phone with it. If you do this a lot, be sure to check the other answers - you can make XCode do all the job to you but it's a troublesome procedure to trick it on doing that.
  • nosatalian
    nosatalian almost 13 years
    Tried following these instructions, but now 'Scheme' is of type My Mac 64 bit, and I don't have any option to run simulator or real iPhone anymore, so I can't even test the code. I was using SDK 4.3, not sure if that matters
  • nosatalian
    nosatalian almost 13 years
    Actually, update: after changing base SDK in project settings from iphoneos to iOS 4.3, things work. Although xcode says 'Error launching remote program: failed to get the task for process' I can launch the app by clicking on it.
  • Stephen
    Stephen over 12 years
    I get this error: The identity used to sign the executable is no longer valid. ... (0xE8008018) Even when I put 3650 days to expire. It seems like the phone itself is doing a check.
  • Gabor
    Gabor about 12 years
    does this "patching XCode" trick work for 4.3.2 or it's gonna brake it
  • abidibo
    abidibo almost 12 years
    Point 6. In my case I had to change the /Developer/iphoneentitlements401/gen_entitlements.py file permissions to get the normal user execute it. With this the procedure works perfectly.
  • cregox
    cregox almost 12 years
    @abidibo you mean like using the last command on point 2.6? chmod 777 gen_entitlements.py - I think I forgot to add a sudo there, if so.
  • kishorer747
    kishorer747 about 8 years
    thanks a lot. this worked perfectly without the paid Apple Developer License.
  • SilverWolf
    SilverWolf over 6 years
    This does have some problems, though--you can only install up to 3 apps at a time, and you need to renew the certificate every week.
  • Suragch
    Suragch over 6 years
    @seaturtle, thanks for the update. I eventually forked out the money for the developer license so I haven't kept up to date on this answer. That's too bad about the limitations. There are some things about Android that are much nicer than Apple.
  • James Douglas
    James Douglas over 5 years
    @Oneiros AppSync is one of the most polular tweaks out there. So is listed under many repos: http://repo.appvv.com, http://repocydia.com and http://repo.hackyouriphone.org.
  • John
    John over 2 years
    On my iPhone running iOS 15 the setting for step 7 was under Settings > General > VPN & Device Management