copinism-ios/copinism/AppDelegate.swift

124 lines
5.0 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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)
}
}