Summary
APNs 를 사용하여 푸쉬 서비스를 이용할 경우 소스코드 내에 푸쉬 서비스 등록 및 푸쉬를 받았을 경우 처리할 수 있는 delegate 를 구현해 주어야 한다.
iOS10 부터 UNUserNotification 을 사용하여 서비스 등록 및 처리 방법이 변경되었기 때문에 iOS10 버전과 하위버전을 같이 처리할 수 있도록 적용해 주어야 한다.
푸시 서비스 등록 및 처리
/************
AppDelegate.h
*************/
#import <UserNotifications/UserNotifications.h> // 추가 ( >= iOS10)
// UNUserNotificationCenterDelegate 를 추가
@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>
...
/************
AppDelegate.m
*************/
...
#define isOSVersionOver10 ([[[[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."] objectAtIndex:0] integerValue] >= 10)
...
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
// 푸시 서비스 초기화 함수를 호출
[self initializeRemoteNotification];
...
}
#pragma mark - Initialize Remote Notification
(void)initializeRemoteNotification {
if(isOSVersionOver10) { // iOS10 이상
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
if( !error ) {
// 푸시 서비스 등록 성공
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else {
// 푸시 서비스 등록 실패
}];
}
else { // iOS10 하위버전
if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
}
}
#pragma mark - Get Device Token
// 푸시에 사용할 디바이스 토큰을 받아오는 부분
(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSMutableString *tokenHex = [NSMutableString stringWithString:[deviceToken description]];
[tokenHex replaceOccurrencesOfString:@"<" withString:@"" options:0 range:NSMakeRange(0, [tokenHex length])];
[tokenHex replaceOccurrencesOfString:@">" withString:@"" options:0 range:NSMakeRange(0, [tokenHex length])];
[tokenHex replaceOccurrencesOfString:@" " withString:@"" options:0 range:NSMakeRange(0, [tokenHex length])];
NSLog(@"Token origin : %@", deviceToken);
NSLog(@"Token : %@", tokenHex);
}
// iOS9 이하 푸시 Delegate
#pragma mark - Remote Notification Delegate for <= iOS 9.x
(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
// 푸시 데이터가 들어오는 함수
(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"Remote notification : %@",userInfo);
}
// 푸시 서비스 등록 실패시 호출되는 함수
(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Error : %@",error);
}
// iOS10 이상 푸시 Delegate
#pragma mark - UNUserNotificationCenter Delegate for >= iOS 10
// 앱이 실행되고 있을때 푸시 데이터 처리
(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
NSLog(@"Remote notification : %@",notification.request.content.userInfo);
//푸시 배너를 띄워준다
completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound);
}
// 앱이 백그라운나 종료되어 있는 상태에서 푸시 데이터 처리
(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
NSLog(@"Remote notification : %@",response.notification.request.content.userInfo);
completionHandler();
}
iOS10 부터는 소스코드 추가 이외에 프로젝트 설정에서 Push Notificaiton 옵션을 활성화 해주어야 한다
옵션을 활성화 해주면 아래와 같이 entitlements 파일이 생성될 것이다.
이렇게 해주면 모든 푸시 서비스 등록 작업이 마무리된다.
반응형
'Programming > iOS - ObjC' 카테고리의 다른 글
[NSArray] 배열에 있는 모든 객체에서 같은 함수 호출하기 (0) | 2018.05.07 |
---|---|
[AppIcon] iOS 10.3 Dynamic Alternate Icon Name (동적으로 앱 아이콘 변경) (0) | 2017.03.28 |
CLLocation - 두 점사이 거리 구하기 (0) | 2017.03.19 |
Layer - 그림자 넣기 (0) | 2017.03.19 |
ObjectiveC와 Javascript 상호 호출 (0) | 2015.07.09 |
UILabel - 특정 범위 색상 변경 (0) | 2015.07.09 |
Device type check (0) | 2015.07.09 |
CATransition - UINavigation push animation (0) | 2015.07.09 |
UIAlertView - TextField 추가 (0) | 2015.07.09 |
NSString - Base64 Encoding/Decoding (0) | 2015.06.30 |