返回介绍

订阅记录变更

发布于 2024-10-06 10:40:36 字数 14945 浏览 0 评论 0 收藏 0

当结果与上一个查询大致相同时,您的应用重复查询效率很低。更高效的方法是订阅记录更改,让服务器在后台运行查询。服务器将通知您的应用程序对用户或应用程序感兴趣的更改。例如,如果您的应用的一个用户对某位艺术家的作品感兴趣,则可以在上传该艺术家的新作品时通知您的应用。

../Art/subscriptions\_2x.png

将订阅保存到数据库

在您的代码中,创建一个订阅对象,指定要通知的记录类型、谓词和更改类型。然后将订阅对象保存到数据库。

创建和保存订阅

  1. 创建谓词对象。例如,订阅艺术家的艺术作品(其中记录类型中的artist字段Artwork是一种Reference类型)。

    CKRecordID *artistRecordID = [[CKRecordID alloc] initWithRecordName:@"Mei Chen"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"artist = %@", artistRecordID];
    

    注: 在谓语格式字符串参数右边的表达可能的值CKRecordCKRecordID以及CKReference对象。如果您知道记录名称,则可以创建仅包含记录名称的记录ID。

  2. 创建指定记录类型、谓词和通知选项的订阅。

    CKSubscription *subscription = [[CKSubscription alloc]
                                        initWithRecordType:@"Artwork"
                                        predicate:predicate
                                        options:CKSubscriptionOptionsFiresOnRecordCreation];
    

    对于可能的值options参数有:CKSubscriptionOptionsFiresOnRecordCreationCKSubscriptionOptionsFiresOnRecordDeletionCKSubscriptionOptionsFiresOnRecordUpdate,和CKSubscriptionOptionsFiresOnce。由于options参数是位掩码,因此您可以订阅更改类型的任意组合。例如,你可以传递CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdateoptions:参数来接收所有新数据的通知。

  3. 创建CloudKit通知对象。

    CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
    notificationInfo.alertLocalizationKey = @"New artwork by your favorite artist.";
    notificationInfo.shouldBadge = YES;
    

    要向用户显示本地化字符串,请设置通知的alertLocalizationKey属性(而不是alertBody属性)。

  4. 将订阅的通知对象设置为新的CloudKit通知对象。

    subscription.notificationInfo = notificationInfo;。
    
  5. 将订阅保存到数据库。

    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协议方法。例如,实现此方法可在创建,更新或删除与谓词匹配的记录时更新视图。

  1. application:didReceiveRemoteNotification:协议方法添加到应用程序的委托。

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    }
    
  2. 在该application:didReceiveRemoteNotification:方法中,将userInfo参数转换为CKNotification对象。

    CKNotification *cloudKitNotification = [CKNotification notificationFromRemoteNotificationDictionary:userInfo];
    
  3. 获取通知的正文。

    NSString *alertBody = cloudKitNotification.alertBody;
    
  4. CKQueryNotification对象获取新记录或修改记录。

    if (cloudKitNotification.notificationType == CKNotificationTypeQuery) {
       CKRecordID *recordID = [(CKQueryNotification *)cloudKitNotification recordID];
    }
    
  5. 更新视图或根据记录更改通知用户。

测试订阅

您最初可以通过Xcode运行应用程序并使用CloudKit Dashboard创建,修改或删除记录来测试订阅,如添加,修改和删除记录中所述。然后通过在多个设备上运行您的应用程序来完全测试订阅。使用一个设备进行更改,使用另一个设备接收订阅通知。您使用多个设备,因为通知不会发送到发起通知的同一设备。

对于iOS和tvOS,请使用连接到Mac(不是模拟器)的设备来测试订阅通知。如果某个对话框询问用户是否允许您的应用接收通知,则您的应用会成功注册推送通知。

概括

在本章中,您学习了如何:

  • 使用谓词订阅记录更改
  • 处理订阅通知

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文