Apple 推送通知服务已连接,但未收到通知 [英] Apple Push Notification Service connects, but no notification is recieved

查看:41
本文介绍了Apple 推送通知服务已连接,但未收到通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

过去一周我一直在努力争取这项工作.我刚刚从头开始并记录了我所做的一切,但仍然无法正常工作.以下是我采取的步骤:

I’ve been banging my head on the wall trying to get this work for the past week. I just started again from scratch and logged everything that I did and it still does not work. Here are the steps i’ve taken:

1) 使用新的 bundle id 创建一个新的 App ID Identifier(旧的没有推送通知)

1) Create a new App ID Identifier using a new bundle id (the old one did not have push notifications)

a) made sure push notifications were added to the app id and proceeded to the last step, this resulted in an app id with push notifications in the ‘configurable’ state.

b) I then went to edit the app id and saw that i could create a new production or development certificate so i did both using the steps listed

2) 创建了两个新的配置文件,一个用于开发,一个用于生产,都使用新的 bundle id

2) Created two new provisioning profiles, one for dev and one for production, both are using the new bundle id

3) 将新的配置文件导入 Xcode,并确保它们是在构建设置中选择的那些

3) import the new provisioning profiles into Xcode and make sure that those are the ones selected in the build settings

4) 使用钥匙串创建 .p12 文件并导出用于开发和生产的 .cer 文件

4) create the .p12 files by using the keychain and exporting the .cer files for dev and production

5) 使用以下命令从 .p12 文件创建 .pem 文件:

5) create the .pem file from the .p12 files using these commands:

openssl pkcs12 -in VX-Mobile-Dev.p12 -out apns-dev.pem -nodes -clcerts

openssl pkcs12 -in VX-Mobile-Prod.p12 -out apns-prod.pem -nodes -clcerts 

6) 接下来创建了一个 php 脚本(我公然从另一个博客中抄袭),我从我的一个虚拟机的命令行运行.在与该文件相同的文件夹中,我放置了 pans-prod.pem 文件.这是该文件的内容

6) Next created a php script (that i blatantly ripped off from another blog) that i run from the command line of one of my virtual machines. In the same folder as that file i put the pans-prod.pem file. Here is the contents of that file

注意,对于设备令牌,我只是从 Xcode 运行应用程序,它已经成功连接到 apns 服务器并获取一个设备令牌,该令牌已注销到控制台,出于测试目的,我只是将新令牌复制到每次都存档.

Note, for the device token i simply run the app from Xcode where it already successfully connects to the apns server and gets a device token which gets logged out into the console, for testing purposes i am just copying the new token into the file each time.

文件内容:

// set time limit to zero in order to avoid timeout
set_time_limit(0);

// charset header for output
header('content-type: text/html; charset: utf-8');

// this is the pass phrase you defined when creating the key
$passphrase = '{passphrase is hidden to you!}';

// you can post a variable to this string or edit the message here
if (!isset($_POST['msg'])) {
$_POST['msg'] = "Notification message here!";
}

// function for fixing Turkish characters
function tr_to_utf($text) {
    $text = trim($text);
    $search = array('Ü', 'Þ', 'Ð', 'Ç', 'Ý', 'Ö', 'ü', 'þ', 'ð', 'ç', 'ý', 'ö');
    $replace = array('Ãœ', 'Åž', 'Ğž', 'Ç', 'Ä°', 'Ö', 'ü', 'ÅŸ', 'ÄŸ', 'ç', 'ı', 'ö');
    $new_text = str_replace($search, $replace, $text);
    return $new_text;
}

// tr_to_utf function needed to fix the Turkish characters
$message = tr_to_utf($_POST['msg']);

// load your device ids to an array
$deviceIds = array(
'97c8c0a77e1380d052d17352e33b1f2224f082a3436ee90310cf88c7278329e7'
);

// this is where you can customize your notification
$payload = '{"aps":{"alert":"' . $message . '","sound":"default"}}';

$result = 'Start' . "\r\n";

////////////////////////////////////////////////////////////////////////////////
// start to create connection
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns-prod.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

echo count($deviceIds) . " devices will receive notifications.\r\n";

foreach ($deviceIds as $item) {
    // wait for some time
    sleep(1);

    // 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" . "\r\n");
    } else {
        echo 'Apple service is online. ' . "\r\n";
    }

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

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

    if (!$result) {
        echo 'Undelivered message count: ' . $item . "\r\n";
    } else {
        echo("\r\nRESULT\r\n\r\n");
        var_dump($result);
        echo("\r\n\r\n");
        echo 'Delivered message count: ' . $item . "\r\n";
    }

    if ($fp) {
        fclose($fp);
        echo 'The connection has been closed by the client' . "\r\n";
    }
}

echo count($deviceIds) . " devices have received notifications.\r\n";

// set time limit back to a normal value
set_time_limit(30);

请帮忙.

推荐答案

原来我快到了.唯一的问题是我应该使用沙箱端点.

Turns out i was almost there. The only problem was that i should have been using the sandbox endpoint.

ssl://gateway.sandbox.push.apple.com:2195

此外,作为对 RJV Kumar 的回应,一旦我开始工作,我就用我的 prod 和我的开发证书尝试了它,它在两种情况下都有效.这对我来说似乎很可疑,但无论如何我很高兴它的工作原理.

Also, in response to RJV Kumar, once i got it working i tried it with both my prod and my dev certificate and it worked in both cases. This seems suspicious to me but whatever i'm just glad that its working.

[更新]

虽然这篇文章中的步骤在技术上是正确的,但我了解到如果您真的希望能够发布新版本的应用程序,则不应创建新的应用程序 ID.您应该简单地将推送通知添加到您当前的 App ID,而不是这样做.

While the steps in this post are technically correct, i learned that you should NOT create a new App ID if you actually want to be able to release a new version of your app. Instead of doing this you should simply add push notifications to your current App ID.

这篇关于Apple 推送通知服务已连接,但未收到通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆