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에 무지한 상태에서 구글링만으로 앱 개발 및 포스팅이 진행됨


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


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



'mobile > ios' 카테고리의 다른 글

ios | ios도 모르고 하이브리드 앱 개발하기 [ 26 We noticed that your app or its metadata includes irrelevant third-party platform information. ]  (0) 2016.10.13
ios | ios도 모르고 하이브리드 앱 개발하기 [ 25 ERROR ITMS-4238 ]  (4) 2016.10.11
ios | ios도 모르고 하이브리드 앱 개발하기 [ 24 ERROR ITMS-90096 ]  (0) 2016.10.11
ios | ios도 모르고 하이브리드 앱 개발하기 [ 23 앱 배포하기 / 앱스토어에 등록 / Xcode로 앱 배포하기 ]  (0) 2016.10.11
ios | ios도 모르고 하이브리드 앱 개발하기 [ 22 APNS 구현 - Received fatal alert: certificate_unknown 오류 ]  (0) 2016.10.07
ios | ios도 모르고 하이브리드 앱 개발하기 [ 21.3 APNS 구현 - APNS 클라이언트 만들기 (IOS 구성) ]  (8) 2016.10.07
ios | ios도 모르고 하이브리드 앱 개발하기 [ 21.2 APNS 구현 - APNS 서버 만들기 (프로바이더 구성) ]  (4) 2016.10.07
ios | ios도 모르고 하이브리드 앱 개발하기 [ 21.1 APNS 구현 - APNS 인증서 만들기 ]  (0) 2016.10.07
ios | ios도 모르고 하이브리드 앱 개발하기 [ 20 키체인에서 인증서는 언제 유효해 질까? ]  (0) 2016.10.07
ios | ios도 모르고 하이브리드 앱 개발하기 [ 19 Provisioning 설정 후 Unable to install "project name" 에러 ]  (0) 2016.10.07
ios | ios도 모르고 하이브리드 앱 개발하기 [ 18 아이폰으로 테스트 하기 / Xcode에 아이폰 연결 / 디바이스 테스트 ]  (6) 2016.10.04
by 개발자 CofS 2016.10.07 11:32
  • 완전 초보 개발자 2016.11.23 14:29 신고 ADDR EDIT/DEL REPLY

    계속해서 token을 못 받아와여
    push 허용을 한다음에 아래와 같이 나오기만 하네요
    타 블로그에 있는 것 처럼 프로비저닝을 다시 생성하기도 하고
    싹 다 지우고 인증서부터 다시 생성해서 프로비저닝을 생성해서 해도 안되네요
    혹시 아래 오류가 날때 대응 방법이 다른게 있나요??

    2016-11-23 14:22:23.830666 recheck[1246:207294] user selected YES
    2016-11-23 14:22:23.833286 recheck[1246:207294] Registration Error : Error Domain=NSCocoaErrorDomain Code=3000 "응용 프로그램을 위한 유효한 'aps-environment' 인타이틀먼트 문자열을 찾을 수 없습니다." UserInfo={NSLocalizedDescription=응용 프로그램을 위한 유효한 'aps-environment' 인타이틀먼트 문자열을 찾을 수 없습니다.}

    • Favicon of https://cofs.tistory.com BlogIcon 개발자 CofS 2016.11.23 17:54 신고 EDIT/DEL

      도움이 될만한 답변을 찾은듯 합니다 ^^

      http://egloos.zum.com/tiger5net/v/5703840

      여기에 아주 자세히 정리가 되어있네요 ㅎㅎ

  • Favicon of https://shiftkey.tistory.com BlogIcon Shift Key 2017.03.31 12:55 신고 ADDR EDIT/DEL REPLY

    혹시 여기서 푸시를 홈화면에서 클릭했을때(백그라운드 상태) 기본 홈화면이 아닌 푸쉬가 갖고있는 해당 url로 변경해주고싶습니다..(카톡 알림을 클릭하면 해당 화면으로 넘어가듯이요....)
    혹시 어떻게 하는지..조언을 구할수있을까요~

    • Favicon of https://cofs.tistory.com BlogIcon 개발자 CofS 2017.03.31 13:37 신고 EDIT/DEL

      didReceiveRemoteNotification 부분이 push 를 수신하는 부분입니다.

      이부분에서 ViewController 호출해서 페이지 이동을 시키면 될거같네요 ㅎㅎ

    • Favicon of https://shiftkey.tistory.com BlogIcon Shift Key 2017.03.31 13:51 신고 EDIT/DEL

      넵 말씀하신 부분에서 페이지 이동을 어떻게 해줘야할지가 고민되더라구요..지금 ViewController까지는 호출했거든욥..여기서 막혀있습니당..

    • Favicon of https://cofs.tistory.com BlogIcon 개발자 CofS 2017.03.31 16:10 신고 EDIT/DEL

      ViewController 에 함수 하나 호출하시고 그 함수에서 webview 가지고 페이지이동시키시면 되지 않을까 싶어요 ㅎㅎ

    • Favicon of https://shiftkey.tistory.com BlogIcon Shift Key 2017.04.05 15:18 신고 EDIT/DEL

      그렇군요! 감사합니다^^

    • Favicon of https://cofs.tistory.com BlogIcon 개발자 CofS 2017.04.05 15:49 신고 EDIT/DEL

      넵 수고하세요 ㅎㅎ