介绍
苹果在2014年与iOS 8一同推出了自己的CloudKit框架。尽管其主要目的是充当iOS应用程序的在线数据库,但CloudKit还提供了许多其他功能,包括推送通知。
本教程要求您至少将Swift 3与Xcode 8结合使用。您还需要具有用于测试的物理iOS设备和Apple开发人员帐户,以便您可以为应用程序启用CloudKit。
1.为什么要使用CloudKit?
首先,我们将研究为应用程序的推送通知使用CloudKit的优点(和缺点)。
在本教程中将看到,要使用CloudKit设置推送通知,您无需像其他云服务一样担心创建证书和置备配置文件。 由于一切都是由Apple制造的,因此您要做的就是为您的应用程序启用CloudKit,其余的都可以使用。
对于某些开发人员而言,CloudKit好的事情之一就是您免费获得多少。 还有许多其他的后端即服务(BaaS)公司,它们为iOS应用提供推送通知,但是其中大多数公司都限制了可以免费发送多少个通知。 使用CloudKit,可以发送给用户的推送通知数量不受限制。 但是,CloudKit的免费套餐确实限制了数据存储,数据传输和每秒的用户请求数。
在您的应用程序中使用CloudKit的另一个优点是,由Apple提供的网络稳定性和维护将是您永远不必担心的事情。 Apple服务中断很少发生,并且需要立即解决。 这意味着您可以依靠CloudKit始终为您的用户正常工作。
2.设置CloudKit
首先,从iOS>应用程序> Single View Application模板在Xcode中创建一个新项目。
Xcode创建项目后,请转到项目导航器 ,然后单击“ 功能”选项卡。 在此屏幕上,单击开关以启用iCloud ,然后启用CloudKit复选框:
启用CloudKit后,现在可以转到应用程序的CloudKit仪表板 。
为了向应用程序的用户发送推送通知,我们将创建一个GlobalNotification记录类型,该记录类型将在创建这种类型的新记录时通知所有用户。 如果登录后尚未为您打开CloudKit仪表板的“ 记录类型”部分,请在侧栏中单击它。
要创建新的记录类型,请点击+ 屏幕顶部的按钮。 填写菜单,如以下屏幕截图所示:
对于本教程,我们仅将单个内容字段添加到记录类型,但是对于您自己的应用程序,您可以根据需要添加任意多个。
完成后,单击右下角的“ 保存”按钮。
3.设置应用
返回Xcode,打开您的AppDelegate.swift文件,并在代码顶部添加以下import语句:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound], completionHandler: { authorized, error in
if authorized {
application.registerForRemoteNotifications()
}
})
return true
}
使用此代码,我们要求用户获得显示通知的权限,如果他们接受,则注册该应用程序以获取推送通知。
现在,我们需要实现application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
方法。 将以下代码添加到您的AppDelegate
类中:func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let subscription = CKQuerySubscription(recordType: "GlobalNotification", predicate: NSPredicate(format: "TRUEPREDICATE"), options: .firesOnRecordCreation)
let info = CKNotificationInfo()
info.alertBody = "A new notification has been posted!"
info.shouldBadge = true
info.soundName = "default"
subscription.notificationInfo = info
CKContainer.default().publicCloudDatabase.save(subscription, completionHandler: { subscription, error in
if error == nil {
// Subscription saved successfully
} else {
// An error occurred
}
})
}
使用此代码,我们首先创建一个CKQuerySubscription
对象。 这个订阅对象告诉CloudKit它应该发送通知的内容。 初始化此订阅时,我们包括以下内容:
- 要监视的记录类型的名称。
- 谓词,可用于将预订限制为指定类型的特定记录。 在本教程中,我们希望订阅所有GlobalNotification记录,因此我们传入始终为真的谓词。
- 一个或多个触发器告诉CloudKit应何时发送通知。 在此示例中,我们只希望在创建新记录时发出通知。 其他有效触发器包括何时更新或删除记录。
接下来,我们创建一个CKNotificationInfo
对象,为其提供一些内容,然后将其分配给订阅对象。 CKNotificationInfo
对象是您格式化传递给用户的推送通知的方式。 在此示例中,我们使用以下属性对其进行配置:
alertBody
"A new notification has been posted!"
shouldBadge
值为true
。 这将导致主屏幕上的应用程序图标针对收到的每个通知增加其编号。soundName
为"default"
。 这只会为您的应用使用默认的iOS通知声音。 如果要使用自定义声音,则将需要使用声音文件的名称。- 具有单个值的
desiredKeys
数组。 对于您包含在此数组中的每个键,CloudKit将从触发通知的记录中加载相应的值,并将其包含在通知的用户信息字典中。
再往下,我们将通知信息分配给订阅,然后将其保存到您的应用程序的公共CloudKit数据库中。
为了在您的应用程序运行时可以看到通知,请在AppDelegate类中添加以下方法:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .sound])
}
此代码使用UserNotifications框架来显示您的通知,就好像您的应用程序根本没有运行一样。
在运行您的应用程序之前,您需要通过转到设置来检查您的测试设备是否已登录到iCloud帐户。 否则,您将需要这样做,因为CloudKit API要求当前用户登录。
从Xcode构建并运行您的应用,并接受您的应用显示通知的请求。 完成此操作后,请返回您应用的CloudKit仪表板,然后单击左侧边栏中的“ 订阅类型 ”。 您应该看到带有INSERT触发器的GlobalNotification记录的新订阅:
4.发送通知
现在,剩下要做的就是发送通知! 仍在CloudKit仪表板中,单击左侧栏中公共数据下的默认区域 。 单击+按钮或“ 新建记录”以创建新的GlobalNotification记录。 随便填写内容 ,然后单击右下角的保存 。
保存记录后,您应该看到通知立即出现在测试设备上:
结论
如您所见,您可以使用CloudKit轻松为iOS应用实现推送通知。 设置非常简单,仅需很少的步骤,并且提供的API允许您为应用程序可能需要的任何推送通知。
翻译自: https://code.tutsplus.com/tutorials/using-apples-cloudkit-for-push-notifications--cms-28125