2016. 10. 7. 11:32ㆍmobile/ios
ios도 모르고 하이브리드 앱 개발하기 [ 21.3 APNS 구현 - APNS 클라이언트 만들기 (IOS 구성) ]
필자는 APNS를 선행작업을 제외한 3단계로 구분하여 포스팅 할 계획이다.
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에 무지한 상태에서 구글링만으로 앱 개발 및 포스팅이 진행됨 누구나 따라할 수 있겠지만 결코 완벽한 정답이 아닐 수 있음 아주 주관적인 입장에서의 포스팅임 |
계속해서 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' 인타이틀먼트 문자열을 찾을 수 없습니다.}
도움이 될만한 답변을 찾은듯 합니다 ^^
http://egloos.zum.com/tiger5net/v/5703840
여기에 아주 자세히 정리가 되어있네요 ㅎㅎ
혹시 여기서 푸시를 홈화면에서 클릭했을때(백그라운드 상태) 기본 홈화면이 아닌 푸쉬가 갖고있는 해당 url로 변경해주고싶습니다..(카톡 알림을 클릭하면 해당 화면으로 넘어가듯이요....)
혹시 어떻게 하는지..조언을 구할수있을까요~
didReceiveRemoteNotification 부분이 push 를 수신하는 부분입니다.
이부분에서 ViewController 호출해서 페이지 이동을 시키면 될거같네요 ㅎㅎ
넵 말씀하신 부분에서 페이지 이동을 어떻게 해줘야할지가 고민되더라구요..지금 ViewController까지는 호출했거든욥..여기서 막혀있습니당..
ViewController 에 함수 하나 호출하시고 그 함수에서 webview 가지고 페이지이동시키시면 되지 않을까 싶어요 ㅎㅎ
그렇군요! 감사합니다^^
넵 수고하세요 ㅎㅎ