it-swarm.cn

如何生成我的客户端可以签署的的iOS版本构建?

我的情景

我为客户编写了一个iOS应用程序。该项目即将结束,现在是他们将它放入App Store的时候了。我一直在开发过程中向他们发送开发版本。那些构建有一个基于我的公司和我的客户端项目的包ID,如下所示:com.mycompany.clientname.projectname。我使用我在自己的Provisioning Portal帐户中创建的Ad Hoc Distribution Provisioning Profile签署了这些Ad Hoc版本。

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

我的问题

我需要将一个已编译的应用程序提供给客户端,以便他们使用其配置文件进行签名。但是,我需要将Bundle ID设置为他们将首先使用的内容。我们说它是com.bestclientever.appname。 Xcode 4现在不允许我存档项目,因为这样做需要代码签名。我无法对其进行代码签名,因为我无法创建具有与其Provisioning Portal中设置的捆绑ID相同的捆绑ID的配置文件(供应门户强制实施唯一性 - 应该如此)。

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

问题

有没有办法存档或以其他方式构建一个没有代码签名的iOS应用程序?就像“以后的标志”设置或什么?

或者,是否有一种方法可以使用一个包ID构建应用程序,但是其他人可以使用其他包ID的配置文件签名(通过更改已编译应用程序的包ID或其他一些签名方法)?

如何构建最终版本构建但是有其他人签署应用程序以分发到App Store?

我尝试或探索的内容

  • 代理客户。[。_____。]
    • 对于其他不那么精明的客户,我最终只获得了他们的Provisioning Portal和iTunesConnect凭据,并且只是做了最终的构建。这不会与这个客户一起飞行。这是一家拥有严格安全准则和大量繁文缛节的大公司。
  • 作为客户欺骗。[。_____。]
  • 向客户端发送我的项目源代码并让他们进行发布构建。[。_____。]
    • 源代码的许可证不在我们的协议中。此外,该客户端不希望涉及源代码(因此将其外包)。我认为这是最后的选择,但必须有更好的方法!
  • 在开发者成员中心设置为管理员级开发人员。[。_____。]
    • 不幸的是,只有代理级用户才能创建供应配置文件(据我所知)。似乎应该有办法让我创建一个我可以用来签署构建或为我生成配置文件的配置文件。我找不到任何一种选择。
64
RickDT

这些答案中的大多数似乎都很复杂且过时。我认为简单的答案是 使用开发人员资料制作存档

这是我目前正在为自己的目的进行调查的解决方案(未经过全面测试):

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

一个复杂的问题是,当您使用开发人员配置文件构建存档时,权利属性get-task-allow设置为true,但需要设置为false以进行分发,因此您必须通过手动设置权限来解决这个问题。 .plist - 请在此处查看我的问题: 我可以使用开发人员证书进行存档,然后在提交期间使用分发证书重新签名吗?

27
Richard Venable

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

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

这确实需要客户端在developer.Apple.com上使用成员中心并稍微使用Xcode(但只是组织者!)。如果您的客户在此级别存在技术能力问题,那么我建议您接管并为他们执行此操作(并为其充电!)。询问他们的开发人员登录名和密码,并代表他们行事,就像您是员工一样。

编者提示:交易密钥是一种可怕的折衷方案,因为它对客户来说更具技术性和参与性,对开发人员而言更具风险和风险。鉴于这两个更好的选择,它应被视为非选择。

27
RickDT

我有同样的问题。这就是我最终解决它的方式:

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

客户并不关心共享 开发 证书,因为他们将共享他们的分发证书。

我还必须创建entitlements.plist,将“Can be debugged”(get-task-allow)设置为NO,并在构建配置中引用它(在Code Signing,Code Signing Entitlements下)。

6
jimmyg

我相信我找到了一种方法来做你想要的,我还没有做过大量的测试或试图上传到应用程序商店,但从我做过的测试看起来似乎很好。辞职和添加我的配置文件正在运行,因为我可以将其安装在AdHoc配置文件中定义的设备上,无需手动配置文件安装。第二次测试是我从xCode获得了一个iPad和一个iPhone版本的应用程序,其中包含相同的软件包ID,起初我无法在iTunes中同时使用,但在辞职和软件包ID更改之后我能够同时安装。我也尝试更改应用程序名称,这也很有效,它在设备和iTunes中显示了新名称。下面是我的脚本,它旨在为我重新签名一个特定的应用程序,因此配置文件和bundleID是硬编码的。我在应用程序的iPhone和iPad版本之间切换,因此我将其添加为脚本的参数。但是你应该能够遵循我在这里的原则并为自己完善它们。

其中的内容建立在诸如 从丹的Dev日记中为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"
3
Piwaf

最好的替代方法是让客户端将他的分发证书私钥导出到.p12文件中,并将其与分发配置文件一起发送给您,您可以使用该配置文件为您的客户生成App Store分发版本。

祝你好运!

问候,山姆

2
Saurabh Passolia

iResign 工作得很好。

它允许您在签名时更改捆绑包ID并添加权利。可能适用于您的用例。

话虽如此,xcarchive解决方案更具规范性。请注意,共享xcarchive文件会为他们提供dsym。

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

1
funroll

嗯,所有这些看起来都比他们必须更加复杂。我用这个:

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
1
Popmedic

好的,找到了一种方法 没有共享配置文件或证书

我的想法是插入一个“运行脚本”构建阶段,以欺骗XCode签署一个它没有编译的应用程序,这样你就可以将编译的(未签名的)App发送到客户端,然后他们的XCode用他们的证书和轮廓。

怎么做: /

步骤1 :使XCode生成一个未签名的Release .app(我称之为“App A”)。请参阅此处的“禁用代码签名”: https://stackoverflow.com/a/10171462/375486

步骤2 :创建一个新的XCode iOS项目并从中删除所有构建阶段,因此它会创建一个空的.app文件(我称之为“App B”)

步骤3 :向项目B添加“运行脚本”构建阶段,将“应用程序A”的内容复制到“应用程序B”中。就我而言,我使用了这个:

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

步骤4 :将“B”XCode项目发送到客户端,包含所有必需的文件。

步骤5 :客户端构建B项目。在引擎盖下,XCode将运行“运行脚本”命令,然后对生成的应用程序进行签名,客户端将获得完美签名的应用程序。

就是这样:)

1
hasvn

我去过那儿。选项2或3是不可能的。选项4将是理想的,但正如您所写,Apple不会让代理委派她的权限来创建分发配置文件。

基本上,您唯一的选择是让您获得使用其帐户定义的分发配置文件。为了让您处理它,您需要以其代理身份登录,这不是一个选项。

所以 他们 必须这样做。没有办法解决这个问题。

他们还必须邀请您作为其产品开发团队的成员加入他们的帐户。你需要成为一名管理员。这意味着您将必须发送Apple概述的签名证书请求。

最后,他们必须下载并向您发送他们创建的分发配置文件。

有了这些,您就可以使用他们的资源为您的应用程序签名。

0
Jean-Denis Muys

我刚刚和Apple取得联系。他们说这是唯一的方法: https://developer.Apple.com/library/ios/#qa/qa1763/_index.html

客户将您添加到他们的团队,并为您提供特定权限。

0
Joshua Smith