티스토리 뷰

반응형

Notification Push는 스마트폰의 없어서는 안되는 기능 중 하나입니다.

간단하게 Push 기능을 구현한 예제를 공유 하겠습니다.

Push 계정 생성

Push 를 사용하려면 Push 계정을 생성해야 합니다.

인증서 생성

키체인 > 인증 기관에서 인증서 요청.. 을 통해 인증서를 만들어야 합니다.


인증서 정보 입력 창에 Apple ID(개발자 ID)와 이름을 입력 후 ‘디스크에 저장됨’을 선택 후 '계속' 을 클릭합니다.


App ID 생성 (Notification)

Notification을 사용하려면 App ID 을 발급받아야합니다.

Apple Developer 에서 Certificates, Idntifiers & Profiles 에 접속합니다.

왼쪽 메뉴에서 Identifiers > App IDs 에 진입합니다.


오른쪽 위에 '+' 버튼을 클릭해서 App ID 생성 화면으로 진입합니다.

앱 이름과 Bundle ID 을 입력합니다. 여기서 사용하는 Bundle ID 는 Notification 을 호출할 App Bundle ID 로 작성합니다.


하단의 App Services에서 Push Notification 을 선택한 뒤 Continue로 다음 단계로 진입합니다.


Push 인증서 등록

이제 본격적으로 APNS 인증서를 발급 받아 서버에서 Notification을 보낼 수 있도록 준비합니다.

Apple Developer 로 돌아와서 왼쪽 메뉴에서 Identifiers > App IDs 에 진입하면 방금 만든 App ID가 추가된 것을 확인할 수 있습니다.

추가된 App을 클릭 합니다. 그러면 Development SSL Certificate 을 만들 수 있는데요. 개발용과 배포용 두 가지로 나눠집니다. 테스트용도로 사용할 것이니 개발용으로 Create Certificate.. 클릭 합니다.


초반에 만든 인증 서를 업로드 합니다.


인증서 등록이 완료되었습니다.

생성된 인증서는 Download 받아 저장합니다.


APNS 인증서 발급

키체인을 열어 방금 App ID을 통해 만든 인증서('Apple Development IOS Push Services')를 '내보내기(Export)' 합니다.


내보내기(Export)을 하면 .p12 확장자로 생성됩니다. 저장 시 암호 설정창이 호출됩니다. 암호를 잘 기억해 두시기 바랍니다.


키체인의 'Apple Development IOS Push Services' 옆에 있는 화살표를 클릭하면 key 가 노출 되는데, 이 key도 Export 합니다.


작업이 완료되면 push_cert.p12, push_key.p12 두 개의 인증서 파일이 생성됩니다. 이제 이 두 파일을 갖고 APNS 파일로 변환하겠습니다.

.p12 확장자 파일을 .pem 로 바꿔주는 작업을 합니다.

입력이 완료되면 비밀번호 입력이 나옵니다. 내보내기(Export) 할때 설정한 비밀번호를 입력합니다. 그러면 .pem 파일로 변환 된 것을 확인할 수 있습니다.

openssl pkcs12 -clcerts -nokeys -out push_cert.pem -in push_cert.p12

key 또한 .p12 파일을 .pem 파일로 변경하는 작업을 합니다. 비밀번호 확인 후 다른 비밀번호로 설정하는 단계가 있습니다. 적당한 비밀번호로 변경 합니다.

openssl pkcs12 -nocerts -out push_key.pem -in push_key.p12

확장자 변경한 key.pem을 가지고 key.unencrypted.pem 을 만들어줍니다. 이 단계에서 key 파일을 .p12 에서 .pem 로 변경하면서 새로 생성해 준 패스워드을 사용합니다.

openssl rsa -in push_key.pem -out push_key.unencrypted.pem

cert 파일과 key 파일을 합쳐 최종 APNS에 사용하는 인증서를 만들어 줍니다.

cat push_cert.pem push_key.unencrypted.pem > push_apns.pem

프로비저닝 생성

Notification App ID를 만든 것을 바탕으로 프로비저닝 파일을 생성합니다.

Apple Developer > Provisionling Profiles > All 에 진입하여 오른쪽 위에 있는 '+' 버튼을 클릭합니다.


iOS App Development 을 클릭 후 다음 단계로 진입합니다.


미리 생성해두었던 App Id를 선택 후 Continue를 클릭합니다.

자기 이름으로 된 인증서를 선택합니다.


테스트 할 기기를 선택합니다. 푸시 테스트를 할 경우 예뮬레이터가 아닌 기기로 테스트 할 수 있습니다.


적당한 프로필 이름을 작성해주면 프로비저닝이 완성됩니다.


다운로드 버튼을 클릭 후 설치 합니다. 설치가 완료되면 Xcode에 자동으로 적용됩니다.


iOS Application 구현

프로젝트 생성

실질적인 테스트를 위해 Xode로 iOS 앱을 생성하겠습니다.

New Project 에서 Single View App 로 생성합니다.

Apple Developer 에서 생성한 Identifiers 의 App IDs 로 Bundle Identifier 을 구성 합니다.

올바르게 생성했는지 확인 방법은 TARGET의 General 에서 Bundle Identifier 확인 할 수 있습니다.

Notification 라이브러리 등록 및 기능 설정

PROJECT의 상단에 Build Settings 을 누르고 우측 검색창에 code siginig 을 검색해 준 뒤, Debug 우측 창을 클릭하여, 설정해 두었던 Push Service을 선택해 줍니다. 만약 설정한 Push Service을 iOS Developer 에 생성한 Push Service가 포함될 수도 있습니다.


 좌측 패널에서 Targets 밑에 있는 앱이름을 클릭하여 세팅을 해줍니다. 우선 Capability옵션에서 Push Notification기능을 켜줍니다.



TARGETS > Build Phases 카테고리에서 Link Binary With Libaraies를 클릭하고, '+'버튼을 눌러 UserNotifications.frameworkPushKit.framework를 추가해줍니다.


AppDelegate.swift 수정

AppDelegate.swift 에서 푸시 알림을 받을 수 있도록 UserNotifications 을 활용하여 소스코드를 구성합니다.

import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

   var window: UIWindow?


   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       // Override point for customization after application launch.
       /**************************** Push service start *****************************/
       // iOS 10 support
       if #available(iOS 10, *) {
           UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){ (granted, error) in }
           application.registerForRemoteNotifications()
       }
           // iOS 9 support
       else if #available(iOS 9, *) {
           UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
           UIApplication.shared.registerForRemoteNotifications()
       }
       /***************************** Push service end ******************************/
       return true
   }
   
   // Called when APNs has assigned the device a unique token
   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
       // Convert token to string (디바이스 토큰 값을 가져옵니다.)
       let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
       
       // Print it to console(토큰 값을 콘솔창에 보여줍니다. 이 토큰값으로 푸시를 전송할 대상을 정합니다.)
       print("APNs device token: \(deviceTokenString)")
       
       // Persist it in your backend in case it's new
   }
   
   // Called when APNs failed to register the device for push notifications
   func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
       // Print the error to console (you should alert the user that registration failed)
       print("APNs registration failed: \(error)")
   }

   //...
   
   // Push notification received
   func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
       // Print notification payload data (푸시 데이터로 받은 것을 보여줍니다.)
       print("Push notification received: \(data)")
   }
}


테스트

테스트를 하기 위해서는 우선 푸시를 받을 앱을 디바이스에서 실행합니다.

주의할점은 Apple Developer에서 푸시 테스트할 디바이스로 설정한 디바이스로 테스트합니다.

앱을 실행하면 알림을 보내고자 한다는 권한 허용 알림창이 나옵니다. '허용' 을 누릅니다.



앱이 실행되면 Application.swift 에서 설정한 콘솔창에 토큰 값이 보여집니다.

푸시 테스트 대상 디바이스를 설정하는데 사용하므로 토큰 값을 저장해됩니다.

APNS 테스터로 테스트

웹 상에 있는 APNS/GCM Tester 로 서버 없이 푸시 테스트를 할 수 있습니다.


  • Device Token : 디바이스 토큰 값을 넣어줍니다.

  • Message : 푸시로 달한 데이터를 설정합니다.

  • Pem File : 인증서로 만든 APNS.pem 파일 (push_apns.pem)을 넣어줍니다.

  • Environment : Sandbox 로 설정합니다.

모든 입력 사항을 입력한 후 Submit 을 누르면 푸시가 전송됩니다.


성공적으로 전송이 완료 되었으면 APNS 파일을 서버에 업로드하여 서버 구성을 하여 푸시 서비스에 활용하시면 됩니다.

주의사항

Token은 Debug Token와 Release Token 으로 구분됩니다. 둘의 차이점은 간단합니다.    ▶ Debug Token : Debug Build 시 발급하는 Device Token    ▶ Release Token : Release Build 시 발급하는 Device Token
Production 으로 Push 테스트 시 Debug, Release Build에 맞는 Token 값을 설정해야 합니다.예를들어 Release Build 한 경우 Release Token으로 테스트 하셔야합니다. 반대로 Debug Build 한 경우 Debug Token을 사용하셔야합니다.    ▶ Release Build : 테스트플라이트, 앱 스토어 배포 된 Build을 의미합니다.

정리

GCM 을 활용하여 iOS에서 푸시 보내고 받는 방법을 테스트하였습니다. 요즘은 GCM(Google Cloud Messaging) 보다 FCM(Firebase Cloud Messaing) 로 변경되고 있으며 Google 에서도 GCM 지원을 중단할 계획이 있다고 하였습니다. GCM으로 Notification 푸시 에 대해서 감을 익히고 FCM으로 푸시를 구성한다면 보다 편하게 구성할 수 있을 것으로 예상됩니다.

반응형
댓글