1. 세상에서 가장 간단한
날씨, 대기환경 엡
따라해보는 iOS push 서비스
김성훈 <hunkim@gmail.com>
2. 왜?
• 엡을 열어 보는 것도 귀찮다
• 그냥 unlock 하면 한번에 날씨, 하늘, 대기 정보 보기
• iOS Badge를 이용
• 2,020: 대기 보통, 맑음, (영상) 20도
• 3,119: 대기 나쁨, 구름, (영상) 19도
• 4,420: 알겠죠?
3. 첫 디자인
• 간단하게 Pull로 하자
• 백그라운드 타이머로 10분 간격 Pull: 엡 실행중에
는 잘 되나 엡이 백그라운드 모드에 있을때 iOS가
타이머를 죽임. 결국 동작 안됨
• iOS가 밧데리 상태등에따라 알아서 작업을 돌려주
는 Background fetch: 이건 내가 언제 fetch 할지
결정할수 없어서 엡데이트 안되는 경우가 많음. 실
패
4. 남은건 PUSH
• 그런데 매우 복잡해 보임
• 무슨 키가 많이 필요하고
• 날씨 정보를 어디로 보내야 하는지?
• 기기는 어떻게 등록? 전반적으로 복잡
5. 무작정 따라해보자
• 그러나 아래 준비물은 필수
• Mac 컴퓨터와 Xcode - iOS개발할거니까
• iPhone - 시뮬레이션으로는 push 테스트 안됨
• $99내고 가입한 apple developer membership
6. 무작정 따라하기전
뭐하는지 5스텝 대충보고 갑니
다.1. 엡생성: XCode로 엡만들고 Push 기능 설정
2. 기기번호따기: XCode로 엡에 기기 번호받는 부분
추가
3. 인증서: Apple 개발자 웹에 가서 푸쉬서버용 인증서
받음
4. 인증서 가공: Mac 에서 인증서 import/export
5. PUSH: ApnsPHP library 이용해 내 엡에 push 보내
기
13. 2.기기번호 따기: http://www.intertech.com/Blog/push-
notifications-tutorial-for-ios-9/
코드를 클래스 안에 붙여넣습니다.
private func convertDeviceTokenToString(deviceToken:NSData) -> String {
// http://www.intertech.com/Blog/push-notifications-tutorial-for-ios-9/
// Convert binary Device Token to a String (and remove the <,> and white space charaters).
var deviceTokenStr = deviceToken.description.stringByReplacingOccurrencesOfString(">", withString: "", range: nil)
deviceTokenStr = deviceTokenStr.stringByReplacingOccurrencesOfString("<", withString: "", range: nil)
deviceTokenStr = deviceTokenStr.stringByReplacingOccurrencesOfString(" ", withString: "", range: nil)
// Our API returns token in all uppercase, regardless how it was originally sent.
// To make the two consistent, I am uppercasing the token string here.
deviceTokenStr = deviceTokenStr.uppercaseString
return deviceTokenStr
}
func initializeNotificationServices() -> Void {
let settings = UIUserNotificationSettings(forTypes: [.Badge], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
// This is an asynchronous method to retrieve a Device Token
// Callbacks are in AppDelegate.swift
// Success = didRegisterForRemoteNotificationsWithDeviceToken
// Fail = didFailToRegisterForRemoteNotificationsWithError
UIApplication.sharedApplication().registerForRemoteNotifications()
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let deviceTokenStr = convertDeviceTokenToString(deviceToken)
// ...register device token with our Time Entry API server via REST
print(deviceTokenStr)
}
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
print("Device token for push notifications: FAIL -- ")
print(error.description)
}
19. 2.기기번호 따기: 혹 시뮬레이터로 실행? 그
럼 이런 에러가 나옵니다. 아이폰을 꼽고 엡
을 실행합니다.
Device token for push notifications: FAIL --
Error Domain=NSCocoaErrorDomain Code=3010
"REMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORT
ED_NSERROR_DESCRIPTION"
UserInfo={NSLocalizedDescription=REMOTE_NOTIFICATI
ON_SIMULATOR_NOT_SUPPORTED_NSERROR_DESCR
IPTION}
20. 2.기기번호 따기: 아이폰을 꼽고 엡을 실행.
아래와 같이 이쁜 기기 번호가 보입니다.
안 보이면 앞 단계를 다시 점검
이 기기 번호를 이용해서 push 합니다.
21. 1, 2 단계끝! 수고 하셨습니다
.
1. 엡생성: XCode로 엡만들고 Push 기능 설정
2. 기기번호따기: XCode로 엡에 기기 번호받는 부분
추가
3. 인증서: Apple 개발자 웹에 가서 푸쉬서버용 인증서
받음
4. 인증서 가공: Mac 에서 인증서 import/export
5. PUSH: ApnsPHP library 이용해 내 엡에 push 보내
기
22. 3.인증서받기: PUSH를 보내기 위해서는 Apple
서버를 거치기 때문에 이 서버에 접속하여 본인
의 엡으로 push를 보내기 위한 인증서가 필요합
니다.
우선 apple 개발자 사이트에 접속후 멤버 센터로 갑니다.
https://developer.apple.com/
28. 3.인증서받기: CSR을 받기 위해 mac 컴푸터에서
Keychain Access를 실행합니다. 왼쪽 메뉴에서 My
Certificate를 선택. 오른쪽에 본인의 iPhone 개발
certificate와 열림 (화살표) 버턴을 누르면 본인의
private 키를 볼수 있습니다.
29. 3.인증서받기: 본인의 private키를 선택하고 오
른쪽 마우스 메뉴를 선택하거나, Keychain
Access/Certificate Assistant/Request … 를 선
택합니다.
30. 3.인증서받기: 이메일과 이름이 본인의 개발자
private키의 것과 반드시 일치하는 것을 확인합니다.
Save to disk를 선택하고 Continue를 선택하여 파일
을 다운 받아 둡니다.
31. 3.인증서받기: 다시 에플 개발자 웹페이지로
돌아 옵니다. 계속을 누르고 방금 만들어준
CSR을 업로드 합니다.
32. 3.인증서받기: 그럼 아래와 같이 certificate
가 만들어 졌다는 메시지를 볼수 있습니다.
이를 다운 받습니다.
33. 4.인증서 가공: 인증서 받기는 끝났습니다. 받은 인
증서를 필요한 파일로 가공하겠습니다. 다운 받은
파일을 더블 클릭하면 자동으로 Keychain Access
에 import 됩니다.
34. 4.인증서 가공: import된 certificate가 My
Certificate에 나타나야 하고 화살표를 누르면
private키가 같이 포함되어야 합니다. 그렇지
않으면 이전 CSR만들때 이름/이메일이 맞는
지 다시 확인후 apple 개발 사이트에서
certificate 재발급합니다.
35. 4.인증서 가공: 이 certificate를 PEM파일 형식으로 변환하
여야 PUSH서버에 사용가능하여 변환 작업을 합니다. 우
선 Certificate와 PrivateKey *둘다* 를 선택한다음 p12파
일로 export 합니다.
36. 4.인증서 가공: 이 p12파일에는 private key가 포함
되어 있기때문에 이를 보호하기 위해 비번을 설정
합니다. 이 비빌번호는 다음과정에서 PEM으로 변
환할때 물어 봅니다.
37. 4.인증서 가공: 이제 shell로 이동하여
openssl 명령으로 저장된 p12파일을 변환
합니다.
이 인증서로 push를 보낼수 있습니다.
openssl pkcs12 -in your.p12 -out your.pem -nodes -clcerts
38. 마지막 단계만 남았습니
다!1. 엡생성: XCode로 엡만들고 Push 기능 설정
2. 기기번호따기: XCode로 엡에 기기 번호받는 부분
추가
3. 인증서: Apple 개발자 웹에 가서 푸쉬서버용 인증서
받음
4. 인증서 가공: Mac 에서 인증서 import/export
5. PUSH: ApnsPHP library 이용해 내 엡에 push 보내
기
39. 5. PUSH: 이 PEM 키를 이용하여 AWS SNS
(월 1백만 push 무료) 나 다른 서비스들을 이
용할수 있습니다.
40. 5. PUSH: 그러나 여기서는 간단한 PHP
library를 이용합니다. (Python, Node.js등의
다른 library들이 많습니다.)
41. 5. PUSH: clone한다음 sample_push.php의 설정 부
분을 봅니다. 첫번째는 p12를 변환한 pem 파일이고
세번째는 엡을 실행하면 나오는 기기 아이디입니다.
42. 5. PUSH: 두번째는 여기서 다운받아 파
일명만 고치면 됩니다.
https://www.entrust.net/downloads/binary/entrust_2048_ca.cer
43. 5. PUSH: 그럼 각각의 pem파일관련 설정을 수정
하고, xcode 엡 실행후 기기 번호를 입력한후 php
를 실행해봅니다. php 결과에 에러가 없으면 성공
!
내 전화기에 push 메시지와 뺏지에 숫자 3이 보이면 성공
44. 5. PUSH: 이제 PHP를 수정하여 숫자 3
대신 날씨등의 정보를 보내 줍니다.
https://developer.forecast.io/docs/v2
날씨는 Dark Sky API등을 사용합니다.
(매일 1,000건이 무료)
45. 5. PUSH: 마지막으로 이 프로그램을
crontab에 넣어 줍니다.
“crontab -e”
날씨는 매시간별, 대기 상태는 매시간 30에
업데이트 되므로 전 매 30분마다 push를
보냅니다.
46. 축하드립니다!
• 더 해보면 좋은것들
• 설치되거나 엡이 실행되면 기기 번호를 자동 등록
-http post등 사용
• AWS SNS등 사용해보기
• 실제 중요한 데이타 보내 보기
• Badge를 이용한 다른 재미있는 엡 만들어 보기