124 lines
5.0 KiB
Swift
124 lines
5.0 KiB
Swift
//
|
||
// AppDelegate.swift
|
||
// copinism
|
||
//
|
||
// Created by 黄仕杰 on 2024/6/7.
|
||
//
|
||
|
||
import UIKit
|
||
import UserNotifications
|
||
import SwiftUI
|
||
|
||
|
||
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
|
||
|
||
var window: UIWindow?
|
||
|
||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
||
// 设置 UNUserNotificationCenter 的代理
|
||
UNUserNotificationCenter.current().delegate = self
|
||
|
||
// 请求推送通知权限
|
||
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
|
||
if granted {
|
||
DispatchQueue.main.async {
|
||
application.registerForRemoteNotifications()
|
||
}
|
||
} else {
|
||
// 在消息列表的界面可以使用这里的不变量展示让用户去手机设置界面开启通知
|
||
print("用户拒绝通知权限: \(String(describing: error))")
|
||
}
|
||
}
|
||
return true
|
||
}
|
||
|
||
// 当设备成功注册推送通知时调用。用来获取设备令牌并发送到服务器
|
||
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
|
||
let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
|
||
let token = tokenParts.joined()
|
||
print("Device Token: \(token)")
|
||
sendDeviceTokenToServer(token: token)
|
||
}
|
||
|
||
// 当设备未能注册推送通知时调用。用来处理和记录错误信息
|
||
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
|
||
print("Failed to register: \(error)")
|
||
}
|
||
|
||
private func sendDeviceTokenToServer(token: String) {
|
||
let url = URL(string: "https://yourserver.com/api/deviceToken")!
|
||
let parameters: [String: Any] = [
|
||
"deviceToken": token,
|
||
"deviceType": "iOS"
|
||
]
|
||
var request = URLRequest(url: url)
|
||
request.httpMethod = "POST"
|
||
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
||
request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)
|
||
let task = URLSession.shared.dataTask(with: request) { data, response, error in
|
||
if let error = error {
|
||
print("Error sending device token: \(error)")
|
||
return
|
||
}
|
||
print("Device token sent successfully")
|
||
}
|
||
task.resume()
|
||
}
|
||
|
||
// 处理接收到的通知
|
||
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
|
||
if #available(iOS 14.0, *) {
|
||
completionHandler([.banner, .sound, .badge])
|
||
} else {
|
||
completionHandler([.alert, .sound, .badge])
|
||
}
|
||
}
|
||
|
||
// 当用户点击通知或通知到达时触发
|
||
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
|
||
// 从锁屏弹出消息到主屏幕
|
||
if response.actionIdentifier == UNNotificationDefaultActionIdentifier {
|
||
// 处理通知,跳转到特定界面
|
||
handleNotification(response.notification)
|
||
|
||
// 发送本地通知
|
||
let message = Message(text: response.notification.request.content.body, sender: response.notification.request.content.title, timestamp: "" ,isSelf: true, avatar: "avatar")
|
||
sendNotification(for: message)
|
||
}
|
||
completionHandler()
|
||
}
|
||
|
||
|
||
private func handleNotification(_ notification: UNNotification) {
|
||
// 在这里添加自定义处理逻辑,比如跳转到特定界面
|
||
if let window = window {
|
||
// 假设 ContentView 是你希望跳转到的视图
|
||
let contentView = ContentView()
|
||
|
||
// 将 SwiftUI 视图包装为 UIViewController
|
||
let hostingController = UIHostingController(rootView: contentView)
|
||
|
||
// 获取 rootViewController 并呈现新的视图
|
||
if let rootViewController = window.rootViewController {
|
||
rootViewController.present(hostingController, animated: true, completion: nil)
|
||
} else {
|
||
window.rootViewController = hostingController
|
||
window.makeKeyAndVisible()
|
||
}
|
||
}
|
||
}
|
||
|
||
// 发送本地通知
|
||
private func sendNotification(for message: Message) {
|
||
let content = UNMutableNotificationContent()
|
||
content.title = message.sender
|
||
content.body = message.text
|
||
content.sound = UNNotificationSound.default
|
||
|
||
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
|
||
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
|
||
|
||
UNUserNotificationCenter.current().add(request)
|
||
}
|
||
}
|