0

我正在玩苹果存折服务。我在所有设备上都有一个非常奇怪的行为。如果我通过 APNS 向设备发送推送,让他们知道某个通行证有更新,他们会进行更新,但不会在设备的锁屏上显示任何通知。

现在我正在记录我的 PHP-Webservice 和 APNS 之间的整个通信。我总是用 headre 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 在 Passbook 中推送 Pass 时不会读取有效负载。

有没有人暗示我接下来可以尝试什么?我需要 pass.json 文件中的任何内容吗?

4

1 回答 1

5

如果您的设备正在更新并接收新的通行证,但您没有看到通知,那么您的 pass.json 很可能不包含 changeMes​​sage 键。

为了显示通知:

  • 传递数据值必须已更改(字段标签、颜色和图像不会触发更新),并且
  • 更改的字段必须包含 changeMes​​sage 键,最好使用将替换为新字段值的 %@ 占位符。

对于 Passbook,APNS 推送的唯一目的是通知设备 Web 服务有新内容。所有通知活动都由新旧 pass.json 文件之间的差异决定。

如果您的 pass 字段正在更改,并且您设置了 changeMes​​sage 键但您没有看到通知,那么在 pass.json 的前后部分发布相关的内容可能有助于我们确定问题所在。

当 'after' pass 替换 'before' pass 时,下面的 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: %@"
        }],
           ...
于 2013-03-05T00:13:35.067 回答