我们完全被困,请帮忙。
我和我的团队制作了一个iPhone应用程序,这是我们第一次尝试使用iOS。
一切都很好,直到我们提交我们的应用程序并在app-store上可用 - 推送通知服务无效。我在网上搜索并尝试通过人们的建议仔细检查我们的应用程序,但我找不到有什么问题。所以这个问题发布在这里。
这些是我们所做的:
我们构建应用程序,假设它名为“AppMaster”。
我们在iOS Provisioning Portal上创建了名为“pushtest”的AppId。此ID在开发和生产上启用了推送通知。
我们从上面的appId创建了一个名为“AppMasterPushTest”的Provisioning for development。此配置用于内部测试,团队中的每个人都将其安装在他们的Mac上。
我们的服务器由Java实现,我们使用java-apn包。在测试过程中,我们下载了用于开发的认证文件并写出了.p12文件,并通过使用包的api - withSandboxDestination()和.p12文件将我们的消息推送到“沙盒”服务器。测试顺利,收到通知。
我认为我们已经准备好了,所以我们创建了另一个名为“AppMaster”的AppId,并仅为生产启用推送通知。此ID写在应用程序的包标识符中。
我们在步骤5中从AppId进行了另一个名为“appMaster”的生产配置,并将分发方法设置为“App Store”。下载并重建应用程序。这个被提交给苹果公司,并在app-stroe上活跃起来。
服务器端,我们下载了生产认证并再次写出.p12文件。并使程序通过使用api - withProductionDestination()将消息推送到生产服务器,并且.p12刚写出来。
我们从App Store安装了该应用。遗憾的是,通知从未发出。
我们错过了什么吗?顺便说一句,我们在step5中创建的id看起来像“XXX.com.company.appname”,但是在app的bundle标识符中,我们只设置了“com.company.appname”部分而没有前缀。这可能是问题吗?
欢迎任何想法。
请成为我们的救星。感谢。
答案 0 :(得分:29)
上述评论不正确。应用程序ID在软件包ID之前有一个前缀:
应用程序ID由应用程序的前缀为的包ID组成 Apple生成的十个字符的代码。团队管理员必须输入 捆绑ID。对于证书,它必须包含特定的捆绑包 ID;您不能使用“通配符”应用程序ID。
您应该检查您的配置文件,以确保它包含正确的aps权利:
验证配置文件文件中的权利是否为 正确。为此,请在文本编辑器中打开.mobileprovision文件。 该文件的内容以XML格式构成。在权利中 字典找到aps-environment密钥。为了发展 配置文件,该键的字符串值应该是 发展;对于分发配置文件,字符串值 应生产。
在向生产APNS服务器发送推送通知时,应确保使用生产设备令牌(在沙箱环境中工作的设备令牌在生产环境中不起作用)。
您应该在将应用程序发布到应用程序商店之前使用AdHoc配置文件测试您的应用程序。 AdHoc配置文件适用于生产推送环境。
编辑:
有关设备令牌的一些引用:
来自Local and Push Notification Programming Guide:
请注意生产环境中的设备令牌和 开发(沙箱)环境中的设备令牌是不一样的 值。
处理格式错误的通知
如果推送服务,简单的二进制接口将断开连接 以某种方式收到不正确的通知。你的提供者 可能会将此视为EPIPE或管道错误,以响应发送a 通知。另一方面,增强的二进制接口将 发送错误响应,其中包含有关内容的更详细信息 在断开连接之前通知错误。确定 您的提供商正确捕获并处理这些条件。
最常见的问题是设备令牌无效。如果令牌来了 来自沙盒环境,例如当你测试时 开发内置,你不能把它发送到生产推动 服务。每个推送环境都会为其发出不同的令牌 相同的设备或计算机。如果您确实发送了设备令牌错误 在环境中,推送服务会将其视为无效令牌 放弃通知。
最后,this article很好地解释了当某些通知无效时(最常见的原因是设备令牌无效)向Apple发送多个通知,可能导致某些有效通知无法到达好。