无法生成cordova ios应用程序的发布版本

时间:2013-11-05 07:40:11

标签: ios xcode cordova xcodebuild xcrun

我正在使用phonegap CLI 3.1和XCode5。我试图通过Phonegap CLI和Xcrun生成发布模式的构建。我不想使用Phonegap Build上传mobileprovision或其中任何进程。我希望xcrun能够将mobileprovison分配给发布版本。

1)cordova build ios --release

在平台上编译应用程序" ios"通过命令 " /应用/ MAMP / htdocs中/ MyTest的/ MyTestApp /平台/ IOS /科尔多瓦/构建" - 发布 平台" 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 verbose = 1 output = / Users / mymac / Desktop / Testnew / MyTestApp.ipa sign = iPhone Distribution:NAME(TEAM_ID)
环境变量:
HOME = / Users / mymac
SUDO_GID = 20
SDKROOT = /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk
VERSIONER_PERL_PREFER_32_BIT =没有 MAIL = / var / mail / root
SSH_AUTH_SOCK = / tmp / launch-zsBMC8 /听众
LANG = en_US.UTF-8
USER = root
LOGNAME = root
__CF_USER_TEXT_ENCODING = 0x0:0:0
USERNAME = root
PATH = / usr / bin:/ bin:/ usr / sbin:/ sbin:/ usr / local / bin:/ usr / local / git / bin
SUDO_USER = mymac
SHELL = / bin / bash
TERM = 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'
  • 读取权利

4 个答案:

答案 0 :(得分:2)

嗯,我遇到了像Shashi这样的问题。

当从shell运行'cordova buld ios [--release]'然后再做一个'xcrun ...'之后,它对我有效。

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

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

所以 - 对我来说 - 似乎,好像cordova在没有完全完成时返回shell(?)

事实上,如果我编写像

这样的脚本
#!/bin/bash
cordova build ios --release
sleep 5
sh -c "xcrun ..."
它对我有用。 问题:这是cordova / phonegap中的错误???

答案 1 :(得分:2)

同时我发现: 事实是,当科尔多瓦退出并返回贝壳时,科尔多瓦的相关活动尚未完成!

在cordova退出后需要一段时间才能显示'platforms / ios / AppName / _CodeSignature / CodeResources'文件。这个文件显然对于由xcrun命令启动的'codesign'是必不可少的。

所以我在我的脚本中(我称之为'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:[...]代码对象根本没有签名

错误!??

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

答案 2 :(得分:2)

所以,最后我把一切都搞定了......:D

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

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

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

喜欢:在“执行shell”的Jenkins工作中

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

答案 3 :(得分:1)

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

xcodebuild clean build CODE_SIGN_IDENTITY =“”CODE_SIGNING_REQUIRED = NO 另外使用-configuration,-target和-sdk参数来定义构建设置。

禁用代码签名:

*转到/应用程序。 右键单击XCode并选择“显示包内容”。 将内容/开发人员/平台/ iPhoneOS.platform / Developer / SDKs / iPhoneOS5.1.sdk / SDKSettings.plist复制到您的桌面。 (确保实际复制和粘贴。没有拖放) 打开它并在DefaultProperties下将CODE_SIGNING_REQUIRED设置为NO。 将其复制并替换原始文件。 重启XCode。 打开你的项目。 在Project Navigator中,选择项目并打开项目的Build Settings部分(而不是任何特定目标) 在代码签名下找到代码签名标识以及调试和发布模式将任何iOS SKD设置为不代码签名。 现在,您应该能够毫无错误地构建项目。*

制作IPA:

在“Project Navigator”中选择“产品” 右键单击[NameOfYourProject] .app并选择“在Finder中显示”。 创建一个文件夹并将其命名为Payload 将[NameOfYourProject] .app移动到Payload。 压缩有效负载并将其重命名为[NameOfYourProject] .ipa