AppsFlyer SDK 对接 - iOS

  • 广告商
  • 开发商

ios.pngSDK版本: 4.9.0 (发布说明)

1. 概述

本指南详细说明了如何将 AppsFlyer SDK 嵌入到您的 iOS 应用中。您可以跟踪安装、会话和其他应用内事件(包括应用内购买、达到的游戏关卡级别等),从而评估 ROI 和了解用户使用应用的频次。AppsFlyer SDK 完全兼容 Apple 的 IPv6 DNS64/NAT64 网络。

 注意

AppsFlyer SDK 完全兼容 Apple 的 IPv6 DNS64/NAT64 网络。如需了解更多信息,请单击此处

 重要信息!

AppsFlyer SDK 使用 NSUserDefaults 类。清除 NSUserDefaults 中的所有数值可能会导致归因出现问题。

 提示

  • 章节2和3是强制性的,从而实现最基本 SDK 集成,即安装归因
  • 追踪应用内事件章节是强烈推荐进行实施的
  • 所描述的其余功能是可选的实现, 但其中一些功能可能是你所必需的, 具体取决于你的应用的业务逻辑。例如, 跟踪收入或在首次启动时获取转化数据可能对你的应用的流程至关重要

2. 快速入门

2.1 下载并将 AppsFlyer SDK 添加到 Xcode

CocoaPodsCarthageStatic FrameworkStatic Lib
  • 确保您已经下载并安装了最新版本的 CocoaPods
  • 将下面一行代码添加到您的 Podfile 中:
    pod 'AppsFlyerFramework'
  • 运行 pod install
  • 确保使用 .xcworkspace文件打开 Xcode 中的项目,而不是使用 .xcodeproj文件打开,从此处继续。

AppsFlyer SDK 使用下列本地框架:

AdSupport.framework
必须要有此框架才能从设备中收集 IDFA。
没有 IDFA 就无法追踪 Facebook Ads、Twitter、 Google ads 以及其他平台的广告。
iAd.framework
需要使用此框架在应用中追踪 Apple Search Ads

2.2 在 App Delegate 中配置对接

打开应用的 AppDelegate.m 文件,并导入 AppsFlyer SDK:

SwiftObjective-C
导入 AppsFlyerLib

3. SDK 初始化

使用从 iTunes Connect获得的 app ID 和您的AppsFlyer开发者密钥,通过didFinishLaunchingWithOptions 的方法初始化 SDK。

注:您需用纯数字在此设置应用 ID,不含“id”前缀。

SwiftObjective-C
AppsFlyerTracker.shared().appsFlyerDevKey = "<your-appsflyer-dev-key>";
AppsFlyerTracker.shared().appleAppID = "123456789"
AppsFlyerTracker.shared().delegate = self
#if DEBUG AppsFlyerTracker.shared().isDebug = true
#endif

 注意

如果设置了 isDebug=true,xCode 控制台会打印出AppsFlyer SDK 的日志

 

  • applicationDidBecomeActive 函数中添加下列代码:
SwiftObjective-C
func applicationDidBecomeActive(application: UIApplication) { 
// Track Installs, updates & sessions(app opens) (You must include this API to enable tracking) 
AppsFlyerTracker.shared().trackAppLaunch() 
// your other code here.... }

4. 追踪应用内事件

应用内事件能够为您提供应用内所发生情况的深入分析。建议您花一点时间定义希望监测的事件,以追踪投资回报率 (ROI) 和用户生命周期价值 (LTV)。

追踪应用内事件是通过调用 trackEvent,将事件名称和数值参数传递过去来进行的。请参阅应用内事件,了解更多详细信息。

应用内事件名称长度不超过 45 个字符。超过 45 个字符的事件名称不会出现在 Dash Board 中,只会出现在原始数据、Pull API 和 Push API 中。

示例: 在应用内购买事件

SwiftObjective-C
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
  withValues: [
     AFEventParamRevenue: "1200",
     AFEventParamContent: "shoes",
     AFEventParamContentId: "123"
]);

这将生成一个 af_purchase 事件类型 (使用 AFEventPurchase 常量) 并带有以下事件值: {af_revenue: 200 , af_currency: "USD", af_quantity: 2, af_content_id: "092" af_receipt_id: "9277"}

 注意

从 iOS SDK 4.8.1 版起,AppsFlyer 支持应用内事件或任何其他 SDK API 使用非英语字符。

对于收入, 不要添加任何货币符号, 因为这些符号是不被识别的。

 使用示例

SwiftObjective C
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
withValues: [
  AFEventParamRevenue: @1200,
  AFEventParamCurrency : @"JPY"
]); 

5. 追踪深度链接

 提示

我们强烈建议您将深度链接对接到您的应用中。 深度链接是访客找回营销活动的重要组成部分,强烈建议您在开展访客找回营销活动时使用这一功能。

需要 iOS9 和更高版本才支持 Universal Links。了解更多详细信息,请单击此处


若要处理深度链接, 请在应用 (在应用代表级) 中添加以下代码。此代码中的方法允许您获取深度链接数据。通过深度链接数据, 您可以将用户引导到相关的应用活动, 并为他们提供相关内容。

SwiftObjective-C

 func onConversionDataReceived(_ installData: [AnyHashable: Any]) {
  //Handle Conversion Data (Deferred Deep Link)
  }
  
  func onConversionDataRequestFailure(_ error: Error?) {
    //    print("\(error)")
  }
  
  func onAppOpenAttribution(_ attributionData: [AnyHashable: Any]) {
    //Handle Deep Link Data
    
  }
  
  func onAppOpenAttributionFailure(_ error: Error?) {
  }
// Reports app open from a Universal Link for iOS 9 or later
  func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    AppsFlyerTracker.shared().continue(userActivity, restorationHandler: restorationHandler)
    return true
  }

  // Reports app open from deep link from apps which do not support Universal Links (Twitter) and for iOS8 and below
  func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    AppsFlyerTracker.shared().handleOpen(url, sourceApplication: sourceApplication, withAnnotation: annotation)
    return true
  }

  // Reports app open from deep link for iOS 10 or later
  func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    AppsFlyerTracker.shared().handleOpen(url, options: options)
    return true
  }
  

 重要信息!

对于 Swift 4.2 以及更高版本, 请对 continue userActivity 方法使用以下代码:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
	AppsFlyerTracker.shared().continue(userActivity, restorationHandler: nil)
	return true
}

6. 追踪收入

使用 af_revenue (AFEventParamRevenue) 事件参数来统计应用内事件的收入。您可以输入任意正负数值。

 注意

AFEventParamRevenue (即使用 af_revenue) 是在原始数据和主面板上 AppsFlyer 唯一计算为真实收入的事件参数。了解更多详细信息,请点击此处


示例:收入应用内事件

SwiftObjective-C
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,withValues: [
        AFEventParamContentId:"1234567",
        AFEventParamContentType : "category_a",
        AFEventParamRevenue: 1.99,
        AFEventParamCurrency:"USD"
    ]);

 重要信息!

不要给收入值设置任何格式。它不应包含逗号分隔符、货币符号或文本。例如,收入事件应类似于 1234.56。

追踪负收入

如果您需要跟踪负收入, 例如当用户取消购买或获得退款时, 您可以发送负收入。

SwiftObjective-C
AppsFlyerTracker.shared().trackEvent("cancel_purchase", 
withValues: [
	AFEventParamContentId:"1234567",
	AFEventParamContentType : "category_a",
	AFEventParamRevenue: -1.99,
	AFEventParamCurrency:"USD"
]);

 注意

请注意上面代码中的以下内容:

  1. 收入值前面有一个减号
  2. 事件名称具有 "cancel_purchase" 的唯一值-允许您在主面板和原始数据报告中识别负收入事件

7. 获取转化数据

AppsFlyer 令您可以直接在 SDK 级别上实时访问每次新安装的用户归因数据。这样,您就可以为用户提供个性化内容或将内容发送到应用内的特定活动,这样可以大大增强与应用的互动。

了解该高级功能的更多信息,请点击此处

8. 用户标示符

获取用户标识符有多种方法:

获取 AppsFlyer Device ID

每次安装App都会创建一个 AppsFlyer 独有的 device ID。您可以使用下列代码获得它

SwiftObjective-C
let appsflyerId = AppsFlyerTracker.shared().getAppsFlyerUID()

设置客户用户 ID

设置您自己的customer user ID 可以帮助您将自己定义的 customer user ID 关联到 AppsFlyer 的独有 ID 和其他设备的 ID。该 ID 会出现在 AppsFlyer的CSV 报告和postback 中,用于与您的内部 ID 关联。

设置您的 Customer User ID:

SwiftObjective-C
AppsFlyerTracker.shared().customerUserID= "my user id"

 重要事项

建议尽快设置 客户用户 ID,因为它只能与完成设置之后上报的事件相关联。如果 setCustomerUserId 在调用 trackAppLaunch之前被调用了, 则在安装和事件的原始导出中就可以看到客户用户 ID。如果在之后设置, 则在调用此方法后, 仅显示跟踪的事件的值。

客户用户 ID 还可用于完成与 "分析平台" (如 Mixpanel 和 Swrve) 的集成。

获取客户用户 ID

要获取客户用户 ID, 请从 sharedTracker 索该。

[AppsFlyerTracker sharedTracker].customerUserID

 重要信息!

在调用 trackAppLaunch</code.之前,请确保在每次启动应用时都设置客户用户ID。

了解客户用户 ID 的更多信息,请点击此处

IDFA 和 IDFV

如果 AdSupport.framework 包含在应用中,则 AppsFlyer 会自动收集 IDFA (广告主 ID) 和 IDFV (厂商 ID)。

9. 可选功能

监测卸载

为了监测卸载, 请在应用上启用远程推送通知。请参阅 Apple 的远程通知编程指南,了解更多详细信息。

按照iOS SDK 集成指导说明来完成卸载监测功能的配置。

追踪推送通知

要启用通过推送通知追踪应用启动,需要在 App Delegate 中添加下列代码:

SwiftObjective-C
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
	AppsFlyerTracker.shared().handlePushNotification(userInfo)
}

推送消息应包含 AppsFlyer 追踪参数的 af 参数。

消息示例:

{
  "aps":{
   "alert":"Push text",
   "sound":"default",
   "category":"REMINDER_CATEGORY"
  },
  "_p":123456,
  "payloadKey":"payloadValue",
  "af":{
   "pid":"swrve_int",
   "is_retargeting":"true",
   "c":"test_campaign"
  }
}

交叉促销追踪

AppsFlyer 允许您追踪并归因从您的某个应用(用户的现有应用)的交叉促销发起的安装。交叉促销应用可以带来更多的新用户安装。

有关详细信息,请参阅交叉促销追踪文章,这里

用户邀请追踪

AppsFlyer 允许您追踪并归因从您应用里的用户邀请并导致的安装。允许您现有的用户邀请朋友或联系人成为您应用的新用户,这可以成为应用的一个关键增长因素。

 
有关详细信息,请参阅用户邀请追踪文章,这里

设置货币代码 

除了随着应用内事件发送到 AppsFlyer 的指定货币代码外,您还可以使用下面的 API 来设置全球货币代码。当AFEventParamCurrency 没有随应用内事件发送时,全球货币代码将被使用。

默认值为 USD。您可以在这里找到可用的 ISO 货币代码。

使用以下 API 设置货币代码:

public void setCurrencyCode(String currencyCode);

使用示例:

SwiftObjective-C
AppsFlyerTracker.shared().currencyCode= "USD"

应用内购买验证

 注意

该函数支持 iOS7 和更高版本。

AppsFlyer SDK 可以提供应用内购买的服务器验证。要设置收据验证追踪,您需要在 SKStoreKit 的 completeTransaction: 回调内调用 validateAndTrackInAppPurchase 方法。此调用将自动生成一个 af_purchase 应用内事件。

- (void) validateAndTrackInAppPurchase:(NSString *) productIdentifier
price:(NSString *) price
currency:(NSString *) currency
transactionId:(NSString *) tranactionId
additionalParameters:(NSDictionary *) params
success:(void (^)(NSDictionary *response)) successBlock
failure:(void (^)(NSError *error, id reponse)) failedBlock;

 注意

价格参数应包含与已验证的购买事件关联的总收入。


此调用有两个回调模块,一个用于“成功”,另一个用于“失败”(出于任何原因,包括验证失败)。成功后, 将返回一份典目, 其中包含 Apple 服务器提供的收据验证数据。

 重要

出于测试目的, 我们建议将useReceiptValidationSandbox标志设置为 "YES", 因为这会将请求重定向到 Apple 沙盒服务器。

#ifdef DEBUG
[AppsFlyerTracker sharedTracker].useReceiptValidationSandbox = YES;
#endif

 

 示例

Objective-CSwift
[[AppsFlyerTracker sharedTracker] validateAndTrackInAppPurchase:@"ProductIdentifier" price:@"price"
    currency:@"USD"
    transactionId:@"transactionID"
    additionalParameters:@{@"test": @"val" , @"test1" : @"val 1"}
    success:^(NSDictionary *result){
      NSLog(@"Purchase succeeded And verified!!! response: %@", result[@"receipt"]);
    } failure:^(NSError *error, id response) {
      NSLog(@"response = %@", response);
      if([response isKindOfClass:[NSDictionary class]]) {
        if([response[@"status"] isEqualToString:@"in_app_arr_empty"]){
          // retry with 'SKReceiptRefreshRequest' because
          // Apple has returned an empty response
          // <YOUR CODE HERE>
        }

      } else {
        //handle other errors
        return;
      }
  }];

 重要信息!

当 AppsFlyer 针对 Apple 服务器验证购买时,如果响应包含一个空的 应用内 列阵, AppsFlyer将返回 {"status":"in_app_arr_empty"} 信息到错误回调。

如果您收到此标志, 则必须通过发送收据刷新请求来恢复 Apple 购买的产品。有关详细信息 请参阅 Apple 的文档.

刷新数据后, 再次调用 validateAndTrackInAppPurchase

请参阅上面的代码, 了解如何处理此错误。

有关验证收据的可能回报值的列表, 请参阅此处的 apple 文档。

匿名

AppsFlyer 为您提供在 AppsFlyer 分析中匿名特定用户标示符的方法。该方法符合最新的隐私要求并遵守 Facebook 数据和隐私政策。默认为 NO,表示默认未进行匿名。

在 SDK 初始化过程中,使用该 API 明确匿名用户安装、事件和互动:

SwiftObjective-C
AppsFlyerTracker.shared().deviceTrackingDisabled= true

可以通过再次调用 deviceTrackingDisabled,并设置为 false,重新启动追踪。

 警告

对用户匿名会严重影响您的归因信息。
只在法律要求您不得收集用户信息的地区使用此选项。

自定义会话间的时间

默认情况下,在2次应用启动之间必须至少间隔 5秒,才能将其计为2次独立的应用启动 (更多有关应用启动计数的信息)。
但是,您可以使用以下 API自定义两次应用启动之间所需的最小时间:

SwiftObjective-C
AppsFlyerTracker.shared().minTimeBetweenSessions= <your_custom_time_in_seconds>

请注意,两次启动之间的自定义时间值设置偏高的话,可能会严重影API,即依赖于会话数据的,如深层链接等。

面向实用应用的后台会话

在 iOS 中不可用。
 

iOS 应用扩展和 WatchKit

应用扩展需要使用互联网的权限:

  1. 打开应用扩展的 info.plist文件
  2. NSExtension/NSExtensionAttributes 中,将 RequestsOpenAccess 标志设置为 YES。

将下列代码添加到应用扩展的 UIViewController viewDidLoad:

SwiftObjective-C
override func viewDidLoad() {  
    super.viewDidLoad()
    AppsFlyerTracker.shared().appsFlyerDevKey = "MY_APPSFLYER_KEY"

    // MY_APP_ID below stands for you app ID on iTunes Connect. Should be 9 or 10 digits.
    AppsFlyerTracker.shared().appleAppID = "MY_APP_ID"
        
    AppsFlyerTracker.sharedTracker().trackAppLaunch()
  }

要在应用扩展上接收归因数据,按照此处的说明进行,并在应用的 UIViewController 而非 AppDelegate 上进行实施。

退出

在某些极端情况下,您可能出于法律和隐私合规方面的考虑,希望关闭所有 SDK 追踪。这可以通过 isStopTracking API 来实现。一旦调用此 API, 我们的 SDK 将不再与我们的服务器通信并停止运行。

有几种不同的方案为用户选择退出。我们强烈建议您遵循与你的应用相关的方案的确切说明

 警告

仅在您完全不想追踪该用户时,使用该 API。使用此 API 将严重影响您的归因、数据收集以及 深度链接 机制。

SwiftObjective-C
AppsFlyerTracker.shared().isStopTracking= true

 重要

如果 isStopTracking 设置为 true, 请不要调用 trackAppLaunch

收集设备名称

AppsFlyer SDK 允许您收集设备名称以作内部分析之用。此项功能默认是关闭的。使用以下 API 开启此项功能:

SwiftObjective-C
AppsFlyerTracker.shared().shouldCollectDeviceName = false

 重要

在某些地区,设备名称可能也属于个人数据。仅在您了解法律允许并已明确获得用户同意的情况下,才能收集该信息。

设置其他自定义数据

setAdditionalData API 需要在 SDK 级别与若干外部合作伙伴平台对接,包括 SegmentAdobe 和 Urban Airship。仅在平台对接文章明确说明需要 setAdditionalData API 时,才使用该 API。
以下为在 iOS 上为 Objective-C 或 Swift 实施 setAdditionalData 的代码示例

Objective-CSwift
NSDictionary* CustomDataMap = [[NSDictionary alloc] initWithObjectsAndKeys:@"value_of_param_1", @"custom_param_1", nil];
  
[[AppsFlyerTracker sharedTracker] setAdditionalData:CustomDataMap];

解决已包装的深度链接 URL

如果您使用的是支持 Universal Links 的 Oneclink, 并使用第三方通用链接将其包装在一起, 则可以使用setResolveDeepLinkURLs API 通知 AppsFlyer SDK, 该 SDK 唤起应用的点击域应被其解析, 并从中提取出底层的 OneLink。这将允许您在将 OneLink 与第三方通用链接包装时保持深度链接和跟踪。 请确保在 SDK 初始化之前调用此 API。

Objective-CSwift
[AppsFlyerTracker sharedTracker].resolveDeepLinkURLs = @[@"example.com",@"click.example.com"];

10. 测试您的对接

了解如何测试您的对接的详细信息,请单击此处

现在, 您可以开始跟踪与您合作的媒体平台

11. 将应用提交到应用商店

您可以在此处找到将应用提交到应用商店的说明。

这篇文章有帮助吗?
15 人中有 9 人觉得有帮助

评论

0 条评论

登录写评论。

页面内容: