当应用程序处于非活动状态时,GCM 推送通知不适用于 iOS

Posted

技术标签:

【中文标题】当应用程序处于非活动状态时,GCM 推送通知不适用于 iOS【英文标题】:GCM push notifications not working for iOS when the app is not active 【发布时间】:2015-10-12 17:53:16 【问题描述】:

我在 xcode 中启用了后台模式并选中了“远程通知”。

我是否也必须启用“推送通知”?用于 GCM

这是来自我的休息客户端的有效负载


    "data": 


            "displayMessage": 
                "message": "Package delivered",

            

    ,
    "registration_ids": [
        "dgfdghdfghgfhhfjhgjghjghjhjghjghjghjghjghjghjhgggh"
    ],
    "content-available" : true,
    "priority": "high"

当应用程序在前台时这有效,当应用程序不在前台时无效。

非常感谢任何帮助让这个 GCM 用于 ios 工作。

【问题讨论】:

看看这个问题虽然***.com/questions/33192145/… GCM Notifications not receiving when app is in background mode in iOS的可能重复 【参考方案1】:

我建议检查这里提到的消息格式:

Making GCM work for iOS device in the background

【讨论】:

在发布这个问题之前我已经尝试过了,但没有成功。你能想到我可能缺少的其他东西吗? 我想它与服务器端而不是客户端有关,你能提供一些代码来展示你如何向 GCM 发出请求吗? @SanthoshAdari 我只是用户休息客户端,称为谷歌浏览器的“高级休息客户端” “到”: “dfgdfgdfgdfc:APA91bGAmf3utL-k3BaZtzVXYayceu6XfW28ewdsgdgdfgdfhgdfgdf86zxxVyi9sIvJqRBZxz18-6PzZxjDeX_Bdn-ZmXaeTslB8qCGsH4m79iUK1bueN2bzTpQ3tx”, “数据”: “声音”: “缺省”, “徽章”: “2”, “标题”: “默认”,“正文”:“测试推送!” , "内容可用":true 当我使用“通知”而不是“数据”时出现内部服务器错误。使用“数据”我可以在应用程序处于活动状态时打开通知。【参考方案2】:

你的钥匙错了。使用content_available,而不是content-available

另外,您的 JSON 无效。具体来说:

"message": "Package delivered",

结尾不应有逗号。

【讨论】:

content_available 总是会给我“InternalServerError”。我已阅读文档并同意它要求我们将 content_available 用于 gcm。 我正在使用 GCM 推送到 iOS 设备,它对我有用。我正在使用 content_available。 你能告诉我你用的是什么rest客户端吗? 当我使用 content_available 时,响应总是 multicast_id: 6973668141157543000 success: 0 failure: 1 canonical_ids: 0 results: [1] 0: error: "InternalServerError" - - 。但是,当我使用 content-available 时,它​​不会唤醒应用程序。 HTTP响应也是5xx错误吗?如果是这样,文档说联系 android-gcm 组报告错误。 developers.google.com/cloud-messaging/http-server-ref群组网址为groups.google.com/forum/#!forum/android-gcm【参考方案3】:

此问题发生在服务器端。通知消息正文应该是这样的。


  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "content_available" : "true"
  "notification" : 
    "body" : "great match!",
    "title" : "Portugal vs. Denmark"
    

这是我已经实现并且运行良好的代码。

<?php

// Message to send
$notificationTitle = "Notification title";
$notificationtBody  = "Notification arrived";

$registrationId = 'GCM_DEVICE_TOKEN';
$apiKey = "GCM_SERVER_KEY";

$response = sendNotification( 
                $apiKey, 
                $registrationId, 
                array(  
                    'sound' => "default", 
                    'badge' => 1, 
                    'body' => $notificationtBody,
                    'title' => $notificationTitle
                )
            );              

echo $response;


function sendNotification( $apiKey, $registrationId, $messageData )
   
    $headers = array("Content-Type:" . "application/json", "Authorization:" . "key=" . $apiKey);
    $data = array(
        'to' => $registrationId,
        'content_available' => true,
        'notification' => $messageData
    );

    $ch = curl_init();

    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); 
    curl_setopt( $ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send" );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data) );

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;

【讨论】:

【参考方案4】:

此通知对我有用


  "to":"ID",
  "notification":  
    "sound":"default",
    "title":"TITLE",
    "body":"BODY"
  ,
  "priority": "high"

【讨论】:

以上是关于当应用程序处于非活动状态时,GCM 推送通知不适用于 iOS的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序一天不活动时,GCM 推送通知不会出现在 iPhone 上

当应用程序处于非活动状态并运行代码时,Swift iOS 应用程序会收到推送通知

应用程序处于非活动状态时无法接收静默通知 iOS

如何在应用程序处于非活动状态时获取推送通知ios swift3

当应用程序关闭或不活动时,如何处理 iOS 应用程序中的推送通知?

当应用程序处于非运行状态时,推送通知委托触发的解决方案是啥?