苹果推送通知testing

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

我真正想知道的,并且可以find没有文档,如果正在发送推送通知如何在服务器上testing。 我正在使用apnagent,目前我可以看到推送通知正在通过手动检查我的设备正确发送,但我很难find一个自动的方式来testing,他们正在正常工作。


这可能足以说明在高层回答需要做些什么。 但是如果这里不是实际的代码:

mongoose模型在创build时触发推送通知:

#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??? 

然后在我的摩卡testing文件中有:

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

在许多情况下,在编写testing的时候,要么确认一个行为是否真的发生(即推送通知已经被发送),要么是不可能的,要么是太危险。 想象一下,为rm命令写一个unit testing,你可以确保rm -rf /成功。 显然,你不能让这个动作发生,并validation你的根分区确实是空的!

然而,你应该做什么,而且应该这样做,就是确保无论是执行任务所需的命令,例程或其他操作都能被正确调用,而不会实际上允许它们发生。

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

所以,而不是testing成功的交付,你testing

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

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

  • networking连接
  • 目标服务器可用性和正确的function

过去,我是这样处理的,首先手动发出正确的请求,捕获响应,然后在unit testing中嘲弄整个通信(使用ie nock) ,这样我就完全控制了整个通信。

据我所知,没有办法检查APNS请求是否到达目的地。 苹果公司往往把这个“一切都很好,如果不是这样,那就应该是你的错”的政策。 如果自从我开始编码以来事情没有改变,那么通过2195端口发送原始数据(JSON有效载荷,您可能知道整个格式)来发出APNS请求,并且完全没有响应。

唯一我能想到的,如果你有一个物理的iOS设备(一个iPod,一个iPhone或一个iPad),你可以通过启动一个带硬编码标记的PUSH请求来“自动化”一个testing,对应于你的设备和一个testing应用程序,如果你收到通知,那么它的作品。

噢,如果不起作用,请确保在防火墙后面运行所有需要的端口。 这是我第一次涉足这个领域的第一个大石头;)(相关: https : //support.apple.com/en-us/HT203609 )

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

Interesting Posts