全体の流れ
1.CloudKitDatabaseから通知がいくようにセットする
2.リモート通知が受け取れるようにセットする
//CloudKitデータベースから通知がいくようにセットする。どこで実行してもOK。
NSPredicate*predicate=[NSPredicate predicateWithFormat:@”TRUEPREDICATE”];
CKSubscription*subscription=[[CKSubscription alloc]initWithRecordType:@”neko” predicate:predicate options:CKSubscriptionOptionsFiresOnRecordCreation|CKSubscriptionOptionsFiresOnRecordDeletion];
subscription.notificationInfo=[[CKNotificationInfo alloc]init];
subscription.notificationInfo.alertBody=@”データベースからの通知だよ”;
subscription.notificationInfo.shouldBadge=YES;
subscription.notificationInfo.shouldSendContentAvailable=YES;
[savedSubscriptions addObject:subscription];
//リモートの通知が受け取れるようにセットする
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationSettings*settings=[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil];
[application registerForRemoteNotifications];
[application registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
…
return YES;
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{
CKNotification*notif=[CKNotification notificationFromRemoteNotificationDictionary:userInfo];
if(notif.notificationType==CKNotificationTypeQuery){
//ここでキャッチした時の処理を書く
}
completionHandler(UIBackgroundFetchResultNoData);
}
訂正:
notif.notificationType==CKNotificationTypeQueryって書くと、アクティブ・バックグラウンドの時は実行されるが、アプリ未起動時は実行されない。返ってきてる値が違うのかもしれない。要確認。
とりあえずif文を外して書いた。