不使用XCode对启用APNS的iOS应用进行代码签名

5
我想建立一个单窗口Mac应用程序,可以用于在不使用XCode的情况下对iOS应用程序进行代码签名。
我们的许多客户使用“企业许可证”来分发他们的应用程序。每年需要重新签名,这是重复性的工作。他们的要求如下:
1. 应用程序使用APNS 2. 他们不想共享他们的企业许可证 3. 在使用他们的证书进行签名时,应该能够替换Bundle标识符 4. 它们在Keychain中拥有相同名称的证书
用户界面具有以下字段:
1. *.ipa文件路径 2. *.mobileprovision文件路径 3. Keychain名称(如果存在多个具有相同名称的证书,则为可选项) 4. 证书的名称(iPhone Developer: .....)
我能够对应用程序进行代码签名,但重新签名后APNS无法正常工作。或者说重签名使用Bundle标识符是否可行?
此外,我想添加一个证书下拉列表的功能,以改善可用性。任何指针都将是巨大的帮助。

@AnoopVaidya 你是否可以在不使用XCode的情况下对使用APNS的应用程序进行代码签名? - Anupdas
1
你可以通过命令行进行代码签名,但相信我,你不想这样做。 - CodaFi
不,这不是通过命令行完成的,我正在尝试使用内置的codesign工具,通过NSTask使用它并提供一个非常简单的UI。我已经能够重新签名可以安装在iOS设备上的应用程序。问题出在推送通知上。 - Anupdas
2个回答

2
为了启用推送通知,需要对应用ID和配置文件进行配置并通过苹果(通过门户网站)允许。您无法仅通过重签名为任意配置文件/应用程序启用它。
在代码签名期间,权限需要将“apns-environment”键设置为“sandbox” /“production”,具体取决于应用程序使用的内容。这将由iOS在运行时进行验证。如果您使用第三方签名工具,则从配置文件中获取“apns-environment”值。
要进行调试,可以使用此命令查看包含.entitlements文件的.app文件:
codesign -d --requirements - --entitlements - path/to/My.app

如果配置文件启用了apns-environment,则应该看到一个值。


感谢您的回复。正如您所提到的,AppId和mobileprovision已按照标准配置。要求是使用有效的mobileprovision重新签名,该mobileprovision可能与先前的mobileprovision具有相同的appId,也可能没有。因此,如果我可以从我的mobileprovision中获取appid和entitlements,并将其提供给codesign任务。应用程序应该能够成功进行代码签名,对吗? - Anupdas
应该可以正常工作。我们经常使用内部脚本来完成此类操作。您需要更新Info.plist文件(包括新的应用程序ID),通过代码签名更新授权和嵌入式.mobileprovision文件。只要正确执行上述步骤,它就应该可以工作。 - Mike Weller
太好了,事实上我也独立完成了同样的操作。我从mobileprovision中提取了plist,然后提取了application-identifier,接着复制了info.plist并修改了CFBundleIdentifier,最后使用entitlements信息对应用进行了代码签名。现在它可以正常工作了,但整个过程似乎有些不正规。我已经接受了你的答案。再次感谢。 - Anupdas
可能看起来有些粗糙,但是你可以使用正确的脚本和工具自动化整个过程。该过程完全合法,并且正是Xcode在对应用程序进行代码签名时所做的。尽管有趣的是,Xcode并不修改授权。 - Mike Weller
如果不介意的话,您能否指出任何有效的链接以获取代码重构工具? - Anupdas
抱歉,我所知道的都是我为雇主开发的内容,我不能公开发布。 - Mike Weller

1

刚刚花了几个小时研究了这个问题,发现了以下的解决方法。在Mike的评论基础上更进一步,为遇到同样问题的其他人提供下面的命令行。

我从一个已经配置了生产推送通知的包标识的Xcode发布版本开始。

从终端窗口运行以下命令 - 将"大写部分"替换为您自己的信息。

codesign -d --entitlements -"NAME OF APP.app" > entitlements.plist

codesign -f -s "SIGNING CERTIFICATE NAME" --resource-rules "NAME OF APP.app/ResourceRules.plist" --entitlements entitlements.plist "NAME OF APP.app"

希望这能帮助下一个遇到同样问题的人。

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