SeSAC_iOS_Day 56 | TIL


📂 Push Notification
前はWando!プロジェクトの進行中にlocalnotificationを開発する必要がありますが、remote notificationとlocalnotificationを区別していません.remote notificationを勉強して、もう少しでプロジェクトに接続するところでした...あの时の勉强の部分を振り返って、今日は宿题を复习します...🙃
✔️ APNs(Apple Push Notification Provider)
:各デバイスに送信するメッセージを受信し、信頼性を確認し、各デバイス->すべてのプッシュ通知の仲介センターにプッシュ通知を送信します.

プロバイダがAPNsにメッセージを送信→APNs上の証明書が信頼できるプロバイダであることを確認→各デバイスに通知を送信
→APNsはプロバイダとデバイス間のそれぞれの証明書が必要
✔️ Provider ↔ APNs
  • Token-based provider connection trust
  • Certificate-based provider connection trust
    :Appleが提供するベンダー証明書の使用方法(Bundle Identifierをターゲット)→
  • (p 8をターゲット)
  • プロバイダはTLSをAPNsサーバ
  • に接続する.
  • APNs発行証明書
  • Apple—提供されるProvider Certificateを含むAPNsに送信
  • 証明書が有効である場合、両者の間に接続が確立される
  • ✔️ APNs ↔ Device
    各デバイスには暗号化証明書と個人暗号化鍵があります.
  • は、デバイスのオペレーティングシステムに内蔵され、KeyChainに格納される
  • APNs証明書と鍵に基づいてデバイス接続の検証と検証
  • 接続を設定すると、アプリケーションはAPNに登録され、リモート通知用のアプリケーション固有のデバイストークンが取得されます.
  • APNsはアプリケーションごとにトークンを発行し、NSDataタイプとして符号化する.APNs上でのみ復号
  • デバイストークンを受信すると、プロバイダに接続してトークンを渡す必要があります.アプリでプッシュ通知を送るためには必ずデバイストークンを含めて!
  • プロバイダは、
  • デバイストークンを受信した後、デバイスにプッシュ通知を送信することができる.
  • APNsもこのトークンを受け取り、受信者と送信者が信頼されている場合、プッシュ通知が送信されます.
    ✔勘定科目Local Notificationの設定が必要なプロセス
  • Apple Developer Site
    1-1. Push通知を送信するアプリケーションのアプリケーション識別子を登録します.
    1-2. Push通知認証鍵
  • の発行
  • 開発者アカウントを購入すると、開発/導入キーは
  • に自動的に発行されます.
  • しかし、プッシュ通知の認証鍵を区別するため、
  • を追加配布してダウンロード(p 8形式)する必要がある.
  • p 8は公開鍵であり、複数のアプリケーションで使用でき、期限切れもありません.p 12は秘密鍵であり、各アプリケーションに必要とされる.1年ごとに更新します.
  • p 8 vsp 12:p 12はp 8の出現後に使用されず、p 8
  • の使用を推奨する.
  • Xcode App - Capabilities
  • プッシュ通知は、バックグラウンドモード
  • を追加する必要がある.
  • Firebaseバインド
    3-1. プロジェクト設定-クラウドメッセージ-APNs認証鍵(鍵IDとチームID)のアップロード
    3-2. コード実装(AppDelegate)
  • 登録通知(リクエスト権限)&u n U s erNotificationCenter Delegateプロトコル
  •         if #available(iOS 10.0, *) {
              // For iOS 10 display notification (sent via APNS)
              UNUserNotificationCenter.current().delegate = self
    
              let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
              UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: { _, _ in }
              )
            } else {
              let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
              application.registerUserNotificationSettings(settings)
            }
    
            application.registerForRemoteNotifications()
  • Firebaseは
  • エージェント設定&メッセージングプロトコルを採用
            Messaging.messaging().delegate = self
            
            // 현재 사용중인 토큰 가져오기
            Messaging.messaging().token { token, error in
              if let error = error {
                print("Error fetching FCM registration token: \(error)")
              } else if let token = token {
                print("FCM registration token: \(token)")
                  // 화면에 보여줄 필요가 없기 때문에 삭제하면 됨
    //            self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
              }
            }
  • コード
  • は、登録されたトークンが更新されるたびに監視するために使用される
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
      print("Firebase registration token: \(String(describing: fcmToken))")
    
      let dataDict: [String: String] = ["token": fcmToken ?? ""]
      NotificationCenter.default.post(
        name: Notification.Name("FCMToken"),
        object: nil,
        userInfo: dataDict
      )
      // TODO: If necessary send token to application server.
      // Note: This callback is fired at each app startup and whenever a new token is generated.
    }
  • APNトークンをFCM登録トークン
  • にマッピングする
    func application(application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
      Messaging.messaging().apnsToken = deviceToken
    }
  • Foreground時のアラーム処理(ローカル/リモート同一)
  • func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
            completionHandler([.alert, .badge, .sound])
        }