概要:既存のAppsFlyer iOS SDK/iOSのWrapper実装をSDK V6に更新してください。
iOS SDK V6 について
この記事の SDK V6 に関する参照事項です。
AppsFlyer iOS SDK V6:
- アプリ所有者と開発者は iOS 14のリリースに向けて準備することができます。
- IDFAの収集に関する許可をユーザーに提示するオプションを提供します。
- iOSモバイルアプリにアプリの計測とイベントレポート機能を提供します。
- 以前のバージョンから、重要な API メソッドの変更が含まれます。
For full information about the SDK V6, and to integrate it into a new app that does not have an earlier version of the AppsFlyer SDK, read our iOS SDK integration guide for marketers.
iOS SDK V6 への更新
iOS SDK V6 へ更新するには、以下の手順(1~5)を実行してください。
1. SDK バージョンを更新する
SDK V6 をダウンロードし、Xcode に追加します。
2. SDK V6 を実装する
次のコードを SDK初期化に追加します:
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
AppDelegate.swift 内で以下を追加します。
import UIKit
import AppTrackingTransparency
import AppsFlyerLib
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 1 - Get AppsFlyer preferences from .plist file
guard let propertiesPath = Bundle.main.path(forResource: "afdevkey_donotpush", ofType: "plist"),
let properties = NSDictionary(contentsOfFile: propertiesPath) as? [String:String] else {
fatalError("Cannot find `afdevkey_donotpush`")
}
guard let appsFlyerDevKey = properties["appsFlyerDevKey"],
let appleAppID = properties["appleAppID"] else {
fatalError("Cannot find `appsFlyerDevKey` or `appleAppID` key")
}
// 2 - Replace 'appsFlyerDevKey', `appleAppID` with your DevKey, Apple App ID
AppsFlyerLib.shared().appsFlyerDevKey = appsFlyerDevKey
AppsFlyerLib.shared().appleAppID = appleAppID
AppsFlyerLib.shared().delegate = self
// Set isDebug to true to see AppsFlyer debug logs
AppsFlyerLib.shared().isDebug = true
// iOS 10 or later
if #available(iOS 10, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { _, _ in }
application.registerForRemoteNotifications()
}
// iOS 9 support - Given for reference. This demo app supports iOS 13 and above
else {
UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
UIApplication.shared.registerForRemoteNotifications()
}
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Start the SDK (start the IDFA timeout set above, for iOS 14 or later)
AppsFlyerLib.shared().start()
}
// Open Univerasal Links
// For Swift version < 4.2 replace function signature with the commented out code
// func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { // this line for Swift < 4.2
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
return true
}
// Open Deeplinks
// Open URI-scheme for iOS 8 and below
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
AppsFlyerLib.shared().handleOpen(url, sourceApplication: sourceApplication, withAnnotation: annotation)
return true
}
// Open URI-scheme for iOS 9 and above
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
AppsFlyerLib.shared().handleOpen(url, options: options)
return true
}
// Report Push Notification attribution data for re-engagements
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
AppsFlyerLib.shared().handlePushNotification(userInfo)
}
}
extension AppDelegate: AppsFlyerLibDelegate {
// Handle Organic/Non-organic installation
func onConversionDataSuccess(_ data: [AnyHashable: Any]) {
print("onConversionDataSuccess data:")
for (key, value) in data {
print(key, ":", value)
}
if let status = data["af_status"] as? String {
if (status == "Non-organic") {
if let sourceID = data["media_source"],
let campaign = data["campaign"] {
print("This is a Non-Organic install. Media source: \(sourceID) Campaign: \(campaign)")
}
} else {
print("This is an organic install.")
}
if let is_first_launch = data["is_first_launch"] as? Bool,
is_first_launch {
print("First Launch")
} else {
print("Not First Launch")
}
}
}
func onConversionDataFail(_ error: Error) {
print("\(error)")
}
// Handle Deeplink
func onAppOpenAttribution(_ attributionData: [AnyHashable: Any]) {
//Handle Deep Link Data
print("onAppOpenAttribution data:")
for (key, value) in attributionData {
print(key, ":",value)
}
}
func onAppOpenAttributionFailure(_ error: Error) {
print("\(error)")
}
}
3. SKAdNetworkアトリビューションのサポート
SKAdNetwork は iOS で使用されるクラスで、広告主アプリのインストールを検証します。アプリのインストール検証プロセスには、ソースアプリと広告主アプリが関係します。
ソースアプリとは、アドネットワークによって署名された広告を表示している、広告掲載面としてのアプリです。広告を表示できるようにアプリを設定することは、AppsFlyer SDKのサポート範囲ではありません。 設定するには、iOSの手順に従ってください。
広告主のアプリを設定するために、AppsFlyer SKAdNetwork ソリューションは、SKAdNetwork を使用して、ユーザーのプライバシーを保護しながら、広告主とアドネットワークにLTV分析、レポート、ポストバックを提供します。アプリの初回起動時に、AppsFlyer プラットフォームは、マーケティング担当者が定義した設定に基づいて、どのように SKAdNetwork コンバージョン値を設定すべきかSDKに指示を出します。
SKAdNetwork ソリューション を使用するには :
- 開発者は何も対応の必要がありません。
-
AppsFlyer SDKは、必要なSKAdNetwork API、つまり
registerAppForAdNetworkAttribution()
とupdateConversionValue()
を自動的にコールするため、開発者はそれらをコールしないでください。 - AppsFlyer以外のSDKが、SKAdNetworkのAPIを呼び出すことを許可しないでください。許可してしまうと、iOS が AppsFlyerに対してポストバックを送信するのを遅らせたり、管理画面上で設定されたユーザーの質を測るデータをSKAdNetworkの管理画面に入力するために使用するコンバージョン値を変更してしまう可能性があります。
- 一方、マーケティング担当者はAppsFlyerの管理画面上でSKAdNetworkの計測設定を行う必要があります。
AppStoreにおいて、開発者、マーケティング担当者のどちらも、この他に何も特別なアクションや登録プロセスは必要ありません。
4. API を変更する
AppsFlyer iOS SDK V6には、いくつか API名の変更が含まれています。以下の表を参照し、以前の SDK バージョンの API名から現在の名前に変更してください。
API名(V6より前) | 現在のAPI名(V6移行) |
---|---|
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. プッシュ通知の実装を確認する
プッシュ通知がすでに実装されている場合は、以下が必要です。
Follow the push notification instructions to ensure you have push notifications integrated using the handlePushNotificationData method.
プラグイン
次のV6プラグインをご利用いただけます。
Unity
AppsFlyerの Unity V6 プラグイン は、アプリ所有者と開発者が iOS 14をサポートし、Unity 開発プラットフォームで開発された Android と iOS モバイルアプリにアプリ計測とイベントのレポートの機能を提供します。このプラグインは、AppsFlyerの iOS およびAndroid SDKと機能的に同等です。
プラグインを以前のバージョンから更新するには、Unity プラグイン V6への移行に関するガイドを参照してください。
- Unity plugin V4から移行する場合(古いプラグインの削除が必要です)
- Unity plugin V5から移行する場合(Unity パッケージの更新が必要です)
React Native
AppsFlyerの React Nativeプラグインは、アプリ所有者と開発者が iOS 14 に向けての準備を支援し、アプリ計測とイベントのレポートの機能を提供します。このプラグインは、AppsFlyerの iOS およびAndroid SDKと機能的に同等です。
以前のバージョンからプラグインを更新する方法:
- 以前のプラグインを削除し置き換えます。GitHub ガイドの手順に従ってください 。
- 必要なAPIの名前を変更、および削除して、実装コードを変更します。
Segment
AppsFlyerの Segmentプラグインは、アプリ所有者と開発者が iOS 14 に向けての準備を支援し、アプリ計測とイベントのレポートの機能を提供します。このプラグインは、AppsFlyerの iOS およびAndroid SDKと機能的に同等です。
プラグインを以前のバージョンから更新するには、以前のプラグインを削除して新しいものに置き換えてください。詳細はGithub ガイドをご覧ください。
Cordova
AppsFlyerのCordovaプラグインは、アプリ所有者と開発者が iOS 14 に向けての準備を支援し、アプリ計測とイベントのレポートの機能を提供します。このプラグインは、AppsFlyerの iOS およびAndroid SDKと機能的に同等です。
プラグインを以前のバージョンから更新するには、以前のプラグインを削除して新しいものに置き換えてください。詳細はGithub ガイドをご覧ください。
Flutter
AppsFlyerの Flutterプラグインは、アプリ所有者と開発者が iOS 14 に向けての準備を支援し、アプリ計測とイベントのレポートの機能を提供します。このプラグインは、AppsFlyerの iOS およびAndroid SDKと機能的に同等です。
以前のバージョンからプラグインを更新するには、以前のプラグインを削除し、 pubspec.yaml
に V6 版を追加します。pub.dev guideの手順に従ってください。
Adobe AIR
AppsFlyerの Adobe AIRプラグインは、アプリ所有者と開発者が iOS 14 に向けての準備を支援し、アプリ計測とイベントのレポートの機能を提供します。このプラグインは、AppsFlyerの iOS およびAndroid SDKと機能的に同等です。
プラグインを以前のバージョンから更新するには、以前のプラグインを削除して新しいものに置き換えてください。詳細はGithub ガイドをご覧ください。