Monday, November 25, 2019

Flutter FCM, iOS에서만 푸시 알림이 오지 않을 때

Flutter와 Firebase를 사용하여 야심 차게 앱을 개발하고, 안드로이드 기기에서 완벽하게 동작하는 푸시 알림을 확인하며 뿌듯함을 느낀 순간. 바로 그때, 테스트용 아이폰에서는 아무런 소식이 없습니다. 콘솔 로그에는 에러 하나 없고, 코드 상으로도 완벽해 보이는데 iOS 기기만 감감무소식인 상황. 많은 Flutter 개발자, 특히 안드로이드 개발에 더 익숙했던 분들이라면 한 번쯤 겪어봤을 절망적인 순간입니다.

이 문제는 Flutter 코드나 `firebase_messaging` 패키지의 버그가 원인인 경우는 극히 드뭅니다. 대부분의 원인은 Apple의 독자적인 푸시 알림 시스템인 APNs(Apple Push Notification service)와 Firebase를 연결하는 과정에서 발생하는 설정 누락에 있습니다. 안드로이드와 달리, iOS는 FCM이 직접 기기에 알림을 보내는 것이 아니라, APNs라는 거대한 중계 시스템을 한 번 더 거쳐야 하기 때문입니다.

이 글에서는 단순히 '이거 하세요' 수준을 넘어, 왜 이런 설정이 필요한지에 대한 근본적인 원리부터 시작하여, Apple Developer 사이트에서의 키 생성, Firebase 프로젝트 연동, Xcode 설정, 그리고 최종 테스트 및 문제 해결 팁까지, iOS 푸시 알림 문제를 해결하기 위한 모든 과정을 상세하고 체계적으로 안내합니다.


1. 근본 원인 이해: 왜 iOS 푸시 알림은 더 복잡할까?

문제를 해결하기 전에, 왜 안드로이드에서는 잘 되던 것이 iOS에서는 안 되는지 이해하는 것이 중요합니다. 이것을 이해하면 앞으로 비슷한 문제를 마주쳤을 때 더 빠르고 정확하게 원인을 파악할 수 있습니다.

안드로이드의 푸시 알림 흐름 (FCM)

안드로이드의 경우, 푸시 알림의 흐름은 비교적 단순합니다.

  1. 개발자 서버가 Firebase Cloud Messaging(FCM) 서버로 "이 기기(FCM 토큰)에 이 메시지를 보내줘"라고 요청을 보냅니다.
  2. FCM 서버는 해당 요청을 받아 Google의 인프라를 통해 직접 타겟 안드로이드 기기로 푸시 알림을 전송합니다.

이 구조에서 Firebase는 푸시 알림의 발송과 수신을 모두 관장하는 중심적인 역할을 합니다.

iOS의 푸시 알림 흐름 (FCM + APNs)

반면, iOS는 Apple이 자체 생태계의 보안과 안정성을 위해 모든 푸시 알림을 직접 관리합니다. Apple의 푸시 알림 서버를 APNs (Apple Push Notification service)라고 부릅니다. 따라서 FCM은 iOS 기기에 직접 알림을 보낼 수 없고, APNs에게 "대신 이 메시지를 이 기기에 전달해줘"라고 요청하는 대리인 역할을 수행해야 합니다.

  1. 개발자 서버FCM 서버로 메시지 전송을 요청합니다. (여기까지는 안드로이드와 동일)
  2. FCM 서버는 메시지를 받아서, 이 요청이 iOS 기기를 향한 것임을 인지합니다.
  3. FCM 서버는 Apple의 APNs로 메시지 전달을 다시 요청합니다. 이 과정에서 FCM은 자신이 '신뢰할 수 있는 발신자'임을 APNs에 증명해야 합니다.
  4. APNs는 FCM으로부터 요청을 받고, 검증이 완료되면 비로소 타겟 iOS 기기로 푸시 알림을 전송합니다.

바로 이 3번 과정, 'FCM이 APNs에 자신을 증명하는 절차'가 바로 우리가 설정해야 할 핵심입니다. 이 증명 과정이 없으면 APNs는 FCM이 보낸 요청을 스팸이나 보안 위협으로 간주하고 무시해버립니다. 그 결과, 우리 아이폰은 아무런 알림도 받지 못하게 되는 것입니다. 이 '증명'을 위한 수단이 바로 APNs 인증 키(.p8 파일)입니다.

이제 왜 우리가 Apple Developer 사이트에 들어가서 무언가를 만들고, 그걸 Firebase에 등록해야 하는지 명확해졌을 것입니다. 이제부터 그 '증명서'를 발급받고 등록하는 구체적인 여정을 시작하겠습니다.


2. 사전 준비: 필수 체크리스트

본격적인 설정에 앞서, 다음 항목들이 준비되었는지 반드시 확인해야 합니다. 하나라도 누락되면 과정을 진행할 수 없습니다.

  • 유료 Apple Developer Program 계정: 연간 $99(또는 이에 상응하는 지역별 금액)를 지불하는 정식 개발자 계정이 필요합니다. 무료 계정으로는 Push Notification 기능을 활성화할 수 없습니다.
  • Firebase 프로젝트: Flutter 앱과 연동된 Firebase 프로젝트가 이미 생성되어 있어야 합니다. 아직이라면 Firebase 공식 문서를 참고하여 프로젝트를 생성하고 Flutter 앱에 기본 설정을 완료해주세요. (`google-services.json` 및 `GoogleService-Info.plist` 파일 설정 포함)
  • Flutter 프로젝트 및 `firebase_messaging` 패키지: `pubspec.yaml` 파일에 `firebase_messaging` 패키지가 추가되어 있고, `flutter pub get` 명령어로 의존성 설치가 완료된 상태여야 합니다.
  • 실제 iOS 기기: iOS 시뮬레이터는 푸시 알림 수신 기능을 완벽하게 지원하지 않습니다. APNs로부터 실제 푸시를 받기 위해서는 반드시 실제 아이폰이나 아이패드가 필요합니다.

모든 준비가 완료되었다면, 이제 가장 중요한 단계인 APNs 인증 키 생성으로 넘어갑니다.


3. [핵심 1단계] Apple Developer에서 APNs 인증 키(.p8) 생성하기

FCM이 APNs와 통신할 수 있도록 허가해주는 '만능 열쇠'를 만드는 과정입니다. 스크린샷은 없지만, 각 메뉴의 명칭을 정확히 기재했으니 차분히 따라오시면 누구나 성공할 수 있습니다.

  1. Apple Developer 사이트 접속 및 로그인
    Apple Developer 사이트로 이동하여 준비해둔 유료 개발자 계정으로 로그인합니다.
  2. Certificates, Identifiers & Profiles 메뉴 이동
    로그인 후, 좌측 메뉴 또는 메인 화면에서 "Certificates, Identifiers & Profiles" 섹션으로 들어갑니다.
  3. Keys 메뉴 선택 및 새 키 생성
    왼쪽 탐색 메뉴에서 "Keys"를 클릭합니다. 기존에 생성한 키가 있다면 목록이 보일 것이고, 없다면 비어있을 것입니다. 파란색 플러스(+) 버튼 또는 "Create a key" 버튼을 눌러 새로운 키 생성을 시작합니다.
  4. 키 이름 입력 및 서비스 활성화 (매우 중요!)
    • Key Name: 키를 식별할 수 있는 이름을 입력합니다. 보통 '앱이름 FCM Key' 또는 'Firebase APNs Key'와 같이 직관적으로 짓는 것이 좋습니다. (예: `MyAwesomeApp APNs Key`)
    • Enable the Apple Push Notifications service (APNs): 아래 서비스 목록에서 "Apple Push Notifications service (APNs)" 항목을 찾아 체크박스를 반드시 활성화해야 합니다. 이 옵션을 켜지 않으면 생성된 키는 푸시 알림 발송 권한이 없으므로 무용지물이 됩니다. 이 부분이 가장 흔한 실수 중 하나입니다.
  5. 키 생성 및 정보 확인
    "Continue" 버튼을 누르고, 다음 화면에서 설정한 내용을 다시 한번 확인한 뒤 "Register" 버튼을 클릭하여 키 생성을 완료합니다.
  6. 키 다운로드 및 정보 저장 (단 한 번의 기회!)
    키 생성이 완료되면 다음과 같은 중요한 정보들이 표시되는 페이지로 이동합니다.
    • Download Your Key: `.p8` 확장자를 가진 파일을 다운로드할 수 있는 버튼이 보입니다. 이 파일은 지금 이 순간, 단 한 번만 다운로드할 수 있습니다. 페이지를 나가거나 새로고침하면 다시는 다운로드할 수 없으므로, 즉시 다운로드하여 매우 안전한 곳(예: 비밀번호로 보호된 클라우드 스토리지, 암호화된 USB 등)에 보관해야 합니다. 이 파일이 유출되면 누구나 당신의 앱 사용자에게 푸시 알림을 보낼 수 있게 됩니다.
    • Key ID: 10자리의 영문/숫자 조합으로 된 키의 고유 ID입니다. 나중에 Firebase에 입력해야 하므로 복사해서 안전한 곳에 메모해두세요. (예: `ABC123DEFG`)
    • Team ID: Apple Developer 계정의 고유 ID입니다. 보통 페이지 우측 상단, 계정 이름 아래에 표시됩니다. 이 또한 복사해서 Key ID와 함께 저장해두세요. (예: `XYZ987WXYZ`)

이제 우리는 FCM과 APNs를 연결하는 데 필요한 세 가지 보물, 즉 `.p8` 파일, Key ID, Team ID를 모두 손에 넣었습니다. 이 정보들을 가지고 이제 Firebase로 이동할 차례입니다.


4. [핵심 2단계] Firebase 프로젝트에 APNs 인증 키 연결하기

Apple로부터 발급받은 '증명서'를 Firebase에 등록하여, Firebase가 APNs에게 "나 Apple이 허가한 합법적인 파트너야"라고 말할 수 있게 해주는 과정입니다.

  1. Firebase 콘솔 이동 및 프로젝트 선택
    Firebase 콘솔로 이동하여 작업 중인 프로젝트를 선택합니다.
  2. 프로젝트 설정으로 이동
    좌측 상단의 톱니바퀴 아이콘을 클릭한 후, "프로젝트 설정" 메뉴로 들어갑니다.
  3. 클라우드 메시징 탭 선택
    프로젝트 설정 페이지 상단의 여러 탭 중에서 "클라우드 메시징" 탭을 클릭합니다.
  4. APNs 인증 키 업로드
    페이지를 아래로 스크롤하면 "Apple 앱 구성"이라는 섹션이 보입니다. 이 섹션 안에 "APNs 인증 키"라는 항목이 있습니다. "업로드" 버튼을 클릭하세요.
  5. 정보 입력 및 업로드
    팝업 창이 나타나면, 방금 전 Apple Developer 사이트에서 얻은 정보를 차례대로 입력합니다.
    • APNs 인증 키: '탐색' 버튼을 눌러 아까 다운로드했던 `.p8` 파일을 선택합니다.
    • 키 ID: 메모해두었던 10자리의 Key ID를 붙여넣습니다.
    • 팀 ID: 메모해두었던 Team ID를 붙여넣습니다.
    모든 정보를 정확히 입력했다면 "업로드" 버튼을 클릭합니다. 업로드가 성공적으로 완료되면, 이전에 비어있던 "APNs 인증 키" 섹션에 방금 업로드한 키의 정보(Key ID와 파일 이름)가 표시됩니다.

여기까지 완료했다면, 서버 간의 연결 설정은 모두 끝났습니다. 이제 마지막으로 우리 앱(클라이언트)이 푸시 알림을 받을 준비가 되었음을 iOS 운영체제에 알려주는 설정을 할 차례입니다.


5. [핵심 3단계] Xcode 프로젝트 설정: 마지막 관문

Flutter 프로젝트의 `ios` 폴더는 사실상 네이티브 iOS 프로젝트입니다. 이 프로젝트 자체에 "우리 앱은 푸시 알림을 사용할 겁니다"라고 명시적으로 선언해주어야 합니다. 이 과정을 누락하면 OS 단에서부터 푸시 알림 수신이 차단됩니다.

  1. Xcode로 iOS 프로젝트 열기
    Flutter 프로젝트의 루트 디렉토리에서 터미널을 열고 다음 명령어를 입력하여 Xcode로 iOS 프로젝트를 엽니다.
    
    open ios/Runner.xcworkspace
            
    주의: `Runner.xcodeproj`가 아닌, `.xcworkspace` 파일을 열어야 합니다. Cocoapods로 설치된 라이브러리들이 포함되어 있기 때문입니다.
  2. Signing & Capabilities 설정 이동
    Xcode가 열리면, 왼쪽 네비게이터에서 최상단에 있는 "Runner" 프로젝트를 선택한 후, 중앙 에디터 영역에서 "Runner" 타겟(Target)을 선택합니다. 그 다음 상단의 탭 메뉴에서 "Signing & Capabilities"를 클릭합니다.
  3. Push Notifications Capability 추가
    "Signing & Capabilities" 탭의 왼쪽 상단에 있는 "+ Capability" 버튼을 클릭합니다. 나타나는 팝업 창에서 "Push Notifications"를 검색하거나 스크롤하여 찾은 후, 더블클릭하여 추가합니다. 추가가 완료되면 해당 탭에 "Push Notifications" 항목이 생긴 것을 확인할 수 있습니다. 이 과정이 바로 앱이 APNs에 등록될 수 있도록 허용하는 스위치를 켜는 것과 같습니다.
  4. Background Modes Capability 추가 (권장)
    앱이 백그라운드 상태일 때에도 알림 관련 데이터를 처리하거나, 조용한 알림(Silent Notification)을 수신하려면 이 설정이 필요합니다.
    • 다시 한번 "+ Capability" 버튼을 클릭합니다.
    • 이번에는 "Background Modes"를 찾아 더블클릭하여 추가합니다.
    • 추가된 "Background Modes" 섹션에서 "Remote notifications" 항목의 체크박스를 활성화합니다. 이 설정을 통해 앱은 백그라운드에서도 원격 알림을 수신할 준비를 마칩니다.

이제 서버-서버 연결, 앱-OS 연결까지 모든 기술적인 설정이 완료되었습니다. 남은 것은 Flutter 코드에서 푸시 권한을 요청하고, 메시지를 처리하는 로직을 작성하는 것입니다.


6. Flutter 코드 점검: 권한 요청 및 메시지 처리

플랫폼 설정이 모두 끝났으니, 이제 앱이 실행될 때 사용자에게 알림 권한을 요청하고, 수신된 메시지를 처리하는 코드가 올바르게 작성되었는지 확인합니다.

`main.dart` 파일 예시

다음은 기본적인 FCM 설정을 포함한 `main.dart` 파일의 예시입니다. 대부분의 경우 FlutterFire 공식 문서의 코드를 따르지만, 핵심적인 부분들을 다시 짚어보겠습니다.


import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';

import 'firebase_options.dart'; // flutterfire configure로 생성된 파일

// 백그라운드 메시지 핸들러는 최상위 함수여야 합니다.
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // 이 핸들러를 사용하려면 다른 Firebase 서비스 초기화가 필요할 수 있습니다.
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  print("백그라운드에서 메시지 수신: ${message.messageId}");
  // 여기서 백그라운드 데이터 처리를 수행할 수 있습니다.
}

Future<void> main() async {
  // Flutter 엔진과 위젯 바인딩 초기화
  WidgetsFlutterBinding.ensureInitialized();
  
  // Firebase 앱 초기화
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  // 백그라운드 메시지 핸들러 설정
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    _setupFCM();
  }

  Future<void> _setupFCM() async {
    final messaging = FirebaseMessaging.instance;

    // 1. iOS 포그라운드 알림 설정 (헤드업 알림)
    await messaging.setForegroundNotificationPresentationOptions(
      alert: true, // Required to display a heads up notification
      badge: true,
      sound: true,
    );

    // 2. 알림 권한 요청 (iOS, macOS)
    NotificationSettings settings = await messaging.requestPermission(
      alert: true,
      announcement: false,
      badge: true,
      carPlay: false,
      criticalAlert: false,
      provisional: false,
      sound: true,
    );

    print('사용자 권한 상태: ${settings.authorizationStatus}');

    if (settings.authorizationStatus == AuthorizationStatus.authorized) {
      print('사용자가 알림을 허용했습니다.');
    } else if (settings.authorizationStatus == AuthorizationStatus.provisional) {
      print('사용자가 임시 알림을 허용했습니다.');
    } else {
      print('사용자가 알림을 거부했거나 아직 결정하지 않았습니다.');
    }

    // 3. FCM 토큰 가져오기
    final fcmToken = await messaging.getToken();
    print('FCM Token: $fcmToken');
    // 이 토큰을 서버로 전송하여 특정 사용자에게 메시지를 보낼 때 사용합니다.

    // 4. 포그라운드 메시지 수신 리스너
    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      print('포그라운드에서 메시지를 받았습니다!');
      print('메시지 데이터: ${message.data}');

      if (message.notification != null) {
        print('메시지에 알림이 포함되어 있습니다: ${message.notification!.title}, ${message.notification!.body}');
      }
    });

    // 5. 앱이 종료된 상태에서 알림을 클릭하여 열었을 때 메시지 가져오기
    RemoteMessage? initialMessage = await messaging.getInitialMessage();
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }
    
    // 6. 앱이 백그라운드 상태에서 알림을 클릭하여 열었을 때 메시지 수신 리스너
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    print("알림 클릭! 메시지 데이터: ${message.data}");
    // 예를 들어, 특정 페이지로 라우팅하는 로직을 여기에 구현합니다.
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('FCM iOS 테스트'),
        ),
        body: const Center(
          child: Text('iOS 푸시 알림을 기다리는 중...'),
        ),
      ),
    );
  }
}

코드의 핵심 포인트

  • `requestPermission()`: 이 함수가 호출될 때 iOS 사용자에게 "이 앱이 알림을 보내도록 허용하시겠습니까?"라는 시스템 팝업이 표시됩니다. 이 권한을 얻지 못하면 어떤 알림도 표시되지 않습니다.
  • `getToken()`: 이 함수는 기기의 고유한 FCM 등록 토큰을 반환합니다. 이 토큰이 성공적으로 반환된다면, 클라이언트 앱과 FCM 서버 간의 통신은 정상적으로 이루어지고 있다는 강력한 증거입니다. 만약 이 함수에서 null이나 에러가 발생한다면, 이전 단계의 설정(특히 `GoogleService-Info.plist` 파일)을 다시 확인해야 합니다.
  • `onBackgroundMessage`: 앱이 완전히 종료되었거나 백그라운드에 있을 때 데이터 메시지를 수신하기 위한 핸들러입니다. 반드시 `runApp` 호출 전에, 최상위 스코프에 정의되어야 합니다.

7. 최종 테스트 및 트러블슈팅

모든 설정을 마쳤다면, 이제 운명의 시간입니다. 실제 기기에서 테스트를 진행해봅시다.

Firebase 콘솔을 이용한 테스트 메시지 발송

  1. Flutter 앱을 Xcode를 통해 실제 iOS 기기에 빌드하고 실행합니다. (`flutter run`도 가능)
  2. 앱이 실행되면, Xcode의 콘솔 또는 VS Code의 디버그 콘솔에서 `FCM Token:`으로 시작하는 로그를 찾습니다. 출력된 긴 토큰 문자열을 전체 복사합니다.
  3. Firebase 콘솔로 돌아가서, 왼쪽 메뉴의 참여(Engage) 섹션 아래에 있는 "Messaging"으로 이동합니다.
  4. "알림 작성(Create your first campaign)" 또는 "새 캠페인(New campaign)" 버튼을 누르고, "알림(Notifications)"을 선택합니다.
  5. 알림 제목과 텍스트를 간단히 입력하고, 우측의 "테스트 메시지 보내기" 패널을 클릭합니다.
  6. "FCM 등록 토큰 추가" 입력란에 방금 복사한 기기의 FCM 토큰을 붙여넣고, "+" 버튼을 눌러 추가합니다.
  7. "테스트" 버튼을 클릭합니다!

몇 초 후, 연결된 아이폰 화면에 방금 작성한 제목과 내용의 푸시 알림이 나타난다면, 당신은 마침내 이 길고 긴 여정을 성공적으로 마친 것입니다! 하지만 만약... 여전히 알림이 오지 않는다면? 좌절하지 마세요. 다음 트러블슈팅 목록을 하나씩 확인해보세요.

그래도 안 될 때: 최종 점검 리스트

  • Bundle Identifier 일치 여부 확인 (가장 흔한 원인):
    • Xcode: Runner > Target "Runner" > General 탭 > "Bundle Identifier"
    • Apple Developer: Certificates, Identifiers & Profiles > Identifiers > 해당 앱 ID > "Bundle ID"
    • Firebase: 프로젝트 설정 > 일반 탭 > 내 앱 > iOS 앱 > "번들 ID"
    이 세 곳의 번들 ID가 정확히 동일한지 글자 하나하나 비교해보세요. `com.company.appname` 과 `com.company.AppName`은 다른 ID입니다.
  • Xcode Capabilities 재확인: "Signing & Capabilities" 탭에 "Push Notifications"가 정말로 추가되어 있는지 다시 확인하세요. 가끔 Xcode가 설정을 제대로 저장하지 않는 경우가 있습니다. Xcode를 완전히 종료했다가 다시 열어서 확인해보는 것도 좋습니다.
  • `.p8` 키와 인증서(`.p12`) 중복 사용 여부: Firebase "클라우드 메시징" 설정에서 APNs 인증 키(.p8)와 APNs 인증서(.p12)를 동시에 업로드하지 않았는지 확인하세요. 최신 방식인 .p8 키만 사용하는 것을 강력히 권장합니다. 인증서는 유효 기간이 있어 주기적으로 갱신해야 하는 번거로움이 있습니다. 만약 둘 다 있다면, 오래된 인증서는 삭제하세요.
  • 기기의 네트워크 환경: 드물지만, 특정 기업이나 공공기관의 Wi-Fi는 APNs가 사용하는 포트(5223, 443, 2197)를 차단할 수 있습니다. Wi-Fi를 끄고 셀룰러 데이터(LTE/5G) 환경에서 다시 테스트해보세요.
  • 기기의 '방해금지 모드' 또는 '집중 모드': 아이폰 자체의 방해금지 모드나 특정 집중 모드가 활성화되어 알림이 음소거되거나 표시되지 않는 것은 아닌지 확인하세요.
  • 앱 권한 재설정: 아이폰의 '설정' > 해당 앱 > '알림' 메뉴로 들어가서 '알림 허용'이 켜져 있는지 확인하세요. 만약 실수로 '허용 안 함'을 눌렀다면 여기서 다시 켤 수 있습니다. 테스트를 위해 앱을 삭제하고 재설치하여 권한 요청 팝업을 다시 띄우는 것도 좋은 방법입니다.
  • `didFailToRegisterForRemoteNotificationsWithError`: Xcode의 콘솔 로그를 유심히 살펴보세요. 만약 APNs 등록 자체에 실패했다면, `didFailToRegisterForRemoteNotificationsWithError`와 같은 로그와 함께 에러 코드가 출력될 수 있습니다. 이 에러 코드로 검색하면 좀 더 구체적인 원인을 찾을 수 있습니다. (예: `no valid 'aps-environment' entitlement` -> Push Notifications Capability가 누락된 경우)

마치며

Flutter에서 iOS FCM 푸시 알림이 오지 않는 문제는 개발자를 깊은 좌절에 빠뜨릴 수 있는 대표적인 '난제' 중 하나입니다. 하지만 그 근본 원리를 파고들어 보면, 결국은 FCM과 APNs라는 두 거대 시스템 간의 '신뢰 관계'를 설정해주는 과정임을 알 수 있습니다.

Apple Developer 사이트에서 발급받은 `.p8` 키는 그 신뢰를 증명하는 열쇠이며, Firebase와 Xcode에서의 설정은 그 열쇠를 올바른 자물쇠에 꽂는 행위와 같습니다. 이 글에서 안내한 단계들을 차근차근 밟아 나갔다면, 아마 지금쯤 당신의 아이폰에서는 아름다운 푸시 알림이 울리고 있을 것입니다.

이 경험은 단순히 문제를 해결하는 것에서 그치지 않고, 크로스플랫폼 개발 시 각 플랫폼의 고유한 특성을 이해하는 것이 얼마나 중요한지를 깨닫게 해주는 좋은 기회가 될 것입니다. 이제 여러분은 어떤 플랫폼에서도 자신 있게 푸시 알림을 구현할 수 있는 개발자로 한 단계 더 성장했습니다.


0 개의 댓글:

Post a Comment