带有 iOs 的 Phonegap 推送通知插件

Posted

技术标签:

【中文标题】带有 iOs 的 Phonegap 推送通知插件【英文标题】:Phonegap push notification plugin with iOs 【发布时间】:2016-07-02 21:36:16 【问题描述】:

我正在使用 phonegap-plugin-push 向 android 设备发送推送通知。

我正在尝试弄清楚如何向 iO 发送通知。

我已经在https://developers.google.com/mobile/add?platform=ios&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging%2Fios%2Fclient&cntlbl=Continue%20Adding%20GCM%20Support&%3Fconfigured%3Dtrue注册了

我在客户端应用程序中获取令牌的方式与在 Android 中相同:

var push = PushNotification.init(
        android: 
            senderID: "5993...475"
        ,
        ios: 
            alert: "true",
            badge: true,
            sound: 'false'
        ,
        windows: 
    );

push.on('registration', function(data) 

    $.ajax(
        url: '/save-token/',
        data: token: data.registrationId,
        success: function (json) 

        
    );


);

在我得到客户的令牌后,我尝试向他们发送推送通知:

$to = ModelGcmTokens::getInstance()->getToken($userId);

$API_KEY = 'AIzaS...HcEYC346zQ';


        $message = array(
            'data' => array(
                'title' => ($title) ? $title : 'Test!',
                'message' => $message
            ),
            'to' => $to
        );

        $message = json_encode($message);

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL,"https://gcm-http.googleapis.com/gcm/send");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $message);


        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Authorization:key=$API_KEY",
            "Content-Type:application/json",
        ));

        // receive server response ...
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $server_output = curl_exec ($ch);

        curl_close ($ch);

        // further processing ....
        if ($server_output == "OK") 

            return true;
         else 

            return false;
        

Google 云消息以 InvalidRegistration 错误响应:

"multicast_id":4701637331500989392,"success":0,"failure":1,"canonical_ids":0,"results":["error":"InvalidRegistration"]

当我用谷歌搜索这个错误时 - 据说我得到了客户的令牌错误。 但我使用与 Android 上相同的 excat 脚本得到它。它适用于 Android。

我看到的唯一区别是令牌的格式:

谁能告诉我如何让推送插件在 iO 上工作? iOs 令牌有什么问题,我应该如何向 GCM 发送消息以供 iOs 接收?

非常感谢您的任何建议。我真的被困住了。

【问题讨论】:

Apple push 有不同的环境用于发送推送,一种用于开发,一种用于生产。如果您获得 dev 令牌并将其发送到 prod 环境,反之亦然,那么它将无法工作。您知道您尝试将推送发送到 iOS 的环境吗? 好吧,我得到了生产密钥并将其发送到生产服务器 我真的不明白如何获得“生产”或“开发”令牌。我通过插件的魔力得到它们,当它向 GCM 服务器发送一些信号并从那里获取令牌时。它是什么令牌——我不知道。但应该是生产,因为我已将生产 p12 密钥上传到 GCM 服务器。 【参考方案1】:

您调用 init 方法的方式是从 APNS 而非 GCM 请求注册 ID。如果您阅读 phonegap-plugin-push 存储库中GCM on iOS 上的文档,您会看到需要像这样调用 init:

var push = PushNotification.init(
    android: 
        senderID: "5993...475"
    ,
    ios: 
        senderID: "5993...475",
        gcmSandbox: true,
        alert: "true",
        badge: true,
        sound: 'false'
    ,
    windows: 
);

如果 iOS 选项有 senderID,它将注册到 GCM。

另外,我注意到在对其中一个 cmets 的回复中,您不知道 APNS 上的 productiondevelopment 环境之间的区别。好吧,你真的需要阅读这个。在 iOS 设备上,APNS 环境会有所不同,具体取决于您是否使用 productiondevelopment 环境。如果您将应用设置为 development 并通过 production 发送推送,它将永远不会到达您的设备。

现在您可能会问我为什么要谈论 APNS。这是因为当您在 iOS 上使用 GCM 时,您会将推送消息发送到 GCM,然后 GCM 会将您的消息转发到 APNS 服务器,最后转发到您的设备。

【讨论】:

非常感谢。这句话If the iOS options has a senderID it will register with GCM. - 如此简单和非常重要。再次感谢! Simon,如果您看一下下一个问题,我将不胜感激;我现在没有得到任何registrationId ***.com/questions/38268507/…

以上是关于带有 iOs 的 Phonegap 推送通知插件的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap 无需插件即可构建远程推送通知?

使用PhoneGap插件点击推送通知时无法打开应用程序?

Icenium/phonegap ios 推送通知和 php 处理

iOS,电话间隙推送插件('通知')未触发

使用 PhoneGap 管理推送通知的平台

Phonegap 推送插件。单击通知后打开特定的应用程序视图