2016년 6월 2일 목요일

iOS app에서 GCM (Google Cloud Messaging 사용하기

APNS를 위한 애플 개발자 페이지에서 앱 설정을 해야 한다.

구글 클라우드 메세징 서비스 페이지
https://developers.google.com/cloud-messaging/

구글 페이지에서
좌측 iOS를 선택하고 언어를 swift로 선택을 하여 안내를 받을 수 있다.

Cocoapod 을 이용해서 Google GCM 라이브러리를 프로젝트에 추가 해야 한다.

https://developers.google.com/cloud-messaging/ios/start?ver=swift


아래에 훌륭한 문서를 참조 하면 쉽게 따라 할 수 있다.
http://devlecture.tistory.com/entry/팁02-APNS-쉽게-만들고-테스트하기


Appdelegate 에 구글에서 제공하는 코드 뼈대를 잘 넣어 줘서 푸시를 수신 받을 수 있다.


앱이 포그라운드 상태에서 푸시를 받으면 아래에 메서드가 호출 된다.
 func application( application: UIApplication,
    didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
      print("Notification received: \(userInfo)")
      // This works only if the app started the GCM service
      GCMService.sharedInstance().appDidReceiveMessage(userInfo);
      // Handle the received message
      // ...
  }
 
앱이 백그라운드 상태에서 푸시를 받으면 아래에 메서드가 호출 된다.  
  func application( application: UIApplication,
    didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
    fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) {
      print("Notification received: \(userInfo)")
      // This works only if the app started the GCM service
      GCMService.sharedInstance().appDidReceiveMessage(userInfo);
      // Handle the received message
      // Invoke the completion handler passing the appropriate UIBackgroundFetchResult value
      // ...
  }
 
아래에 메서드는 GCM 서버로 부터 registrationToken을 받는다. 
  func registrationHandler(registrationToken: String!, error: NSError!) {
  }
 
테스트는 구글  크롬 어플리케이션 중에 포스트 맨을 이용하여 테스트가 가능 하다.

  registrationToken과 구글 GCM 사이트에서 앱을 등록 하고 p12 키등을 입력 받아서 얻은 Server API Key가 있어야 테스트가 가능 하다.



중요
디버깅 모드에서 푸시가 잘되는데 adhoc (릴리즈 버젼에서 푸시가 오지 않는경우)

개발이 완료되어 배포 시점이 되면 다음 코드를 수정 해야 한다.
  func application( application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken
      deviceToken: NSData ) {
  // [END receive_apns_token]
        // [START get_gcm_reg_token]
        // Create a config and set a delegate that implements the GGLInstaceIDDelegate protocol.
        let instanceIDConfig = GGLInstanceIDConfig.defaultConfig()
        instanceIDConfig.delegate = self
        // Start the GGLInstanceID shared instance with that config and request a registration
        // token to enable reception of notifications
        GGLInstanceID.sharedInstance().startWithConfig(instanceIDConfig)
        registrationOptions = [kGGLInstanceIDRegisterAPNSOption:deviceToken,
          kGGLInstanceIDAPNSServerTypeSandboxOption:true]
        GGLInstanceID.sharedInstance().tokenWithAuthorizedEntity(gcmSenderID,
          scope: kGGLInstanceIDScopeGCM, options: registrationOptions, handler: registrationHandler)
        // [END get_gcm_reg_token]
  }

kGGLInstanceIDAPNSServerTypeSandboxOption:true --> kGGLInstanceIDAPNSServerTypeSandboxOption:false

댓글 없음: