인디노트

GCM 을 이용한 iOS Push Notification 실현 본문

개발 플랫폼 및 언어

GCM 을 이용한 iOS Push Notification 실현

인디개발자 2016. 8. 3. 07:10

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 개발자 (클라이언트) 가 할 일들을 쭉쭉 진행해 보도록 하자.



진행 과정을 요약해보면 아래와 같다.


  1. cocoapods 설치
  2. Apple 개발자 센터에 App ID 등록 및 APNS 사용을 위한 준비
  3. 인증서와 키의 생성 및 GCM 에 등록
  4. XCode 소스 에 cocoapods 설치 및 Google SDK 가져오기 , AppDelegate에 샘플소스 작성
  5. POSTMAN을 통한 GCM 테스트







____광고입니다___










  1. cocoapods 설치
    • El Capitan (엘 캐피탄) 부터는 코코아팟의 설치방법이 조금 달라졌다. (공식 홈에서 하라는대로 하면 설치가 안되고 에러가 뿜어져 나온다.)
    • 코코아 팟을 설치해보자. 터미널 창을 열고 아래와 같이 명령어를 입력한다
      • sudo gem install -n /usr/local/bin cocoapods

    • 코코아팟이 잘 설치되어있는지 확인해 보자. 터미널 창을 열고 아래와 같이 명령어를 입력한다
      • pod --version

        • 0.39.0 과 같이 버전이 나오면 설치된 것이다.

  2. Apple 개발자 센터에 App ID 등록 및 APNS 사용을 위한 준비
    • 유의할 점은 GCM 에서는 개발/배포 버전의 인증서를 만들때 필요한 CertificateSigningRequest.certSigningRequest 파일을 서로 다르게 해야 한다는 것이다.
      • 왜인지 모르겠는데 같은 CertificateSigningRequest.certSigningRequest 파일을 사용해서 개발/배포 버전의 p12 파일을 등록할 때 에러가 난다.
      • 그래서 나도 위와 같이 CSR 을 두개 만들어서 각각 개발과 배포용으로 사용했다.



  3. 인증서와 키의 생성 및 GCM 에 등록
      • 나는 elimsoft CTO니까 kr.co.elimsoft.GCMTester 라는 번들ID를 만들었다.
      • 앱 이름은 GCMTester
      • 독특하게도 P12 포맷의 파일을 요청한다.
      • 개발용과 배포용인데 위에서 한번 말했다 시피 이상하게 이 두 녀석의 인증서를 만들 때 필요한 CSR 은 서로 다른 것으로 해야 한다.(키가 서로 달라야 하나 보다.)


        • 키는 이렇게 '인증서+키' 조합을 묶어서 내보내기하면 된다.

    • 참고로 위 인증서는 애플 개발자 계정에서 이곳에서 만든 것을 더블클릭 해서 키체인에 넣은 것이다.





    • 내보내기 해서 만들어 낸 P12 파일 (비밀번호를 적어서 export  하고, GCM 에 이 파일을 업로드 할때 그 비밀번호를 적는다.)
        • CSR 다르게 해서 업르도 하면 위와 같이 키 등록에 성공할 수 있다.


    • GoogleService-Info.plist 를 다운로드 받자 -> 나중에 프로젝트에 넣어야 한다.
        • 파일을 다운로드 받은 후에 아래에 나오는 Server API Key 를 잘 메모해 두자




  4. XCode 소스 에 cocoapods 설치 및 Google SDK 가져오기 , AppDelegate에 샘플소스 작성
    • 프로젝트를 생성한다.

        • 애플 개발자 사이트 및 GCM 사이트에 등록한 대로 만들어야 한다.


    • 프로젝트에 cocoapods 을 입히자.
      • 터미널로 프로젝트 루트에 가서 아래와 같이 입력한다.
        • pod init

      • 입력하고 나면 podfile 이란 녀석이 프로젝트에 생겨있다.
      • 구글의 가이드대로 podfile 에 pod 'Google/CloudMessaging' 을 적어보자

          • 위와 같이 작성 후 저장한다.


      • 이후 터미널에 아래와 같이 명령어를 입력한다.
        • pod install

      • 위 내용은 모두 구글 가이드 대로 한 것이다.


    • 이제부터는 새로 생성된 프로젝트 파일인 '.xcworkspace' 파일로 된 프로젝트를 연다.





    • 프로젝트에 아까 다운로드 받았던 GoogleService-Info.plist 파일을 집어넣고, Target에 걸어주자










    • 코드사인과 프로비저닝을 확인하자
        • 프로젝트에서 코드사인 확인


    • 애플 개발자 웹사이트에서도 확인
        • 완벽하게 하자!


    • 소스 실행!
      • 소스를 실행하고 나면 Push 허용을 할 것인지 물어보고, YES 하게 되면 로그를 통해 위와 같이 GCM키가 발급된다. 이걸 메모해두자 (테스트 때 써먹어야 된다. 현업 때는 다른 안드로이드 기기에서 하는 것 처럼 이 값을 서드파티 서버로 보내서 DB에 저장한다. )
        • 까놓고 보면 실제로 동작순서는 아래와 같다
          1. 아이폰이 APNS 서버로 통신
          2. APNS용 deviceToken을 발급받음
          3. 아이폰이 GCM 서버와 통신을 시도 -> deviceToken을 보낸다.
          4. 아이폰이 GCM 서버로부터 GCM키를 받아낸다.




  5. POSTMAN을 통한 GCM 테스트
    • 방식 : 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 보다 포그라운드에서는 속도가 빠른 듯 하다.


반응형
Comments