プッシュ通知を実装したという点で、1つのアプリケーションを開発しました。現在、Appleストアで公開されています。 iOS 9プッシュまでは正常に動作しますが、iOS 10以降は動作しません。
コードの問題は何ですか?
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のプッシュ通知をサポートするコード行のみを追加してください。
IOS 10のサイレントプッシュ通知で問題が発生しました。 iOS9以前では、追加のデータフィールドがあり、データに空のaps
属性が含まれていたプッシュ通知を送信すると正常に機能しました。しかし、iOS10では、空のaps
属性を持つプッシュ通知は、didReceiveRemoteNotificationアプリのデリゲートメソッドをまったくヒットしません。つまり、すべてのサイレントプッシュ通知(アプリを開いている間にアクションをトリガーするために内部で使用する通知)がiOS10で機能しなくなりました。
プッシュ通知のaps
部分に少なくとも1つの属性を追加することで、アプリに更新をプッシュせずにこれを修正できました。この場合、badge: 0
を追加しただけで、iOS 10でサイレントプッシュ通知が再び機能し始めました。他の人を助けます!
@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) {
}
テストするときは、通知を機能させるためにsandbox
アドレスを使用する必要があることを忘れないでください。