订阅记录变更
当结果与上一个查询大致相同时,您的应用重复查询效率很低。更高效的方法是订阅记录更改,让服务器在后台运行查询。服务器将通知您的应用程序对用户或应用程序感兴趣的更改。例如,如果您的应用的一个用户对某位艺术家的作品感兴趣,则可以在上传该艺术家的新作品时通知您的应用。
将订阅保存到数据库
在您的代码中,创建一个订阅对象,指定要通知的记录类型、谓词和更改类型。然后将订阅对象保存到数据库。
创建和保存订阅
创建谓词对象。例如,订阅艺术家的艺术作品(其中记录类型中的
artist
字段Artwork
是一种Reference
类型)。CKRecordID *artistRecordID = [[CKRecordID alloc] initWithRecordName:@"Mei Chen"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"artist = %@", artistRecordID];
注: 在谓语格式字符串参数右边的表达可能的值
CKRecord
、
CKRecordID
以及CKReference
对象。如果您知道记录名称,则可以创建仅包含记录名称的记录ID。创建指定记录类型、谓词和通知选项的订阅。
CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Artwork" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordCreation];
对于可能的值
options
参数有:CKSubscriptionOptionsFiresOnRecordCreation
,CKSubscriptionOptionsFiresOnRecordDeletion
,CKSubscriptionOptionsFiresOnRecordUpdate
,和CKSubscriptionOptionsFiresOnce
。由于options
参数是位掩码,因此您可以订阅更改类型的任意组合。例如,你可以传递CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate
的options:
参数来接收所有新数据的通知。创建CloudKit通知对象。
CKNotificationInfo *notificationInfo = [CKNotificationInfo new]; notificationInfo.alertLocalizationKey = @"New artwork by your favorite artist."; notificationInfo.shouldBadge = YES;
要向用户显示本地化字符串,请设置通知的
alertLocalizationKey
属性(而不是alertBody
属性)。将订阅的通知对象设置为新的CloudKit通知对象。
subscription.notificationInfo = notificationInfo;。
将订阅保存到数据库。
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase]; [publicDatabase saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) { if (error) // insert error handling } ];
在Xcode中,运行您的应用程序以保存对数据库的订阅。
注册推送通知
保存订阅数据库不会自动将应用程序配置为在订阅触发时接收通知。CloudKit使用Apple推送通知服务(APN)向您的应用发送订阅通知,因此您的应用需要注册推送通知以接收它们。
对于iOS和tvOS应用程序,将此代码添加到application:didFinishLaunchingWithOptions:
协议方法以注册推送通知:
// Register for push notifications
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:notificationSettings];
[application registerForRemoteNotifications];
对于Mac应用程序,请实施applicationDidFinishLaunching:
协议方法以注册推送通知。
(可选)实现application:didRegisterForRemoteNotificationsWithDeviceToken:
和application:didFailToRegisterForRemoteNotificationsWithError:
方法,以便在应用程序成功或不成功注册推送通知时采取适当的操作。
注意: 您无需在开发者帐户中为应用的显式应用ID启用推送通知即可接收订阅通知。启用CloudKit时,Xcode会自动将APN权利添加到您的权利文件中。
处理代码中的推送通知
接下来,实现该application:didReceiveRemoteNotification:
方法在到达时处理订阅通知。对于iOS和tvOS应用程序,实现UIApplicationDelegate
协议方法,对于Mac应用程序,实现NSApplicationDelegate
协议方法。例如,实现此方法可在创建,更新或删除与谓词匹配的记录时更新视图。
将
application:didReceiveRemoteNotification:
协议方法添加到应用程序的委托。- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { }
在该
application:didReceiveRemoteNotification:
方法中,将userInfo
参数转换为CKNotification
对象。CKNotification *cloudKitNotification = [CKNotification notificationFromRemoteNotificationDictionary:userInfo];
获取通知的正文。
NSString *alertBody = cloudKitNotification.alertBody;
从
CKQueryNotification
对象获取新记录或修改记录。if (cloudKitNotification.notificationType == CKNotificationTypeQuery) { CKRecordID *recordID = [(CKQueryNotification *)cloudKitNotification recordID]; }
更新视图或根据记录更改通知用户。
测试订阅
您最初可以通过Xcode运行应用程序并使用CloudKit Dashboard创建,修改或删除记录来测试订阅,如添加,修改和删除记录中所述。然后通过在多个设备上运行您的应用程序来完全测试订阅。使用一个设备进行更改,使用另一个设备接收订阅通知。您使用多个设备,因为通知不会发送到发起通知的同一设备。
对于iOS和tvOS,请使用连接到Mac(不是模拟器)的设备来测试订阅通知。如果某个对话框询问用户是否允许您的应用接收通知,则您的应用会成功注册推送通知。
概括
在本章中,您学习了如何:
- 使用谓词订阅记录更改
- 处理订阅通知
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论