发送多个 iPhone 推送通知 + APNS + PHP

我正在开发一个PHP网站+ iPhone应用程序和用于iPhone应用程序的API,有一个针对学生和医生的消息系统,当任何人发送消息(来自网站或iPhone)时,另一个用户应该在他的iPhone上收到推送通知。例如,如果学生为教师添加了新问题,则教师 iPhone/iPad 上的推送通知将发送给教师,当教师回复学生的答案时,学生将收到推送通知。

由于注册网站的教师和学生数量没有限制,我的问题是如何将推送消息发送到注册用户的iPhone?我想在有人回复或添加问题后立即发送推送消息。请为我提供用于发送多个推送消息的 PHP 代码。我在注册时为每个用户保存设备令牌。

当老师回复问题时,我正在向学生发送邮件,我也想向学生发送推送通知,反之亦然,因此请指定能够管理错误条件的代码。


答案 1

简单的方法,无需使用任何文件。你可以用不同的Tokiked多次调用它。

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ckipad.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', 
    $err, 
    $errstr, 
    60, 
    STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, 
    $ctx);

//if (!$fp)
//exit("Failed to connect amarnew: $err $errstr" . PHP_EOL);

//echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
    'badge' => +1,
    'alert' => $message,
    'sound' => 'default'
);

$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered amar'.$message. PHP_EOL;

// Close the connection to the server
fclose($fp);

答案 2

您应该更好地将APNS库用于PHP。你可以在这里找到它。浏览开发人员提供的示例。

我也遇到了证书问题。我的行为是:

  1. 定位文件ApnsPHP/Abstract.php
  2. 对方法进行一些更改,粘贴此行_connect()

    $streamContext = stream_context_create(
                       array(
                         'ssl' => array(
                                   'local_cert' => $this->_sProviderCertificateFile,
                                   'passphrase' => ''
                                  )
                       )
    );
    
    $this->_hSocket = @stream_socket_client(
                        $sURL, 
                        $nError, 
                        $sError,
                        $this->_nConnectTimeout,
                        STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
                        $streamContext);
    

    而不是原始列在那里

  3. 现在,您可以使用 *.pem 证书,而无需entrust_root_certification_authority。

这对我来说很好。


推荐