SlideShare una empresa de Scribd logo
1 de 46
세상에서 가장 간단한
날씨, 대기환경 엡
따라해보는 iOS push 서비스
김성훈 <hunkim@gmail.com>
왜?
• 엡을 열어 보는 것도 귀찮다
• 그냥 unlock 하면 한번에 날씨, 하늘, 대기 정보 보기
• iOS Badge를 이용
• 2,020: 대기 보통, 맑음, (영상) 20도
• 3,119: 대기 나쁨, 구름, (영상) 19도
• 4,420: 알겠죠?
첫 디자인
• 간단하게 Pull로 하자
• 백그라운드 타이머로 10분 간격 Pull: 엡 실행중에
는 잘 되나 엡이 백그라운드 모드에 있을때 iOS가
타이머를 죽임. 결국 동작 안됨
• iOS가 밧데리 상태등에따라 알아서 작업을 돌려주
는 Background fetch: 이건 내가 언제 fetch 할지
결정할수 없어서 엡데이트 안되는 경우가 많음. 실
패
남은건 PUSH
• 그런데 매우 복잡해 보임
• 무슨 키가 많이 필요하고
• 날씨 정보를 어디로 보내야 하는지?
• 기기는 어떻게 등록? 전반적으로 복잡
무작정 따라해보자
• 그러나 아래 준비물은 필수
• Mac 컴퓨터와 Xcode - iOS개발할거니까
• iPhone - 시뮬레이션으로는 push 테스트 안됨
• $99내고 가입한 apple developer membership
무작정 따라하기전
뭐하는지 5스텝 대충보고 갑니
다.1. 엡생성: XCode로 엡만들고 Push 기능 설정
2. 기기번호따기: XCode로 엡에 기기 번호받는 부분
추가
3. 인증서: Apple 개발자 웹에 가서 푸쉬서버용 인증서
받음
4. 인증서 가공: Mac 에서 인증서 import/export
5. PUSH: ApnsPHP library 이용해 내 엡에 push 보내
기
1. 엡생성: Xcode 시작, Single View 엡
생성
1. 엡생성: 이름 정하고 Bundle ID 잘 기
억해둡니다.
1. 엡생성: Capabilities에 가서 Push
notifications를 켭니다.
1. 엡생성: 이때 본인의 개발팀을 물어 봅
니다. 성공하면 아래 체크마크가 나오고
ON됩니다.
1. 엡생성: 엡이 백그라운드모드에서
push 받고 싶으시죠? 그럼 아래와 같이
설정.
2.기기번호 따기: AppDelegate.swift 열기
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)
}
2.기기번호 따기: 이렇게 되겠죠?
2.기기번호 따기: AppDelegate.swift application
함수에서 initializeNotificationServices()를 불러줍
니다.
2.기기번호 따기 완성: 실행 버턴을 눌러 이
제 엡을 실행합니다. 처음이면 본인의 Apple
개발 아이디 설정으로 들어 갑니다.
2.기기번호 따기 완성: 실행이 성공하면 아
래 print 실행되며 기기 번호가 화면에 출력
됩니다.
2.기기번호 따기: 한편 실행되는 iphone에는 팝업이
보입니다. 뻿지도 Push로 오기때문에 Notification 받
기로 합니다.
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}
2.기기번호 따기: 아이폰을 꼽고 엡을 실행.
아래와 같이 이쁜 기기 번호가 보입니다.
안 보이면 앞 단계를 다시 점검
이 기기 번호를 이용해서 push 합니다.
1, 2 단계끝! 수고 하셨습니다
.
1. 엡생성: XCode로 엡만들고 Push 기능 설정
2. 기기번호따기: XCode로 엡에 기기 번호받는 부분
추가
3. 인증서: Apple 개발자 웹에 가서 푸쉬서버용 인증서
받음
4. 인증서 가공: Mac 에서 인증서 import/export
5. PUSH: ApnsPHP library 이용해 내 엡에 push 보내
기
3.인증서받기: PUSH를 보내기 위해서는 Apple
서버를 거치기 때문에 이 서버에 접속하여 본인
의 엡으로 push를 보내기 위한 인증서가 필요합
니다.
우선 apple 개발자 사이트에 접속후 멤버 센터로 갑니다.
https://developer.apple.com/
3.인증서받기: 우리의 관심은 인증서,
클릭합니다.
3.인증서받기: 왼쪽 메뉴에서 App IDs를 선
택하면 오른쪽에 우리가 XCode에서 만든
App ID가 보입니다. 이를 선택합니다.
3.인증서받기: Application Service항목이 보이는데 우리의
관심은 Push. 이것이 주황색으로 나와야 합니다. 아님
Xcode 엡 설정에서 Push 서비스를 “On” 설정. 그런 다음
Edit을 선택합니다.
3.인증서받기: Push Notifications 항목으로
들어가면 개발용과 production모드로 나뉘어
지는데 개발모드 선택 (추후 서비스 할때
Production 선택)
3.인증서받기: 그럼 CSR이라는 파일을
만들라는 화면이 자세한 설명과 함께 나
옵니다.
3.인증서받기: CSR을 받기 위해 mac 컴푸터에서
Keychain Access를 실행합니다. 왼쪽 메뉴에서 My
Certificate를 선택. 오른쪽에 본인의 iPhone 개발
certificate와 열림 (화살표) 버턴을 누르면 본인의
private 키를 볼수 있습니다.
3.인증서받기: 본인의 private키를 선택하고 오
른쪽 마우스 메뉴를 선택하거나, Keychain
Access/Certificate Assistant/Request … 를 선
택합니다.
3.인증서받기: 이메일과 이름이 본인의 개발자
private키의 것과 반드시 일치하는 것을 확인합니다.
Save to disk를 선택하고 Continue를 선택하여 파일
을 다운 받아 둡니다.
3.인증서받기: 다시 에플 개발자 웹페이지로
돌아 옵니다. 계속을 누르고 방금 만들어준
CSR을 업로드 합니다.
3.인증서받기: 그럼 아래와 같이 certificate
가 만들어 졌다는 메시지를 볼수 있습니다.
이를 다운 받습니다.
4.인증서 가공: 인증서 받기는 끝났습니다. 받은 인
증서를 필요한 파일로 가공하겠습니다. 다운 받은
파일을 더블 클릭하면 자동으로 Keychain Access
에 import 됩니다.
4.인증서 가공: import된 certificate가 My
Certificate에 나타나야 하고 화살표를 누르면
private키가 같이 포함되어야 합니다. 그렇지
않으면 이전 CSR만들때 이름/이메일이 맞는
지 다시 확인후 apple 개발 사이트에서
certificate 재발급합니다.
4.인증서 가공: 이 certificate를 PEM파일 형식으로 변환하
여야 PUSH서버에 사용가능하여 변환 작업을 합니다. 우
선 Certificate와 PrivateKey *둘다* 를 선택한다음 p12파
일로 export 합니다.
4.인증서 가공: 이 p12파일에는 private key가 포함
되어 있기때문에 이를 보호하기 위해 비번을 설정
합니다. 이 비빌번호는 다음과정에서 PEM으로 변
환할때 물어 봅니다.
4.인증서 가공: 이제 shell로 이동하여
openssl 명령으로 저장된 p12파일을 변환
합니다.
이 인증서로 push를 보낼수 있습니다.
openssl pkcs12 -in your.p12 -out your.pem -nodes -clcerts
마지막 단계만 남았습니
다!1. 엡생성: XCode로 엡만들고 Push 기능 설정
2. 기기번호따기: XCode로 엡에 기기 번호받는 부분
추가
3. 인증서: Apple 개발자 웹에 가서 푸쉬서버용 인증서
받음
4. 인증서 가공: Mac 에서 인증서 import/export
5. PUSH: ApnsPHP library 이용해 내 엡에 push 보내
기
5. PUSH: 이 PEM 키를 이용하여 AWS SNS
(월 1백만 push 무료) 나 다른 서비스들을 이
용할수 있습니다.
5. PUSH: 그러나 여기서는 간단한 PHP
library를 이용합니다. (Python, Node.js등의
다른 library들이 많습니다.)
5. PUSH: clone한다음 sample_push.php의 설정 부
분을 봅니다. 첫번째는 p12를 변환한 pem 파일이고
세번째는 엡을 실행하면 나오는 기기 아이디입니다.
5. PUSH: 두번째는 여기서 다운받아 파
일명만 고치면 됩니다.
https://www.entrust.net/downloads/binary/entrust_2048_ca.cer
5. PUSH: 그럼 각각의 pem파일관련 설정을 수정
하고, xcode 엡 실행후 기기 번호를 입력한후 php
를 실행해봅니다. php 결과에 에러가 없으면 성공
!
내 전화기에 push 메시지와 뺏지에 숫자 3이 보이면 성공
5. PUSH: 이제 PHP를 수정하여 숫자 3
대신 날씨등의 정보를 보내 줍니다.
https://developer.forecast.io/docs/v2
날씨는 Dark Sky API등을 사용합니다.
(매일 1,000건이 무료)
5. PUSH: 마지막으로 이 프로그램을
crontab에 넣어 줍니다.
“crontab -e”
날씨는 매시간별, 대기 상태는 매시간 30에
업데이트 되므로 전 매 30분마다 push를
보냅니다.
축하드립니다!
• 더 해보면 좋은것들
• 설치되거나 엡이 실행되면 기기 번호를 자동 등록
-http post등 사용
• AWS SNS등 사용해보기
• 실제 중요한 데이타 보내 보기
• Badge를 이용한 다른 재미있는 엡 만들어 보기

Más contenido relacionado

Similar a I os push: 세상에서 가장 간단한 날씨, 대기환경 엡

PCF Installation Guide
PCF Installation GuidePCF Installation Guide
PCF Installation Guideseungdon Choi
 
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIDo IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIHyunghun Cho
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Wangeun Lee
 
라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기Circulus
 
NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기TaeYoung Kim
 
Windows reversing study_basic_7
Windows reversing study_basic_7Windows reversing study_basic_7
Windows reversing study_basic_7Jinkyoung Kim
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현NAVER Engineering
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
 
아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼
아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼
아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼Hyuk Kwon
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...JooHyung Kim
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Internship backend
Internship backendInternship backend
Internship backendYein Sim
 
초보자를 위한 AWS EC2, RDS 설정
초보자를 위한 AWS EC2, RDS 설정초보자를 위한 AWS EC2, RDS 설정
초보자를 위한 AWS EC2, RDS 설정Seonghun Kang
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial우림 류
 
Start io t_with_raspberrypi
Start io t_with_raspberrypiStart io t_with_raspberrypi
Start io t_with_raspberrypiYeonah Ki
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVAcooddy
 
Giip doc1411-01-notification servicemanual
Giip doc1411-01-notification servicemanualGiip doc1411-01-notification servicemanual
Giip doc1411-01-notification servicemanualLowy Shin
 

Similar a I os push: 세상에서 가장 간단한 날씨, 대기환경 엡 (20)

PCF Installation Guide
PCF Installation GuidePCF Installation Guide
PCF Installation Guide
 
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIDo IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
 
라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기
 
NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기
 
Windows reversing study_basic_7
Windows reversing study_basic_7Windows reversing study_basic_7
Windows reversing study_basic_7
 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼
아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼
아마존 AWS 클라우드에서 LEMP(NginX) stack 설치 매뉴얼
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Internship backend
Internship backendInternship backend
Internship backend
 
초보자를 위한 AWS EC2, RDS 설정
초보자를 위한 AWS EC2, RDS 설정초보자를 위한 AWS EC2, RDS 설정
초보자를 위한 AWS EC2, RDS 설정
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial
 
Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
Start io t_with_raspberrypi
Start io t_with_raspberrypiStart io t_with_raspberrypi
Start io t_with_raspberrypi
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
Giip doc1411-01-notification servicemanual
Giip doc1411-01-notification servicemanualGiip doc1411-01-notification servicemanual
Giip doc1411-01-notification servicemanual
 

I os push: 세상에서 가장 간단한 날씨, 대기환경 엡

  • 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 보내 기
  • 7. 1. 엡생성: Xcode 시작, Single View 엡 생성
  • 8. 1. 엡생성: 이름 정하고 Bundle ID 잘 기 억해둡니다.
  • 9. 1. 엡생성: Capabilities에 가서 Push notifications를 켭니다.
  • 10. 1. 엡생성: 이때 본인의 개발팀을 물어 봅 니다. 성공하면 아래 체크마크가 나오고 ON됩니다.
  • 11. 1. 엡생성: 엡이 백그라운드모드에서 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) }
  • 15. 2.기기번호 따기: AppDelegate.swift application 함수에서 initializeNotificationServices()를 불러줍 니다.
  • 16. 2.기기번호 따기 완성: 실행 버턴을 눌러 이 제 엡을 실행합니다. 처음이면 본인의 Apple 개발 아이디 설정으로 들어 갑니다.
  • 17. 2.기기번호 따기 완성: 실행이 성공하면 아 래 print 실행되며 기기 번호가 화면에 출력 됩니다.
  • 18. 2.기기번호 따기: 한편 실행되는 iphone에는 팝업이 보입니다. 뻿지도 Push로 오기때문에 Notification 받 기로 합니다.
  • 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/
  • 23. 3.인증서받기: 우리의 관심은 인증서, 클릭합니다.
  • 24. 3.인증서받기: 왼쪽 메뉴에서 App IDs를 선 택하면 오른쪽에 우리가 XCode에서 만든 App ID가 보입니다. 이를 선택합니다.
  • 25. 3.인증서받기: Application Service항목이 보이는데 우리의 관심은 Push. 이것이 주황색으로 나와야 합니다. 아님 Xcode 엡 설정에서 Push 서비스를 “On” 설정. 그런 다음 Edit을 선택합니다.
  • 26. 3.인증서받기: Push Notifications 항목으로 들어가면 개발용과 production모드로 나뉘어 지는데 개발모드 선택 (추후 서비스 할때 Production 선택)
  • 27. 3.인증서받기: 그럼 CSR이라는 파일을 만들라는 화면이 자세한 설명과 함께 나 옵니다.
  • 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를 이용한 다른 재미있는 엡 만들어 보기