2

我有一个需要推送功能的 iOS 应用程序,为此我创建了必要的开发和生产 SSL 证书并将它们加载到通知提供程序(node-apn)上;

通知在 APNs 沙盒环境中工作正常,但是,在生产设置上发送通知时,提供者从 APNs 网关收到缺少主题错误。

在检查产品证书后,我看到证书扩展下列出了三个项目,如预期的那样:

  1. app.bundle.id
  2. app.bundle.id.voip 和
  3. app.bundle.id.complication

APSd 登录手机,显示当应用向操作系统注册其通知设置时,相关主题(app.bundle.id)已启用。因此,在应用程序方面,我的设置看起来不错。

根据 Apple 文档,来自 Provider 的通知发布 POST 必须包含一个apn-topic标头 iff,该应用程序支持多个主题。

我的理解是 voip 和复杂节点会自动添加到证书扩展中,并不一定意味着单独的主题。

问题 :

  1. apn-topic 标头是强制性的还是可选的?

  2. 上述设置被视为多主题还是单主题?

  3. 每个通知提供者是否需要知道它支持的每个应用程序的捆绑 ID/主题,并使用该值将 apn-topic 标头发送到 APNs?

好心提醒。

4

2 回答 2

1

使用 Legacy 证书,开发人员为他们的应用程序支持的每种类型的功能获得一个证书:常规 PUSH 通知、VoIP 等。每个都只配置一个主题,因此当通知提供程序使用旧证书与 APNs 网关接口时,主题规范是可选的。

通过新的 http2 接口和通用证书的引入,开发人员现在可以获得一个证书,如果他们愿意的话,它允许标准推送、VoIP 推送和 watchkit 通知。这意味着同一个证书可以有多个主题(就像我的情况一样)。因此,当通知提供者使用新的通用证书与 APNs 网关交互时,必须在 http 标头中指定主题,并且主题需要与证书中存在的主题相匹配。

主题标题不再是可选的。

于 2017-02-15T12:00:03.960 回答
1

我在 dev 和 prod 之间遇到了类似的问题,在我的情况下,与文档相关的标题中的问题说:

apns-id、apns-expiration 和 apns-collapse-id 请求标头采用的适当编码取决于它是初始 POST 操作的一部分还是后续 POST 操作的一部分,如下所示: 第一次发送这些标头时,使用增量索引对它们进行编码以允许将标头名称添加到动态表中随后发送这些标头时,将它们编码为文字标头字段而不进行索引

对 APN 的 HTTP/2 请求

所以在 PHP 中,请求的标头是这样的:

 $headers[] = 'content-length: ' . strlen($data);
 $headers[] = 'apns-topic: ' . $message->topic;
 $headers[] = 'apns-expiration: ' . ($message->time_to_live ? (int)$message->time_to_live + time() : 0);

没有名字或钥匙。

我希望它可以帮助某人

于 2017-01-04T20:24:26.153 回答