ios | ios도 모르고 하이브리드 앱 개발하기 [ 21.3 APNS 구현 - APNS 클라이언트 만들기 (IOS 구성) ]

2016. 10. 7. 11:32mobile/ios



ios도 모르고 하이브리드 앱 개발하기 [ 21.3 APNS 구현 - APNS 클라이언트 만들기 (IOS 구성) ]






필자는 APNS를 선행작업을 제외한 3단계로 구분하여 포스팅 할 계획이다.

21.1 APNS 구현 - APNS 인증서 만들기

21.2 APNS 구현 - APNS 서버 만들기 (프로바이더 구성)

21.3 APNS 구현 - APNS 클라이언트 만들기 (IOS 구성)






마지막으로 클라이언트를 구성해보자.


AppDelegate.m 파일을 수정하면 된다.



didFinishLaunchingWithOptions 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    /* S APNS 등록 */
    // iOS 8.0 이상인 경우
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
        UIUserNotificationSettings *pushRegistration = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:pushRegistration];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
    
    // 어플리케이션 실행시 뱃지를 0으로 해준다.
    application.applicationIconBadgeNumber = 0;
    
    /* E APNS 등록 */
    return YES;
    
}
cs

11# : IOS 8.0 이상만 사용가능한 앱이라면 주석처리, 그렇지 않으면 Project > General > Deployment Target 7.x 설정

15# : 뱃지를 0으로 설정함, 앱 최초 실행시 PUSH 동의 여보를 한번만 묻는다고 한다.



디바이스 토큰 가져오기

1
2
3
4
5
6
7
8
9
/* S 디바이스 토큰 가져오기 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSLog(@"Token : %@", token);
    NSLog(@"deviceToken : %@", deviceToken);
    
}
/* E 디바이스 토큰 가져오기 */
cs

3# : 사용자가 알림을 승인하면 deviceToken 에서 불필요한 <, >, 공백을 제거한 토큰을 가져온다.

5# : Console에 찍히는 Token 값을 서버에 deviceToken 변수에 대입함




APNS 동의 여부를 묻는 알림창의 확인버튼 또는 허용 안 함 버튼을 클릭시 콜백(?) 처리하는 부분

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* S APNS 알림창 버튼 클릭 컨트롤 */
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    if ((notificationSettings.types & 1== UIUserNotificationTypeNone) {
        NSLog(@"user selected NO");
    } else {
     NSLog(@"user selected YES");
        [application registerForRemoteNotifications];
    }    
}    
#endif

/* E APNS 알림창 버튼 클릭 컨트롤 */
cs




토큰 가져오기를 실패했을 경우 실행된다.

1
2
3
4
5
6
7
8
9
/* S 디바이스 토큰 가져오기 ERROR */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    
#if !TARGET_IPHONE_SIMULATOR
    NSLog(@"Registration Error : %@", error);
#endif
    
}
/* E 디바이스 토큰 가져오기 ERROR */
cs

4# : 시뮬레이터에서는 테스트 불가능하기 때문에 분기함



앱이 실행중 백그라운드 or 포그라운드 상태일 경우 didReceiveRemoteNotification 호출

1
2
3
4
5
6
/* S APNS 수신 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//     NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];
 
}
/* E APNS 수신 */
cs





모든 준비는 끝났다.

 




테스트 방법 !!!!

1. 디바이스에서 앱을 실행시키고 동의한 후 Console 에 Token 값을 확인한다.

2. 서버의 jsp 파일의 deviceTocke 변수에 Token 값을 대입한다.

3. 디바이스 화면을 끄거나 앱을 종료시킨다.

4. 서버를 기동한다. (start)

5. http://localhost:8080/IOSweb/iosApns.jsp 를 호출한다.

6. 디바이스에 Push가 오는지 확인한다.




Received fatal alert: certificate_unknown 애러를 만날 수 도 있다.

그럴 땐 아래 포스팅 참고, 지금 미리 봐두는것도 나쁘지 않음 ^^

ios도 모르고 하이브리드 앱 개발하기 [ 21.3 APNS 구현 - Received fatal alert: certificate_unknown 오류  ]


 


 


 * 경고


IOS에 무지한 상태에서 구글링만으로 앱 개발 및 포스팅이 진행됨


누구나 따라할 수 있겠지만 결코 완벽한 정답이 아닐 수 있음


아주 주관적인 입장에서의 포스팅임