iOS 建立遠距推播 App (一) Storyboard 程式篇

如何使用 xcode 建立 遠距推播 app ?
Step 01 : 建立 Storyboard 專案
Step 02 : 設定各項參數
(1) 在 專案(Project)  TARGETS 頁 Signing & Capabilities 內新增
Background Modes 及 Push Notification 二個 Capabilities
Background Modes 項目勾選 Remote notifications

Step 03 : 自訂 AppDelegate 類別
(SwiftUI 專案才需要,Storyboard 專案已經內建)
在 AppDelegate.swift 的  class AppDelegate: NSObject, UIApplicationDelegate 內的 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
內新增 application.registerForRemoteNotifications()

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    application.registerForRemoteNotifications() //啟用 Remote Notification
    return true
}

在 AppDelegate.swift 的  class AppDelegate: NSObject, UIApplicationDelegate 內 新增二個功能.

func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
){
     let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
     print(token)
}

func application(
    _ application: UIApplication,
    didFailToRegisterForRemoteNotificationsWithError error: Error
){
   //無法推播的錯誤訊息
   print(error)
}


Step04: 在 ViewController.swift 內 import UserNotifications 及在 viewDidAppear 取得 推播權

import UIKit
import UserNotifications
class ViewController: UIViewController {
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        //MARK: 取得推播援權
        Task{
            let opt:UNAuthorizationOptions = [.alert, .badge, .sound]
            if try! await UNUserNotificationCenter.current().requestAuthorization(options: opt){
                
            } else {
                
            }
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}