iOS

*샘플 다운로드

Note

최신 샘플 및 라이브러리는 아래 링크를 통해, 다운로드 받을 수 있습니다.

1. 개요

Morpheus Push 는 스마트폰 OS에서 지원하는 PNS(Push Notification Server)를 기반으로 한 메세지 전송 플랫폼이다. iOS Client 에서는 UPMC WAS 에서 제공하는 Push API 를 각각 버전 규격에 맞춰 연동하여 원할하게 Push Service 를 운영하기 위한 라이브러리를 제공한다.

2. 용어

APNS

  • Apple Push Notification Service 의 줄임말.

  • Apple 에서 직접 제공하는 영구적인 보안 채널에 공급자를 연결하여 대상 장치에 알림을 보낼 수 있는 서비스.

UPMC

  • Uracle Push Message Center 의 줄임말.

  • Apple APNS 서버와 TLS 인증으로 연결된 APNS Provider 서버를 Server 대 Server 로 연계하여 구동하는 WAS(Web Application Server) 이다.

  • Receiver 라고도 불림

Service 등록

  • APNS 로 부터 Token 을 할당 받고 UPMC 로 Push 서비스를 사용하겠다고 등록하는 절차

Service 해제

  • UPMC 로 Push 서비스를 사용하지 않겠다고 등록을 삭제하는 절차

User 등록

  • UPMC 로 Push 서비스에 대한 사용자를 등록 또는 변경하는 절차

ServiceAndUser 등록

  • UPMC 로 Push 서비스 등록 및 사용자를 등록을 동시에 진행하는 절차

수신 확인

  • 메세지를 제대로 받았을 때 UPMC 로 Ack를 주는 절차

읽음 확인

  • App에서 메세지를 읽었을때 UPMC 로 Ack를 주는 절차

Project ID

  • Push 서비스 이용을 위해 Dev Console에서 발급받은 ID

Client ID

  • 사용자로 등록할 Client 의 고유한 ID (CUID 라고도 함)

  • Email, UserID, Phone Number 또는 Device-UUID 등을 CUID 로 사용

Client Name

  • 사용자로 등록할 Client 의 이름 (CNAME 라고도 함)

  • 사용자의 이름이나 Nickname 또는 Device Name 을 CNAME 으로 사용

GROUPSEQ

  • Group Sequence Number 의 준말로 User Group의 고유한 Sequence Number

PSID

  • Push Service ID 의 줄임말

  • Push 서비스에 대한 고유 ID

  • APNS에서 할당 받은 Device Token을 사용

3. APNS 인증키 p8 발급 따라하기

  • p8 키가 생성되어 있지 않을 경우 Apple 개발자 사이트에서 p8 Key 발급이 가능하다.

3.1. Apple 개발자 사이트 접속

../../_images/3-110.png

3.2. Apple Developer에 로그인

  • 1번 항목에 애플 개발자 아이디, 2번 항목에 패스워드를 입력한다.

../../_images/3-21.png

3.3. Account

  • Certificates, Identifiers & Profiles 메뉴로 이동한다.

../../_images/3-31.png

3.4. Certificates, Identifiers & Profiles

  • Keys 메뉴로 이동한다.

../../_images/3-41.png

3.5. Keys

  • 1번 항목에서 기존에 생성되어 있던 p8키를 확인할 수 있다.

  • p8키는 계정당 2개까지 생성이 가능하며 계정내에 모든앱이 함께 사용하는 부분으로 적절한 관리가 필요하다.

  • 2번(+버튼)을 눌러 키를 추가한다.

../../_images/3-51.png

3.6. Register a New Key

  • 1번 항목에 Key 이름을 입력한다.

  • 2번 항목을 체크하여 APNS Key를 선택한다.

  • Continue를 눌러 다음 절차를 진행한다.

../../_images/3-61.png

3.7. APNS Key 생성중

  • 선택한 설정에 대한 내용을 보여준다.

  • Register를 눌러 키를 생성한다.

../../_images/3-71.png

3.8. Download Your Key

  • Download 버튼을 눌러 p8키를 다운로드 받는다.

  • p8키는 생성할때 1회 다운로드가 가능하고 이후 추가 다운로드가 불가하니 키 파일 관리에 유의해야 한다.

../../_images/3-81.png

3.9. Key ID

  • Apple 개발자 사이트 -> Account -> Certificates, Identifiers & Profiles 메뉴로 이동한다.

  • Keys 탭에서 기존에 생성되어 있는 Key 리스트와 그 Key ID를 확인할수 있다.

../../_images/3-101.png

3.10. Team ID

../../_images/3-91.png

4. SDK 및 설정 파일

SDK 파일

  • iOS 용 SDK 파일

    • MPushLibrary.framework

      • APNS Push를 활용할 수 있는 라이브러리가 담긴 framework 파일

    • MPushLibrary.bundle

      • MPushLibrary.framework 을 사용함에 있어 필요한 resource가 담긴 bundle 파일

  • iOS 용 샘플 파일

    • PushRecevier

      • PushManagerDelegate 대리자 샘플 파일

    • 관련 Frameworks 추가

      • XCode Project 설정 > Build Phases > Link Binary With Libraries > UserNotifications.framework 추가

      • iOS10 대응을 위해 추가되는 UserNotifications.framework 을 추가하기 위해서는 XCode 8 이상 필요

공통 설정 파일

  • Manifest.xml

    • Push 구동을 위한 설정 파일

    <manifest useDirectView="false">
            ...
        <settings>
            <push>
                <receiver>
                    <log>y</log>
                    <version>x.x</version>
                    <server>http://pushxx.morpheus.co.kr:8080/upmc</server>
                    <project-id>xxxxxxxxxxxxxxxxxxxxxxx</project-id>
                </receiver>
            </push>
        </settings>
        ...
    </manifest>
    
    • settings.push.receiver 에 대한 설정값

    Key

    Type

    Description

    project-id

    String Push 프로젝트 생성시 발급된 Project-ID

    log

    String

    Push Service 에 대한 Debugging 로그 출력 여부 ( y / n )

    version

    String

    UPMC Version ( 5.0 )

    server

    String

    UPMC WAS 서버 URL

5. 프로젝트 생성 따라하기

  • iOS 프로젝트를 생성한다. Xcode11.3 버전을 기준으로 작성됨

5.1. Create a new Xcode project

  • 템플릿 어플리케이션을 선택하고 Next를 눌러 다음 절차를 진행한다.

../../_images/5-11.png

5.2. 새 프로젝트 설정

  • 설정 항목들은 앱을 생성후 변경이 가능하다.

  • 1번 항목에 프로젝트 이름을 입력한다.

  • 2번 항목은 Apple Developer Team을 선택하는 부분으로 연동된 개발자 계정이 없을 경우 None으로 설정된다.

  • 3번 항목은 앱의 고유한 아이디 값으로 앱을 구별하는 기준이 된다.

  • Objective-C를 기준으로 적용방법이 가이드

  • Next를 눌러 다음 절차를 진행한다.

    ../../_images/5-21.png

5.3. 프로젝트 생성 경로 설정

  • 프로젝트가 생성될 위치를 선택하고 프로젝트를 생성한다.

../../_images/5-31.png

6. 프로젝트에 Push SDK 적용

6.1. Push SDK 프로젝트에 drag & drop

  • 1번 항목에서 라이브러리 파일 MPushLibrary.framework 와 MPushLibrary.bundle을 확인할 수 있다.

  • Custom 파일과 Manifest.xml 파일이 포함된 2번 폴더 전체를 프로젝트에 드래그하여 추가한다.

  • Custom 파일은 사용방법에 따라 추가하지 않을수 있으며 라이브러리와 Manifest.xml 은 반드시 포함되어야 한다.

../../_images/6-11.png

6.2. Push SDK 프로젝트에 추가(옵션)

  • 1번 항목이 체크되어 있으면 프로젝트 폴더에 드래그한 파일이 복사된다.

  • Create groups 옵션이 선택되어 있는지 확인한다.

  • Finish를 선택하여 SDK 추가

../../_images/6-21.png

6.3. Push SDK 프로젝트에 추가(완료)

  • 1번 항목에서 SDK가 추가된 것을 확인할 수 있다.

  • Target -> Build Phases -> Link Binary With Libraries 항목에서 추가된 framework를 확인할 수 있다.

../../_images/6-3.png

6.4. 프로젝트 Push 설정

  • iOS Push를 사용하기 위해서는 Capabilities 항목에 Push Notifications를 추가해 주어야 한다.

  • Target -> Signing & Capabilities 메뉴에서 + Capabilities 항목을 선택한다.

../../_images/6-41.png

6.5. 프로젝트 Push 설정(Capabilities)

  • 팝업에서 Push Notifications 항목을 선택한다.

    ../../_images/6-51.png

6.6. 프로젝트 Push 설정(완료)

  • Push Notifications 항목이 추가된 것을 확인할 수 있다.

  • 프로젝트이름.entitlements 파일이 추가된 것을 확인할 수 있다.

    ../../_images/6-61.png

6.7. Push 라이브러리 초기화

  • 일반적으로 Appdelegate.m 파일에서 Push 라이브러리를 초기화한다.

    Case #1. <MPushLibrary/AppDelegate+PushManager.h> 로 바로 연동

    #import <MPushLibrary/PushManager.h>
    // (optional) PushManagerDelegate 대리자를 설정할 경우
    #import "PushReceiver.h"
    
    
    - (BOOL)application:(UIApplication *)application
                    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        ...
    
        [[PushManager defaultManager] application:application
                                            didFinishLaunchingWithOptions:launchOptions];
    
        // (optional) PushManagerDelegate 대리자를 설정할 경우
        [[PushManager defaultManager] initilaizeWithDelegate:[[PushReceiver alloc] init]];
    
        return YES;
    }
    

    Case #2. Push Notification 관련 UIApplicationDelegate 를 직접 연동하여 처리할 경우

    #import <MPushLibrary/PushManager.h>
    // (optional) PushManagerDelegate 대리자를 설정할 경우
    #import "PushReceiver.h"
    
    - (BOOL)application:(UIApplication *)application
                    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        ...
    
        [[PushManager defaultManager] application:application
                            didFinishLaunchingWithOptions:launchOptions];
    
        // (optional) PushManagerDelegate 대리자를 설정할 경우
        [[PushManager defaultManager] initilaizeWithDelegate:[[PushReceiver alloc] init]];
    
        return YES;
    }
    
    - (void)application:(UIApplication *)application
                    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    
        [[PushManager defaultManager] application:application
                                didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
    }
    
    - (void)application:(UIApplication *)application
                    didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    
        [[PushManager defaultManager] application:application
                                didFailToRegisterForRemoteNotificationsWithError:error];
    }
    
    - (void)application:(UIApplication *)application
                    didReceiveLocalNotification:(UILocalNotification *)notification {
    
        [[PushManager defaultManager] application:application
                                didReceiveLocalNotification:notification];
    }
    
    - (void)application:(UIApplication *)application
                    didReceiveRemoteNotification:(NSDictionary *)userInfo {
    
        [[PushManager defaultManager] application:application
                                didReceiveRemoteNotification:userInfo];
    }
    
    /*
     // Background 모드에서 호출하는 경우에 사용
    - (void)application:(UIApplication *)application
            didReceiveRemoteNotification:(NSDictionary *)userInfo
            fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
            [[PushManager defaultManager] application:application
                    didReceiveRemoteNotification:userInfo
                    fetchCompletionHandler:completionHandler];
    }
    */
    
    - (void)application:(UIApplication *)application
       didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    
        [[PushManager defaultManager] application:application
                    didRegisterUserNotificationSettings:notificationSettings];
    }
    

7. 프로젝트 빌드

  • APNS 테스트의 경우 Simulator에서는 APNS TOKEN값이 발급되지 않아 테스트가 불가하다.

  • iOS 디바이스 빌드를 위해서는 애플아이디, 인증서, 프로비저닝 프로파일 등이 필요하다.

  • 코드서명 https://developer.apple.com/kr/support/code-signing

7.1. 빌드 준비

  • 1번: 인증서, 프로비저닝 프로파일을 수동으로 셋팅할지 자동으로 셋팅할지 여부를 체크

  • 2번: Team을 선택하기 위해서는 Preferences 메뉴에 Apple ID가 등록되어 있어야 한다.

  • 3번: 빌드를 위한 셋팅중 오류가 발생하면 관련 오류 메시지가 표기된다.

  • 4번: Xcode -> Preferences 메뉴를 선택하여 Apple ID를 추가한다.

../../_images/7-1.png

7.2. Apple ID 연동

  • 애플 개발자사이트에 등록되어 있는 Apple ID를 XCode와 연동하는 과정이다.

  • 1번: Accounts메뉴를 선택하면 등록되어 있는 계정등의 정보 확인이 가능하다.

  • 2번 +버튼을 누르고 3번 Apple ID를 선택한다.

../../_images/7-2.png

7.3. Apple ID 연동(계정입력)

  • Apple ID와 Password를 입력하고 Next를 눌러 계정을 추가한다.

../../_images/7-3.png

7.4. Apple ID 연동(완료)

  • 1번: 선택된 계정에 생성되어 있는 프로비저닝 프로파일을 다운로드한다.

  • 2번: 선택된 계정에 인증서를 생성 편집등을 할수 있는 편집창을 띄운다.

../../_images/7-4.png

7.5. Automatically Manage signing

  • 등록되어 있는 Apple ID를 기준으로 Team을 선택할수 있다.

  • 빌드 셋팅 관련 오류 메시지가 사라지면 정상적으로 연결된 단말기에 빌드할 수 있다.

../../_images/7-5.png

7.6. Manually Manage signing

  • Automatically Manage signing을 해제하면 맥에 설치되어 있는 인증서, 프로비저닝 프로파일 기준으로 설정할 수 있다

  • Provisioning Profile 에서 설치된 프로비저닝 프로파일을 선택할 수 있다.

../../_images/7-6.png

7.7. Signing 메뉴

  • 프로젝트 -> Target -> Build Settings에서 Signing 메뉴에서 signing에 대한 설정을 할수 있다.

../../_images/7-7.png

7.8. 로그 보기

  • 코드서명이 정상적으로 준비가 되면 연결된 Target Device를 선택한다.

  • run 버튼을 누르면 하단 창이 활상화 되고 하단창이 열리지 않을 경우 3번 버튼을 클릭하여 활성화할 수 있다.

  • 하단창의 로그가 보이지 않을 경우 4번이 비활성화 되어 있는지 확인

  • Manifest.xml 파일에서 log가 y로 되어 있을 경우에만 Push 관련 로그가 표기

  • Push 라이브러리가 정상적으로 초기화가 되면 화면과 같은 로그를 확인할 수 있다.

../../_images/7-8.png

7.9. APNS_MODE

  • APNS_MODE는 서버에서 메시지 발송시 APNS서버를 TEST로 발송할지 REAL로 발송할지의 대한 여부값이 된다.

  • APNS_MODE값이 일치하지 않을 경우 메시지 발송시 Bad Device Token오류가 발생한다.

  • RegisterServiceAndUser API호출시 서버에 해당값을 전달한다.

  • Push 라이브러리 초기화시 값이 설정되며 default 값은 REAL

    (5.0.4 버전 이상시 mobileprovision 값을 체크하여 라이브러리에서 자동으로 초기화)

  • 개발용 인증서로 앱을 빌드시 APNS TOKEN값은 TEST토큰값이므로 DEV설정 필요하다.

  • [[PushManager defaultManager].info changeMode:@”DEV”];

../../_images/7-9.png