CloudKitデータベースから通知を発行する/受け取る

全体の流れ
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文を外して書いた。

コメントを残す