根据您的描述,听起来好像您在一个开发者帐户下注册的 AppId 上进行了原始实施,然后尝试将构建迁移到第二个开发者帐户。
在 APNS 用语中,生成推送通知有效负载对象的服务器称为提供者,并且必须注册 APNS 证书密钥对才能在您的服务器和相关 Apple 推送通知网关(沙盒或生产)之间建立安全连接.此密钥对为其注册的 AppId 专有,AppIds 为其注册的开发者帐户专有 - 即使在一个帐户下注册的精确匹配的 AppId 证书也不能转移到第二个帐户。如果可能的话,我可以查看您应用的 AppId,在我自己的帐户中注册该 AppId,然后开始向您的应用发送垃圾邮件推送。值得庆幸的是,Bundle Seed ID 是所有 AppID 的静默元素,可以防止这种情况发生!
我已经回答了一个关于 APNS 配置的类似问题,这可能有助于进一步阐明幕后发生的事情,因此您可以阅读 Why I can't add APNs Development iOS typed certificate to provisioning profile。
如果您想查看您的 AppID 实际上是不同的,您可以使用几个终端命令从原始配置文件(工作正常的地方)和企业配置文件(工作不工作的地方)导出信息查看差异:
复制并粘贴以下内容,注意将路径更新为您的特定.mobileprovision:
/usr/libexec/PlistBuddy -c 'Print :Entitlements' /dev/stdin <<< $(security cms -D -i /path/to/your/original.mobileprovision)
然后再次运行此命令,更新企业配置文件的路径。
此命令的输出将是一个键值对字典:
Dict {
get-task-allow = true
aps-environment = development
com.apple.developer.team-identifier = ABC1DEF2G3
application-identifier = XYZW1ABC2D.com.mycompany.niftyapp
keychain-access-groups = Array {
XYZW1ABC2D.*
}
}
您会注意到这两个命令的输出是不同的——application-identifier 部分和 keychain-access-groups 部分将具有不同的捆绑种子 ID。
那我该如何解决呢?
修复非常简单,无需在应用程序内进行额外的开发工作!但是,您可能需要使用新的配置文件重新编译:
- 因为您已经设置好了,您只需要登录到企业帐户并在您的企业帐户的 AppId 中启用推送通知
- 在该 AppID 的配置中,您需要生成一个新的 SSL 密钥对并将其提交给 Apple,就像您为原始帐户所做的那样。
- 在推送服务器上安装新证书和私钥
- 编辑您的 Enterprise Distribution 配置文件,并将其安装到 Xcode 中,注意删除旧的 Enterprise Distribution 配置文件。
- 使用新的 Provisioning Profile 重建您的应用程序。
重建可能是必要的,因为如果 Enterprise AppID 未启用推送通知,则 Enterprise Distribution Provisioning Profile 的 Entitlements 块将不包含 aps-environment 密钥,因此被禁止与 APNS 网关连接。