测试 Apple 推送通知

Test for Apple Push Notification

我正在使用 node.js(服务器框架)和 mongoose.js(基于 mongo 的模式建模)作为 iOS 应用程序的后端,并且我正在使用 Mocha(测试框架)以确保一切正常。

我真正想知道但找不到相关文档的是如何在服务器上测试推送通知是否被正确发送。我正在使用 apnagent,目前我可以通过手动检查我的设备看到推送通知正在正确发送,但我很难找到一种自动化的方法来测试它们是否正常工作。


以上描述可能足以回答需要做什么的高层次问题。但以防万一这里没有实际代码:

Mongoose 模型在创建时触发推送通知:

#this code is called after this model is saved in mongodb
eventModel.post 'save', (doc) ->
  #push the message
  sendMessageToDevice = (event, token) ->
    message =
      event_body:
        eventId: event._id
        lat: event.lngLat[1]
        lng: event.lngLat[0]
    agent.createMessage()
      .device(token)
      .alert('New Event! ' + event.description)
      .set(message)
      .send()

  #cycle through the users to push to
  #get all the unique device tokens in the database for APN
  users.getAllUniqueDeviceTokens (error, devices) ->
    if error then return util.handleError error
    console.log "Sending push notices to all devices (%d):", devices.length
    console.log devices
    for token in devices
      sendMessageToDevice doc, token

    #send some verification here that the code ran correctly???

然后在我的 Mocha 测试文件中我有:

it 'should receive push notification from fort creation', (done) ->
    #some logic here to verify that push notifications were sent
    done()

我会使用像 nock to intercept the request to APN. The urls seem to be located in the code here 这样的请求模拟框架。

据我所知,没有办法检查 APNS 请求是否已到达目的地。 Apple 倾向于与我们的开发人员制定此 "everything's fine, and if it's not, then it should be your fault" 政策。如果自从我开始编码以来事情没有改变,你通过 2195 端口发送原始数据(JSON 有效负载,你可能知道整个格式)来发出 APNS 请求,你绝对没有得到任何回应。

我唯一能想到的是,如果你有物理 iOS 设备(iPod、iPhone 或 iPad),你可以 "automate"通过启动带有硬编码令牌的 PUSH 请求进行测试,该令牌对应于您的设备和测试应用程序,如果您收到通知,则它可以正常工作。

哦,如果它不起作用,请确保您在防火墙后操作时已打开所有必需的端口。这是我第一次涉足的第一块大石头;)(相关:https://support.apple.com/en-us/HT203609

在许多情况下,在编写测试时,验证操作是否确实发生(即已发送推送通知)是不可能的或太危险了。想象一下,为 rm 命令编写单元测试,您希望确保执行 rm -rf / 成功。显然,你不能让这个动作发生并验证你的根分区确实是空的!

然而,您可以做的(实际上应该做的)是验证是否正确调用了完成任务所需的任何命令、例程或其他操作,而不是实际允许它们发生。

在您的特定情况下,您不需要验证推送通知是否已送达,因为您的应用程序不负责通知的送达。但是,您可以测试推送通知是否正确传送到推送服务器。

因此,您不是测试是否成功交付,而是测试

  1. 传出请求的格式是否正确(即JSON有效)
  2. 它是否包含您期望它包含的数据(即 JSON 中的字段存在并且包含期望的数据)
  3. 是否包含服务器需要的认证token
  4. 目标服务器是否正确(即您确实将数据发送到 xxx.apple.com 而不是本地主机)

理想情况下,这些测试请求甚至不会到达目标服务器 - 这样做意味着您依赖两个并不总是非常稳定的因素:

  • 网络连接
  • 目标服务器可用性和正常功能

过去,我处理这个问题是先手​​动发出正确的请求,捕获响应,然后在单元测试中模拟整个通信(使用 nock。这样,我完全控制整个通信。