iOS에서 동적 링크 수신

하는 Firebase Dynamic Links를 받기 위해 앱에 Dynamic Links SDK를 포함하고 handleUniversalLink:dynamicLinkFromCustomSchemeURL: 메서드를 사용하여 Dynamic Link에 전달된 데이터를 가져옵니다.

기본 요건

시작하기 전에 iOS 프로젝트에 Firebase를 추가해야 합니다.

Swift Package Manager를 사용해 Firebase 종속 항목을 설치하고 관리하세요.

  1. 앱 프로젝트를 연 상태로 Xcode에서 File(파일) > Add Packages(패키지 추가)로 이동합니다.
  2. 메시지가 표시되면 Firebase Apple 플랫폼 SDK 저장소를 추가합니다.
  3.   https://github.com/firebase/firebase-ios-sdk.git
    드림 <ph type="x-smartling-placeholder">
  4. Dynamic Links 라이브러리를 선택합니다.
  5. 타겟 빌드 설정의 Other Linker Flags(기타 링커 플래그) 섹션에 -ObjC 플래그를 추가합니다.
  6. Dynamic Links 사용 환경을 최적화하려면 다음을 권장합니다. Google Analytics 사용 설정 Google 애널리틱스용 Firebase SDK를 앱에 추가하면 됩니다. 다음을 수행할 수 있습니다. IDFA 수집이 없는 라이브러리 또는 IDFA 수집이 있는 라이브러리를 선택하세요.
  7. 완료되면 Xcode가 백그라운드에서 자동으로 종속 항목을 확인하고 다운로드하기 시작합니다.

이제 몇 가지 구성 단계를 수행합니다.

  1. Firebase 콘솔에서 Dynamic Links를 엽니다. 섹션으로 이동합니다. 서비스 약관에 동의하라는 메시지가 표시되면 약관에 동의합니다.
  2. 앱 설정에서 앱의 App Store ID 및 앱 ID 프리픽스를 지정합니다. 앱 설정을 확인하고 수정하려면 Firebase 프로젝트의 설정 페이지로 이동하고 iOS 앱을 선택합니다.

    Firebase 프로젝트가 다음을 사용하도록 올바르게 구성되었는지 확인할 수 있습니다. Dynamic Links을 엽니다.

    https://your_dynamic_links_domain/apple-app-site-association

    앱이 연결되면 apple-app-site-association 파일에 앱의 앱 ID 프리픽스 및 번들 ID에 대한 참조가 포함됩니다. 예를 들면 다음과 같습니다.

    {"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["NOT /_/*","/*"]}]}}

    details 필드가 비어 있는 경우 앱 ID 프리픽스를 지정했는지 확인해 보세요. 앱 ID 프리픽스와 팀 ID가 같지 않을 수도 있습니다.

  3. 선택사항: Dynamic Links SDK의 iOS 사용 중지 임시 보드입니다.

    기본적으로 Dynamic Links SDK는 페이스트보드를 사용하여 신뢰성을 개선하는 데 도움이 될 수 있습니다 페이스트보드를 사용하여 Dynamic Links 사용자가 Dynamic Link을 열지만 앱을 설치해야 할 때 사용자가 링크를 클릭하면 원본 콘텐츠로 즉시 이동할 수 있습니다. 설치 후 처음으로 앱을 여는 경우

    단점은 iOS 14 이상에서 페이스트보드를 사용하면 알림을 트리거한다는 것입니다. 따라서 사용자가 앱을 처음 열 때 페이스트보드에 URL이 포함되어 있으면 앱이 페이스트보드에 액세스했다는 알림이 표시되어 혼란을 일으킬 수 있습니다.

    이 동작을 사용 중지하려면 Xcode 프로젝트의 Info.plist 파일을 수정하고 FirebaseDeepLinkPasteboardRetrievalEnabled 키를 NO로 설정합니다.

  1. 앱의 Xcode 프로젝트에 있는 Info(정보) 탭에서 새 항목을 만듭니다. Dynamic Links에 사용할 URL 유형입니다. 다음과 같이 설정합니다. Identifier 필드를 고유한 값으로, URL scheme 필드를 고유한 값으로 설정합니다. 번들 식별자는 Dynamic Links에서 사용하는 기본 URL 스키마입니다.
  2. 앱의 Xcode 프로젝트의 기능 탭에서 관련 도메인을 사용 설정하고 관련 도메인 목록에 다음을 추가합니다.
    applinks:your_dynamic_links_domain
  3. 다음과 함께 Dynamic Links을(를) 수신하려는 경우 완전 커스텀 도메인, Xcode 프로젝트의 Info.plist 파일에서 FirebaseDynamicLinksCustomDomains를 앱의 URL 프리픽스 Dynamic Links개 예를 들면 다음과 같습니다.
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. UIApplicationDelegateFirebaseCore 모듈과 앱 대리자가 사용하는 다른 Firebase 모듈을 가져옵니다. 예를 들어 Cloud FirestoreAuthentication를 사용하려면 다음을 실행합니다.

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. 앱 대리자의 application(_:didFinishLaunchingWithOptions:) 메서드에서 FirebaseApp 공유 인스턴스를 구성합니다.

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. SwiftUI를 사용하는 경우 앱 대리자를 만들고 UIApplicationDelegateAdaptor 또는 NSApplicationDelegateAdaptor를 통해 App 구조체에 연결해야 합니다. 앱 대리자 재구성도 중지해야 합니다. 자세한 내용은 SwiftUI 안내를 참조하세요.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  7. 다음으로 앱을 이미 설치했으면 application:continueUserActivity:restorationHandler: 메서드에서 범용 링크로 수신된 링크를 처리합니다.

    Swift

    참고: 이 제품은 macOS, Mac Catalyst, tvOS 또는 watchOS 대상에서는 사용할 수 없습니다.
    func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
      let handled = DynamicLinks.dynamicLinks()
        .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in
          // ...
        }
    
      return handled
    }

    Objective-C

    참고: 이 제품은 macOS, Mac Catalyst, tvOS 또는 watchOS 대상에서는 사용할 수 없습니다.
    - (BOOL)application:(UIApplication *)application
    continueUserActivity:(nonnull NSUserActivity *)userActivity
     restorationHandler:
    #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
    (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler {
    #else
        (nonnull void (^)(NSArray *_Nullable))restorationHandler {
    #endif  // __IPHONE_12_0
      BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
                                                              completion:^(FIRDynamicLink * _Nullable dynamicLink,
                                                                           NSError * _Nullable error) {
                                                                // ...
                                                              }];
      return handled;
    }
  8. 마지막으로 application:openURL:options:에서 앱의 커스텀 URL 스킴을 통해 수신된 링크를 처리합니다. 이 메서드는 설치 후 앱이 처음으로 열릴 때 호출됩니다.

    앱을 처음 실행할 때 Dynamic Link를 찾을 수 없으면 이 메서드는 DynamicLinkurlnil로 설정되어 SDK가 일치하는 대기 중인 Dynamic Link을(를) 찾을 수 없습니다.

    Swift

    참고: 이 제품은 macOS, Mac Catalyst, tvOS 또는 watchOS 대상에서는 사용할 수 없습니다.
    @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
      return application(app, open: url,
                         sourceApplication: options[UIApplication.OpenURLOptionsKey
                           .sourceApplication] as? String,
                         annotation: "")
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
                     annotation: Any) -> Bool {
      if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
        // Handle the deep link. For example, show the deep-linked content or
        // apply a promotional offer to the user's account.
        // ...
        return true
      }
      return false
    }

    Objective-C

    참고: 이 제품은 macOS, Mac Catalyst, tvOS 또는 watchOS 대상에서는 사용할 수 없습니다.
    - (BOOL)application:(UIApplication *)app
                openURL:(NSURL *)url
                options:(NSDictionary<NSString *, id> *)options {
      return [self application:app
                       openURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    
    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
    
      if (dynamicLink) {
        if (dynamicLink.url) {
          // Handle the deep link. For example, show the deep-linked content,
          // apply a promotional offer to the user's account or show customized onboarding view.
          // ...
        } else {
          // Dynamic link has empty deep link. This situation will happens if
          // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
          // but pending link is not available for this device/App combination.
          // At this point you may display default onboarding view.
        }
        return YES;
      }
      return NO;
    }