如何使用'cordova build ios --release'部署(创建.ipa)iPhone应用程序?

60
我使用Cordova创建了一个名为'helloworld'的iOS应用程序,使用了documentation。当我运行cordova emulate ios时,该应用程序可以成功运行。但是,在部署时运行cordova build --release时,我无法生成任何.ipa文件。我在PROJECT_ROOT/platforms/ios/build目录中只能找到一个Helloworld.build文件。我是否漏掉了什么?
5个回答

78

我发现这个命令对我有用:

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

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

我首先运行了@MD.Mohiuddin Ahmed的Ruby脚本,这可能已经更改了我的xcodeproj文件。我不确定这是否必要,但我认为不是。

XCode 8更新:正如一位评论员所指出的,PackageApplication已从XCode 8中删除。有关更新过程,请参见问题:什么是替代Xcode's PackageApplication的方法?

根据评论添加了cordova build命令以澄清流程。


14
正确答案。只需澄清一下:运行cordova build ios --device来生成应用程序,位于platforms/ios/build/device目录下。 - M165437
是的,使用“cordova build ios --device”非常好。 - mike nelson
1
由于某些原因,对我来说 xcrun 命令似乎不是必需的。我正在使用 Cordova 6,它是否已经集成到 cordova build ios --device 命令中了呢?当我运行该命令时,它似乎已经使用我的 XCode 设置生成了一个正确签名的 ipa 文件。 - Julian
1
似乎PackageApplication在xcode8中已被删除,对我来说不起作用。 - Alba Hoo

47
如果您正在使用cordova ios 3.9.0或更高版本,您可以使用此命令直接从CLI创建.ipa文件,无需额外的命令:
cordova build ios --device --release
你的项目根目录需要一个名为 build.json 的文件。
{
  "ios": {
    "debug": {
      "codeSignIdentity": "iPhone Developer",
      "provisioningProfile": "your-dev-provisioning-profile-UUID-here"
    },
    "release": {
      "codeSignIdentity": "iPhone Distribution",
      "provisioningProfile": "your-distribution-provisioning-profile-UUID-here"
    }
  }
}

获取UUID的方法是在文本编辑器中打开.mobileprovision文件并搜索'UUID',不确定是否有更简单的查找方式。

如果使用Xcode 8,则build.json需要developmentTeam字段和packageType字段,但不再需要配置文件,同时,codeSignIdentity应为调试和发布都是iPhone Developer

{
    "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


1
只是提醒一下,这对我来说并没有起作用。我的意思是它创建了一个.app文件但没有.ipa文件。结果发现我的iOS平台版本是3.8,已经过时了。这是很容易犯的错误,所以要小心。 - Raymond Camden
更新了,此功能已添加到 Cordova iOS 3.9.0。 - jcesarmobile
1
这是更好的选择.. 因为它只需要一次设置..!! - Mr. Noddy
2
我谈论的是配置文件(.mobileprovision)的UUID,而不是设备的UUID。 - jcesarmobile
请注意:最新(dev)版本的构建.json所需内容已更改。有关更多信息,请参阅Cordova文档。 - CWBudde
显示剩余3条评论

5

我最终通过使用xcodeproj、Xcode和这个Ruby脚本找到了自动化的方法:

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

接着在 PROJECT_ROOT/platforms/ios/ 目录下,运行这个命令可以生成我的 *.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

我们可以稍后签名我们的.ipa文件 :)


1
你可以尝试来自http://fir.im的新工具。
他们有一个用Ruby编写的Fir CLI工具。您可以使用以下命令安装它:
sudo gem install fir-cli --no-ri --no-rdoc

注册一个账户(所有免费,就像旧的TestFlight一样),并从您的个人资料中获取一个令牌。从您的命令提示符中运行:

fir login

请提供您的令牌。
进入您的目录,其中包含.xcodeproj文件。
fir build_ipa . 

如果构建成功,过一段时间后您将在./build_ipa文件夹中找到ipa文件。


不要发送注册验证码,仅返回已翻译的文本。 - user3682770

1

其他的方法对我都不起作用,但这个方法对我有效。

cordova build ios

那么

cordova run ios --device

该.ipa文件位于

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

build.json(设置自动签名)

{
    "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\""
            ]
        }
    }
}

参考资料 docs

Voila!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接