How can I deploy (create .ipa) iphone app using 'cordova build ios --release'?

CordovaDeploymentIpa

Cordova Problem Overview


I have created a 'helloworld' iOS app with cordova using there documentation. The app successfully runs when I run cordova emulate ios. What I can't do, is while deploying when I run cordova build --release. It doesn't create any .ipa files there. All I find is a Helloworld.build file in the PROJECT_ROOT/platforms/ios/build directory. Am I missing something here?

Cordova Solutions


Solution 1 - Cordova

I found this command which worked for me:

cordova build ios --device
cd platforms/ios/build/device
/usr/bin/xcrun -sdk iphoneos PackageApplication "$(pwd)/$PROJECT_NAME.app" -o "$(pwd)/$PROJECT_NAME.ipa"

Source: http://www.splinter.com.au/xcode-4-command-line-builds-of-iphone-apps/

I did run @MD. Mohiuddin Ahmed's Ruby script first, which would have changed my xcodeproj file. I'm not sure if that was necessary but I don't think so.

Update for XCode 8: As a commenter has noted, PackageApplication has been removed from XCode 8. To update the process, see the question: https://stackoverflow.com/questions/43094380/whats-the-replacement-for-xcodes-packageapplication

Edited to clarify process by adding cordova build command as suggested by comments.

Solution 2 - Cordova

If you are using cordova ios 3.9.0 or newer, you can use this command to create the .ipa directly from the CLI with no extra commands:

cordova build ios --device --release

You'll need a build.json file on the root of your project

{
  "ios": {
    "debug": {
      "codeSignIdentity": "iPhone Developer",
      "provisioningProfile": "your-dev-provisioning-profile-UUID-here"
    },
    "release": {
      "codeSignIdentity": "iPhone Distribution",
      "provisioningProfile": "your-distribution-provisioning-profile-UUID-here"
    }
  }
}

To get the UUID I open the .mobileprovision file on a text editor and search for 'UUID', not sure if there is an easier way of finding it.

If using Xcode 8 the build.json needs developmentTeam field and packageType field, but not longer need the provisioning profile, also, the codeSignIdentity should be iPhone Developer for both debug and release:

{
    "ios": {
        "debug": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "FG35JLLMXX4A",
            "packageType": "development"
        },
        "release": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "FG35JLLMXX4A",
            "packageType": "app-store"
        }
    }
}

http://cordova.apache.org/docs/en/6.x/guide/platforms/ios/index.html#using-buildjson

Solution 3 - Cordova

I finally figured out a way to automate this by using xcodeproj, xcode and this ruby script :

require 'xcodeproj'
xcproj = Xcodeproj::Project.open("HelloWorld.xcodeproj")
xcproj.recreate_user_schemes
xcproj.save

And then in the PROJECT_ROOT/platforms/ios/ directory this command helped me to generate my *.ipa:

xcodebuild -project HelloWorld.xcodeproj -exportArchive -exportFormat ipa -archivePath $(pwd)/HelloWorld.xcarchive -exportPath $(pwd)/HelloWorld.ipa CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -alltargets -configuration Release

Thought we can sign our .ipa later on :)

Solution 4 - Cordova

You can try a new tool from http://fir.im.

They have a fir cli tool written in ruby. You can install it with the following command:

sudo gem install fir-cli --no-ri --no-rdoc

Sign up an account (all free like the good old testflight) and get a token from your profile. From your command prompt run:

fir login

Provide your token.

CD into your directory where your .xcodeproj located.

fir build_ipa . 

After a while (if the build success) you will find your ipa in your ./build_ipa folder.

Solution 5 - Cordova

Everything else did not work for me but this works for me

cordova build ios

then

cordova run ios --device

The .ipa file is located at

myPrject/platforms/ios/build/device/myProject.ipa

build.json (set automatic siging)

{
    "ios": {
        "debug": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "FG35JLLMXX4A",
            "packageType": "development",
            "automaticProvisioning": true,
            "buildFlag": [
                "EMBEDDED_CONTENT_CONTAINS_SWIFT = YES",
                "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES=NO",
                "LD_RUNPATH_SEARCH_PATHS = \"@executable_path/Frameworks\""
            ]
        },
        "release": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "FG35JLLMXX4A",
            "packageType": "app-store",
            "automaticProvisioning": true,
            "buildFlag": [
                "EMBEDDED_CONTENT_CONTAINS_SWIFT = YES",
                "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES=NO",
                "LD_RUNPATH_SEARCH_PATHS = \"@executable_path/Frameworks\""
            ]
        }
    }
}

Reference docs

Voila!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMD. Mohiuddin AhmedView Question on Stackoverflow
Solution 1 - CordovaDave BurtView Answer on Stackoverflow
Solution 2 - CordovajcesarmobileView Answer on Stackoverflow
Solution 3 - CordovaMD. Mohiuddin AhmedView Answer on Stackoverflow
Solution 4 - CordovaJoel ChuView Answer on Stackoverflow
Solution 5 - CordovaGroguView Answer on Stackoverflow