【问题标题】:Can't push notification to APNS to update my pass in Apple Wallet无法向 APNS 推送通知以更新我在 Apple Wallet 中的通行证
【发布时间】:2016-10-04 10:25:39
【问题描述】:

我正在尝试向 APNS 推送通知以更新我在 Apple Wallet 应用中的通行证。根据this document,我们只需要将pass type identifier和push token发送给APNs即可。然后他们会处理剩下的事情。

$apnsHost = 'gateway.push.apple.com';
    $apnsPort = 2195;
    $apnsCert = base_path('app/config/passbook/certificates.pem');
    $payload = ['aps' => []];
    $payload = json_encode($payload);

    $streamContext = stream_context_create();
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
    stream_context_set_option($streamContext, 'ssl', 'passphrase', 'xxxxxx');

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);

    if(!$apns) {
        Logger::logError(1, "Passbook push notification error", ['serial_number' => $serialNumber, 'pass_type_id' => $passIdentify]);
        return "Failed to connect (stream_socket_client): $error $errorString";
    } else {
        foreach($push_tokens as $idx => $push_token) {
            $msg = chr(0) . pack('n', 32) . pack('H*', $push_token) . pack('n', strlen($payload)) . $payload;

            fwrite($apns, $msg);
        }
    }
    @socket_close($apns);
    fclose($apns);

没有返回错误,但似乎不起作用。我做错了什么?请帮忙。

【问题讨论】:

  • 您确定它没有返回错误吗?正如我所看到的,您只是在写入套接字而不是读取。您正在尝试向正在生产的应用程序发送通知。您是否在开发过程中使用沙盒网关向应用程序发送通知?此外,可能有一些类似的问题可以帮助您。 stackoverflow.com/questions/26865331/…
  • 对不起,我没有解释清楚。我正在尝试向 APNS 推送通知以更新我在 Apple Wallet 应用中的通行证。根据this document,我们只需要将pass type identifier和push token发送给APNs即可。然后他们会处理剩下的事情。
  • 你用的是什么证书?
  • 您还实现了 Web 服务的所有 5 个端点。如果你拉下你的通行证背面,它会刷新吗?
  • @PassKit 我正在使用的证书是我用来签署创建通行证的证书(成功)。我用这个命令导出了.pem证书$ openssl pkcs12 -in WenderCastPush.p12 -out WenderCastPush.pem -nodes -clcerts

标签: php ios passbook wallet


【解决方案1】:

这是我的项目的代码

    $errors = [];
    $apnsHost = 'gateway.push.apple.com';
    $apnsPort = 2195;
    $apnsCert = base_path('app/config/passbook/certificates.pem');
    $payload = ['aps' => []];
    $payload = json_encode($payload);

    $streamContext = stream_context_create();
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
    stream_context_set_option($streamContext, 'ssl', 'passphrase', 'xxxxxxxxx');

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
    stream_set_blocking ($apns, 0);

    if( ! $apns) {
        return "Failed to connect (stream_socket_client): $error $errorString";
    } else {
        foreach($push_tokens as $idx => $push_token) {
            $msg = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $push_token)) . chr(0) . chr(mb_strlen($payload)) . $payload;

            $success = fwrite($apns, $msg);
            if ($success === strlen($msg)) { // log success
                Logger::logPassbook('Push success', ['push_token' => $push_token]);
            } else {
                Logger::logPassbook('Push failed', ['push_token' => $push_token]);
            }
        }
    }

    @socket_close($apns);
    fclose($apns);

    return $errors;

【讨论】:

  • Payload 字符串中的 ['aps' => []] 应该写什么?我没有任何关于它的信息。能否请您在此处提供示例有效负载字符串。
  • Apple 推送通知服务不再支持二进制协议。请查看链接:developer.apple.com/news/?id=11042019a
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多