苹果推送通知 - PHP

3

在使用推送通知时,我遇到了问题。在开发中使用时可以正常工作,但当我想要在真实环境中使用它时,它就无法正常工作。

证书是为生产环境制作的。

当我使用它时,结果显示为:消息已成功发送,但我的手机却没有收到该消息。

<?php

pushNotification('wow2','DeviceToken');

function pushNotification($theMessage, $theDeviceToken)
{

        // Put your device token here (without spaces):
    $deviceToken = $theDeviceToken;     

    // Put your private key's passphrase here:
    $passphrase = 'Code';

    // Put your alert message here:
    $message = $theMessage;

    ////////////////////////////////////////////////////////////////////////////////

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

    // Open a connection to the APNS server
    $fp = stream_socket_client(
        'ssl://gateway.push.apple.com:2195', $err,
        $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

    if (!$fp)
        //exit("Failed to connect: $err $errstr" . PHP_EOL);
    exit("" . PHP_EOL);
    //echo 'Connected to APNS\n' . PHP_EOL;

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

    // Encode the payload as JSON
    $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' . PHP_EOL;

    fclose($fp);


}
?>      

有人能看出问题出在哪里吗? :)
3个回答

1

这里面有三种与APNS相关的问题:

  1. 设备令牌不匹配
  2. .pem文件无效,原因是.p12.cer文件有时会损坏,所以删除.p12文件和.cer文件,然后重新创建。
  3. 这并不是一个有价值的答案,但有时会发生——检查你的设备通知是否打开。

如果您需要一些参考,请使用以下链接:https://dev59.com/w2Eh5IYBdhLWcg3wMAwt,http://stackoverflow.com/questions/17896979/apns-push-notifications-is-not-working-with-production-certificate - Anbu.Karthik

0

我认为这是您的设备令牌出了问题。如果您的服务器中有无效的设备令牌,它将无法接收通知。一旦您从服务器中删除了无效的设备令牌,它就会正常工作。

我也遇到过同样的问题,花费了很长时间才找到解决方案。


我刚和一些朋友尝试了一下,但还是不行 :/ - Stof
@Stof 好的,请使用苹果开发者控制台登录并检查您的苹果应用程序的bundle identifier,看看是否启用了推送通知。 - Shanthanu

0

尝试使用您设备的硬编码设备令牌。

之后再尝试使用变量或回显设备令牌。

// 在此处放置您的设备令牌(不带空格):

$deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5dd43487462c7eaf61bbad78';

这就是我正在做的事情 :) - Stof
然后检查您的ck.pem生成过程并正确上传它们。 - Ram S
我已经用开发工具完成了这个任务,并且多次检查以确保它被正确地完成。 - Stof
你尝试过使用其他设备或手机吗?记得点击“好”的按钮接受推送通知对话框。同时也尝试重新启动你的设备。 - Ram S
是的,我尝试了所有这些方法;/ - Stof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接