Push-уведомление об обновлении Passbook не отображается на экране блокировки

Я играю с сервисом Apple Passbook. У меня действительно странное поведение на всех устройствах. Если я отправляю push-уведомление через APNS на устройство, чтобы сообщить им, что есть обновление для определенного прохода, они делают обновление, но не отображают никаких уведомлений на экране блокировки на устройстве.

Прямо сейчас я регистрирую всю связь между моим PHP-Webservice и APNS. Я всегда отвечаю с заголовком 200 и запрошенным ответом. (1-й серийный номер; 2-й Pass.pkpass), и устройство выполняет обновление, как я вижу в приложении сберегательной книжки, но, как я уже сказал, я не получаю никаких уведомлений на экране блокировки. Устройство настроено правильно, как описано в этой статье: ссылка

и я делаю свой запрос APNS следующим образом:

public function sendePushNotification($passTypeID, $debug = true)
{
// Zertifikat vorhanden ?
$certFullPath = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . "api/cert/ck.pem";
if (file_exists($certFullPath))
{
  /**
   * Payload vorbereiten
   */
  $message = 'PASSDROP UPDATE'; 
  $body = array();
  $body['aps'] = array('alert' =>  $message);


  /**
   * Host bestimmen
   */
  $apnsHost = "gateway.push.apple.com";   // Development Umgbung

  /**
   * Stream erstellen
   */
  $ctx = stream_context_create();
  stream_context_set_option($ctx, 'ssl', 'local_cert', $certFullPath);
  $fp = stream_socket_client('ssl://' . $apnsHost . ':2195', $err, $errstr, 2, STREAM_CLIENT_CONNECT, $ctx);
  if (!$fp) 
  {
    echo "Fehler beim APNS: " . $err . " / ". $errstr. "\n";
    return false;
  }

  /**
   * Payload versenden
   */
  $payload = json_encode($body);
  $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $this->token)) . pack("n",strlen($payload)) . $payload;      
}
else
{
  throw new Exception("Zertifikat-Bundle " . $certFullPath . " existiert nicht !!!");
}
}

Насколько я знаю, Apple не считывает полезную нагрузку при нажатии Pass в Passbook.

У кого-нибудь есть подсказка для меня, что я могу попробовать дальше? Нужно ли мне что-нибудь в файле pass.json?


person A.S.    schedule 04.03.2013    source источник


Ответы (1)


Если ваши устройства обновляются и получают новые проходы, но вы не видите уведомления, скорее всего, ваш pass.json не содержит ключ changeMessage.

Чтобы отображалось уведомление:

  • значение данных прохода должно быть изменено (метки полей, цвета и изображения не вызывают обновления), и
  • измененное поле должно включать ключ changeMessage, предпочтительно с заполнителем %@, который будет заменен новым значением поля.

Для Passbook единственная цель отправки APNS — уведомить устройство о том, что в веб-службе есть свежий контент. Вся активность уведомлений определяется различиями между старым и новым файлами pass.json.

Если ваше поле пароля изменяется, и у вас установлен ключ changeMessage, но вы не видите уведомления, публикация соответствующих разделов «до» и «после» файла pass.json может помочь нам определить, что не так.

Выдержки из json ниже вызовут следующие два уведомления, когда проход «после» заменит проход «до»:

  • Пожалуйста, пройдите к выходу 22.
  • Статус рейса: Посадка

Перед проходом:

  "boardingPass": {
        "headerFields": [{
            "key": "h1",
            "value": "--",
            "label": "Gate",
            "changeMessage": "Please proceed to gate %@"
        }, {
            "key": "h2",
            "value": "On Time",
            "label": "Status",
            "changeMessage": "Flight status: %@"
        }],
           ...

После прохода:

  "boardingPass": {
        "headerFields": [{
            "key": "h1",
            "value": "22",
            "label": "Gate",
            "changeMessage": "Please proceed to gate %@"
        }, {
            "key": "h2",
            "value": "Boarding",
            "label": "Status",
            "changeMessage": "Flight status: %@"
        }],
           ...
person PassKit    schedule 05.03.2013
comment
Вау спасибо за ответ. Можете ли вы подробно остановиться на changeMessageKey? У меня нет ни одного из этих значений в моем pass.json - person A.S.; 05.03.2013
comment
Я думаю, что эта ссылка будет очень полезна для всех, особенно ключ изменения ссылка - person A.S.; 05.03.2013
comment
@soma-web - я добавил пример, чтобы помочь. - person PassKit; 05.03.2013
comment
Я хотел спросить, как будет выглядеть файл pass.json с changeMessage, если единственное, что я обновлял, — это местоположения (значения широты, долготы). Должен ли я просто добавить ключ changeMessage в каждый словарь местоположения вместе с ключом широты и долготы? (Я попробовал это, и пропуск стал недействительным) - person Abdul91; 01.07.2016
comment
Очень полезно, я не знаю, почему они не упомянули об этом здесь: developer.apple.com/library/content/documentation/ - person Unnikrishnan; 12.01.2018
comment
В этом PHP-коде нет включения pass.json. В моем случае я только что сгенерировал файл pkpass напрямую на устройство Apple. Итак, где мне обновить файл pass.json. Пожалуйста, помогите в этом. - person Dharmesh Goswami; 25.07.2019
comment
Пакет .pkpass содержит файл pass.json. Я предлагаю просмотреть документацию Apple, так как без глубокого понимания основ вам будет сложно продвинуться очень далеко. - person PassKit; 25.07.2019
comment
@PassKit В демо-версии создания Pass я просто сгенерировал пакет .pkpass напрямую на мобильном устройстве и не сохранял его на сервере. Теперь в коде push-уведомлений нет возможности обновить файл pass.json этого мобильного устройства. Поэтому я запутался, как отправить обновление этого файла. Пожалуйста, дайте мне ссылку на демонстрацию или документацию Apple. Пожалуйста, помогите мне понять этот рабочий процесс. - person Dharmesh Goswami; 25.07.2019
comment
Вы должны каждый раз генерировать новый пакет .pkpass. Вам также необходимо реализовать API веб-службы, чтобы устройство могло запрашивать обновленный пакет с вашего сервера. developer.apple.com/wallet. - person PassKit; 25.07.2019
comment
@PassKit Спасибо за быстрый ответ. Да, я могу создать API веб-сервиса для устройства, чтобы запрашивать обновленный пакет пропусков. Но, насколько я понимаю, сначала будет вызываться служба push-уведомлений, которая отправит push-уведомление на устройство, а затем этот API будет вызываться с устройства. Моя проблема в том, что Push-уведомление не работает для этого обновленного прохода. Таким образом, устройство не может знать, что у Pass есть обновление, и оно не будет вызывать API-интерфейс обновления. В моем коде push-уведомления нет проблем. Тем не менее это устройство не получает никаких уведомлений о пропуске. - person Dharmesh Goswami; 25.07.2019
comment
Убедитесь, что вы подключаетесь к APNS с сертификатом PassTypeId, а не с сертификатом APNS человека. Затем подключите свой iPhone к Mac и проверяйте его журналы при отправке push-уведомления. Для тестирования вам понадобится iPhone и Mac. Симулятор iOS не принимает push-уведомления. - person PassKit; 25.07.2019
comment
Давайте продолжим это обсуждение в чате. - person Dharmesh Goswami; 25.07.2019
comment
@PassKit У меня есть iPhone и Mac для тестирования. Код PHP показывает успешное сообщение о подключении к серверу APNS. Но после этого я не могу отследить, что случилось с этим Push. Не могли бы вы помочь мне, как я могу проверить вход в Mac, подключив мое приложение и iPhone? У меня есть разработчик iPhone, поэтому, пожалуйста, дайте больше деталей, чтобы отследить этот запрос Push. - person Dharmesh Goswami; 25.07.2019