1. 通知权限获得, App 启动时会询问, 是否允许接收通知。
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate{ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().delegate = self // 通知権限を取得 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in if granted { DispatchQueue.main.async(execute: { // 通过UIApplication注册远程通知。 // appWatch没有这段代码,appWatch所以不能注册远程通知服务。 UIApplication.shared.registerForRemoteNotifications() }) } } return true }
2. RemoteNotification注册成功后, 会激活AppDelegate中下面的方法。得到 从苹果Apns返回的deviceToken。
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let uuid = UIDevice.current.identifierForVendor!.uuidString let deviceTokenStr = deviceToken.hexString } extension Data { var hexString: String { let hexString = map { String(format: "%02.2hhx", $0) }.joined() return hexString } }
3. 在AppDelegate实装下面的两个方法, App接收通知到以后, 会激活下面的方法。
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.badge, .alert, .sound]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { completionHandler() }
4. 发送LocalNotification例子。
// ローカル通知 let content = UNMutableNotificationContent() content.title = "本地通知" // 通知消息体 content.body = "通知" // 通知声音, 可以自定义 content.sound = UNNotificationSound.default // トリガー let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false) let requestIdentifier = "com.localNotification." + String(Date().timeIntervalSince1970) // 通知リクエスト let request = UNNotificationRequest(identifier: requestIdentifier, content: content, trigger: trigger) // 通知メッセージを送信 UNUserNotificationCenter.current().add(request) { error in if error == nil { print("Time Interval Notification scheduled: \(requestIdentifier)") }else{ print("Time error: \(String(describing: error))") } }
5. 通过NodeJs 发送RemoteNotification。
// 需要npm install apn package.json { "name": "RemoteNotificationSample", "version": "1.0.0", "description": "RemoteNotificationSample", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "apn": "^2.2.0" } }
// 一部分nodejs代码 const apn = require("apn"); var options = { // 发送RemoteNotification,需要有P12证书。 pfx: "./xxxxx.p12", // P12证书 密码 passphrase: "xxxxxx", production: true }; var apnProvider = new apn.Provider(options); var note = new apn.Notification(); note.alert = "这是一个RemoteNotification"; note.payload = { 'messageFrom': 'リモート通知' }; // 和App 的Bundle Id需要一致 note.topic = "com.xxx.xxx.xxx"; note.sound = "ping.aiff"; // 通过apnProvider发送RemoteNotification apnProvider.send(note, deviceToken).then((result) => { console.log(result.failed) });
6.LocalNotification 和 RemoteNotification总结
[table id=1 /]