iOS和谷歌云消息:一系列通知中缺少推送通知



我使用谷歌云消息在iOS应用程序中接收推送通知。为了了解系统的可靠性,我进行了两次测试。1.在应用程序处于前台时接收通知称为旋度12.在应用程序处于后台时接收通知。iOS主屏幕可见。然后设备被锁定。在下面的中称为卷曲2,3,4

对于这两个测试,我都使用一个终端程序向GCM连续发送10个推送通知。

#!/bin/bash
api_key="MYAPYKEYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
reg_id="MYREGIDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
for i in `seq 1 10`;
        do
            echo "Sending message $i"
            curl    --header "Authorization: key=$api_key"  --header Content-Type:"application/json"    https://android.googleapis.com/gcm/send  -d "{"registration_ids":["$reg_id"], "data":{"message": "This is $i"}, "content_available":true}"
            echo " "
        done

我的AppDelegate.swift包含以下代码:对于此测试,我只是将收到的通知记录到控制台。

func application( application: UIApplication,
        didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
            self.log.debug("(userInfo["gcm.message_id"]): type: (userInfo) ")
        // This works only if the app started the GCM service
        GCMService.sharedInstance().appDidReceiveMessage(userInfo);
        // Handle the received message
        // [START_EXCLUDE]
        NSNotificationCenter.defaultCenter().postNotificationName(messageKey, object: nil,
            userInfo: userInfo)
        // [END_EXCLUDE]
}
func application( application: UIApplication,
    didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
    fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) {
        self.log.debug("(userInfo["gcm.message_id"]): type: (userInfo) ")
        // This works only if the app started the GCM service
        GCMService.sharedInstance().appDidReceiveMessage(userInfo);
        // Handle the received message
        // Invoke the completion handler passing the appropriate UIBackgroundFetchResult value
        // [START_EXCLUDE]
        NSNotificationCenter.defaultCenter().postNotificationName(messageKey, object: nil,
            userInfo: userInfo)
        // [END_EXCLUDE]
        handler(UIBackgroundFetchResult.NewData)
}
    // [END ack_message_reception]

curl 1:在应用程序处于活动状态时运行

$ sh gcm-push-curl.sh 
Sending message 1
{"multicast_id":7601092806058312069,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966587095558%d9588296d9588296"}]} 
Sending message 2
{"multicast_id":5909902520187109640,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966587866963%d9588296d9588296"}]} 
Sending message 3
{"multicast_id":4614499459908171704,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966589361277%d9588296d9588296"}]} 
Sending message 4
{"multicast_id":8134668915396219272,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966590641578%d9588296d9588296"}]} 
Sending message 5
{"multicast_id":4784965394490169762,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966591587472%d9588296d9588296"}]} 
Sending message 6
{"multicast_id":6241530976591223030,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966594764987%d9588296d9588296"}]} 
Sending message 7
{"multicast_id":8978902798439854756,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966595671922%d9588296d9588296"}]} 
Sending message 8
{"multicast_id":6283825418645144982,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966596474541%d9588296d9588296"}]} 
Sending message 9
{"multicast_id":8120719633509436218,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966597242071%d9588296d9588296"}]} 
Sending message 10
{"multicast_id":8512105467086003642,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966597991847%d9588296d9588296"}]} 

curl 2:在应用程序处于后台且设备锁定时运行

$sh gcm-push-curl.sh 
Sending message 1
{"multicast_id":5588705638430973508,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966661606755%d9588296d9588296"}]} 
Sending message 2
{"multicast_id":9016701196490961038,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966662368880%d9588296d9588296"}]} 
Sending message 3
{"multicast_id":8811760824655650118,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966664079778%d9588296d9588296"}]} 
Sending message 4
{"multicast_id":5409935873727765078,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966665050940%d9588296d9588296"}]} 
Sending message 5
{"multicast_id":7729732231428218287,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966666508932%d9588296d9588296"}]} 
Sending message 6
{"multicast_id":8188050074826382607,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966667585382%d9588296d9588296"}]} 
Sending message 7
{"multicast_id":5913793804137018252,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966671009307%d9588296d9588296"}]} 
Sending message 8
{"multicast_id":5601975420774004308,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966672984512%d9588296d9588296"}]} 
Sending message 9
{"multicast_id":8457313732470913239,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966673716583%d9588296d9588296"}]} 
Sending message 10
{"multicast_id":5371949804462995150,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966675441327%d9588296d9588296"}]} 

curl 3:在应用程序处于后台并且设备再次锁定时运行

$ sh gcm-push-curl.sh 
Sending message 1
{"multicast_id":5557012639197983768,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966719944546%d9588296d9588296"}]} 
Sending message 2
{"multicast_id":4730409051405748208,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966724620582%d9588296d9588296"}]} 
Sending message 3
{"multicast_id":5530580902639958686,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966725438291%d9588296d9588296"}]} 
Sending message 4
{"multicast_id":9111474059722223027,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966727055882%d9588296d9588296"}]} 
Sending message 5
{"multicast_id":7841377277124478181,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966728970341%d9588296d9588296"}]} 
Sending message 6
{"multicast_id":5594543271725809615,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966730800067%d9588296d9588296"}]} 
Sending message 7
{"multicast_id":8685309308966690464,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966731640101%d9588296d9588296"}]} 
Sending message 8
{"multicast_id":8859997925201491765,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966735618351%d9588296d9588296"}]} 
Sending message 9
{"multicast_id":8830947759563422702,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966737433853%d9588296d9588296"}]} 
Sending message 10
{"multicast_id":5660703487823801785,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446966738664391%d9588296d9588296"}]} 

curl 4:在应用程序处于后台时运行,设备再次锁定

$sh gcm-push-curl.sh 
Sending message 1
{"multicast_id":4866730914828951532,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967658074261%d9588296d9588296"}]} 
Sending message 2
{"multicast_id":8385741491167809594,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967658837166%d9588296d9588296"}]} 
Sending message 3
{"multicast_id":7340882174172500805,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967660847155%d9588296d9588296"}]} 
Sending message 4
{"multicast_id":8822097918345564456,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967661759583%d9588296d9588296"}]} 
Sending message 5
{"multicast_id":9155633918940805212,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967662891127%d9588296d9588296"}]} 
Sending message 6
{"multicast_id":8374566084159111686,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967663658639%d9588296d9588296"}]} 
Sending message 7
{"multicast_id":5062396269674637650,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967664476061%d9588296d9588296"}]} 
Sending message 8
{"multicast_id":5632447549491506026,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967665191507%d9588296d9588296"}]} 
Sending message 9
{"multicast_id":5582459520681321352,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967665936985%d9588296d9588296"}]} 
Sending message 10
{"multicast_id":7328958609399996860,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1446967668825005%d9588296d9588296"}]} 

结果:

卷曲1之后

2015-11-08 08:09:47.718 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966587095558%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 1, gcm.message_id: 0:1446966587095558%d9588296d9588296] 
2015-11-08 08:09:48.434 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966587866963%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 2, gcm.message_id: 0:1446966587866963%d9588296d9588296] 
2015-11-08 08:09:49.973 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966589361277%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 3, gcm.message_id: 0:1446966589361277%d9588296d9588296] 
2015-11-08 08:09:51.401 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966590641578%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 4, gcm.message_id: 0:1446966590641578%d9588296d9588296] 
2015-11-08 08:09:52.222 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966591587472%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 5, gcm.message_id: 0:1446966591587472%d9588296d9588296] 
2015-11-08 08:09:55.397 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966594764987%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 6, gcm.message_id: 0:1446966594764987%d9588296d9588296] 
2015-11-08 08:09:56.317 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966595671922%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 7, gcm.message_id: 0:1446966595671922%d9588296d9588296] 
2015-11-08 08:09:57.036 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966596474541%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 8, gcm.message_id: 0:1446966596474541%d9588296d9588296] 
2015-11-08 08:09:57.855 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966597242071%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 9, gcm.message_id: 0:1446966597242071%d9588296d9588296] 
2015-11-08 08:09:58.569 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966597991847%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 10, gcm.message_id: 0:1446966597991847%d9588296d9588296] 

卷曲2之后

2015-11-08 08:11:05.404 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966661606755%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 1, gcm.message_id: 0:1446966661606755%d9588296d9588296] 
2015-11-08 08:11:07.286 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966662368880%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 2, gcm.message_id: 0:1446966662368880%d9588296d9588296] 
2015-11-08 08:11:10.109 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966664079778%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 3, gcm.message_id: 0:1446966664079778%d9588296d9588296] 

卷曲3之后

2015-11-08 08:12:16.960 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966730800067%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 6, gcm.message_id: 0:1446966730800067%d9588296d9588296] 
2015-11-08 08:12:18.698 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966731640101%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 7, gcm.message_id: 0:1446966731640101%d9588296d9588296] 
2015-11-08 08:12:22.159 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966735618351%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 8, gcm.message_id: 0:1446966735618351%d9588296d9588296] 
    ### 30 seconds later...
2015-11-08 08:20:57.287 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446966738664391%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 10, gcm.message_id: 0:1446966738664391%d9588296d9588296] 

卷曲4之后

2015-11-08 08:27:41.779 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446967658074261%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 1, gcm.message_id: 0:1446967658074261%d9588296d9588296] 
2015-11-08 08:27:43.798 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446967658837166%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 2, gcm.message_id: 0:1446967658837166%d9588296d9588296] 
2015-11-08 08:27:49.739 [Debug] [main] [AppDelegate.swift:206] application(_:didReceiveRemoteNotification:fetchCompletionHandler:) > Optional(0:1446967662891127%d9588296d9588296): type: [aps: {
    "content-available" = 1;
}, message: This is 5, gcm.message_id: 0:1446967662891127%d9588296d9588296]

正如您所看到的,当设备被锁定时,并不是所有的通知都会被接收。但有些人,有些人来晚了(第三卷第10名)。

我不知道该怎么办,因为一般都会收到通知。

我希望你们中有人有任何想法。

最佳西蒙

第1版:我查看了一次日志,发现从未调用过func application( application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject])

GCM在应用程序不在前台时使用APN传递消息。APN不保证通知送达。

重要提示:发送通知是"尽最大努力",而不是保证。它不打算将数据传递到您的应用程序,仅用于通知用户存在可用的新数据。

我认为,在应用程序不在的情况下,通过APN发送可用的背靠背消息是前景,就像你在测试中所做的那样,会导致消息丢失。也许延迟更长的测试会减少丢弃的消息。

如果您的消息具有高优先级,请考虑将消息的优先级值设置为高,但前提是该消息需要像聊天消息一样的用户交互。

最新更新