注:Xcode11.6 Swift5.1 最低版本:iOS 10.0
1.在做下面接入之前需要把APNs的开发证书与发布证书搞定。
2.同时需要后端同学接入APNs的时候需要把p12证书也给他们(证书最好是带密码的,无密码好像会报错。)
Coding:
// MARK: - 推送配置方法
extension AppDelegate{
// MARK: - 0.通知注册(只有在真机中起作用)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.alert,.sound,.badge]) { (accepted, error) in
if !accepted {
YLog("用户不允许消息通知。")
}else{
YLog("用户Accepted通知。")
}
}
//获取DeviceToken注册
UIApplication.shared.registerForRemoteNotifications()
}
// MARK: - 1.程序在前台时收到通知会触发
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
//可以根据业务需求发一些通知
}
// MARK: - 2.通知点击调用(只是在程序处于运行状态和前台状态调用)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
guard let res = response.notification.request.trigger else {
return
}
if res.isKind(of: UNPushNotificationTrigger.self) {
//收到远程通知
}else{
// 收到本地通知
}
completionHandler()//系统要求需实现
}
// MARK: - 3.通知点击调用(APP被杀死状态下点击通知调用)
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if application.applicationState == UIApplication.State.active {
// 从前台接受消息app
YLog("fetchCompletionHandler 前台接受消息 active \n\(userInfo) ")
}else{
// 从后台接受消息后进入app
YLog("fetchCompletionHandler 后台接受消息 inactive|background \n\(userInfo) ")
}
completionHandler(.newData)
}
// MARK: - 4.实现注册 APNs 接口deviceToken®istrationID
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
YLog("APNs注册 deviceToken -----> \(deviceToken.map { String(format: "%02hhx", $0) }.joined())")
}
// MARK: - 5.实现注册 APNs 失败接口(可选)
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
YLog("注册远程通知&DeviceToken获取失败 \(error) ")
}
}
注:APNs Tool (ANPs测试工具)
Done.