로그인
회원가입
Loading...
Loading...

Board

게시판

FCM 푸시 알림 iOS 앱 가이드

구글 파이어베이스는 공식적으로 안드로이드와 iOS 양대 운영체제를 지원하고 있다.

iOS 디바이스에 대한 지원은 FCM 연결 서버가 APNs(Apple Push Notification Service)를 경유하는 방식으로 이루어 진다.

공식 가이드 : https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ko

미리 일러두지만, 개발과정과 배포시점에서 사용하는 인증서(APNs SSL Certificates)가 다르고 소스와 설정이 변경되는 점이 번거로운 편이다.


- info.plist -





공식 가이드에서 무엇보다 가장 먼저 언급되는 파이어베이스 메쏘드 재구성(Method Swizzling)은 info.plist에서 FirebaseAppDelegateProxyEnabled 항목을 추가하고 Boolean값 NO로 설정하면 해제가 된다.

개발용 인증서 Development SSL Certificate를 사용하는 동안은 신경쓸 필요가 없는 부분이다.
하지만 막상 배포용 인증서 Production SSL Certificate로 전환하고 실제 서비스를 구현하려면 반드시 메쏘드 재구성을 해제하고 setAPNSToken함수로 토큰 타입 FIRInstanceIDAPNSTokenType.prod를 지정해주어야 한다.

이부분만은 구글의 메시징 서비스가 GCM에서 FCM으로 전환되면서 불명료해진 면이 있다.
참고 : https://developers.google.com/cloud-messaging/ios/ios-migrate-fcm


- Firebase SDK 설치 -



의존성 체크 유틸인 코코아포드를 이용해서 파이어베이스 SDK를 설치한다.

참고 : https://cocoapods.org/pods/Firebase

설치과정은 다음과 같다. 공식문서를 참고하자.
1. 코코아포드 설치 $ sudo gem install cocoapods
2. SDK 다운로드 $ pod try Firebase
3. Podfile 파일 설정 $ cd project-folder $ vi Podfile
4. 프로젝트에 파이어베이스 설치 $ pod install
5. 워크스페이스로 작업하기 $ open your-project.xcworkspace

이후로는 기존의 .xcodeproj대신 .xcworkspace를 열어서 작업하게 된다.


- GoogleService-Info.plist -





파이어베이스 콘솔에서 기존의 FCM 프로젝트에 다른 앱 추가로 iOS 앱을 추가한다. 앱의 번들 ID는 Xcode 프로젝트 General 탭에서 확인이 가능하니 정확하게 일치시켜주자.



프로젝트의 설정에서 iOS앱을 선택하면 스샷처럼 GoogleService-Info.plist를 다운로드할 수 있다.
Xcode 프로젝트의 루트에 복사해놓자.


- APNs SSL Certificates -



이제 FCM이 APN을 경유하기 위한 핵심요소인 인증서를 구해야 한다.
당연한 이야기지만, 이후 과정은 Apple Developer Program에 가입한 것을 전제로 하고있다.
애플 디벨로퍼 멤버 센터 Certificates, Identifiers and Profiles 항목에서 공식가이드를 참조해서 인증서를 다운받도록 하자.

공식 가이드 : https://firebase.google.com/docs/cloud-messaging/ios/certs

개발용 인증서 Development SSL Certificate와 배포용 인증서 Production SSL Certificate를 모두 만들어서 다운받아 놓기를 권장한다.



키체인 액세스로 추출한 .p12 파일들을 스샷처럼 파이어 베이스 콘솔의 프로젝트 > 설정 > 클라우드 메시징으로 접근해서 업로드 한다.


- Provisioning Profiles -





앱을 빌드할때 필요한 프로비저닝 프로필 역시 개발용과 배포용을 각각 만들고 다운, 더블클릭해서 설치하면 된다.


- Capabilities -



앱의 기능설정에서 푸시 알림과 백그라운드 모드를 ON 시켜둔다.

Xcode => Projects => Capabilities => Push Notifications ON
Xcode => Projects => Capabilities => Background Mode ON => RemoteNotification


- AppDelegate.swift -



github 샘플 : AppDelegate.swift

샘플 코드는 iOS 10 부터 변경된 내용들로 인해 약간 중복된 부분들이 있다.
자신의 프로젝트에 적절히 관련 코드를 적용하자.

여기서, 실제 앱스토어에 출시할 목적으로 배포용 프로비저닝을 적용한다면 변경해줄 점들이 있다.

우선, info.plist 를 수정(FirebaseAppDelegateProxyEnabled NO)해서 메쏘드 재구성을 사용 중지한다.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

// TODO: Handle data of notification
FIRMessaging.messaging().appDidReceiveMessage(userInfo)

if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: \(messageID)")
}

print(userInfo)

completionHandler(UIBackgroundFetchResult.newData)
}

다음으로 FIRMessaging.messaging().appDidReceiveMessage()를 didReceiveRemoteNotification()에서 호출해준다.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
print("APNs token retrieved: \(deviceToken)")

// With swizzling disabled you must set the APNs token here.
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.prod )
}

마지막으로 FIRInstanceID.instanceID().setAPNSToken()에서 토큰의 타입을 FIRInstanceIDAPNSTokenType.prod로 명시적으로 지정해준다.


- 앱 서버에 토큰 등록 -



FCM에서 받아온 토큰을 앱 서버에 등록시키고 싶다면 다음처럼 처리한다.

func connectToFcm() {
guard FIRInstanceID.instanceID().token() != nil else {
return
}

// Send token to App Server
let Url = URL(string: "https://yourserver.com/fcm/register_token.php?Token=\(token!)")
let rq = URLRequest(url: Url!)
let task = URLSession.shared.dataTask(with: rq)
task.resume()

FIRMessaging.messaging().disconnect()

FIRMessaging.messaging().connect { (error) in
if error != nil {
print("Unable to connect with FCM. \(error?.localizedDescription ?? "")")
} else {
print("Connected to FCM.")
}
}
}

여기선 connectToFcm()에서 URLRequest()를 이용해 토큰을 전송했다.
앱을 실행하면 몇초후 서버에 토큰이 전송되는 것을 확인할 수 있다.

-- FCM 푸시 알림 --

FCM 푸시 알림 안드로이드 앱 가이드
FCM 푸시 알림 앱 서버 PHP 가이드
FCM 푸시 알림 iOS 앱 가이드

COMMENTS