对接SDK
了解如何初始化和启动iOS SDK。
推荐
Get started with our SDK integration wizard
- 在对接之前,必须安装SDK 。
- 本文档包含实施的示例。请确保更换以下内容:
<YOUR_DEV_KEY>
: The AppsFlyer dev key.<APPLE_APP_ID>
: The Apple App ID (without theid
prefix).- Additional placeholders, where needed.
初始化iOS SDK
步骤1:导入依赖项
导入 AppsFlyerLib
:
// AppDelegate.h
#import <AppsFlyerLib/AppsFlyerLib.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
// ...
}
步骤2:初始化SDK
In didFinishLaunchingWithOptions
configure your Apple App ID and AppsFlyer dev key:
[[AppsFlyerLib shared] setAppsFlyerDevKey:@"<YOUR_DEV_KEY>"];
[[AppsFlyerLib shared] setAppleAppID:@"<APPLE_APP_ID>"];
AppsFlyerLib.shared().appsFlyerDevKey = "<YOUR_DEV_KEY>"
AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"
启动iOS SDK
In applicationDidBecomeActive
, call start
:
[[AppsFlyerLib shared] start];
func applicationDidBecomeActive(_ application: UIApplication) {
AppsFlyerLib.shared().start()
// ...
}
Add SceneDelegate support
可选
Do the following only if you use SceneDelegate
s:
In didFinishLaunchingWithOptions
, add a UIApplicationDidBecomeActiveNotification
observer and set it to run start
:
@implementation AppDelegate
// SceneDelegate support - start AppsFlyer SDK
- (void)sendLaunch:(UIApplication *)application {
[[AppsFlyerLib shared] start];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
// SceneDelegate support
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(sendLaunch:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
// ...
return YES;
}
// ...
@end
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
// SceneDelegate support
NotificationCenter.default.addObserver(self, selector: NSSelectorFromString("sendLaunch"), name: UIApplicationdidBecomeActiveNotification, object: nil)
return true
}
// SceneDelegate support - start AppsFlyer SDK
@objc func sendLaunch() {
AppsFlyerLib.shared().start()
}
// ...
}
Start with completion handler
可选
To confirm that the SDK started successfully and notified the AppsFlyer servers, call start
with a completion handler. You can then apply logic to handle the success or failure of the SDK launch.
[[AppsFlyerLib shared] startWithCompletionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
if (error) {
NSLog(@"%@", error);
return;
}
if (dictionary) {
NSLog(@"%@", dictionary);
return;
}
}];
AppsFlyerLib.shared()?.start(completionHandler: { (dictionary, error) in
if (error != nil){
print(error ?? "")
return
} else {
print(dictionary ?? "")
return
}
})
完整示例
#import "AppDelegate.h"
#import <AppsFlyerLib/AppsFlyerLib.h>
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
// Start the AppsFlyer SDK
- (void)sendLaunch:(UIApplication *)application {
[[AppsFlyerLib shared] start];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/** APPSFLYER INIT **/
[AppsFlyerLib shared].appsFlyerDevKey = @"<YOUR_DEV_KEY>";
[AppsFlyerLib shared].appleAppID = @"<APPLE_APP_ID>";
/* Uncomment the following line to see AppsFlyer debug logs */
// [AppsFlyerLib shared].isDebug = true;
// SceneDelegate support
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(sendLaunch:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
if (@available(iOS 10, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
}
else {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
[[UIApplication sharedApplication] registerForRemoteNotifications];
return YES;
}
@end
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "<YOUR_DEV_KEY>"
AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"
/* Uncomment the following line to see AppsFlyer debug logs */
// AppsFlyerLib.shared().isDebug = true
// SceneDelegate support
NotificationCenter.default.addObserver(self, selector: NSSelectorFromString("sendLaunch"), name: UIApplication.didBecomeActiveNotification, object: nil)
return true
}
// SceneDelegate support
@objc func sendLaunch() {
AppsFlyerLib.shared().start()
}
// ...
}
Setting the Customer User ID
可选
The Customer User ID (CUID) is a unique user identifier created outside the SDK by the app owner. If made available to the SDK, it can be associated with installs and other in-app events. These CUID-tagged events can be cross-referenced with user data from other devices and applications.
Set the CUID
To set the CUID:
[AppsFlyerLib shared].customerUserID = @"my user id";
AppsFlyerLib.shared().customerUserID = "my user id"
注意
The Customer User ID must be set with every app launch.
Associate the CUID with the install event
If it’s important for you to associate the install event with the CUID, you should set to set the customerUserId
before calling the start
method. This is because start
sends the install event to AppsFlyer. If the CUID is set after calling start
, it will not be associated with the install event.
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Your custom logic of retrieving CUID
NSString *customUserId = [[NSUserDefaults standardUserDefaults] stringForKey:@"customerUserId"];
if (customUserId != nil && ![customUserId isEqual: @""]) {
// Set CUID in AppsFlyer SDK for this session
[AppsFlyerLib shared].customerUserID = customUserId;
// Start
[[AppsFlyerLib shared] start];
}
}
func applicationDidBecomeActive(_ application: UIApplication) {
// your logic to retrieve CUID
let customUserId = UserDefaults.standard.string(forKey: "customUserId")
if(customUserId != nil && customUserId != ""){
// Set CUID in AppsFlyer SDK for this session
AppsFlyerLib.shared().customerUserID = customUserId
AppsFlyerLib.shared().start() // Start
}
}
Log sessions
The SDK sends an af_app_opened
message whenever the app is opened or brought to the foreground, providing that start
is called in the didBecomeActive
lifecycle event method. Before the message is sent, the SDK makes sure that the time passed since sending the last message is not smaller than a predefined interval.
Setting the time interval between app launches
已设置 minTimeBetweenSessions
to the minimal time interval that must lapse between two af_app_opened
messages. The default interval is 5 seconds.
iOS 14支持
Following are guides on setting up support for iOS 14+ features.
Enabling App Tracking Transparency (ATT) support
Starting iOS 14.5, IDFA access is governed by the ATT framework.
Enabling ATT support in the SDK handles IDFA collection on devices with iOS 14.5
+ installed.
注意事项
Call
waitForATTUserAuthorization
only if you intend to callrequestTrackingAuthorization
somewhere in your app.
步骤1:设置 waitForATTUserAuthorization
When Initializing the SDK, before calling start
In applicationDidBecomeActive
, call waitForATTUserAuthorization
:
[[AppsFlyerLib shared] waitForATTUserAuthorizationWithTimeoutInterval:60];
AppsFlyerLib.shared().waitForATTUserAuthorization(timeoutInterval: 60)
已设置 timeoutInterval
as such that app users have enough time to see and engage with the ATT prompt. A few examples:
- 如果应用程序启动时显示ATT提示–60秒的间隔应该足够了
- 如果ATT提示是在一个大约需要2分钟才能完成的教程之后显示的–120秒的间隔应该足够了。
步骤2:调用 requestTrackingAuthorization
Call requestTrackingAuthorization
where you wish to display the prompt:
- (void)didBecomeActiveNotification {
// start is usually called here:
// [[AppsFlyerLib shared] start];
if @available(iOS 14, *) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
NSLog(@"Status: %lu", (unsigned long)status);
}];
}
}
@objc func didBecomeActiveNotification() {
// start is usually called here:
// AppsFlyerLib.shared().start()
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { (status) in
switch status {
case .denied:
print("AuthorizationSatus is denied")
case .notDetermined:
print("AuthorizationSatus is notDetermined")
case .restricted:
print("AuthorizationSatus is restricted")
case .authorized:
print("AuthorizationSatus is authorized")
@unknown default:
fatalError("Invalid authorization status")
}
}
}
}
注意
- You need to import the
AppTrackingTransparency
framework to callrequestTrackingAuthorization
.- According to Apple documentation:
requestTrackingAuthorization
is invoked only if the app is in theUIApplicationStateActive
state.requestTrackingAuthorization
can't be invoked from App Extensions.
Customizing the ATT consent dialog
The ATT consent dialog can be customized by modifying your Xcode project's info.plist
:
详细说明请参见Apple的文档。
Attributing App Clips
Apple App Clips attribution was introduced in iOS SDK V6.0.8
. See our App Clips integration guide for detailed instructions.
Sending SKAN postback copies to AppsFlyer
iOS 15
Configure your app to send postback copies to AppsFlyer.
请按以下步骤注册AppsFlyer端点:
- Add the
NSAdvertisingAttributionReportEndpoint
key to your app'sinfo.plist
. - Set the key's value to
https://appsflyer-skadnetwork.com/
.
According to Apple, you can set only one endpoint. Copies of received postbacks are available in the postbacks copy report.
启用调试模式
You can enable debug logs by setting isDebug to true
:
[AppsFlyerLib shared].isDebug = true;
AppsFlyerLib.shared().isDebug = true
注意
To see full debug logs, make sure to set
isDebug
before invoking other SDK methods.See example.
警告
To avoid leaking sensitive information, make sure debug logs are disabled before distributing the app.
测试对接
For detailed integration testing instructions, see the iOS SDK integration testing guide.
已更新 2 months ago