iOS에서 동적 링크 수신

생성한 Firebase 동적 링크를 수신하려면 앱에 동적 링크 SDK를 포함하고 앱이 로드될 때 handleUniversalLink:dynamicLinkFromCustomSchemeURL: 메소드를 호출하여 동적 링크로 전달된 데이터를 가져와야 합니다.

기본 요건

Firebase 동적 링크를 사용하려면 iOS 8 이상이 필요합니다. 앱에서는 iOS 7을 대상으로 할 수도 있지만, iOS 8 이상에서 앱을 실행하지 않으면 Firebase 동적 링크 SDK의 모든 호출이 아무 작업도 실행하지 않습니다.

Firebase 및 동적 링크 SDK 설정

  1. iOS 프로젝트에 Firebase를 추가합니다. Podfile에 다음 pod를 포함합니다.
    pod 'Firebase/Analytics'
    pod 'Firebase/DynamicLinks'
  2. pod install을 실행하고 생성된 .xcworkspace 파일을 엽니다.
  3. Firebase Console에서 동적 링크 섹션을 엽니다. 서비스 약관에 동의하라는 메시지가 표시되면 약관에 동의합니다.
  4. 앱 설정에서 앱의 App Store ID 및 앱 ID 프리픽스를 지정합니다. 앱 설정을 확인하고 수정하려면 Firebase 프로젝트의 설정 페이지로 이동하고 iOS 앱을 선택합니다.

    다음 URL을 열면 iOS 앱에서 동적 링크를 사용할 수 있도록 Firebase 프로젝트가 올바르게 구성되었는지 확인할 수 있습니다.

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

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

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

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

앱에서 동적 링크 열기

  1. 앱의 Xcode 프로젝트의 정보 탭에서 동적 링크로 사용할 새 URL 유형을 만듭니다. 식별자 필드는 고유한 값으로, URL 스키마 필드는 동적 링크에서 사용하는 기본 URL 스키마인 번들 식별자로 설정합니다.
  2. 앱의 Xcode 프로젝트의 기능 탭에서 관련 도메인을 사용 설정하고 관련 도메인 목록에 다음을 추가합니다.
    applinks:your_dynamic_links_domain
  3. 완전 맞춤 도메인이 있는 동적 링크를 수신하려면 Xcode 프로젝트의 Info.plist 파일에서 FirebaseDynamicLinksCustomDomains 키를 만들어 앱의 동적 링크 URL 프리픽스로 설정합니다. 예를 들면 다음과 같습니다.
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. UIApplicationDelegate에서 Firebase 모듈을 가져옵니다.

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  5. 일반적으로 앱의 application:didFinishLaunchingWithOptions: 메소드에서 FirebaseApp 공유 인스턴스를 구성합니다.

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. 다음으로 iOS 9 이상 버전에 앱을 이미 설치했다면 application:continueUserActivity:restorationHandler: 메소드에서 범용 링크로 수신된 링크를 처리합니다.

    Swift

    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

    - (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;
    }
  7. 마지막으로 application:openURL:sourceApplication:annotation: (iOS 8 이상) 및 application:openURL:options:(iOS 9 이상) 메소드에서 앱의 맞춤 URL 스키마를 통해 수신된 링크를 처리합니다. 이 메소드는 iOS 8 이하의 경우에는 앱이 링크를 수신할 때, 그리고 iOS 버전에 상관없이 앱을 설치한 후 처음으로 열었을 때 호출됩니다.

    모든 iOS 버전에서 앱이 처음 실행될 때 동적 링크가 발견되지 않으면 이 메소드는 FIRDynamicLinkurlnil로 설정하여 호출합니다. 이는 SDK가 일치하는 대기중 동적 링크를 찾지 못했음을 나타냅니다.

    Swift

    @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

    - (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;
    }