web-dev-qa-db-ja.com

プッシュ通知とサイレントプッシュを表示する前にバックグラウンド更新をトリガーするプッシュ通知

プッシュを受信したときにアプリにバックグラウンド更新機能を実装したい。プッシュ通知がユーザーに表示される直前に、バックエンド(Parse.com)から新しいメッセージをダウンロードして配列に保存します。私はここからガイドに従っています: http://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/

このガイドがどれほど正確かわかりません。それは述べています:iOS 7(およびそれ以上)は、アプリケーションにバックグラウンドでコンテンツを更新する機会を与えることにより、通常のプッシュ通知を拡張しますbeforeユーザーに通知し、ユーザーがアプリケーションを開いて新しいコンテンツをすぐに表示できるようにします。

だから私はこのように私のバックグラウンドプッシュを実装しようとしました:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{


    if([[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]){

        NSLog(@"Doing the background refresh");
        UINavigationController *navigationController=(UINavigationController *)[[[UIApplication sharedApplication] keyWindow] rootViewController];

        MyViewController *myViewController = (MyViewController *)[[navigationController viewControllers] objectAtIndex:1];

        [myViewController.currentUser refreshMessagesArrayWithCompletionHandler:^(BOOL successful, BOOL newMiaos) {

            NSLog(@"messages refreshed the array now has %lu messages",(unsigned long)[myViewController.currentUser.messages count]);
            handler(UIBackgroundFetchResultNewData);
        }];
    }
}

バックグラウンド更新が呼び出され、プッシュが表示されますが、プッシュ通知はバックグラウンドタスクが完了するまで待機しません。入荷次第表示します。これは正しい機能ですか?上記のチュートリアルでは、バックグラウンドタスクが完了するまで通知を表示しないことを推奨しています。

次に、サイレント通知を試してみました。これにより、プッシュが受信されても​​通知が表示されないときに、アプリがトリガーされてバックグラウンドでメッセージがダウンロードされます。そのため、ダウンロードの完了後に代わりにローカル通知を発行してこれを行います。これは本当に正しい方法ですか? whatsappなどの従来のアプリは、サイレント通知を使用してバックグラウンド更新をトリガーしてから、ローカル通知を起動しますか?少しハックらしい。確かに、バックグラウンドプッシュのアイデアは、通知を表示する前にデータを準備することですが、そのようには機能しません。

他に気づいたのは、サイレント通知がレート制限されている通常のプッシュ通知よりも優先度が低いため、アプリの効率も確実に妨げられることです...

これについてのご意見をいただければ幸いです。私がこれに正しい方法で近づいているのかどうかにかかわらず、ただ頭を動かそうとしています。すべては非常にハッキーです...

24
Kex

メッセージングアプリ で同じタスクに苦労しています。ユーザーが通知をタップする直前にメッセージを表示することを望みました。私たちが直面したこと:

  • ペイロードサイズの制限。 iOS 7はペイロードに256バイトのみを持つことができます
  • アプリが実行されていない場合、単一のサイレント通知はアプリを起動しません
  • アラート本文なしのcontent-available通知は、デバイスに配信されない場合さえある
  • バックグラウンドフェッチはアプリによって制御されないため、目的の信号を受信できない可能性があるため、この機能に依存することはできません。しかし、これは私たちが望むものを達成するための追加の方法として役立つかもしれません
  • iOS 8にはペイロード用の多くのスペースがあります-2KB
  • アラート本文およびを送信すると、content-available-ほとんどの場合配信され、アプリはそれを処理できます

それで、私たちは唯一の受け入れ可能な解決策に到達しました:私たちはこの機能をios8 +だけで作ることにしました。 content-availableキーを使用して可視のプッシュ通知を送信します。これにより、プロセスが実行/凍結されている場合に通知ペイロードを処理し、アプリが実行されていない場合に通知を表示できます。アプリがプッシュ通知を受信すると、アラートテキストの本文を受け取り、ローカルデータベースに書き込みます。これにより、ユーザーは会話でそれを読むことができます。統計によると、メッセージの平均サイズは200シンボル以下であるため、ほとんどの場合、追加のリクエストは必要ありません。メッセージが200シンボルより長い場合は、プッシュ通知処理でテキスト本文を要求するために使用される追加のパラメーターでペイロード本文を拡張します。ユーザーにはテキストのトリミングされたバージョンが表示されますが、リクエストが完了したら、ローカルデータベースのメッセージを受信した値で書き換えます。

そのため、この手法を使用すると、ほとんどの場合、受信したメッセージをすぐにユーザーに表示できます。アプリが実行されていなかった場合は、サーバーにリクエストを送信して、アプリケーションの起動直後に不足しているメッセージをフェッチします。これは、iOSで発生する可能性のある最速かつ最も許容可能なケースです。私の経験があなたがあなたが望むものを実装するのに役立つことを願っています。

18
Sega-Zero

あなたはいくつかのものを混ぜ合わせました。

リンクをざっと見てみると、これはxamarinのガイドです。正しい情報があるかもしれませんが、xamarinを使用していない場合は、別のチュートリアルを検索します。

良い方法は、サイレント通知をユーザーに送信し、それが行われたときにローカル通知をトリガーすることです(これはまったくハッキングではありません)。

これはwhatsAppが機能する方法です:

WhatsAppがバックグラウンドにある間、単一のプッシュ通知が受信されます(例えば、「5」)。そのメッセージはユーザーに表示されません。

whatsAppはそれをメソッドapplication:didReceiveRemoteNotification:fetchCompletionHandler:で受信し、ユーザーが受信しなかった「5」より前の通知があるかどうかをサーバーに対してチェックします。その場合、サーバーからそのデータをプルし、ローカル通知を使用してユーザーにデータを提示します。これは基本的にデータを提示する方法であり、APNSとはまったく関係ありません。

あなたは私が書いた別の答えで完全な答えとコンテキストを読むことができます here

9
Segev