먹고 기도하고 코딩하라

[Swift] FCM 푸시 알림 전송 작업 중 삽질 본문

앱/Swift

[Swift] FCM 푸시 알림 전송 작업 중 삽질

사과먹는사람 2022. 12. 18. 14:50
728x90
728x90

 

업무 프로세스에 어느 정도 적응이 되어가고 이슈도 몇 개 쳐내고 있던 중에 J님이 FCM이나 딥링크, 다이나믹 링크를 보면 좋을 것 같다고 조언을 해주셔서 지난 금요일 오후에는 계속 FCM 푸시 보내는 걸 연습했다. 비록 잘 안 돼서 삽질을 엄청 했지만... -_- 이런 걸로 삽질하면 되게 머쓱한데 무안 주시지도 않고 잘 봐주셔서 너무 감사했다.

어떤 부분에서 잘 안 됐는지만 간단히 적어보려 한다.

 

 

1. 일단 공식 문서에 너무 의존하지 않는다. 이상한 말이긴 한데 구글 파이어베이스 쪽에서 제공하는 공식 문서는 약간 옛날 느낌이라, 첫 번째 프로젝트 만들어서 고대로 했을 때는 망해버렸다. (ㅠㅠ)

그리고 자동 번역된 거 보느니 원문 보는 게 훨씬 나을 수도 있다. (빠른, 목표-C 이렇게 돼 있는 거 보고 잠깐 벙쪘다가 아, Swift랑 옵젝C구나.. -_- 이랬다는)

이런 건 차라리 한국어로 쓰인 최신 자료가 도움이 되는 것 같다. 난 이 글을 보고 따라서 진행했고 두 번째에는 성공했다. 

 

2. AppDelegate.swift에서는 FirebaseCore가 아니라 Firebase를 import한다. FirebaseCore import하면

Messaging.messaging().delegate = self

이 코드에서 messaging이 뭔지 모르겠다고 에러 메시지가 뜬다. Firebase로 import하고, AppDelegate가 MessagingDelegate 준수하도록 변경하면 에러 메시지가 사라진다.

 

3. MessagingDelegate를 준수하고 messaging 메서드를 구현하게 되는데 이 때 fcmToken은 String? 타입이다. 그러므로 dataDict를 초기화할 때는 다음과 같이 초기화해야 한다.

extension AppDelegate: MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        let dataDict: [String: String] = ["token": fcmToken ?? ""]
        
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
    }
}

 

4. App ID 등록할 때 "An attribute in the provided entity has invalid value, An App ID with Identifier '번들아이디' is not available. Please enter a different string." 하는 경고창이 뜨기도 한다. 번들 ID는 내 프로젝트만이 아니라 전체 앱들 중에서 유일하게 이 앱을 식별할 수 있도록 고유해야 하기 때문에 다른 앱에서 사용하는 번들 아이디와 겹치면 사용할 수 없다. 프로젝트에서도 번들 id를 바꿔주고 새로운 걸로 등록하는 수밖에 없다. 

 

[Apple] An attribute in the provided entity has invalid value

애플의 Identifiers 중 Services IDs를 생성하던 중 발생했다. 다른 Identifiers에서 만든 것과 같은 Identifier를 입력해서 발생한 것으로 보인다. 해결방법 중복되지 않는 Identifier로 만들어 해결

leeseongho.tistory.com

번들 id 개념은 다음 포스팅 참고. 예를 들면 나는 Identifiers에 com.apple.Health 라는 id로 등록할 수는 없다. 애플의 건강 앱이 이 번들 id를 갖고 있기 때문이다.

이 때 주의할 점은 GoogleService-Info.plist 파일의 bundle ID 부분도 함께 바꿔야 한다는 점이다.

 

5. 알림이 바로 안 오고 생뚱맞은 타이밍에 오기도 하는 것 같다. 노티가 안 돼서 이것저것 고쳐보다 보니까 3분 전에 쏜 노티가 갑자기 알림 센터에 등장한다. 뭐야.. 싶었는데 되긴 된다.. 것 참.. 내 경우 테스트로는 푸시가 오지 않았고, 무조건 검토까지 해서 캠페인 하나를 완성해야 알림이 왔다. 테스트에서 안 된다고 끝내지 말고 완성을 하고 몇 분 기다려보자.

+ Info.plist에 FirebaseAppDelegateProxyEnabled 속성을 Boolean, NO 로 줘야 한다는 해결책이 있는데 이게 반드시 있어야 먹히는 건 아닌 것 같다.

FIRMessaging Remote Notifications proxy enabled, will swizzle remote notification receiver handlers. If you'd prefer to manually integrate Firebase Messaging, add "FirebaseAppDelegateProxyEnabled" to your Info.plist, and set it to NO. Follow the instructions at:
https://firebase.google.com/docs/cloud-messaging/ios/client#method_swizzling_in_firebase_messaging
to ensure proper integration.

 

+ 사진 푸시

여기까지는 그냥 기본적으로 파이어베이스에서 텍스트 푸시 보내는 과정에서 생긴 문제를 다뤘다.

푸시에 사진 넣어서 보내려면 프로젝트에 Notification Service Extension 올려야 한다. 프로젝트에 Extension 생성을 하면 파란 종이 생기는데, 실무 프로젝트에 있던 그 파란색 종(bell)이 이거였구나~ 깨닫는 순간이었다. 

사진 푸시는 이 글 참고해서 진행했다. 직접 UNNotificationAttachment 세팅해서 populate하는 방법이 있고, FIRMessagingExtensionHelper 도움 받아서 populate하는 방법도 있다. 코드 길이는 헬퍼 사용하는 게 압도적으로 짧긴 하지만 원리를 익히려면 페이로드 뜯어서 어떻게 생겼는지 보고 Attachment 세팅하는 게 더 도움이 될 것 같다는 생각이 든다.

 

음.. 파이어베이스로 커스텀 메시지("{{userName}} 님, 저번에 들었던 {{content}} 나머지 내용이 궁금하지 않으세요?")도 가능할 줄 알았는데 그것까진 불가능한 모양이다. 이건 백엔드 서버가 붙어야 가능한 듯하다. 출근해서 Extension 쪽 코드를 조금 더 살펴봐야겠다.

 

 

 

728x90
반응형
Comments