【问题标题】:Failed to generate release build of cordova ios app无法生成科尔多瓦 ios 应用程序的发布版本
【发布时间】:2013-11-16 00:40:56
【问题描述】:

我正在使用 phonegap CLI 3.1 和 XCode5。我正在尝试通过 Phonegap CLI 和 Xcrun 为发布模式生成构建。我不想使用 Phonegap Build 来上传 mobileprovision 或它们的任何过程。我想通过 xcrun 来分配 mobileprovision 来发布构建。

1) cordova build ios --release

通过命令在“ios”平台上编译应用程序 “/Applications/MAMP/htdocs/MyTest/MyTestApp/platforms/ios/cordova/build”--release 平台“ios”编译成功。

2) sudo xcrun -sdk iphoneos PackageApplication -v "ios/build/emulator/MyTestApp.app" -o "/Users/mymac/Desktop/Testnew/MyTestApp.ipa" --sign "iPhone 分发: NAME (TEAM_ID)" --embed "MyTestApp_Dis.mobileprovision"

打包应用程序:'ios/build/emulator/MyTestApp.app' 参数: embed=MyTestApp_Dis.mobileprovision 详细=1 输出=/Users/mymac/Desktop/Testnew/MyTestApp.ipa 标志=iPhone 分布:NAME (TEAM_ID)
环境变量:
主页 = /用户/mymac
SUDO_GID = 20
SDKROOT = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk
VERSIONER_PERL_PREFER_32_BIT = 否
邮件 = /var/mail/root
SSH_AUTH_SOCK = /tmp/launch-zsBMC8/Listeners
LANG = en_US.UTF-8
用户 = 根
LOGNAME = 根
__CF_USER_TEXT_ENCODING = 0x0:0:0
用户名 = 根
PATH = /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin
SUDO_USER = mymac
外壳 = /bin/bash
期限 = xterm-256color
SUDO_COMMAND = /usr/bin/xcrun -sdk iphoneos PackageApplication -v ios/build/emulator/MyTestApp.app -o /Users/mymac/Desktop/Testnew/MyTestApp.ipa --sign iPhone Distribution: NAME (TEAM_ID) --embed MyTestApp_Dis.mobileprovision
SUDO_UID = 501
VERSIONER_PERL_VERSION = 5.12

输出目录:'/Users/mymac/Desktop/Testnew/MyTestApp.ipa'
临时目录:'/tmp/W81FhZ9VAH'(设置详细时不会在退出时删除)
+ /bin/cp -Rp ios/build/emulator/MyTestApp.app /tmp/W81FhZ9VAH/Payload
程序 /bin/cp 返回 0 : []

检查原始应用程序

  • /usr/bin/codesign --verify -vvvv ios/build/emulator/MyTestApp.app
    程序 /usr/bin/codesign 返回 1:[ios/build/emulator/MyTestApp.app:代码对象根本没有签名
    在架构方面:i386
    ] 代码设计检查失败:ios/build/emulator/MyTestApp.app:代码对象根本没有签名 在架构方面:i386

完成对原始应用的检查

嵌入“MyTestApp_Dis.mobileprovision”

  • /bin/rm -rf /tmp/W81FhZ9VAH/Payload/MyTestApp.app/embedded.mobileprovision 程序 /bin/rm 返回 0 : []
  • /bin/cp -rp MyTestApp_Dis.mobileprovision /tmp/W81FhZ9VAH/Payload/MyTestApp.app/embedded.mobileprovision 程序 /bin/cp 返回 0 : []
  • /usr/bin/codesign -d --entitlements /tmp/W81FhZ9VAH/entitlements_rawixGWnKhi /tmp/W81FhZ9VAH/Payload/MyTestApp.app 程序 /usr/bin/codesign 返回 1:[/tmp/W81FhZ9VAH/Payload/MyTestApp.app:代码对象根本没有签名 ]
    错误:无法从“/tmp/W81FhZ9VAH/Payload/MyTestApp.app”读取权利

【问题讨论】:

    标签: ios xcode cordova xcodebuild xcrun


    【解决方案1】:

    同时我发现: 事实是,当 cordova 退出并返回到 shell 时,cordova 相关的活动还没有完成!

    cordova 退出后需要一段时间才能显示“platforms/ios/AppName/_CodeSignature/CodeResources”文件。这个文件显然是 xcrun 命令启动的“代码设计”成功所必需的。

    所以我在我的脚本中这样做(我称之为“buildit.sh”)

    #!/bin/bash
    [...]
    cordova build ios --release
    signaturefile="platforms/ios/build/device/$appname/_CodeSignature/CodeResources"
    echo DEBUG:signatur file is $signaturefile
    
    while [ ! -f $signaturefile ]
    do
      echo waiting
      sleep 1
    done
    xcrun ...
    

    然后在一个脚本中的整个构建/打包过程成功。

    但是:从我的 ContinuousIntegration 服务器 Jenkins 运行脚本,我发现这个标准可能是必要的,但还不够。从 CI 我仍然得到一个

    /usr/bin/codesign --verify -vvvv [...] 程序 /usr/bin/codesign 返回 1 : [...] 代码对象根本没有签名

    错误!??

    编辑 (05.12.2013): 这是因为 Jenkins 服务无法访问钥匙串。例如。在运行构建脚本之前在 Jenkins 工作中解锁钥匙串对其进行排序。 (可能不是最优雅的解决方案,但至少它证明问题不在脚本中:)

    【讨论】:

    • 顺便说一句:我只是在速度更快的机器上运行它,它具有更强大的 CPU 和 SSD,而不是普通的 HD。在这样一台速度更快的机器上,遇到的问题根本不会出现。仍然 IMO 这仍然是科尔多瓦的一个错误......
    • 更奇怪的是:创建了故障机器的映像并使用该磁盘映像引导功能更强大的机器,问题也显示在这里!?所以它一定是那个特定机器/磁盘的MacOS设置问题(它失败了)?奇怪的 ... !由于我不是 MacOS 专家而且时间紧迫,我在这里放弃:|
    • 再提一提:进一步分析(通过“dtrace”显示,cordova 正在调用一个脚本,该脚本本身将启动 2 个“xcrun ...”进程(一个用于设备包/构建,一个用于模拟器包/构建)。但是我们看到这个脚本在某个时间点得到一个“kill”信号,这就是为什么第一个 xcrun 回退到 PPID 1(init :),而第二个 xcrun 永远不会被执行。 ...然后科尔多瓦退出了,而第一个 xcrun 仍未完成。
    【解决方案2】:

    所以,我终于把一切都搞定了……:D

    Jenkins 抱怨 'codesign ...' 运行失败的问题是 MacOS(配置)问题

    关键是允许 Jenkins 访问系统的钥匙串。 Jenkins 用户的 Login-shell 允许的访问权限与在 Jenkins 用户帐户下运行的 Jenkins 服务器进程不同(!)

    现在我通过在运行构建脚本之前在 Jenkins 作业中运行 login.keychain 的解锁来实现这一点

    like:在 Jenkins 作业中“执行 shell”

    security unlock-keychain -p password /Users/Shared/Jenkins/Library/Keychains/login.keychain
    echo ##### building now ######################
    ./buildit.sh ios --release -v
    

    这可能不是 100% 最好的解决方案 - 但现在它可以工作:P

    另见:[1]:Keychain won't unlock from Jenkins script unless user logged in

    【讨论】:

    • 呃,这样就没有其他人花费数小时来解决这个问题了......如果你是从 SSH 构建的,同样的事情也适用!没有特殊措施,安全钥匙串解锁无法正常工作!
    【解决方案3】:

    嗯,我也遇到了类似 Shashi 的问题。

    当从 shell 运行 'cordova buld ios [--release]' 然后执行 'xcrun ...' 后它对我有用。

    但是:从脚本中运行此序列时,我也收到“Codesign check failed ...”错误...

    如果我在我的脚本中的 cordova 和 xcrun 调用之间插入(喜欢)一个 "wait" 循环,它就可以工作。

    所以 - 对我来说 - 好像 cordova 在尚未完全完成时返回到 shell (?)

    事实是,如果我像这样编写脚本

    #!/bin/bash
    cordova build ios --release
    sleep 5
    sh -c "xcrun ..."
    

    它对我有用。 问题:这是cordova/phonegap中的一个错误吗???

    【讨论】:

    • 另一个观察结果(可能还有解释(?))如果我用例如替换“睡眠”一个复制命令,我从该副本中得到一个错误,即“cordova build ...”正在创建的 App 文件夹不存在!?!事实上 - 后来 - 它确实存在。这就是为什么在等待一段时间(“睡眠”)后它成功了。所以对我来说,'cordova'似乎不是同步命令(!)意味着:如果它退出(像'0')它还没有完成!听起来合乎逻辑???
    【解决方案4】:

    要跳过代码签名,您可以从控制台执行手动构建,如下所示:

    xcodebuild clean build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO 额外使用 -configuration、-target 和 -sdk 参数来定义您的构建设置。

    禁用代码签名:

    *转到/应用程序。 右键单击 XCode 并选择“显示包内容”。 将 Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/SDKSettings.plist 复制到您的桌面。 (确保实际复制和粘贴。没有拖放) 打开它并在 DefaultProperties 下将 CODE_SIGNING_REQUIRED 设置为 NO。 将其复制回来并替换原始文件。 重新启动 XCode。 打开你的项目。 在 Project Navigator 中选择您的项目并打开项目的 Build Settings 部分(而不是任何特定目标) 在 Code Signing 下找到 Code Signing Identity,对于 Debug 和 Release 模式,将 Any iOS SKD 设置为 Don't Code Sign。 现在您应该能够构建您的项目而不会出现任何错误。*

    制作 IPA:

    在“项目导航器”中选择产品 右键单击 [NameOfYourProject].app 并选择“在 Finder 中显示”。 创建一个文件夹并将其命名为 Payload 将 [NameOfYourProject].app 移动到 Payload。 压缩 Payload 并将其重命名为 [NameOfYourProject].ipa

    【讨论】:

    • 在ios平台目录下的build.xcconfig文件中添加CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO似乎可以解决问题。
    猜你喜欢
    • 2017-06-08
    • 2018-01-16
    • 2021-10-07
    • 1970-01-01
    • 2017-01-11
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多