web-dev-qa-db-ja.com

iOS 10でバックグラウンドでプッシュ通知を処理する方法は?

バックグラウンドでプッシュ通知を処理していません。

以下の手順に従って、バックグラウンドでプッシュ通知を処理する場合:-

  1. [機能]-> [リモート通知を有効にする]で。
  2. 機能->バックグラウンドモード->リモート通知を有効にします。
  3. DidFinishLaunchingWithOptionsで、iOS10のすべての権限を付与します。
  4. プッシュ通知にはUNUserNotificationCenterを使用しました。
  5. App Foregroundの場合、プッシュ通知は正常に機能しており、メソッド呼び出しの下にあります。

    userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
    

しかし、私の問題はバックグラウンドでのアプリであり、メソッドを呼び出さないため、iOS10のバックグラウンドでプッシュ通知を処理するためのアイデアや解決策があります。助けてください。

ありがとう。

willPresentNotificationアプリがフォアグラウンドにあるときに呼び出されます。彼らのドキュメントを見てください

 - (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
    // The method will be called on the delegate only if the application is in the foreground.
    // If the method is not implemented or the handler is not called in a timely manner then the notification will not be presented.
    // The application can choose to have the notification presented as a sound, badge, alert and/or in the notification list.
    // This decision should be based on whether the information in the notification is otherwise visible to the user.

}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)())completionHandler {
    // The method will be called on the delegate when the user responded to the notification by opening the application,
    // dismissing the notification or choosing a UNNotificationAction.
    // The delegate must be set before the application returns from applicationDidFinishLaunching:.

}

didReceiveNotificationResponseにチェックインしてみてください。必要なものが手に入ります。

[〜#〜] also [〜#〜]データまたは処理をフェッチする必要がある場合は、バックグラウンドモードでバックグラウンドフェッチを有効にし、以下の方法を使用します

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{

    completionHandler(UIBackgroundFetchResultNewData);
}

アプリケーションの状態に基づいてAPNSを処理する

   if(application.applicationState == UIApplicationStateInactive)
     {
        /* 
        # App is transitioning from background to foreground (user taps notification), do what you need when user taps here!
         */    
    }
    else if(application.applicationState == UIApplicationStateActive)
    {
        /*
         # App is currently active, can update badges count here
       */
    }
    else if(application.applicationState == UIApplicationStateBackground)
    {
        /* # App is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here */
    }
6

これが私にとっての解決策でした:

{  
    "aps" : {  
        "content-available" : 1  
    },  
    "acme1" : "bar",  
    "acme2" : 42  
}  

重要なのは、利用可能なコンテンツを1にすることです。

2
ΩlostA

alertキーを含むプッシュ通知を受信すると、iOSはユーザーに通知を表示します。ユーザーがアラートを操作すると、アプリケーションはフォアグラウンドモードで起動されます。

サイレント通知は、content-availableキーを含むプッシュ通知です。これらの通知はnotユーザーに表示され、alertsound、またはbadgeキーを含めることはできません。 iOSがサイレント通知を配信すると、アプリケーションはバックグラウンドモードで起動されます。アプリケーションは、サイレント通知に応答して、バックグラウンドで非常に限られた量の作業を実行できます。

サイレント通知は次のようになります。

{
    "aps" : {
        "content-available" : 1
    },
    "com.yourcompany.something.something" : "something"
}

配信されると、アプリケーションデリゲートメソッドapplication:didReceiveRemoteNotification:fetchCompletionHandler:が呼び出されます。そのメソッドの実装では、fetchCompletionHandlerパラメーターで渡されたブロックを呼び出すのに30秒かかります。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {  
    completionHandler(UIBackgroundFetchResultNoData);
    return;
}
1
quellish