首先检查用户授予权限,然后调用该方法注册远程通知。当请求完成后者将调用另一个代理方法。这个方法响应包含一个device token,你可以打印进行调试。在发送推送通知来识别设备需要这个device token。
如果出现错误,调用下面的方法。
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { print("Registration failed!") }
注意:重要的是在应用程序启动时要调用registerUserNotificationSettings,因为用户可以改变权限的设置。同样registerForRemoteNotifications也是很重要的,因为有些场景device token可以改变那么通知将不再发送。
到目前为止,这足以让你收到一个简单的通知。
通知内容
通过不同的通知内容,有不同的方式来使一个App来收到不同类型的通知,这些通知内容包括应用程序通知用户的信息,或者用户自定义的信息。
给用户发送通知,使用JSON格式,这个格式本身包含一个字典,对应aps的key。在这第二个字典你指定载内容和key。
最常见的是:
向用户显示的通知消息。这是一个简单的字符串,或一个字典key和标题一样,正文等等。
接收到通知的声音。它可以是一个定制的声音,或一个系统的声音。
应用图标右上角的角标个数。将其设置为0,消除角标。
有效的内容。使用值1发送一个无声的通知给用户。它不会播放任何声音,或任何角标设置,但是当通知被唤醒,应用将与服务器进行沟通。
本教程的一个简单的通知内容:
{ "aps": { "alert": { "title":"Hello! :)", "body":"App closed..." }, "badge":1, "sound":"default" } }
应用程序的生命周期
拷贝device token粘贴在Pusher的token部分,拷贝这个JSON对象在Pusherd的payload部分。
试着发送第一个通知。如果设备的屏幕被锁定,它将看起来如下,但什么都不会发生,当用户点击了这个通知视图。
接受通知,你需要添加新的方法:
private func getAlert(notification: [NSObject:AnyObject]) -> (String, String) { let aps = notification["aps"] as? [String:AnyObject] let alert = aps?["alert"] as? [String:AnyObject] let title = alert?["title"] as? String let body = alert?["body"] as? String return (title ?? "-", body ?? "-") }
这将返回收到的通知标题和正文,如果结构是相同的。
func notificationReceived(notification: [NSObject:AnyObject]) { let viewController = window?.rootViewController let view = viewController as? ViewController view?.addNotification( title: getAlert(notification: notification).0, body: getAlert(notification: notification).1) }
这个方法将在应用程序主要视图UITableView内添加一行(参见ViewController的完整项目代码)。
我测试了三个案例的推送通知:
当应用关闭时
如果用户打开应用程序的通知,调用didFinishLaunchingWithOptions方法更新,如下:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. application.applicationIconBadgeNumber = 0; // Clear badge when app launches // Check if launched from notification if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] { window?.rootViewController?.present(ViewController(), animated: true, completion: nil) notificationReceived(notification: notification) } else { registerPushNotifications() } return true }
假设用户已经看过了这个通知,那么角标就被清除了。然后,检查应用程序是从图标打开还是通过通知打开的。在第一种情况下,调用registerPushNotifications()方法然后继续之前的流程。如果应用是通过打开通知的方式运行,则调用自定义notificationReceived方法来添加行。
当应用运行在前台时
如果用户正在使用应用程序,这意味着应用程序在前台,接受通知的方法如下。在这个通知的方法中加入对tableView的处理:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { notificationReceived(notification: userInfo) }
注意:在这种情况下,通知将不会发出声音。
当应用运行在后台时
在这种情况下,我添加了一个方法来清除角标数目。通知的处理和应用程序在前台的处理是一样的。
func applicationWillEnterForeground(_ application: UIApplication) { application.applicationIconBadgeNumber = 0; // Clear badge when app is or resumed }
最后,这个列表中有三行来自通知的内容。
最后