iOS Push 透传推送与本地推送科普

在移动应用的开发过程中,推送通知是一个重要的功能,它帮助开发者与用户保持联系。iOS中的推送通知主要分为两种类型:透传推送(Remote Push Notifications)和本地推送(Local Notifications)。本文将介绍这两种推送的工作原理,并提供代码示例,最后用甘特图展示它们的工作流程。

透传推送

透传推送是通过服务器向用户设备发送通知的方式。一般流程如下:

  1. 用户同意接收推送通知:用户在第一次启动应用时,会收到请求权限的弹窗。
  2. 服务器注册设备Token:成功获取设备Token后,将其发送给服务器。
  3. 服务器发送推送通知:服务器使用APNs(Apple Push Notification service)发送通知。

代码示例

首先,我们需要在AppDelegate中请求用户授权接收通知:

import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // 请求用户允许接收通知
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
            if granted {
                print("用户允许接收通知")
            } else {
                print("用户拒绝接收通知")
            }
        }
        
        application.registerForRemoteNotifications()
        return true
    }

    // 处理获得的 Device Token
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print("Device Token: \(tokenString)")
        // 这里可以将 tokenString 发送给服务器
    }

    // 处理获取 Device Token 的错误
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("获取 Device Token 出错: \(error.localizedDescription)")
    }
}

接着,假设服务器已经准备好并支持APNs协议,开发者只需调用API向用户发送推送消息。这时,用户的设备上就会出现透传推送的通知。

本地推送

本地推送是通过应用内部调度通知,不需要服务器支持。用户可以设置本地的通知时间和内容。流程如下:

  1. 创建通知内容:设置通知标题、内容和触发时间等。
  2. 添加通知请求:将通知请求添加到UNUserNotificationCenter。
  3. 发送通知:在用户设定的时间,系统会触发通知。

代码示例

AppDelegate或任意一个视图控制器中设置本地推送:

import UserNotifications

func scheduleLocalNotification() {
    let content = UNMutableNotificationContent()
    content.title = "本地通知"
    content.body = "这是一个本地通知示例"
    content.sound = UNNotificationSound.default

    // 设置触发时间为5秒后
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

    // 创建通知请求
    let request = UNNotificationRequest(identifier: "local_notification", content: content, trigger: trigger)

    // 添加请求到UNUserNotificationCenter
    UNUserNotificationCenter.current().add(request) { error in
        if let error = error {
            print("添加本地通知出错: \(error.localizedDescription)")
        }
    }
}

在调用scheduleLocalNotification()函数后,用户将在5秒后收到本地通知。

甘特图展示

以下是透传推送与本地推送的工作流程甘特图,使用mermaid语法可视化:

gantt
    title Push Notification Workflow
    dateFormat  YYYY-MM-DD
    section 透传推送
    请求用户权限       :a1, 2023-10-01, 1d
    注册Device Token   :a2, after a1, 1d
    服务器发送通知     :a3, after a2, 3d
    section 本地推送
    创建通知内容       :b1, 2023-10-05, 2d
    添加通知请求       :b2, after b1, 1d
    发送通知           :b3, after b2, 1d

结语

通过本文的介绍,我们对iOS中的透传推送和本地推送有了更清晰的认识。透传推送方便用于服务器控制推送内容,而本地推送则可以在离线状态下发送通知。两者各有千秋,可根据应用需求合理选择。希望这篇文章能对您今后的开发工作提供帮助!