web-dev-qa-db-ja.com

iOS 7のサイレントプッシュ通知が機能しない

WWDC 2013の「マルチタスクの新機能」プレゼンテーションには、サイレントプッシュ通知に関するセクションがあります。簡単そうです。プレゼンテーションによると、content-availableを1に設定しただけでAPSペイロードを送信した場合、ユーザーには通知が通知されません。

// A. This doesn't work
{ 
  aps: { 
          content-available: 1 
       }
}

私のテストでは、プッシュが受信されないため、これは機能しません。しかし、サウンド属性を含め、アラート属性を除外すると、機能します(もう静かではありません)。

// B. This works
{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

ただし、サウンド属性を変更してサイレントオーディオを再生する場合、サイレントプッシュを模倣できます。

// C. This works too.
{ 
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}

誰か知っている:

  1. これがバグなら?
  2. そして、BまたはCがリモート通知として扱われていると仮定するのが正しい場合(サウンド属性が必要なサイレントプッシュのバグではありません)?もしそうなら、これはサイレントプッシュのようにレート制限されていないことを意味します... Appleはおそらく修正されるでしょう。だから私はおそらくそれに頼るべきではない。
  3. レート制限とは何ですか(NはX秒ごとにプッシュするなど)?

前もって感謝します。

詳細を編集

Aの場合、アプリケーションの状態は重要ではありません。通知は受信されません。

以下のように、属性と値を引用符で囲む場合にのみ、BとCが機能するようです。

{"aps":{"content-available": 1, "sound":"silent.wav"}}

そして、通知は状態に関係なくapplication:didReceiveRemoteNotification:fetchCompletionHandler:に到着します。

85
mkwon

これも機能し、到着時にサウンドを再生しません。

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}

編集

この問題を抱えている人は このリンク をチェックアウトしたいかもしれません。 AppleのDeveloperフォーラムのスレッドに参加しています。このフォーラムでは、すべてのアプリの状態と、サイレントプッシュが受信されたときと受信されなかったときを調べます。

69
CMVR

だから昨日この問題に出くわし、空の文字列に設定されたサウンドでペイロードを送信しようとしても、デバイスで振動/音が発生していました。最終的に、私は送信する必要があることを示唆したUrban Airshipのブログ投稿に出くわしました。

{ priority: 5 }

私が見たことのないプッシュ通知で。プッシュ通知に関するAppleのドキュメントを熟読した後、私はこのページを偶然見つけました。

https://developer.Apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

これは、優先度を「5」または「10」に設定する必要があることを示し、以下を説明しています。

通知の優先度。次の値のいずれかを指定します。

10プッシュメッセージがすぐに送信されます。

プッシュ通知は、デバイスでアラート、サウンド、またはバッジをトリガーする必要があります。コンテンツで利用可能なキーのみを含むプッシュにこの優先度を使用するとエラーになります。

5プッシュメッセージは、それを受信するデバイスの電力を節約する時間に送信されます。

最終的に、バッジカウントで動作するサイレントプッシュ通知を取得することができました(そして、アラートでも同じことができると思います)。

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };
30
Dave Lyon

私は空の文字列をアラート属性として設定しようとしましたが、それも機能しました:

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}

APNSは、Pushペイロードを検証する目的でこの属性の存在を確認しているようです。興味深いことに、彼らは実際のコンテンツをチェックしていません。少しハックが多いようですが...

10
JaimeFBC

ツールを使用します- Knuff プッシュ通知をデバイスに送信します。

次のようになります。 enter image description here

次に、これらの例を試しました。

これらはすべて機能しますが、優先度10を設定する必要があります!

ツールを使用しない場合は、注意してください


例:

  • 警告なし、音なし
{
    "aps":{
        "content-available":1,
    }
}
  • アラートのみ
{
    "aps":{
        "content-available":1,
        "alert":""
    }
}
  • 音だけ
{
    "aps":{
        "content-available":1,
        "sound":""
    }
}
5
wenghengcong

これは私のために働く:

{ 
  aps: { 
          content-available: 1 
       }
}

Background fetch> Project CapabilitiesBackground Modesチェックボックスをオンにするかどうかを確認します

4
IgniteCoders

同じ問題が発生しています。 「content-available」:1でプッシュを送信し、他の属性が設定されていない場合、通知は受信されません。他の属性を追加すると、完全に機能します。

一時的な回避策として、バッジ属性を追加します。これは、バッジをアイコンに追加すること以外はユーザーに警告しないためです。

より良い解決策が見つかったら教えてください。

2
Jon C

優先度は、バイナリストリームでは1つのアイテムとして設定する必要がありますが、ペイロードjson文字列では設定しないでください。どうやら、次のように優先度の設定に使用できるのは、最新のタイプ2形式のみです。

$token      = chr(1) . pack('n', 32)     . pack('H*', $deviceToken);
$payload    = chr(2) . pack('n', strlen($json)) . $json;
$identifier = chr(3) . pack('n', 4)      . pack('N', $notification);
$expiration = chr(4) . pack('n', 4)      . pack('N', time()+86400);
$priority   = chr(5) . pack('n', 1)      . chr($priority);

$frame_data = $token.$payload.$identifier.$expiration.$priority;
$frame_length = strlen(bin2hex($frame_data))/2;

$msg = chr(2) . pack('N', $frame_length) . $frame_data;

リモート通知バイナリメッセージの形式タイプ(最初のバイト):

0-シンプル(古い)1-拡張(古い)2-最新のパラメーターを追加(新しい)

1
dev03

「サウンド」を0に設定するとうまくいきました... :)

0
Alex Zak

通知が配信されないという同じ問題がありました。この場合、バッジ番号を更新するためにサイレントプッシュを使用していました。アラート(本文とタイトル)に空の文字列を設定し、音を鳴らすと機能しますが、キーが存在しない場合は失敗します。サウンドまたはアラートなしでバッジを更新しました(didReceiveRemoteNotificationの結果のuserInfo辞書のログ)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
0
Grant Luck

ああ!また、髪を引っ張ります-これは、うまくいかないペイロードの別の例ほど多くの答えではありません。 didReceiveRemoteNotificationメソッドは呼び出されませんが、デバイスがスリープしている場合は、アラートテキストISが表示されます。

 {"aps":
    {  "alert":"alert!",
       "sound":"default",
       "content-available" : 1},
    "content-id":21482,
    "apt":"1"
}

「apt」は、通知タイプを示すために使用するカスタムフィールドです。

0

優先度を5に設定しても機能しませんでしたが、サウンドまたはアラートを空の文字列に設定すると、通知が優先度の高いものとして処理されました

0
Radim