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


87

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:に到着します


どのアプリの状態でも機能しませんか?私の場合、「A」はアプリがフォアグラウンドで実行されている限り機能します(didReceiveRemoteNotificationが呼び出されます)。ただし、アプリが実行されていない場合、アプリは通知されません(「B」を試してみると、音が聞こえるだけです)。「B」または「C」を使用すると、アプリがバックグラウンドでウェイクアップ(didReceiveRemoteNotification)されますか?
DerBernie 2013年

同様の動作が見られます。これは、しばらく試していて、最初はアプリが正しくセットアップされていなかったため、セットアップが正しくなる前にAppleが抑制していた可能性があるためだと思います。
nickthedude 2013年

4
おい...私はあなたに10票を与えることができればいいのに
Michael Wiles 2013年

最初のオプションが機能するはずなので、>のチェックBackground fetchボックスをオンにするかどうかを確認してください。サイレントプッシュはサウンド属性を必要とせず、アプリケーションがバックグラウンド/フォアグラウンドで実行されているか実行されていない場合でも常に到着します。Project CapabilitiesBackground Modesapplication:didReceiveRemoteNotification:fetchCompletionHandler:
IgniteCoders 2014年

回答:


73

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

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

編集

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


リンクをありがとう。ADCのフォーラムでこれについて議論している複数のスレッドがあります。結論:Appleの担当者が(最終的には)アップデートで修正する必要があることを認めたバグが(デバイスの再起動後に)あります。
SG1

3
iOS7では、サウンド/アラートキーがなくてもうまく機能します。Content-avalableで十分です!しかし、iOS8では、「content-available」に加えて空でない文字列でアラートキーを設定した場合でも、非常に奇妙な動作が発生します。1「alert」文字列のバナーのみが表示されますが、「content-available」は何らかの理由で無視されます。
malex 2015年

サウンドの追加の有無にかかわらず、通知からアプリを起動することに成功しました。おそらく、サウンド、アラート、またはバッジ(空かどうか)を設定すると、デフォルトの通知優先度が10に上がり、信頼性が向上します。アップルがpans-priorityについて言っていることを参照してください:developer.apple.com/library/ios/documentation/…デフォルトの優先度は10(高)ですが、コンテンツ利用可能なキーのみを使用したプッシュ通知にこれを使用するとエラーになります。したがって、content-availableキーのみが設定されている場合、デフォルトは5に設定されている可能性があります。
emem 2016年

1
iOS10では動作しません。私は何かを「音」に押し込まなければなりません。
ストーニー

私のためにiOS10で働いた。ただし、iOS11では機能しません
Slav

30

だから私は昨日この問題に遭遇しました、そして空の文字列に設定された音でペイロードを送ろうとした後、それはまだデバイスに振動/音を引き起こしていました。最終的に、私はアーバンエアシップからのブログ投稿に出くわしました。

{ priority: 5 }

私が見たことがなかったプッシュ通知で。プッシュ通知についてAppleのドキュメントを熟読した後、私はこのページに出くわしました:

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

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

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

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

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

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

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

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

素晴らしい答えデイブ!優先度5は許可されますが、「コンテンツ使用可能キーのみを含むプッシュにこの優先度[10]を使用するのはエラーです」。developer.apple.com/library/ios/documentation/...
rjobidon

4
ペイロードに優先的に含める必要がありますか?IMO送信するプッシュで1バイト分離されます。
Foriger 2014

6
ペイロードに優先度が設定されません。これはバイナリ通知で設定されます。
Sandy D.

10

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

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

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


alert=""ペイロードに含まれるこのソリューションは、私にも有効でしたiOS 9.0sound=""代わりに動作しませんでした。
loretoparisi 2015年

5

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

次のようになります。 ここに画像の説明を入力してください

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

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

したがって、ツールを使用していない場合は、それに注意してください。


例:

  • 警告なし、音なし

{
    "aps":{
        "content-available":1,
    }
}

  • アラートのみ

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}

  • 音だけ

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


4

これは私のために働きます:

{ 
  aps: { 
          content-available: 1 
       }
}

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


2

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

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

より良い解決策を見つけたら教えてください。


1

優先度は、バイナリストリームでは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-最新のパラメーターが多い(新しい)


0

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

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

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


2
アプリがバックグラウンドにあり、「alert」属性を削除すると、application:didReceiveRemoteNotification:fetchCompletionHandler:でコールバックを受信する必要があります。
mkwon

@mkwonそして、BG +でアラート(通常のプッシュ)を表示したい場合は、application:didReceiveRemoteNotification:fetchCompletionHand‌ lerを呼び出します:?Tnx
DaNLtR 2016


0

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


0

通知が配信されないという同じ問題が発生しました。私たちの場合、バッジ番号を更新するためにサイレントプッシュを使用していました。アラート(本文とタイトル)とサウンドに空の文字列を設定すると機能しますが、いずれかのキーが存在しない場合は失敗しました。これが機能し、音声やアラートなしでバッジを更新しました(didReceiveRemoteNotificationの結果のuserInfoディクショナリのログ)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.