Apple Push Notification не доставляется - PullRequest
9 голосов
/ 19 января 2012

Я знаю, что это немного затоплено проблемами службы push-уведомлений Apple (APNs) по всему StackOverflow, поэтому я действительно провел много исследований, прежде чем поднять свой вопрос.

По сути, я следовал за apns-php's CertificateCreation , некоторые учебные пособия, такие как на mobiforge , а некоторые из Matthijs Hollemans .Тем не менее, я не могу отправлять уведомления на свой iPad 2.

По сути, я выполнил следующие шаги:

  1. Я следовал учебнику CertificateCreation Я вышел с server_certificates_bundle_sandbox.pem, entrust_root_certification_authority.pem.
  2. Следуя инструкциям, указанным в mobiforge blog , я успешно создал идентификатор приложения, предоставил профиль и связал их вместе.

    • Описание: APNTest
    • Идентификатор комплекта семян: Использовать идентификатор группы
    • Идентификатор комплекта: com.learn.APN
  3. Затем я включаю SSL-сертификат Development Push (только на данный момент), используя тот же запрос сертификата, который я использовал только что, чтобы получить сертификаты, и я загружаю его и устанавливаю в свою цепочку для ключей.

  4. Я загрузил свой профиль обеспечения в файл .mobileprovision и загрузил его в Организатор XCode под моим устройством iPad 2.

  5. Далее я создаю простое приложение только с этими кодами:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
        // Override point for customization after application launch.
        return YES;
    }
    
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSLog(@"%@", deviceToken);
    }
    
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
    {
        NSLog(@"Error: %@", error);
    }
    
  6. Затем я настраиваю параметры сборки:

    • Цели> Информация> Идентификатор сборки: net.learn.APN
    • Цели> Настройки сборки> Идентификация подписи кода> (я выбрал профиль обеспечения, который я только что установил, и он автоматически выбирает идентичные профили для моего Отладки и выпуска)
  7. Я создаю и запускаю приложение на своем iPad 2. Мое приложение запрашивает Push-уведомление, и после того, как я одобрил его, в моей консоли появился идентификатор токена:

    2012-01-19 12:43:26.345 TestAPN[578:707] <3cb08612 9392996b 5332d2fc 5adce03d 994f8959 d7a2ac38 de7bed52 c8e0778e>
    
  8. Я использовал apns-php , изменил идентификатор устройства (необработанные 64 шестнадцатеричные значения), затем запустите sample_push.php.Сценарий успешно запущен, но мое устройство не получает никаких уведомлений

  9. Затем я пытаюсь использовать SimplePush.php .Появилось сообщение «Сообщение успешно доставлено», но мой iPad все еще не получает никаких уведомлений от APN

Вопрос в том, какие шаги я сделал неправильно?Я довольно новичок в этой области, и для моего проекта на самом деле требуется, чтобы сервер отправлял сообщения нашим собственным приложениям.Нам известно о программном обеспечении сторонних производителей, которое отправляет APN от вашего имени, но мы хотели бы внедрить его самостоятельно.

Я также столкнулся с « APN Feedback Service » и написалэто (основано на SimplePush), но, к сожалению, оно пустое.Что мне теперь делать?

<?php
// Put your private key's passphrase here:
$passphrase = '';

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

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

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

echo 'Connected to APNS' . PHP_EOL;

while (!feof($fp)) {
        $data = fgets($fp, 1024);
        var_dump(unpack("N1timestamp/n1length/H*devtoken", $data));
}
// Close the connection to the server
fclose($fp);

Примечание

  1. Мне известны различия между сертификатами разработки / производства.
  2. iPadне взломан, работает под управлением iOS 5.0.1
  3. Другие приложения App Store обычно получают уведомления
  4. XCode 4.2.1, Lion 10.7.2

Я надеюсь, что я 'm не дублирует ни один из вопросов здесь ..;)

РЕДАКТИРОВАТЬ

Когда я запускаю php simplepush.php затем php feedback.php, я получаю отзыв с идентификатором своего устройства,Мое приложение все еще в iPad, значит ли это, что идентификатор моего устройства неверный?

[root@ip-xx-xx-xx-xx SimplePush]# php feedback.php
Connected to APNS
array(3) {
  ["timestamp"]=>
  int(1326962028)
  ["length"]=>
  int(32)
  ["devtoken"]=>
  string(64) "3cb086129392996b5332d2fc5adce03d994f8959d7a2ac38de7bed52c8e0778e"
}

Спасибо

РЕДАКТИРОВАТЬ

После долгих попытоки переделывая все шаги, написанные Matthijs Hollemans , я наконец-то начал работать.Таким образом, проблема заключается в неправильном сгенерированном файле PEM ... хмм

1 Ответ

16 голосов
/ 19 января 2012

У меня была похожая проблема, для меня ключевое, чего я не знал, это то, что токен устройства отличается для dev и prod (для одного и того же устройства) .

Я использовал токен устройства, полученный при тестировании в dev для тестирования в prod. В dev это работало нормально, но когда я переключился на prod, я сохранил тот же токен устройства в моем скрипте python (предполагая, что ошибочно токен устройства будет одинаковым для того же устройства), но фактический токен устройства, зарегистрированный в prod отличается.

На практике этого не произойдет, поскольку токен устройства отправляется на сервер, но когда я тестировал, я использовал жестко закодированный токен устройства, поскольку не хотел задействовать сервер.

Надеюсь, это спасет кого-то от разочарования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...