도래울

ios push 구현 본문

개발/iOS

ios push 구현

도래울 2016. 8. 30. 09:44

1. 중요 용어 정리.


- Provider란? 
단말로 정보를 제공해 주는 역할을 하는 시스템(=서비스, 서버) 입니다.
예를들어 카카오톡, 페이스북등이 있습니다.

- APNS란?
애플사의 원격 알림 서비스(Apple Push Notification Service)를 말합니다.
[그립2]에서는 push 서비스를 위한 애플사의 서버라고 보시면 됩니다. 

- DeviceToken란?
푸시서비스에서 단말기기를 구별하기 위한 ID 라고 생각하시면 됩니다.
예를들어 3ebd7dc97074f2f05e62eb936c4b99c977355a095a6844459dfa6aa0b7b98b0 이런 스트링값입니다.



 2. 단말에서의 구현.


단말에서 APNS로 부터 DeviceToken을 가져오려면 아래의 함수들를 실행시키면 됩니다.
위의 함수들의 위치는 '프로젝트이름AppDelegate.m'  입니다.

(1) apns에 단말을 등록하는 함수
파라미터는 알럿, 사운드, 뱃지를 푸시로 받겠다는 뜻 입니다.
원하는 푸시방식을 선택하면 됩니다. 알럿만 할 수도 있고 3개 모두 할 수 있습니다.
이 파라미터에 따라 아이폰 > 설정 > 알림 > 나의앱 > 사운드, 경고, 알림표시 가 나타납니다.
최초 어플실행시, 알럿창에 '..푸시설정 하시겠습니까?' 라고 물어볼때 사용자의 Yes/No 에 따라 
아이폰 > 설정 > 알림 > 나의앱의 알림설정이 결정됩니다.
성공적으로 apns에 단말이 등록되면 didRegisterForRemoteNotificationsWithDeviceToken)가 호출되고 실패시 3)함수(didFailToRegisterForRemoteNotificationsWithError) 가 호출됩니다.
 

ex)
- (void)applicationDidFinishLaunching:(UIApplication *)application {    

     ....
     [application registerForRemoteNotificationTypes:( UIRemoteNotificationTypeAlert |                
                                                                             UIRemoteNotificationTypeSound |
                                                                             UIRemoteNotificationTypeBadge ) ]; 
  ....
}

(2)  APNS에 단말이 등록되었을때 호출되어 지는 함수.
APNS에 성공적으로 단말이 등록되어지면 deviceToken이 리턴됩니다.
NSData형으로 받게 되고 NSString으로 변환하여 NSUserDefault등에 저장하여
사용하면 됩니다.
deviceToken을 Provider로 전송하여 단말을 구별하는데 사용됩니다.
리턴된 deviceToken은 '<3ebd7dc9 7074f2f0 ... 9dfa6aa0 b7b98b0f>' 으로 되어 있어서


'<', '>', 스페이스 문자는 제거해서 사용합니다.



- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        
    NSString *deviceTokenStr = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSetcharacterSetWithCharactersInString:@"<>"]];
    deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@" "withString:@""];

    if (deviceTokenStr != nil) {
        [[NSUserDefaultsstandardUserDefaults] setObject:deviceTokenStr forKey:@"deviceToken"];
        [[NSUserDefaultsstandardUserDefaults] synchronize];
    }
}

(3) APNS에 단말 등록이 실패했을때 호출되어지는 함수.

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    
    NSLog(@"\n\n\n\ndeviceToken error : %@", [error description]);
}

(4) 푸시가 왔을때 실행되는 함수.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userPushInfo {
    
    NSLog(@"userPushInfo : %@", userPushInfo);
    ....
}


1) APNS에서 보내온 push정보.

{
    aps =     {
               alert = "안녕하세요~";
               badge = 10;
               sound = default
    };
    key1 = value1;
    key2 = value2;
    key3 = value3;




}

Provider는 deviceToken, alert, badge, sound 정보등을 APNS에 보내고 APNS는 위의 형태로 단말에 보내게 됩니다.
단말에서는 

NSDictionary *aps = [userPushInfo valueForKey:@"aps"]; 와 같이 꺼내서 사용하면 됩니다.

2) 앱의 상태에 따른 푸시제어.

포그라운드상태는 화면에 유저앱이 떠 있는 상태이다.
포그라운드에서 푸시가 오면 바로  didReceiveRemoteNotification 가 호출되고
didReceiveRemoteNotification 함수 안에서 
알럿창을 개발자가 직접 만들어서 주어야 한다.
포그라운드상에서는 푸시정보에 sound=default이면 기본음이 울려지지 않는다.

백그라운드에서 푸시가 오면 iOS에서 알럿을 뿌려준다.
알럿의 내용은 푸시정보의 aps->alert값이고 sound가 default로 되어있으면 기본음이 울려진다.
iOS에서 뿌려준 알럿청에는 '닫기', '보기' 버튼이 있고
'보기' 버튼을 클릭하면  didReceiveRemoteNotification 호출된다.
'닫기'버튼을 클릭하면 didReceiveRemoteNotification호출되지 않고 이벤트가 종료된다.

잠금상태에서 푸시가 오면 iOS에서 알럿을 뿌려준다.
알럿에는 메시지만 있고 단추는 없다.
'밀어서 잠금해제'를 하면 didReceiveRemoteNotification가 호출된다.

didReceiveRemoteNotification 함수안에서 앱이 포그라운드인지 백그라운드 또는 잠금상태인지는
아래와 같이 알 수 있다.

UIApplicationState state = [application applicationState];

if ( state == UIApplicationStateActive ) { // 포그라운드
    ....
} else { // 백그라운드, 잠금상태
    ....
}

Comments