0Pricing
Swift Academy · 课时

注册推送通知

请求权限并获取设备令牌。

注册推送通知 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

推送通知的完整工作流程

推送通知会从您的服务器出发,经过 Apple 推送通知服务(APNs),到达特定设备。设备使用 APNs 签发的设备 token证明身份。在此之前,用户必须授予权限,并且应用必须完成注册。

// Flow: App registers -> APNs returns device token ->
// you send token to your server -> server pushes via APNs

通知中心

UNUserNotificationCenter 是用于处理所有本地和远程通知的单一对象:请求授权、设置代理、安排本地通知以及读取 settings。请获取共享实例。

import UserNotifications
let center = UNUserNotificationCenter.current()
// All notification configuration goes through center

请求授权

显示通知前必须先询问用户。requestAuthorization(options:) 会显示系统提示,并返回用户是否同意。请只请求所需的选项:.alert、.sound、.badge。

import UserNotifications
func requestAuth() async throws -> Bool {
    let center = UNUserNotificationCenter.current()
    return try await center.requestAuthorization(
        options: [.alert, .sound, .badge])
}

向 APNs 注册

授权与注册是分开的。获得权限后(或同时进行),请在主执行器上调用 registerForRemoteNotifications()。这会向 APNs 请求设备 token,并且必须在主线程上运行。

import UIKit
@MainActor
func registerForPush() {
    UIApplication.shared.registerForRemoteNotifications()
}

接收设备 token

成功后,应用代理的 didRegisterForRemoteNotificationsWithDeviceToken 会携带一个 Data token 被调用。您需要将其转换为十六进制字符串并发送到服务器,服务器会利用它定位此设备。

import UIKit
func application(
    _ app: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken
    deviceToken: Data) {
    let token = deviceToken.map {
        String(format: "%02x", $0) }.joined()
    print("APNs token:", token)
    // send token to your backend
}

处理注册失败

注册可能失败,原因包括没有网络、没有 APNs 权限,或运行在不受支持的环境中。请实现 didFailToRegisterForRemoteNotificationsWithError,记录错误并优雅地恢复,而不是让应用崩溃。

import UIKit
func application(
    _ app: UIApplication,
    didFailToRegisterForRemoteNotificationsWithError
    error: Error) {
    print("Push registration failed:", error)
}

token 可能发生变化

设备 token 并非永久不变。用户从备份恢复、重新安装应用或更换设备时,它都可能发生变化。请在每次启动时完成注册并上传最新 token,同时在服务器端替换旧 token。

// Best practice: register on each launch,
// always upload the freshly received token,
// never cache a token as permanent.
let rule = "re-register every launch"
_ = rule

检查 current settings

用户之后可能会在设置中撤销权限。在依赖通知之前,请查询 getNotificationSettings,读取当前授权状态以及允许使用的功能。

import UserNotifications
func currentStatus() async -> UNAuthorizationStatus {
    let settings = await UNUserNotificationCenter
        .current().notificationSettings()
    return settings.authorizationStatus
}

临时授权

.provisional 选项允许通知在没有预先提示的情况下,以静默方式到达通知中心。这非常适合让用户先试用通知,再决定是否保留或关闭它们。

import UserNotifications
func requestQuiet() async throws -> Bool {
    try await UNUserNotificationCenter.current()
        .requestAuthorization(
            options: [.alert, .sound, .provisional])
}

必需的功能

如果未在 Xcode 目标中启用推送通知功能,以上操作都无法运行;启用后会添加 aps-environment 权限。要支持后台传递,您还需要启用带有远程通知的后台模式功能。

// Xcode target > Signing & Capabilities:
//   + Push Notifications
//   + Background Modes > Remote notifications
let caps = "entitlements required"
_ = caps

整合注册流程

清晰的启动流程是:请求授权,如果用户 granted,则在主执行器上注册远程通知。随后 token 会在代理回调中到达,供上传使用。

import UIKit
import UserNotifications
func setupPush() async {
    let center = UNUserNotificationCenter.current()
    let granted = (try? await center.requestAuthorization(
        options: [.alert, .sound, .badge])) ?? false
    if granted {
        await MainActor.run {
            UIApplication.shared.registerForRemoteNotifications()
        }
    }
}

快速检查

回顾授权与注册之间的关系。

回顾

您已学会如何注册推送通知:

  • 使用 UNUserNotificationCenter 请求 .alert/.sound/.badge 授权。
  • 授权与注册是分开的;请在主执行器上调用 registerForRemoteNotifications()。
  • 将 Data 令牌转换为十六进制并上传;每次启动时都要重新注册,因为令牌会发生变化。
  • 启用推送通知功能,并考虑使用 .provisional 授权。

常见问题解答

「注册推送通知」课时是免费的吗?

是的 — 「注册推送通知」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「注册推送通知」这节课中我会学到什么?

请求权限并获取设备令牌。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「注册推送通知」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 注册推送通知
  2. 处理通知载荷
  3. 后台任务与刷新
  4. 通知操作与类别
← 返回 Swift Academy