web-dev-qa-db-ja.com

iOS 10でのユーザー通知の処理

ユーザーがiOS 10のユーザープッシュ通知をタップするタイミングを判断するのに問題があります。

これまで、私は-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]を使用してきました。

  • Case 1:アプリケーションはアクティブで、プッシュが受信されます
  • Case 2:ユーザーが受信した通知をタップした後にアプリを起動したとき

このメソッドのコメントは明示的に言う

この動作はapplication:didReceiveRemoteNotification:とは対照的であることに注意してください。これらの場合は呼び出されず、このメソッドが実装されている場合は呼び出されません。

これらはすべて期待どおりに機能します。

IOS 10はこのデリゲートメソッドを廃止し、UserNotificationフレームワークを導入しましたが、まだiOS 8および9をターゲットにしているため使用できません。

IOS 10でアプリを実行していて、アプリがアクティブなときにプッシュを受信すると(Case 1)、-[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]が正しく呼び出されます。

再びiOS 10では、ユーザーが通知(Case 2)をタップしてアプリを起動すると、このメソッド呼び出されませんになります。

古い-[UIApplicationDelegate application:didReceiveRemoteNotification:]を実装すると、それがCase 2で呼び出されることに気付きます。

IOS 8および9では、Case 2-[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]メソッドが呼び出されます。

IOS 10のためにアプリケーションを更新し、古いデリゲートを実装する必要があるということですか?

したがって、質問は、UserNotificationフレームワークを使用せずにiOS 10で受信したプッシュのユーザーインタラクションを処理する適切な実装は何かということです。

乾杯、Jan

26
Jan

これはiOS 10.1 Beta 1で修正されました!!

-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]は、ユーザーが通知をタップしたときに正しく呼び出されます。

13
Jan

IOS 10のSwiftコード:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.currentNotificationCenter()
        center.delegate = self
    }

    // ...

    return true
}

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {

    print(response.notification.request.content.userInfo)        
}

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {

    print(notification.request.content.userInfo)
}
24
Adam Bardon

ここで同じ問題に直面していましたが、iOS 10 GMリリースでこの問題を解決することができました。ここに与えられた答えのコードを使用して: https:// forums。 developer.Apple.com/thread/54332

     - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {  

           NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
           if (version.majorVersion == 10 && version.minorVersion == 0) {
              [self application: application 
   didReceiveRemoteNotification: userInfo    
         fetchCompletionHandler: ^(UIBackgroundFetchResult result) { 

            }];
       }

この修正により、iOS 9と10の両方でコードが再び機能するようになりました。

また、処理方法を変更する必要がありました アプリケーション状態の動作(UIApplicationStateActive、UIApplicationStateInactive、UIApplicationStateBackground) プッシュ通知、iOS 10でも変更されたようです

[〜#〜] edit [〜#〜]

  • 最新のiOS 10バージョンでは、アプリケーション状態の動作が正常に戻ったようです。
15
andresk