web-dev-qa-db-ja.com

iOS 10のプッシュ通知の問題

プッシュ通知を実装したという点で、1つのアプリケーションを開発しました。現在、Appleストアで公開されています。 iOS 9プッシュまでは正常に動作しますが、iOS 10以降は動作しません。

コードの問題は何ですか?

54
Mohsin Sabasara

XCode 8 GMを使用するiOS 10の場合。

IOS 10でxCode 8 GMを使用して、次の手順で問題を解決しました。

1)ターゲットの[機能]で、[プッシュ通知]を有効にして、プッシュ通知の資格を追加します。

2)UserNotifications.frameworkをアプリに実装します。 AppDelegateにUserNotifications.frameworkをインポートします。

#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder   <UIApplicationDelegate,UNUserNotificationCenterDelegate>

@end

3)didFinishLaunchingWithOptionsメソッドでUIUserNotificationSettingsを割り当て、UNUserNotificationCenterデリゲートを実装します。

#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
         if( !error ){
             [[UIApplication sharedApplication] registerForRemoteNotifications];
         }
     }];  
}

return YES;
}

4)最後に、この2つのデリゲートメソッドを実装します。

// ============ iOS 10の場合==============

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

    //Called when a notification is delivered to a foreground app. 

    NSLog(@"Userinfo %@",notification.request.content.userInfo);

    completionHandler(UNNotificationPresentationOptionAlert);
}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{

   //Called to let your app know which action was selected by the user for a given notification.

   NSLog(@"Userinfo %@",response.notification.request.content.userInfo);

}

IOS 9で使用しているコードのままにしてください。UserNotifications.frameworkを使用してiOS 10のプッシュ通知をサポートするコード行のみを追加してください。

115
Ashish Shah

IOS 10以前はすべて正常に機能していましたが、私の場合、この問題の原因は機能設定のみです。

プッシュ通知の場合はオンにする必要があります。

enter image description here

24
AiOsN

IOS 10のサイレントプッシュ通知で問題が発生しました。 iOS9以前では、追加のデータフィールドがあり、データに空のaps属性が含まれていたプッシュ通知を送信すると正常に機能しました。しかし、iOS10では、空のaps属性を持つプッシュ通知は、didReceiveRemoteNotificationアプリのデリゲートメソッドをまったくヒットしません。つまり、すべてのサイレントプッシュ通知(アプリを開いている間にアクションをトリガーするために内部で使用する通知)がiOS10で機能しなくなりました。

プッシュ通知のaps部分に少なくとも1つの属性を追加することで、アプリに更新をプッシュせずにこれを修正できました。この場合、badge: 0を追加しただけで、iOS 10でサイレントプッシュ通知が再び機能し始めました。他の人を助けます!

18
jakedunc

@Ashish ShahコードのSwift 3バージョンは次のとおりです。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

//notifications
        if #available(iOS 10.0, *) {
            let center  = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
                if error == nil{
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        } else {
            // Fallback on earlier versions
        }

        return true
    }
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    }

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

    }
7
Lucho

テストするときは、通知を機能させるためにsandboxアドレスを使用する必要があることを忘れないでください。

0
Ashkan Ghodrat