【问题标题】:IOS Push Notifications not received or sent anymore for some users某些用户不再收到或发送 IOS 推送通知
【发布时间】:2016-02-29 09:14:48
【问题描述】:

我遇到了以下问题。

我有一个运行两年的 IOS 应用程序,推送通知没有问题。

我基本上所做的是将所有注册 ID 存储在数据库中,并通过 php 脚本向它们发送通知:

// 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);

$title = "My App";

$nachricht = $message['teams']['heim']." - ". $message['teams']['aus'];
// Create the payload body
$body['aps'] = array(
    'alert' => $title. " \n " . $nachricht,
    'sound' => 'default',
    'message' => $nachricht
    );
$body['id'] = $message['spiel'];
$body['message'] = $nachricht;
$body['title'] = $title;

// Encode the payload as JSON
$payload = json_encode($body);

for ($i = 0; $i < count($registation_ids); $i++) {
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $registation_ids[$i]) . pack('n', strlen($payload)) . $payload;

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

}
fclose($fp);

这个脚本我从来没有遇到过任何问题,但现在一些几周前收到通知的用户不再收到通知了。首先我认为我的证书和提供配置文件有问题,但是具有相同 IOS 版本和 App 版本的其他用户仍然收到通知。 我还检查了用户不再收到消息的通知设置,它们是正确的。

什么会导致这个问题? 目前我不知道错误发生在哪里。

【问题讨论】:

  • 注册时检查设备令牌..
  • 我认为他们没有注册,因为有些帐户确实在前一段时间收到了推送通知,而现在没有收到。他们可以设置一些设置,因为他们使用设备令牌作为密钥,这也是有效的

标签: php ios iphone notifications push-notification


【解决方案1】:
function send_notification_ios($registatoin_ids,$message) {

        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'passphrase', '');
        //for sandbox url

        stream_context_set_option($ctx, 'ssl', 'local_cert', 'pemios/dev_apns_vookar.pem');
        $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

        //for live url

        // stream_context_set_option($ctx, 'ssl', 'local_cert', 'pemios/apns-production.pem');
        //$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

        stream_set_blocking ($fp, 1);
        if (!$fp) {
            echo "Failed to connect (stream_socket_client): $err $errstr";
        }
        else {
            $apple_expiry = time() + (90 * 24 * 60 * 60);
            foreach($registatoin_ids  as $key=>$value){
                $apple_identifier = $key;
                $deviceToken = $value;
                $payload = json_encode($message);
                $msg = pack("C", 1) . pack("N", $apple_identifier) . pack("N", $apple_expiry) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload;
                fwrite($fp, $msg);
                //checkAppleErrorResponse($fp);
            }
        }
        usleep(500000);
        //checkAppleErrorResponse($fp);
        //mysql_close($con);
        fclose($fp);
        return true;
    }



 $iphonedeviceId = array($requestDataIos[0]['device_id']);
                    $body = array();

                      $body['aps']['alert'] = $message;
                    $body['aps']['userId'] = $params['user_id'];
                    $body['aps']['request_id'] = $params['request_id'];
                    $body['aps']['vendor_id'] = $params['vendor_id'];
                   // $body['aps']['request_vendor_arrived'] = 1;
                    $body['aps']['sender'] = $userDetails[0]['full_name'];


                    $body['aps']['badge'] = +1;
                    $body['aps']['userId'] = $userId;
                    $body['aps']['sound'] = "default";
                    $body['aps']['content-available'] = "1";
                    $body['aps']['nt'] = "3";
                    $this->send_notification_ios($iphonedeviceId, $body);

【讨论】:

  • 并检查您的 PEM 文件
  • 部分用户收到通知,我认为 PEM 文件没有任何问题?
  • 是的,但有些用户正在收到通知。然后是 Iphone id 的问题
  • 我对我的脚本唯一相关的区别是关闭 $fp 之前的 usleep(5000) 是否正确?
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2015-11-21
相关资源
最近更新 更多