【问题标题】:apple push notification not working in production苹果推送通知在生产中不起作用
【发布时间】:2013-03-13 19:23:00
【问题描述】:

我们完全陷入困境,请帮助。

我和我的团队制作了一个 iPhone 应用程序,这是我们第一次在 iOS 上尝试。

一切都很好,直到我们提交了我们的应用程序并在应用程序商店上架——推送通知服务无法正常工作。我在网上搜索并尝试按照人们的建议仔细检查我们的应用程序,但我找不到问题所在。所以这个问题贴在这里。

这些是我们所做的:

  1. 我们构建应用程序,假设它被命名为“AppMaster”。

  2. 我们在 iOS 配置门户上创建了 AppId,名为:“pushtest”。此 ID 在开发和生产中都启用了推送通知。

  3. 我们从上面的 appId 创建了一个名为“AppMasterPushTest”的开发供应。此配置用于内部测试,团队的每个人都将其安装在他们的 mac 上。

  4. 我们的服务器是由 Java 实现的,我们使用了 java-apn 包。在测试过程中,我们下载了用于开发的认证文件并写出 .p12 文件,并使用该包的 api --withSandboxDestination() 和该 .p12 文件将我们的消息推送到“沙盒”服务器。测试顺利,收到通知。

  5. 我以为我们已经准备好了,所以我们创建了另一个名为“AppMaster”的 AppId,并仅为生产启用推送通知。这个 Id 写在应用的包标识符中。

  6. 在第 5 步中,我们从 AppId 为生产创建了另一个名为“appMaster”的 Provisioning,分发方法设置为“App Store”。下载它并重建应用程序。这个已提交给苹果,并在 app-stroe 上运行。

  7. 服务器端,我们下载了生产认证并再次写出.p12文件。并编写程序使用api-withProductionDestination()将消息推送到生产服务器,其中.p12刚刚被写入。

  8. 我们从 App Store 安装了该应用程序。遗憾的是,通知从未送达。

我们错过了什么吗?顺便说一句,我们在第 5 步中创建的 id 看起来像“XXX.com.company.appname”,但在应用程序的包标识符中,我们只是设置了“com.company.appname”部分没有前缀。这可能是问题吗?

欢迎任何想法。

请成为我们的救星。谢谢。

【问题讨论】:

  • 你自己说的。推送应用 ID 和实际捆绑包 ID 应该相同。您的证书也可能有问题。确保您的主分发证书和推送证书使用相同的 SSH RSA 密钥对签名。
  • 您可以尝试从 .p12 创建一个 pem 文件,然后尝试通过 PHP 发送推送。这是链接 - raywenderlich.com/3443/…
  • 谢谢大家。关于应用程序 ID,我认为 Eran 是对的。而且我们的服务器是纯java的,加个php工具太费劲了。

标签: iphone ios push-notification apple-push-notifications


【解决方案1】:

上面的评论不正确。 app ID 在 bundle ID 前有一个前缀:

应用程序 ID 由应用程序的捆绑包 ID 组成,前缀为 Apple 生成的十字符代码。团队管理员必须输入 捆绑标识。对于证书,它必须包含特定的捆绑包 ID;您不能使用“通配符”应用程序 ID。

您应该检查您的配置文件,以确保它包含正确的 aps 权利:

验证配置文件中的权利是 正确的。为此,请在文本编辑器中打开 .mobileprovision 文件。 该文件的内容采用 XML 结构。在权利 字典找到 aps-environment 键。为了一个发展 配置文件,这个键的字符串值应该是 发展;对于分发配置文件,字符串值 应该是生产

您应该确保在向生产 APNS 服务器发送推送通知时使用生产设备令牌(在沙盒环境中工作的设备令牌在生产环境中不起作用)。

在将应用发布到应用商店之前,您应该使用 AdHoc 配置文件对其进行测试。 AdHoc 配置文件适用于生产推送环境。

编辑:

关于设备令牌的一些引用:

来自Local and Push Notification Programming Guide

请注意,生产环境中的设备令牌和 开发(沙盒)环境中的设备令牌不一样 价值。

来自Technical Note TN2265

处理格式错误的通知

如果推送服务,简单的二进制接口会断开连接 收到在某种程度上不正确的通知。您的提供商 可能会将此视为 EPIPE 或损坏的管道错误,以响应发送 通知。另一方面,增强的二进制接口将 发送错误响应,其中包含有关发生了什么的更详细信息 在断开连接之前通知错误。确定 您的提供商会正确捕获并处理这些情况。

最常见的问题是设备令牌无效。如果令牌来了 从沙盒环境中,例如当您测试一个 内部开发,您不能将其发送到生产推送 服务。每个推送环境都会为 相同的设备或计算机。如果您确实将设备令牌发送到错误的 环境中,推送服务会将其视为无效令牌,并且 丢弃通知。

最后,this article 很好地解释了当某些通知无效时(最常见的原因是设备令牌无效)如何向 Apple 发送多个通知,可能会导致某些有效通知也无法到达。

【讨论】:

  • 感谢 Eran,我们检查了我们的配置文件,它确实有“aps-environment”键,值为“production”。现在我不确定设备令牌,但对于我自己的 iPhone,我们的系统确实显示了两个不同的令牌。还在努力……
  • @HetfieldJoe 如果您有两个令牌用于同一设备,则只有一个令牌适用于生产环境。如果您尝试发送给他们两个,如果您首先发送错误的令牌(这将关闭连接),他们可能都会失败。
  • 这是一个新想法。会检查它
  • 嗨,Eran,它成功了。虽然我不确定这是不是问题,但它确实有效。我们从数据库中删除了所有令牌,并使用“仅生产”令牌重新创建它,过了一会儿,消息传递了。你知道,感觉就像,在我找到钥匙之前,门就被打开了。非常感谢我们的团队,干杯! (开发中心有没有关于这个问题的文档?这可能会给每个人带来麻烦。)
  • @HetfieldJoe 我很高兴它成功了。转动钥匙后门就开了。请参阅我添加到答案中的引号和链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多