How can I deploy (create .ipa) iphone app using 'cordova build ios --release'?
CordovaDeploymentIpaCordova 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 '
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!