我如何生成一个iOS版本构build,我的客户端可以签署他们的最终?

我的场景

我为客户写了一个iOS应用程序。 这个项目已经快结束了,现在是时候把它放到App Store了。 在整个开发过程中,我一直在向他们发送开发版本。 这些版本有一个基于我的公司和我的客户端的项目,如: com.mycompany.clientname.projectname的捆绑ID。 我使用我在自己的Provisioning Portal帐户中创build的Ad Hoc Distribution Provision Profile来签署这些Ad Hoc版本。

现在是时候进入App Store了,我需要做一个发布版本并发送给他们,用他们自己的App Store Distribution Provisioning Profile进行签名。 这也意味着为项目设置一个新的Bundle ID。

我的问题

我需要获得一个已编译的应用程序给客户端,供他们签署configuration文件。 但是,我需要将Bundle ID设置为首先使用的内容。 假设它是com.bestclientever.appname 。 Xcode 4不会让我现在归档项目,因为这样做需要代码签名。 我无法对代码进行编码签名,因为我无法使用与其在供应门户中设置的相同的捆绑ID创build供应configuration文件(供应门户强制执行唯一性 – 因为它应该)。

我在这里做了任何不正确的假设或误解吗? 即。 我是否真的必须将Bundle ID设置为他们要签名的内容?

问题

有没有什么办法来存档或以其他方式构buildiOS应用程序而无需代码签名? 像“以后再签”设置什么的?

或者,有没有一种方法来构build一个捆绑ID的应用程序,但其他人可以使用另一个捆绑ID的供应configuration文件签名(通过更改已编译的应用程序的捆绑ID或其他签名方法)?

我如何构build最终版本的版本,但有其他人签署的应用程序分发到App Store?

我已经尝试或探索过

  • 代理客户。
    • 与其他不那么聪明的客户,我刚刚得到他们的供应门户和iTunesConnect凭据,只是做最后的构build。 这不会与这个客户。 这是一个严格的安全准则和繁文</s>节的大公司。
  • 作为客户欺骗。
    • 这与上面的类似,不会出于同样的原因。 询问我的客户“你能把你的私钥导出并发给我”这听起来很诡异吗? 在这个答案中描述了这种技术: 我怎样才能发送iOS应用程序到客户端,让他们进行代码签名
  • 发送客户端我的项目源代码,并让他们做发布版本。
    • 源代码的许可不在我们的协议中。 另外,这个客户不想涉及源代码(因此外包)。 我会把这招作为最后的select,但是有一个更好的办法!
  • 在开发人员中心成为pipe理员级开发人员。
    • 不幸的是,只有代理级别的用户可以创build一个configuration文件(据我所知)。 似乎应该有办法让我创build一个configuration文件,我可以用来签署构build或为我生成configuration文件。 我找不到任何选项。

这些答案大部分看起来很复杂和过时。 我认为最简单的答案就是使用开发人员configuration文件进行存档

这是我目前正在为自己的目的而调查的一个解决scheme(未经过充分testing):

您只需要开发人员访问(而不是团队代理)到他们的账户,并创build一个开发configuration文件,授权您build立指定的App ID(您需要指定App ID,因为它被编译)。 然后使用“开发”configuration文件归档应用程序,并与您的客户端共享存档。 然后,他们可以使用自己的分发configuration文件重新签署存档。

一个复杂的情况是,当您使用开发人员configuration文件构build归档文件时,授权属性get-task-allow会被设置为true,但是需要将其设置为false才能进行分发,所以您必须通过手动设置来解决该问题。 .plist – 在这里看到我的问题: 我可以使用开发人员证书进行存档,然后在提交时使用分发证书重新签名?

我刚刚在WWDC 2012上确认了以下技术。 它最能满足我对客户参与度低,客户端专业知识低,简单的签名stream程和源代码所有权的限制。

  1. 客户邀请开发者作为pipe理员join他们在会员中心的团队
  2. 开发者接受邀请(应该在您的电子邮件中)
  3. 开发人员打开Xcode的组织者 – >设备选项卡 – >供应configuration文件,并在右下angular点击刷新。 确保你select合适的团队,你应该得到一些新的项目。
  4. 在Xcode中,将“代码签名标识”设置保留为其默认值(或将其重置为iPhone Developer for Any iOS SDK)
  5. 归档应用程序
  6. 在pipe理器中,右键单击存档并select在Finder中显示
  7. 将.xcarchive文件发送到您的客户端
  8. 客户端必须安装Xcode
  9. 客户端双击应在pipe理器中打开它的.xcarchive文件
  10. 客户点击分发并用他们的身份签署应用程序
  11. 利润

这确实要求客户使用developer.apple.com上的会员中心,并使用Xcode(但只是组织者!)。 如果你的客户在这个级别有技术能力问题,那么我build议你接pipe并为他们做(并收费!)。 请求他们的开发人员login名和密码,并以他们的名义行事,就像你是一名雇员一样。

编者提示:周围的交易密钥是一个可怕的妥协,因为它更多的技术和客户参与,更开发人员hacky和风险。 考虑到这两个更好的select,它应该被认为是一个非选项。

我有同样的问题。 我终于解决了这个问题:

  1. 客户创build了一个开发证书。
  2. 客户端使用与分发configuration文件相同的App ID创build开发configuration文件。
  3. 客户端导出的开发证书(.p12)。
  4. 客户端给我发送了.p12文件和开发移动configuration文件。
  5. 我将客户端p12文件导入到我的钥匙串中
  6. 我将客户端的configuration文件导入到Xcode中。
  7. 将我的构buildconfiguration的代码签名标识设置为使用客户端的供应文件。
  8. 我存档的应用程序。
  9. 我将档案传送给客户。
  10. 客户通过使用分发configuration文件对应用程序进行签名来创build分发版本。 (他们在内部分发应用程序进行testing。)

客户不太关心共享发展证书,因为他们会分享他们的发行证书。

我还必须创buildentitlements.plist与“可以debugging”(get-task-allow)设置为NO,并引用它在生成configuration(在代码签名,代码签名权利下)。

我相信我已经find了一种方法去做你想做的事情,我没有做过广泛的testing,或者试图上传到app store,但是从我做的testing来看,它似乎是好的。 我的configuration文件的辞职和添加正在工作,因为我可以将它安装在AdHocconfiguration文件中定义的设备上,而无需手动configuration文件安装。 第二个testing是我从xCode获得了一个具有相同捆绑ID的iPad和iPhone版本的应用程序,起初我无法在iTunes中进行,但是在辞职和捆绑ID变化之后,我能够安装这两个软件。 我也尝试更改应用程序名称,并且工作得很好,它显示在设备上,并以iTunes的名称显示。 下面是我的脚本,它的目的是为我辞去一个特定的应用程序,所以configuration文件和bundleID是硬编码的。 我在iPhone和iPad版本的应用程序之间翻转,所以我添加了作为脚本的参数。 但是,你应该能够把我在这里的原则,并为自己完善。

这种胆量build立在“ 进一步的冒险 ”这样的文章上,从Dan的Dev Diary辞职到iOS,与上面列出的Erica Sadun的App Signer非常相似。 我做的主要补充是在辞职之前编辑Info.plist。

 #!/bin/sh DestFile="Signed_$1" SigningCertName="YOUR DISTROBUTION CERT NAME HERE FROM KEYCHAIN" AppInternalName="APP NAME FROM INSIDE PAYLOAD FOLDER.app" echo echo "Going to take the app $1 and resign it as $DestFile" echo if [ "$2" = "iphone" ] ; then echo "Using iPhone Profile" echo BundleID="com.YOURCOMPANY" ProvProfile="/Users/YOURNAME/Library/MobileDevice/Provisioning Profiles/PROVISIONINGPROFILE.mobileprovision" elif [ "$2" = "ipad" ] ; then echo "Using iPad Profile" echo BundleID="com.YOURCOMPANY.ipad" ProvProfile="/Users/YOURNAME/Library/MobileDevice/Provisioning Profiles/PROVISIONINGPROFILE_iPad.mobileprovision" else echo "You must enter either iphone or ipad as the second parameter to choose the profile to sign with." echo exit 1 fi rm -f Resigned.ipa unzip -q $1 -d temparea cd temparea/Payload echo "*** Original Signing ***" echo "************************" codesign -d -vv $AppInternalName/ cp "$ProvProfile" ./$AppInternalName/embedded.mobileprovision export EMBEDDED_PROFILE_NAME=embedded.mobileprovision export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate #Update the Info.plist with the new Bundle ID sed 's/>ORIGINAL BUNDLEID HERE</>'$BundleID'</' ./$AppInternalName/Info.plist >./$AppInternalName/Info.plist.new mv -f ./$AppInternalName/Info.plist.new ./$AppInternalName/Info.plist # this will do a rename of the app if needed # sed 's/>ORIGINAL APP NAME</>NEW APP NAME</' ./$AppInternalName/Info.plist >./$AppInternalName/Info.plist.new # mv -f ./$AppInternalName/Info.plist.new ./$AppInternalName/Info.plist # echo "Hit enter to proceed with signing." # read TMP codesign -f -vv -s "$SigningCertName" -i $BundleID $AppInternalName echo echo "*** New Signing ***" echo "*******************" codesign -d -vv $AppInternalName/ cd .. zip -r -q ../Resigned.zip . cd .. rm -R temparea mv Resigned.zip $DestFile echo echo "New IPA Created, $DestFile" 

最好的替代方法是要求客户将其分发证书私钥导出到.p12文件中,并将其发送给您,同时将分发configuration文件与您一起为您的客户端生成App Store分发版本。

祝你好运!

问候,山姆

好吧,find一种方法来做到这一点, 而不共享configuration文件或证书

这个想法是插入一个“运行脚本”构build阶段,诱使XCode签署一个未编译的应用程序,所以你可以发送一个编译(未签名)的应用程序到客户端,然后他们的XCode签署该应用程序与他们的证书和个人资料。

怎么做:

第1步 :使XCode生成一个未签名的发行.app(我将称之为“应用程序A”)。 请参阅“禁用代码签名”: https : //stackoverflow.com/a/10171462/375486

第2步 :创build一个新的XCode iOS项目,并从中删除所有的构build阶段,所以它创build一个空的.app文件(我将称之为“应用程序B”)

步骤3 :将“运行脚本”构build阶段添加到项目B,将“应用程序A”的内容复制到“应用程序B”。 在我的情况下,我用这个:

 cp -r A.app/* "$CODESIGNING_FOLDER_PATH" 

步骤4 :将“B”XCode项目发送到客户端,并提供所有必要的文件。

第5步 :客户端build立B项目。 在底层,XCode将运行“运行脚本”命令,然后签署生成的应用程序,客户端得到一个完全签名的应用程序。

就是这样:)

iResign工作得很好。

它允许您在签名时更改捆绑ID并添加权利。 可能会为你的用例工作。

这就是说,xcarchive解决scheme更具规范性。 请注意,共享xcarchive文件为他们提供了dsym。

如果您的代码中有任何#ifdef DEBUG语句,请确保在您为其提供的构build中禁用了它们。

我去过那儿。 选项2或3是没有问题的。 选项4将是理想的,但正如你所写的,苹果不会让代理委托她的特权来创build分配configuration文件。

所以基本上,你唯一的select是让你获得用他们的账户定义的分布configuration文件。 为了让您处理它,您需要以代理身份login,这不是一个选项。

所以他们必须这样做。 这是没有办法的。

他们还必须邀请您作为其产品开发团队的成员。 你将需要成为一个pipe理员。 这意味着你将不得不发送苹果公司提出的签名证书请求。

最后,他们将不得不下载并发送您创build的分发configuration文件。

所有这一切,你将能够用自己的资源签署你的应用程序。

我刚刚和苹果电话通了电话。 他们说这是做到这一点的唯一方法: https : //developer.apple.com/library/ios/#qa/qa1763/_index.html

客户将你添加到他们的团队,并给你特定的权限。

呵呵,所有这些看起来都更复杂,然后他们必须这样做。 我用这个:

 xcodebuild -scheme "$SCHEME" clean archive \ -archivePath "build/$SCHEME" \ -workspace $PRODUCT_NAME.xcworkspace \ -allowProvisioningUpdates \ -configuration Release \ PRODUCT_NAME="$SCHEME" \ PRODUCT_BUNDLE_IDENTIFIER="$BUNDLE_ID" \ EXECUTABLE_NAME="$SCHEME" \ DISPLAY_NAME="$DISPLAY_NAME" \ CODE_SIGN_IDENTITY="" \ CODE_SIGNING_REQUIRED=NO \ CODE_SIGN_ENTITLEMENTS="" \ CODE_SIGNING_ALLOWED=YES