ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP代码点火器使用curl为iOS推送通知

2019-11-22 15:33:08  阅读:198  来源: 互联网

标签:codeigniter curl apple-push-notifications ios php


我做了网络服务,可以使用curl将推送通知发送到ios,
我有待开发的ck.pem文件,其中同时包含cert& RSA私钥,并正确引用它.

但是每次我调用网络服务时,都会遇到相同的错误
卷曲失败:无法使用客户端证书(找不到密钥或密码错误?)

除了使用“ stream_context_create”的替代方案之外,所有相关解决方案均不起作用,但是我想使用curl和idk来解决问题所在.

在我的代码下面找到:

function test_push_to_ios() {
    $url = 'https://gateway.sandbox.push.apple.com:2195';
    $cert = base_url() . 'backend_includes/ios_cert/ck.pem';

    $gcm_ids = array("xxxxxx");
    $passphrase = "passphrase";
    $message = 'nbad_notification';
    $aps = array('alert' => $message, 'sound' => 'default');
    $fields = array('device_tokens' => $gcm_ids, 'data' => $message, 'aps' => $aps);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSLCERT, $cert);
    //curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $passphrase);
    curl_setopt($ch, CURLOPT_SSLKEY, $cert);
    curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $passphrase);
    curl_setopt($ch, CURLOPT_CERTINFO, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }
    curl_close($ch);
    echo json_encode($result);
}

解决方法:

我没有仔细阅读您的问题.

您正在尝试通过HTTPS请求将推送通知发送给Apple.那行不通. Apple Push Notifications仅通过TCP协议使用特定的二进制格式.

As a provider you communicate with Apple Push Notification service over a binary interface. This interface is a high-speed, high-capacity interface for providers; it uses a streaming TCP socket design in conjunction with binary content. The binary interface is asynchronous.

您的代码有很多问题:

您似乎将GCM代码与APNS代码混合在一起.
$fields = array(‘device_tokens’=> $gcm_ids,’data’=> $message,’aps’=> $aps);看起来与向Google Cloud Messaging服务器发送消息时的操作类似.但是GCM与APNS完全不同,那么您为什么认为这可行?

您正在发送JSON主体,这与GCM兼容,但是APNS使用二进制格式.虽然发给APNS的二进制消息中的有效负载包含一个编码的JSON字符串(看起来与$aps JSON相似),但是您不能将其打包在另一个JSON中并期望它可以工作.

并且在APNS服务器前添加https://不能使其支持HTTPS,因为它没有实现为支持HTTPS(也不是HTTP).

我建议您使用stream_context,它可以工作.

标签:codeigniter,curl,apple-push-notifications,ios,php
来源: https://codeday.me/bug/20191122/2060555.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有