【问题标题】:Test for Apple Push Notification测试 Apple 推送通知
【发布时间】:2015-07-08 06:47:44
【问题描述】:

我正在使用 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()

【问题讨论】:

    标签: node.js mongoose coffeescript apple-push-notifications apnagent


    【解决方案1】:

    我会使用像 nock 这样的请求模拟框架来拦截对 APN 的请求。网址似乎位于代码here

    【讨论】:

      【解决方案2】:

      据我所知,没有办法检查 APNS 请求是否已到达目的地。 Apple 对我们的开发人员往往有这种“一切都很好,如果不是,那应该是你的错”的政策。如果自从我开始编码后情况没有改变,您可以通过 2195 端口发送原始数据(JSON 有效负载,您可能知道整个格式)来发出 APNS 请求,但您绝对不会收到任何响应。

      我能想到的唯一一件事是,如果您有一个物理 iOS 设备(iPod、iPhone 或 iPad),您可以通过使用与您的设备相对应的硬编码令牌启动 PUSH 请求来“自动化”测试一个测试应用程序,如果您收到通知,则它可以工作。

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        1. 传出请求的格式是否正确(即 JSON 是否有效)
        2. 它是否包含您期望它包含的数据(即 JSON 中的字段存在并包含预期数据)
        3. 是否包含服务器所需的身份验证令牌
        4. 目标服务器是否正确(即您确实将数据发送到 xxx.apple.com 而不是 localhost)

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

        • 网络连接
        • 目标服务器可用性和适当的功能

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

        【讨论】:

        • 非常感谢您的详尽回答,以及 nock 的链接,我以前没有听说过,看起来是测试一些东西的好方法!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 1970-01-01
        相关资源
        最近更新 更多