切换到企业分发后推送通知不起作用

Push notifications not working after switching to Enterprise distribution

我在使用临时分发的应用程序上运行推送通知。然后我的客户购买了企业版许可证,我生成了新的 certificates/profiles,存档了应用程序,现在我们通过企业版进行分发,但推送通知不再有效。为了让他们在企业版上工作,我必须采取什么步骤?谢谢!

根据您的描述,您似乎是在一个开发者帐户下注册的 AppId 上完成最初的实施,然后尝试将构建迁移到第二个开发者帐户。

用 APNS 的说法,生成推送通知负载对象的服务器称为提供者,必须注册一个 APNS 证书密钥对才能在您的服务器和相关的 Apple 推送通知网关(沙盒或生产)。此密钥对专用于其注册的 AppId,而 AppId 专用于其注册的开发者帐户——即使具有精确匹配的在一个帐户下注册的 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 供应配置文件。
  • 使用新的配置文件重建您的应用程序。

重建可能是必要的,因为如果企业 AppID 没有启用推送通知,企业分发配置文件的授权块将不包含 aps-environment 密钥,因此被禁止连接 APNS 网关.