본문 바로가기
카카오 REST API & SDK/푸시 알림

iOS(Swift) + APNs + Postman 예제 - 푸시 알림 (Notification)

by kakao-TAM 2022. 7. 31.

KeyID, TeamID, Device Token으로 발송 테스트 할 수 있는 어플리케이션 https://apps.apple.com/kr/app/swifty-pusher/id1618221326?mt=12 

애플 공식 문서 https://developer.apple.com/documentation/usernotifications


1. Apple Developers Key 등록 

https://developer.apple.com/account/resources/authkeys/list

2. 인증 키 다운로드

3. 디벨로퍼스 푸시 알림 설정

"2. 인증 키 다운로드"에서 받은 AuthKey_XXXXXXXX.p8 파일과 Key ID

그리고 https://developer.apple.com/ > Account > Membership에서 확인할 수 있는 Team ID를 설정합니다.

 

 

4. XCode 푸시 알림 설정 

Background Modes의 Remote notification과 PushNotification을 추가합니다.

참고. https://help.apple.com/xcode/mac/current/#/devdfd3d04a1

import UserNotifications

@main
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate, UNUserNotificationCenterDelegate {



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        Messaging.messaging().delegate = self
        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()
              
        return true
    }
    
    // [START receive_message]
    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult)
                       -> Void) {
      // If you are receiving a notification message while your app is in the background,
      // this callback will not be fired till the user taps on the notification launching the application.
      // TODO: Handle data of notification
      // With swizzling disabled you must let Messaging know about the message, for Analytics
      // Messaging.messaging().appDidReceiveMessage(userInfo)
      // Print message ID.
      if let messageID = userInfo[gcmMessageIDKey] {
        print("Message ID: \(messageID)")
      }

      // Print full message.
      print(userInfo)

      completionHandler(UIBackgroundFetchResult.newData)
    }
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
        print("APNs token retrieved: \(deviceToken)")
    }    
}

 

5. 테스터로 푸시 알림 테스트

※ 개발환경에서 로그로 확인한 deviceToken은 Sandbox APN Server로 발송 가능합니다.

 동일한 앱이라도 앱스토어에서 다운로드 받은 앱은 deviceToken이 다르고 스토어에서 앱 재설치해도 deviceToken이 달라집니다.

앱스토어에서 설치한 앱으로 받은 deviceToken만 Production APN Server로 발송 가능합니다.

 

6. 카카오 푸시 알림 API 호출 

(1) 푸시 토큰 등록 하기 - 공식문서

 

헤더에 Admin Key 를 Authorization 설정하고 push_token과 device_id에 deviceToken 값을 설정합니다.

(2) 푸시 알림 보내기 - 공식문서

{
  "for_apns":{
    "badge":3,
    "sound":"sound_file",
    "push_alert":true,
    "message":"홍길동님 외 2명이 댓글을 달았습니다.",
    "custom_field":{
      "article_id":"111",
      "comment_id":"222"
    }
  }
}

디벨로퍼스 가이드에 있는 내용 그대로 발송

 

 

 

 

댓글