iOS SDK V6로 업데이트하기 & 플러그인

요약: 기존 앱스플라이어 iOS SDK/iOS SDK V6와 래퍼 연동을 업데이트합니다.

iOS SDK V6 소개

이 문서는 SDK V6에 관련된 참고자료입니다. 

앱스플라이어 iOS SDK V6는

  • 앱 소유주와 앱 개발자가 iOS 14 출시에 대비하도록 지원합니다.
  • 앱 사용자에게 IDFA 수집 승인 여부를 묻는 옵션을 지원합니다.
  • iOS 모바일 앱에 앱 어트리뷰션과 이벤트 리포팅 기능을 제공합니다.
  • API 메서드가 이전 버전과 다릅니다. 

SDK V6 관련 상세 내용과 그 버전을 앱스플라이어 SDK 기존 버전이 설치되지 않은 새 앱에 설치하는 방식은 마케터용 iOS SDK 연동 가이드를 참고하십시오.

iOS SDK V6로 업데이트하기

iOS SDK V6로 업데이트하기 위해, 다음 절차(1-5)를 완료하십시오. 

1. SDK 버전을 업데이트 합니다.

SDK V6를 다운로드하고 Xcode에 추가합니다. 

2. SDK V6을 구현합니다.

다음 코드를 SDK 작동 시점에 추가하십시오.

Objective-CSwift

AppDelegate.h 에서, 다음 작업을 진행하십시오:

#import "AppDelegate.h"
#import <AppsFlyerLib/AppsFlyerLib.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 1 - Get AppsFlyer preferences from .plist file
    NSString *path = [[NSBundle mainBundle] pathForResource:@"afdevkey_donotpush" ofType:@".plist"];
    NSDictionary* properties = [NSDictionary dictionaryWithContentsOfFile:path];
    if (properties == nil || path == nil) {
        [NSException raise:@"Error" format:@"Cannot find .plist file"];
    }
    NSString* appsFlyerDevKey = [properties objectForKey:@"appsFlyerDevKey"];
    NSString* appleAppID = [properties objectForKey:@"appleAppID"];
    if (appsFlyerDevKey == nil || appleAppID == nil) {
        [NSException raise:@"Error" format:@"Cannot find appsFlyerDevKey or appleAppID"];
    }
    // 2 - Replace 'appsFlyerDevKey', `appleAppID` with your DevKey, Apple App ID
    [[AppsFlyerLib shared] setAppsFlyerDevKey:appsFlyerDevKey];
    [[AppsFlyerLib shared] setAppleAppID:appleAppID];
    [AppsFlyerLib shared].delegate = self;
    //  Set isDebug to true to see AppsFlyer debug logs
    [AppsFlyerLib shared].isDebug = true;

    if (@available(iOS 10, *)) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
    return YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[AppsFlyerLib shared] start];
}

// Deep linking
// Open URI-scheme for iOS 9 and above
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *) options {
    [[AppsFlyerLib shared] handleOpenUrl:url options:options];
    return YES;
}
// Open URI-scheme for iOS 8 and below
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {
    [[AppsFlyerLib shared] handleOpenURL:url sourceApplication:sourceApplication withAnnotation:annotation];
    return YES;
}
// Open Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
    [[AppsFlyerLib shared] continueUserActivity:userActivity restorationHandler:restorationHandler];
    return YES;
}
// Report Push Notification attribution data for re-engagements
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [[AppsFlyerLib shared] handlePushNotification:userInfo];
}
// AppsFlyerLib implementation
//Handle Conversion Data (Deferred Deep Link)
-(void)onConversionDataSuccess:(NSDictionary*) installData {
    id status = [installData objectForKey:@"af_status"];
    if([status isEqualToString:@"Non-organic"]) {
        id sourceID = [installData objectForKey:@"media_source"];
        id campaign = [installData objectForKey:@"campaign"];
        NSLog(@"This is a none organic install. Media source: %@  Campaign: %@",sourceID,campaign);
    } else if([status isEqualToString:@"Organic"]) {
        NSLog(@"This is an organic install.");
    }
}
-(void)onConversionDataFail:(NSError *) error {
    NSLog(@"%@",error);
}
//Handle Direct Deep Link
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
    NSLog(@"%@",attributionData);
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
    NSLog(@"%@",error);
}
// support for scene delegate
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options API_AVAILABLE(ios(13)){
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions  API_AVAILABLE(ios(13.0)){
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
@end

3. SKAdNetwork 어트리뷰션 지원

SKAdNetwork는 iOS가 사용하는 클래스이며, 앱 설치가 광고에 기인해서 발생했는지 검증합니다. 이 앱 설치 유효성 검증 프로세스에는 소스(source) 앱과 광고 대상 앱이 있습니다.  

소스(source) 앱은 광고 네트워크가 서명한 광고를 자신의 지면에 게재하여 광고 캠페인에 참여하는 앱입니다. 광고를 게재하도록 앱을 구성하는 작업은 앱스플라이어 SDK 범위 내에 없습니다. 구성할 때 iOS 지침을 따라야 합니다.

광고되는 앱을 구성하기 위해, 앱스플라이어 SKAdNetwork 솔루션은 SKAdNetwork를 이용하여 광고주와 광고 네트워크에 LTV 애널리틱스, 리포트, 포스트백을 제공하는 동시에 엔드유저 개인정보를 보호합니다. 앱이 설치 후 처음 실행되면, 앱스플라이어 플랫폼은 마케터가 플랫폼에 설정한 조건에 따라 SDK에 SKAdNetwork 전환 값을 설정하는 방식을 지시합니다.

SKAdNetwork Solution를 사용하기 위해:

  • 개발자가 할 일은 없습니다.
  • 앱스플라이어 SDK는 자동으로 필요한 SKAdNetwork API인 registerAppForAdNetworkAttribution()updateConversionValue() 를 호출합니다. 이 API들을 개발자가 임의로 호출해서는 안됩니다. 
  • 앱스플라이어 외 다른 SDK가 SKAdNet API를 호출하지 않도록 하십시오. 다른 SDK가 호출하면, iOS가 앱스플라이어에 보내는 포스트백이 지연될 수 있고, 전환 값이 변경되어 전환 값을 사용하여 SKAdNetwork 대시보드에 표기되는 사용자 가치 데이터도 변경될 수 있습니다. 
  • 마케터는앱스플라이어에서 SKAdNetwork 측정 방식을 설정해야 합니다. 

 App Store에서 개발자나 마케터가 해야 할 작업이나 등록 절차는 없습니다. 

4. API를 변경합니다.

앱스플라이어 iOS SDK V6에서는 API 이름이 일부 변경되었습니다. 아래 표에서 SDK 이전 버전과 최신 버전의 API 이름을 참조하여 API 이름을 최신 버전으로 변경하십시오. 

V6 이전 API 이름 V6 이상 API 이름
AppsFlyerTracker AppsFlyerLib
disableIAdTracking disableCollectASA
trackAppLaunchWithCompletionHandler

startWithCompletionHandler

trackLocation

logLocation

trackAppLaunch

start

trackEvent

logEvent

disableAppleAdSupportTracking

disableAdvertisingIdentifier

validateAndTrackInAppPurchase

validateAndLogInAppPurchase

isStopTracking

isStopped

deviceTrackingDisabled/deviceLoggingDisabled

anonymizeUser

sharedTracker (Objective C) shared

5. 푸시 알림 연동을 확인합니다.

푸시 알림 연동이 이미 구현되어 있는 경우 다음 사항이 필요합니다.

푸시 알림 지침을 따라 handlePushNotificationData 메서드를 이용하여 푸시 알림이 연동되었음을 확인합니다. 

플러그인

다음과 같은 V6 플러그인이 지원됩니다.

Unity

앱 소유주와 앱 개발자는 앱스플라이어 Unity V6 플러그인으로 iOS 14을 지원할 수 있으며, 이 플러그인은 유니티 개발 플랫폼에서 개발된 안드로이드와 iOS 앱에 어트리뷰션과 이벤트 리포팅 기능을 제공합니다. 플러그인은 앱스플라이어 iOS 및 안드로이드 SDK와 기능적으로 동일합니다.

기존 버전에서 플러그인을 업데이트하시려면, 앱스플라이어 Unity 플러그인 V6 업데이트 가이드를 참조하십시오.

React Native

앱스플라이어 React Native 플러그인은 앱 소유주와 앱 개발자가 iOS 14에 대비하도록 지원하고 안드로이드와 iOS 앱에 어트리뷰션과 이벤트 리포팅 기능을 제공합니다. 플러그인은 앱스플라이어 iOS 및 안드로이드 SDK와 기능적으로 동일합니다.

플러그인 버전을 최신 버전으로 업데이트하려면 다음을 수행하십시오. 

  1. 기존 플러그인 버전을 제거하고 앱스플라이어 GitHub 가이드에 따라 최신 버전을 설치하십시오. 
  2. 필수 API 이름을 변경하거나 삭제하여 연동을 변경하십시오.

Segment

앱스플라이어 Segment 플러그인은 앱 소유주와 앱 개발자가 iOS 14에 대비하도록 지원하고 안드로이드와 iOS 앱에 어트리뷰션과 이벤트 리포팅 기능을 제공합니다. 플러그인은 앱스플라이어 iOS 및 안드로이드 SDK와 기능적으로 동일합니다.

기존 플러그인 버전을 업그레이드 하기 위해, 기존 버전을 삭제하고 앱스플라이어 GitHub 가이드에 따라 최신 버전을 설치하십시오.

Cordova

앱스플라이어 Cordova 플러그인은 앱 소유주와 앱 개발자가 iOS 14에 대비하도록 지원하며 안드로이드와 iOS 앱에 어트리뷰션과 이벤트 리포팅 기능을 제공합니다. 플러그인은 앱스플라이어 iOS 및 안드로이드 SDK와 기능적으로 동일합니다.

기존 플러그인 버전을 업그레이드 하기 위해, 기존 버전을 삭제하고 앱스플라이어 GitHub 가이드에 따라 최신 버전을 설치하십시오.

Flutter

앱스플라이어 Flutter 플러그인은 앱 소유주와 앱 개발자가 iOS 14에 대비하도록 지원하며 안드로이드와 iOS 앱에 어트리뷰션과 이벤트 리포팅 기능을 제공합니다. 플러그인은 앱스플라이어 iOS 및 안드로이드 SDK와 기능적으로 동일합니다.

플러그인 버전을 업데이트하려면, 기존 버전을 제거하고 V6 버전을 pubspec.yaml에 추가하십시오. 앱스플라이어 개발 가이드 pub.dev guide에 있는 안내사항을 따르십시오. 

Adobe AIR

앱스플라이어 Adobe AIR 플러그인은 앱 소유주와 앱 개발자가 iOS 14에 대비하도록 지원하며 안드로이드와 iOS 앱에 어트리뷰션과 이벤트 리포팅 기능을 제공합니다. 플러그인은 앱스플라이어 iOS 및 안드로이드 SDK와 기능적으로 동일합니다.

기존 플러그인 버전을 업그레이드 하기 위해, 기존 버전을 삭제하고 앱스플라이어 GitHub 가이드에 따라 최신 버전을 설치하십시오.