SwiftUI 教程

SwiftUI 主页 SwiftUI 概览 SwiftUI 与 UIkit

SwiftUI 环境

SwiftUI 安装和环境配置 SwiftUI 基本组件 SwiftUI 构建第一个应用程序

SwiftUI 视图

SwiftUI 视图 SwiftUI 自定义文本视图 SwiftUI 自定义图像视图 SwiftUI 堆栈

SwiftUI 绘制形状

SwiftUI 形状 SwiftUI 绘制线条 SwiftUI 绘制矩形 SwiftUI 绘制圆角矩形 SwiftUI 绘制三角形 SwiftUI 绘制圆形 SwiftUI 绘制星形 SwiftUI 绘制多边形 SwiftUI 绘制饼图 SwiftUI 使用内置形状

SwiftUI 文本

SwiftUI 文本视图 SwiftUI 文本输入和输出

SwiftUI 颜色

SwiftUI 颜色 SwiftUI 颜色选择器 SwiftUI 渐变 SwiftUI 调整颜色

SwiftUI 效果

SwiftUI 效果 SwiftUI 混合效果 SwiftUI BLur 效果 SwiftUI 阴影效果 SwiftUI 悬停效果

SwiftUI 动画

SwiftUI 动画 SwiftUI 创建动画 SwiftUI 创建显式动画 SwiftUI 多个动画 SwiftUI 过渡 SwiftUI 不对称过渡 SwiftUI 自定义过渡

SwiftUI 图像

SwiftUI 图像 SwiftUI 图像作为背景 SwiftUI 旋转图像 SwiftUI 媒体

SwiftUI 视图布局

SwiftUI 视图布局 SwiftUI 视图大小 SwiftUI 视图间距 SwiftUI 视图填充

SwiftUI UI 控件

SwiftUI UI 控件 SwiftUI 按钮 SwiftUI 复选框 SwiftUI 菜单栏 SwiftUI 工具栏 SwiftUI 搜索栏 SwiftUI 文本字段 SwiftUI 滑块 SwiftUI 切换 SwiftUI 选择器 SwiftUI 菜单

SwiftUI 列表 &表格

SwiftUI 列表 SwiftUI 静态列表 SwiftUI 动态列表 SwiftUI 自定义列表 SwiftUI 表格

SwiftUI 表单

SwiftUI 表单 SwiftUI 在部分中拆分表单

SwiftUI 事件处理

SwiftUI 事件处理 SwiftUI 手势 SwiftUI 剪贴板 SwiftUI 拖放 SwiftUI 焦点 SwiftUI 警报

SwiftUI 杂项

SwiftUI 容器 SwiftUI 导航 SwiftUI 通知 SwiftUI 跨平台 UI SwiftUI 数据 SwiftUI 可访问性

SwiftUI 框架集成

SwiftUI 框架集成 SwiftUI 与 UIKit 交互 SwiftUI 创建 macOS 应用

SwiftUI 有用资源

SwiftUI 有用资源 SwiftUI 讨论


SwiftUI- 通知

通知是发送给用户的消息或警报,用于通知他们有关应用程序或服务的新信息、更新或事件。通知可以显示在设备的锁定屏幕上、通知中心中,也可以显示为横幅或警报,具体取决于系统和设置。

通知类型

在 SwiftUI 中,通知有两种类型:

  • 本地通知:这些通知在设备本地安排和触发,无需互联网连接。例如,提醒应用程序可能会使用本地通知提醒用户即将发生的事件。

  • 推送(远程)通知:这些通知从服务器发送到设备,通常通过 iOS 的 Apple 推送通知服务 (APNs) 或 Android 的 Firebase 云消息传递 (FCM) 等服务发送。例如,社交媒体应用可能会发送推送通知,通知用户有新消息。

通知的工作原理?

通知的工作原理按以下步骤说明:

  • 权限请求:应用向用户请求权限以显示通知。

  • 触发:通知由应用(本地)或服务器(推送)触发。

  • 显示:通知以横幅、声音或徽章的形式显示在设备上。

  • 交互:用户可以通过点击通知与通知进行交互,从而打开应用或执行操作(例如,回复消息)。

本地通知

SwiftUI 中的本地通知是指由应用本身触发的通知,通常不需要互联网连接。本地通知可以安排在特定时间或特定事件之后出现,并且它们可以包含标题、消息、声音和徽章等内容。

这些通知在设备本地管理,这意味着应用程序不依赖外部服务器来触发它们。

示例

以下 SwiftUI 程序用于创建本地通知。

import SwiftUI
import UserNotifications
@main
struct MyApp: App {
   @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
   var body: some Scene {
     WindowGroup {
       ContentView()
         .onAppear {
            // 当应用出现时请求通知权限
            requestNotificationPermission()
         }
     }
   }
   // 请求显示通知的权限
   func requestNotificationPermission() {
     UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
       if granted {
         print("Notification permission granted")
       } else if let error = error {
         print("Error: \(error.localizedDescription)")
       }
     }
   }
   // 5 秒后安排本地通知的功能
   func scheduleLocalNotification() {
     let content = UNMutableNotificationContent()
     content.title = "Reminder!"
     content.body = "This is a local notification from SwiftUI."
     content.sound = .default

     // 5 秒后触发通知
     let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

     // 创建通知请求
     let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

     // 将通知请求添加到通知中心
     UNUserNotificationCenter.current().add(request) { error in
       if let error = error {
         print("Error scheduling notification: \(error.localizedDescription)")
       } else {
         print("Notification scheduled successfully!")
       }
     }
   }
}
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {   
   // 应用程序启动完成后将调用此函数
   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     UNUserNotificationCenter.current().delegate = self
     return true
   }
   // 当应用程序处于前台时处理通知
   func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
     // 通过横幅和声音显示通知
     completionHandler([.banner, .sound])
   }
}
struct ContentView: View {
   var body: some View {
     VStack {
       Text("Local Notification Example").font(.title).padding()

       // Button to schedule a local notification
       Button(action: {
         // 调用函数来安排通知
         if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
            appDelegate.scheduleLocalNotification()
         }
       }) {
         Text("Schedule Notification")
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
       }
     }.padding()
   }
}

远程通知

推送(远程)通知是从服务器发送到用户设备的消息,即使应用未在前台运行也是如此。与由应用本身触发的本地通知不同,推送通知是从外部服务器发起的,通常通过 iOS 的 Apple 推送通知服务 (APN) 和 Android 的 Firebase Cloud Messaging (FCM) 等服务发起。

示例

以下 SwiftUI 程序用于创建推送通知。

import SwiftUI
import UserNotifications
import UIKit

@main
struct MyApp: App {
   @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

   var body: some Scene {
     WindowGroup {
       ContentView()
         .onAppear {
            // 启动时请求通知权限
            requestPushNotificationPermission()
         }
      }
   }

   // 请求推送通知权限
   func requestPushNotificationPermission() {
     UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
       if granted {
         print("Push notification permission granted")
       } else if let error = error {
         print("Error requesting permission: \(error.localizedDescription)")
       }
     }
   }
}
class AppDelegate: NSObject, UIApplicationDelegate {   
   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     // 请求推送通知权限
     requestPushNotificationPermission()
     
     // 注册远程通知
     application.registerForRemoteNotifications()
     return true
   }
   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
     // 在此处理设备令牌
     let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
     print("Device Token: \(deviceTokenString)")
     // 将此设备令牌发送到您的服务器
   }
   func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
     print("Failed to register for push notifications: \(error.localizedDescription)")
   }
}
extension AppDelegate: UNUserNotificationCenterDelegate {   
   // 在前台处理推送通知
   func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
     completionHandler([.banner, .sound, .badge])
   }
   // 当用户点击通知时处理
   func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
     print("User tapped on the notification: \(response.notification.request.content.body)")
     completionHandler()
   }
}
struct ContentView: View {
   var body: some View {
     VStack {
       Text("Push Notifications Example")
         .font(.title).padding()

       Text("Push notifications will appear here when sent from the server.")
         .padding()

       // 用于测试或与通知交互的按钮
       Button("Send Test Push Notification") {
         // 触发服务器端操作以发送推送通知
       }.padding()
       .background(Color.blue)
       .foregroundColor(.white)
       .cornerRadius(10)
     }
   }
}