일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- kmip
- SwiftUI
- OSX
- OTP
- MSYS2
- git
- 2FA
- 인증
- FIDO2
- 앨범북
- Android
- openssl
- WebAuthn
- SSH
- 애플
- 앱리소스
- 안드로이드
- SSL
- fido
- apple
- otpkey
- Xcode
- MYSQL
- 앱스토어
- MFA
- SWIFT
- appres
- albumbook
- css
- Nodejs
- Today
- Total
인디노트
GCM 을 이용한 iOS Push Notification 실현 본문
GCM ( Google Cloud Message ) 은 최근 3.0 버전이 되면서, iOS 까지 Push notification 을 지원해주게 되었다.
현재 프로젝트에서 사용중인데, 한글로 가이드 해놓은 곳이 한군데도 없어서, 한번 적어볼까 한다.
그동안 푸시는 Android -> GCM , iOS -> APNS 를 사용해서 구현했었다.
앱을 통해 서비스를 제공하는 서버들은 그래서 그동안 GCM 과 APNS 두 곳의 서버와 통신을 해야 했었다.
하지만 이제 GCM 하나로 Android 와 iOS 모두 Push를 보낼 수 있게 되었다.
https://developers.google.com/cloud-messaging/
물론 아무 수고도 없이, iOS 에서 이용할 수 있는 것은 아니다.
일반적인 구현보다 iOS 개발자(클라이언트 개발자)가 아조 쪼오오금 더 서버를 도와준다고 할까.
그럼 이제 iOS 개발자 (클라이언트) 가 할 일들을 쭉쭉 진행해 보도록 하자.
진행 과정을 요약해보면 아래와 같다.
- cocoapods 설치
- Apple 개발자 센터에 App ID 등록 및 APNS 사용을 위한 준비
- 인증서와 키의 생성 및 GCM 에 등록
- XCode 소스 에 cocoapods 설치 및 Google SDK 가져오기 , AppDelegate에 샘플소스 작성
- POSTMAN을 통한 GCM 테스트
- cocoapods 설치
- El Capitan (엘 캐피탄) 부터는 코코아팟의 설치방법이 조금 달라졌다. (공식 홈에서 하라는대로 하면 설치가 안되고 에러가 뿜어져 나온다.)
- 코코아 팟을 설치해보자. 터미널 창을 열고 아래와 같이 명령어를 입력한다
- sudo gem install -n /usr/local/bin cocoapods
- 코코아팟이 잘 설치되어있는지 확인해 보자. 터미널 창을 열고 아래와 같이 명령어를 입력한다
pod --version
0.39.0 과 같이 버전이 나오면 설치된 것이다.
- Apple 개발자 센터에 App ID 등록 및 APNS 사용을 위한 준비
- 유의할 점은 GCM 에서는 개발/배포 버전의 인증서를 만들때 필요한 CertificateSigningRequest.certSigningRequest 파일을 서로 다르게 해야 한다는 것이다.
- 왜인지 모르겠는데 같은 CertificateSigningRequest.certSigningRequest 파일을 사용해서 개발/배포 버전의 p12 파일을 등록할 때 에러가 난다.
- 그래서 나도 위와 같이 CSR 을 두개 만들어서 각각 개발과 배포용으로 사용했다.
- 인증서와 키의 생성 및 GCM 에 등록
- iOS 가이드 페이지에 접속 후 'Get a Configuration File' 을 클릭하자
- 나는 elimsoft CTO니까 kr.co.elimsoft.GCMTester 라는 번들ID를 만들었다.
- 앱 이름은 GCMTester
- 독특하게도 P12 포맷의 파일을 요청한다.
- 개발용과 배포용인데 위에서 한번 말했다 시피 이상하게 이 두 녀석의 인증서를 만들 때 필요한 CSR 은 서로 다른 것으로 해야 한다.(키가 서로 달라야 하나 보다.)
- 키는 이렇게 '인증서+키' 조합을 묶어서 내보내기하면 된다.
- 참고로 위 인증서는 애플 개발자 계정에서 이곳에서 만든 것을 더블클릭 해서 키체인에 넣은 것이다.
- 내보내기 해서 만들어 낸 P12 파일 (비밀번호를 적어서 export 하고, GCM 에 이 파일을 업로드 할때 그 비밀번호를 적는다.)
- CSR 다르게 해서 업르도 하면 위와 같이 키 등록에 성공할 수 있다.
- GoogleService-Info.plist 를 다운로드 받자 -> 나중에 프로젝트에 넣어야 한다.
- 파일을 다운로드 받은 후에 아래에 나오는 Server API Key 를 잘 메모해 두자
- XCode 소스 에 cocoapods 설치 및 Google SDK 가져오기 , AppDelegate에 샘플소스 작성
- 프로젝트를 생성한다.
- 애플 개발자 사이트 및 GCM 사이트에 등록한 대로 만들어야 한다.
- 프로젝트에 cocoapods 을 입히자.
- 터미널로 프로젝트 루트에 가서 아래와 같이 입력한다.
- pod init
- 입력하고 나면 podfile 이란 녀석이 프로젝트에 생겨있다.
- 구글의 가이드대로 podfile 에 pod 'Google/CloudMessaging' 을 적어보자
- 위와 같이 작성 후 저장한다.
- 이후 터미널에 아래와 같이 명령어를 입력한다.
- pod install
- 위 내용은 모두 구글 가이드 대로 한 것이다.
- 이제부터는 새로 생성된 프로젝트 파일인 '.xcworkspace' 파일로 된 프로젝트를 연다.
- 프로젝트에 아까 다운로드 받았던 GoogleService-Info.plist 파일을 집어넣고, Target에 걸어주자
- 구글에서 안내하는 Github의 소스 중 AppDelegate를 베끼자 --> 이 문서에는 Objective-C로 해봤다. (현업에서는 Swift로 했지만ㅎ)
- Objective-C 라면 깃허브 소스 m 파일 뿐만 아니라 h 파일(헤더) 까지 베끼자
- 비트코드 옵션 해제
- cocoapods 을 통해 가져온 GCM 소스는 bitcode를 지원하지 않는다.
- Build Settings 에 가서 bitcode를 해제하자
- 코드사인과 프로비저닝을 확인하자
- 프로젝트에서 코드사인 확인
- 애플 개발자 웹사이트에서도 확인
- 완벽하게 하자!
- 소스 실행!
- 소스를 실행하고 나면 Push 허용을 할 것인지 물어보고, YES 하게 되면 로그를 통해 위와 같이 GCM키가 발급된다. 이걸 메모해두자 (테스트 때 써먹어야 된다. 현업 때는 다른 안드로이드 기기에서 하는 것 처럼 이 값을 서드파티 서버로 보내서 DB에 저장한다. )
- 까놓고 보면 실제로 동작순서는 아래와 같다
- 아이폰이 APNS 서버로 통신
- APNS용 deviceToken을 발급받음
- 아이폰이 GCM 서버와 통신을 시도 -> deviceToken을 보낸다.
- 아이폰이 GCM 서버로부터 GCM키를 받아낸다.
- POSTMAN을 통한 GCM 테스트
- APNS, GCM 등을 테스트할 수 있는 각종 서비스들이 있지만, GCM 을 iOS 로 보낼때는 json 에 notification 을 셋팅해 줘야 하기 때문에 POSTMAN 을 사용한다.
- 위 문제로 인해 많은 불쌍한 영혼들이 헤메고 있다는 것을 알 수 있다.
- 방식 : POST
- URL
- https://android.googleapis.com/gcm/send
- Header
- Content-Type
- application/json
- Authorization
- key=AIzaSyCO68nEDsXxdgo6LhrjQJ8W4zIhcwk9sOY
- 아까 메모해 두라고 했던 서버 API 키를 적는 것이다.
- Body
{
"to":"kLw3oLkH_lA:APA91bEZDV9WRVwv306m9Y-ieRPCmPkYzlfS2lx42Txu9qySrS0B4LI--BGmY6OsGLV-Rwq5---cO70OBtglP3ZZugj6ZHzjVZon0hASo1hoqlDbLRPMf9JA5Y7yUNXQyYbIxR5XFqgs",
"content_available":true,
"priority": "high",
"notification": {
"title":"GCM을 통해서 푸시메시지 보내기",
"body":"GCM 으로 iOS 를 !!",
"sound":"default"
}
}
- to 부분에 소스에서 아까 받았던 값을 넣어서 통신한다.
- 테스트 확인
- GCM 서버를 통해 iOS 푸시를 했다.
주의할 점은 iOS 는 notification 이라는 JSON Key 로 Push를 받고, Android 는 data 라는 JSON Key 로 Push를 받는 다는 것이다.
결국은 서버에서 Android 는 data 를 루트로, iOS에서는 notification 을 루트로 JSON을 만들어야 한다.
이로 인해서 많은 시행착오들이 있는 듯 하며, 불쌍한 영혼들이라고 표현하는 듯 하다
안드로이드와 iOS 모두 푸시를 구현해야 하는 풀스택 개발자 입장에서는 조금 더 쉽게 두 플랫폼 모두 푸시를 구현할 수 있는 방법임에 틀림 없다.
(구글에서 P12 의 유효성까지 체크해준다.)
iOS에서 background 에서는 APNS를 사용하지만, foreground 로 진입하면 GCM 서버와 바로 통신한다. (마치 채팅과 같음)
이로써 조금 더 Push 보다 포그라운드에서는 속도가 빠른 듯 하다.
'개발 플랫폼 및 언어' 카테고리의 다른 글
맥 OS X 에서 MySQL 설치하는 문서인데 잘 정리되어 있다. (0) | 2016.09.23 |
---|---|
애플, 앱 스토어 앱 품질 관리 한다. 앱 이름 길이도 제한. (0) | 2016.09.06 |
애플의 새로운 IDFA 가이드라인 - IDFA 관련 iOS 앱 제출 방법 (0) | 2016.07.23 |
iOS 개발이 쉬울까 Android 개발이 쉬울까 ? (0) | 2016.07.08 |
애플 결국 돈 안되는 iAD 광고 사업 접는다. (0) | 2016.06.22 |