Khái quát: Tích hợp SDK AppsFlyer vào ứng dụng iOS để đo lường lượt cài đặt, sự kiện trong ứng dụng, nguồn truyền thông, v.v.
Ghi chú phát hành (lên đến phiên bản V6.2.4)
Lưu ý
- SDK iOS V5.4.4 tương thích hoàn toàn với iOS 14. Tuy nhiên, chúng tôi đề nghị bạn nên sử dụng SDK V6.X để đảm bảo khả năng tương thích với các bản phát hành iOS trong tương lai. Xem Cập nhật lên SDK iOS V6.
- Tính năng phân bổ Apple App Clips khả dụng từ SDK V6.0.8. Tìm hiểu mọi thông tin về App Clips trong Hướng dẫn Toàn tập về App Clips dành cho Nhà phát triển của chúng tôi.
- Theo Apple, việc thực thi Minh bạch về Theo dõi Ứng dụng (ATT) được lên kế hoạch để bắt đầu với iOS 14.5 (đầu mùa xuân năm 2021). Tìm hiểu cách cấu hình SDK iOS để hỗ trợ ATT.
1. Tổng quan
SDK cung cấp chức năng cài đặt ứng dụng và ghi nhận sự kiện. SDK mạnh mẽ, an toàn, nhẹ và dễ nhúng.
Bạn có thể ghi nhận các lượt cài đặt, cập nhật, phiên và sự kiện trong ứng dụng. Sự kiện trong ứng dụng hỗ trợ mua hàng trong ứng dụng, cấp độ trò chơi, v.v. để đánh giá ROI và chất lượng người dùng.
Phiên bản iOS | Các mô hình phân bổ được hỗ trợ |
---|---|
8–11.3 |
|
11.3–13 |
|
14+ |
|
* Từ SDK iOS V5.4 trở xuống:
|
1.1 Tích hợp SDK—những việc cần thực hiện
Tab | Mục đích | Kết quả |
---|---|---|
Tích hợp SDK |
Hướng dẫn cách thêm và cấu hình SDK. |
|
API lõi |
Tìm hiểu về cách sử dụng API lõi SDK:
|
Các sự kiện trong ứng dụng và doanh thu xuất hiện trên bảng điều khiển của bạn. Bạn có thể thực hiện liên kết sâu. |
Tìm hiểu cách sử dụng các API bổ sung:
|
Bạn có thể đo lường lượt gỡ cài đặt, lượt giới thiệu, mức độ tương tác của người dùng bằng thông báo đẩy, xử lý các tình huống về quyền riêng tư của người dùng, v.v. |
|
Tham chiếu các phương thức SDK dành cho nhà phát triển |
|
1.2 Khả năng tương thích SDK
SDK iOS của AppsFlyer tương thích với các nền tảng sau:
- iOS
8
+ (iPhone, iPod, iPad) - tvOS
9
+ (Apple TV) - Phù hợp với mạng IPv6 DNS64/NAT64 của Apple
Tab này giải thích cách triển khai và khởi tạo SDK và được viết cho bạn, nhà phát triển ứng dụng. Sau khi hoàn thành tab này, bạn sẽ thấy hai lượt cài đặt trong bảng điều khiển ứng dụng, một lượt cài đặt tự nhiên và một lượt không tự nhiên.
2. Thêm SDK vào ứng dụng của bạn
2.1 Tải xuống và thêm SDK vào Xcode
- Tải về và cài đặt phiên bản CocoaPods mới nhất.
- Thêm hàng sau vào
Podfile
:
pod 'AppsFlyerFramework'
- Chạy
pod install
. - Sử dụng tệp tin
.xcworkspace
để mở dự án trong Xcode, thay vì sử dụng tệp tin.xcodeproj
từ thời điểm này trở đi.
Lưu ý
Nếu bạn đang phát triển ứng dụng tvOS, CocoaPods sẽ tự động thêm các phần phụ thuộc có liên quan từ AppsFlyerFramework.
- Cài đặt phiên bản Carthage mới nhất.
- Thêm dòng dưới đây vào nhị phân Cartfile của bạn:
https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerFramework/master/Carthage/appsflyer-ios.json
Lưu ý
Liên kết ở trên liên kết đến một thư viện tĩnh. Nếu bạn đang nâng cấp lên phiên bản iOS mới hơn, hãy thực hiện như sau:
- Xóa vùng hiển thị Chạy Tập lệnh khỏi Xcode chạy các khung sao chép.
- Hãy chắc chắn rằng thư viện không được nhúng.
Để tìm hiểu thêm, hãy xem tài liệu về Carthage.
Hiện không hỗ trợ các ứng dụng tvOS.
-
Tải về iOS SDK dưới dạng một khung tĩnh.
Để xác minh tính toàn vẹn của khung tĩnh SDK tải về, hãy nhấp vào đây. - Giải nén tệp tin AppsFlyerLib.framework.zip bạn vừa tải về
- Kéo AppsFlyerLib.framework và thả vào dự án Xcode của bạn
- Đảm bảo đánh dấu chọn vào Copy items if needed (Sao chép mục nếu cần thiết).
Lưu ý
Cách này chỉ tương thích với iOS 8 trở lên.
Đối với các ứng dụng tvOS, bạn cần một AppsFlyerFramework khác:
- Sao chép kho lưu trữ này.
- Tìm AppsFlyerLib.framework trong thư mục của kho lưu trữ được sao chép này.
- Lặp lại bước 3 và 4.
2.2 Các phần phụ thuộc khung iOS gốc
SDK này tự động thêm và sử dụng các khung gốc sau:
- AdSupport.framework
- Khung này là bắt buộc để thu thập IDFA từ các thiết bị.
Nếu không có IDFA, bạn không thể theo dõi quảng cáo Facebook, Twitter, quảng cáo của Google và các mạng khác. - iAd.framework
- Đo lường hiệu suất của Apple Search Ads trong ứng dụng của bạn.
- Khung AdServices (
V6.1.3+
) - Đo lường hiệu suất của Apple Search Ads trong ứng dụng của bạn.
Nếu bạn muốn xóa các khung này và tắt chức năng thu thập IDFA:
- Tắt thu thập IDFA
- Tắt iAd.framework
SDK chế độ nghiêm ngặt
Sử dụng bộ công cụ phát triển phần mềm (SDK) chế độ nghiêm ngặt để xóa hoàn toàn chức năng thu thập Mã khung hỗ trợ quảng cáo (IDFA) và các phần phụ thuộc của khung AdSupport (ví dụ: khi phát triển ứng dụng cho trẻ em).
Lưu ý: IDFV vẫn có sẵn.
Trong Podfile
của bạn, thay thế phần phụ thuộc AppsFlyerLib
bằng:
pod 'AppsFlyerFramework/Strict','6.2.3'
Lưu ý: Nếu bạn sử dụng SDK chế độ nghiêm ngặt và gọi ra disableAdvertisingIdentifier
, bạn sẽ nhận được lỗi biên dịch.
Lưu ý
Nếu bạn đang sử dụng phiên bản SDK cũ hơn 4.10.4, bạn sẽ cần thêm các khung hỗ trợ quảng cáo theo cách thủ công.
Để thêm khung hỗ trợ quảng cáo theo cách thủ công:
- Trong dự án Xcode của bạn, hãy chọn mục tiêu của dự án.
- Chọn tab General cho mục tiêu của bạn.
- Mở rộng phần Linked Frameworks and Libraries (Khung và Thư viện được liên kết).
- Nhấp vào + để thêm khung.
- Tìm kiếm AdSupport.framework
- Chọn AdSupport.framework từ danh sách.
Lặp lại quy trình cho iAd.framework.
3. Triển khai và khởi tạo SDK
Phần này mô tả cách khởi tạo và khởi động SDK của AppsFlyer trên nền tảng iOS.
3.1 Lấy dev key AppsFlyer của bạn
AppsFlyer sử dụng dev key để xác định duy nhất tài khoản của bạn. Dev key là bắt buộc vì mã này cho phép SDK gửi và truy xuất dữ liệu thuộc tài khoản của bạn một cách an toàn.
Để lấy khóa SDK:
- Trong AppsFlyer, đi đến Configuration (Cấu hình) > App Settings (Cài đặt Ứng dụng).
- Hãy sao chép dev key của bạn, bạn sẽ cần dev key này cho bước tiếp theo.
3.2 Khởi tạo SDK
Lưu ý
Để hỗ trợ các ứng dụng iOS sử dụng SceneDelegate
, hãy xem Khởi tạo SDK bằng SceneDelegate.
Đoạn mã sau là một ví dụ thực hiện. Đảm bảo thay đổi phần giữ chỗ <AF_DEV_KEY>
và <APPLE_APP_ID>
nếu cần.
Trong tệp tin AppDelegate.h
:
- Nhập tiêu đề
AppsFlyerLib/AppsFlyerLib.h
. - Thêm
AppsFlyerLibDelegate
vào phần khai báo giao diệnAppDelegate
.
#import <UIKit/UIKit.h>
#import <AppsFlyerLib/AppsFlyerLib.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerLibDelegate>
@end
Trong tệp tin AppDelegate.m
:
- Trong
didFinishLaunchingWithOptions
, định cấu hình:- Dev key AppsFlyer mà bạn đã sao chép ở bước trước
- ID ứng dụng trên nền tảng Apple
- Để thu thập IDFA, hãy cấu hình hỗ trợ Minh bạch về Theo dõi Ứng dụng (ATT).
- Cài đặt bổ sung
- Ghi đè lệnh gọi lại
onConversionDataSuccess
vàonConversionDataFail
để xử lý lượt chuyển đổi và bật deferred deep linking. - Ghi đè lệnh gọi lại
onAppOpenAttribution
vàonAppOpenAttributionFailure
để xử lý phân bổ và cho phép liên kết sâu trực tiếp. - Trong lệnh gọi lại
didReceiveRemoteNotification
, gọi rahandlePushNotification
để phân bổ các lần thu hút lại thông báo đẩy. - Trong lệnh gọi lại
applicationDidBecomeActive
, gọi rastart
.
#import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/** APPSFLYER INIT **/
[AppsFlyerLib shared].appsFlyerDevKey = @"<AF_DEV_KEY>";
[AppsFlyerLib shared].appleAppID = @"<APPLE_APP_ID>";
[AppsFlyerLib shared].delegate = self;
/* Set isDebug to true to see AppsFlyer debug logs */
[AppsFlyerLib shared].isDebug = true;
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;
}
- (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 non-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);
}
@end
Trong tệp tin AppDelegate.swift
:
- Nhập
AppsFlyerLib
- thêm
AppsFlyerLibDelegate
vào phần khai báo lớpAppDelegate
. - Trong
didFinishLaunchingWithOptions
, định cấu hình:- Dev key AppsFlyer
- ID ứng dụng
- Để thu thập IDFA, hãy cấu hình hỗ trợ Minh bạch về Theo dõi Ứng dụng (ATT).
- Cài đặt bổ sung
- Ghi đè lệnh gọi lại
onConversionDataSuccess
vàonConversionDataFail
để xử lý lượt chuyển đổi và bật deferred deep linking. - Ghi đè lệnh gọi lại
onAppOpenAttribution
vàonAppOpenAttributionFailure
để xử lý phân bổ và cho phép liên kết sâu trực tiếp. - Trong lệnh gọi lại
didReceiveRemoteNotification
, gọi rahandlePushNotification
để phân bổ các lần thu hút lại thông báo đẩy. - Trong lệnh gọi lại
applicationDidBecomeActive
, gọi rastart
.
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let defaults = UserDefaults.standard
//MARK: LifeCycle
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "<AF_DEV_KEY>"
AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"
AppsFlyerLib.shared().delegate = self
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 {
application.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
application.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 {
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
print(" user info \(userInfo)")
AppsFlyerLib.shared().handlePushNotification(userInfo)
}
// Open Deeplinks
// Open URI-scheme for iOS 8 and below
private func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: restorationHandler)
return true
}
// Open URI-scheme for iOS 9 and above
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
AppsFlyerLib.shared().handleOpen(url, sourceApplication: sourceApplication, withAnnotation: annotation)
return true
}
// Report Push Notification attribution data for re-engagements
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
AppsFlyerLib.shared().handleOpen(url, options: options)
return true
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
AppsFlyerLib.shared().handlePushNotification(userInfo)
}
// Reports app open from deep link for iOS 10 or later
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
return true
}
}
//MARK: AppsFlyerLibDelegate
extension AppDelegate: AppsFlyerLibDelegate{
// Handle Organic/Non-organic installation
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
print("onConversionDataSuccess data:")
for (key, value) in installData {
print(key, ":", value)
}
if let status = installData["af_status"] as? String {
if (status == "Non-organic") {
if let sourceID = installData["media_source"],
let campaign = installData["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 = installData["is_first_launch"] as? Bool,
is_first_launch {
print("First Launch")
} else {
print("Not First Launch")
}
}
}
func onConversionDataFail(_ error: Error) {
print(error)
}
//Handle Deep Link
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.2.1 Khởi tạo SDK với SceneDelegate
Chỉ sử dụng phương thức khởi tạo này nếu bạn đang sử dụng SceneDelegate
.
Vì applicationDidBecomeActive
không được gọi ra khi sử dụng SceneDelegate
nên hãy sử dụng giải pháp thay thế UIApplicationDidBecomeActiveNotification
để khởi chạy SDK, như được minh họa trong ví dụ sau.
Đoạn mã sau là một ví dụ thực hiện. Đảm bảo thay đổi phần giữ chỗ <AF_DEV_KEY>
và <APPLE_APP_ID>
nếu cần.
Trong tệp tin AppDelegate.h
:
- Nhập tiêu đề
AppsFlyerLib/AppsFlyerLib.h
. - Thêm
AppsFlyerLibDelegate
vào phần khai báo giao diệnAppDelegate
.
#import <AppsFlyerLib/AppsFlyerLib.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerLibDelegate>
@end
Trong tệp tin AppDelegate.m
:
- Trong lệnh gọi lại
didFinishLaunchingWithOptions
, đặt cấu hình:- Dev key AppsFlyer
- ID ứng dụng
- Để thu thập IDFA, hãy cấu hình hỗ trợ Minh bạch về Theo dõi Ứng dụng (ATT).
- Cài đặt bổ sung
- Ghi đè lệnh gọi lại
onConversionDataSuccess
vàonConversionDataFail
để xử lý lượt chuyển đổi và bật deferred deep linking. - Ghi đè lệnh gọi lại
onAppOpenAttribution
vàonAppOpenAttributionFailure
để xử lý phân bổ và cho phép liên kết sâu trực tiếp. - Trong lệnh gọi lại
didReceiveRemoteNotification
, gọi rahandlePushNotification
để phân bổ các lần thu hút lại thông báo đẩy. - Trong lệnh gọi lại
sendLaunch
, gọi rastart
.
#import "AppDelegate.h"
#import <AppsFlyerLib/AppsFlyerLib.h>
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
// Khởi động AppsFlyer SDK
- (void)sendLaunch:(UIApplication *)application {
[[AppsFlyerLib shared] start];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Ghi đè điểm để tùy chỉnh sau khi ứng dụng khởi chạy.
/** APPSFLYER INIT **/
[AppsFlyerLib shared].appsFlyerDevKey = @"<AF_DEV_KEY>";
[AppsFlyerLib shared].appleAppID = @"<APPLE_APP_ID>";
[AppsFlyerLib shared].delegate = self;
/* Set isDebug to true to see AppsFlyer debug logs */
[AppsFlyerLib shared].isDebug = true;
// Sử dụng UIApplicationDidBecomeActiveNotification để khởi động SDK
[[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;
}
// Báo cáo dữ liệu phân bổ Thông báo Đẩy cho thu hút lại
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[AppsFlyerLib shared] handlePushNotification:userInfo];
}
// Triển khai AppsFlyerLib
//Xử lý Dữ liệu Chuyển đổi (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);
}
//Xử lý Liên kết Sâu Trực tiếp
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
NSLog(@"%@",attributionData);
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@",error);
}
// hỗ trợ cảnh đại diện
#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
Trong tệp tin SceneDelegate.m
:
- Trong lệnh gọi lại
openURLContexts
, hãy gọi rahandleOpenUrl
. - Trong lệnh gọi lại
continueUserActivity
, hãy gọi racontinueUserActivity
.
#import "SceneDelegate.h"
@interface SceneDelegate ()
@end
@implementation SceneDelegate
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts API_AVAILABLE(ios(13.0)){
NSURL* url = [[URLContexts allObjects] objectAtIndex:0].URL;
if(url){
[[AppsFlyerLib shared] handleOpenUrl:url options:nil];
}
}
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity API_AVAILABLE(ios(13.0)){
[[AppsFlyerLib shared]continueUserActivity:userActivity restorationHandler:nil];
}
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
NSUserActivity *activity = [[connectionOptions userActivities] allObjects].firstObject;
if (activity) {
[self scene:scene continueUserActivity:activity];
}
[self scene:scene openURLContexts: [connectionOptions URLContexts]];
}
- (void)sceneDidDisconnect:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
}
- (void)sceneDidBecomeActive:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
- (void)sceneWillResignActive:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
- (void)sceneWillEnterForeground:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
- (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
@end
Trong tệp tin AppDelegate.swift
:
- Nhập
AppsFlyerLib
- Thêm
AppsFlyerLibDelegate
vào khai báo lớpAppDelegate
. - Trong lệnh gọi lại
didFinishLaunchingWithOptions
, định cấu hình:- Dev key AppsFlyer
- ID ứng dụng
- Để thu thập IDFA, hãy cấu hình hỗ trợ Minh bạch về Theo dõi Ứng dụng (ATT).
- Cài đặt bổ sung
- Ghi đè lệnh gọi lại
onConversionDataSuccess
vàonConversionDataFail
để xử lý lượt chuyển đổi và bật deferred deep linking. - Ghi đè lệnh gọi lại
onAppOpenAttribution
vàonAppOpenAttributionFailure
để xử lý phân bổ và cho phép liên kết sâu trực tiếp. - Trong lệnh gọi lại
didReceiveRemoteNotification
, gọi rahandlePushNotification
để phân bổ các lần thu hút lại thông báo đẩy. - Trong lệnh gọi lại
sendLaunch
, gọi rastart
.
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerLibDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "<AF_DEV_KEY>"
AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"
AppsFlyerLib.shared().delegate = self
AppsFlyerLib.shared().isDebug = true
NotificationCenter.default.addObserver(self, selector: NSSelectorFromString("sendLaunch"), name: UIApplication.didBecomeActiveNotification, object: nil)
return true
}
@objc func sendLaunch() {
AppsFlyerLib.shared().start()
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
}
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// 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.
}
//MARK: -GCD
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
print("onConversionDataSuccess data:")
for (key, value) in installData {
print(key, ":", value)
}
if let status = installData["af_status"] as? String {
if (status == "Non-organic") {
if let sourceID = installData["media_source"],
let campaign = installData["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 = installData["is_first_launch"] as? Bool,
is_first_launch {
print("First Launch")
} else {
print("Not First Launch")
}
}
}
func onConversionDataFail(_ error: Error!) {
if let err = error{
print(err)
}
}
func onAppOpenAttribution(_ attributionData: [AnyHashable : Any]!) {
if let data = attributionData{
print("\(data)")
}
}
func onAppOpenAttributionFailure(_ error: Error!) {
if let err = error{
print(err)
}
}
}
Trong tệp tin SceneDelegate.swift
:
- Nhập
AppsFlyerLib
- Trong lệnh gọi lại
openURLContexts
, hãy gọi raAppsFlyerLib.shared().handleOpen
. - Trong lệnh gọi lại
continue
, hãy gọi raAppsFlyerLib.shared().continue
.
import UIKit
import AppsFlyerLib
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Processing Universal Link from the killed state
if let userActivity = connectionOptions.userActivities.first {
self.scene(scene, continue: userActivity)
}
// Processing URI-scheme from the killed state
self.scene(scene, openURLContexts: connectionOptions.urlContexts)
guard let _ = (scene as? UIWindowScene) else { return }
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
}
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
AppsFlyerLib.shared().handleOpen(url, options: nil)
}
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}
3.3 Hỗ trợ phân bổ SKAdNetwork
Lưu ý
Để hỗ trợ đầy đủ tính năng phân bổ SKAdNetwork, hãy nâng cấp lên SDK iOS V6.2.3+
.
SKAdNetwork là một lớp được iOS sử dụng để xác thực các lượt cài đặt ứng dụng định hướng theo nhà quảng cáo. Quy trình xác thực cài đặt ứng dụng liên quan đến ứng dụng nguồn và ứng dụng được quảng cáo.
Ứng dụng nguồn là một ứng dụng tham gia vào các chiến dịch quảng cáo bằng cách hiển thị quảng cáo được ký bởi mạng quảng cáo. Việc cấu hình ứng dụng của bạn để hiển thị quảng cáo không nằm trong phạm vi của SDK AppsFlyer. Để cấu hình, hãy làm theo hướng dẫn của Apple.
Đối với ứng dụng được quảng cáo (ứng dụng có SDK AppsFlyer), Giải pháp SKAdNetwork của AppsFlyer sử dụng SKAdNetwork để cung cấp đăng lại phân bổ trong khi AppsFlyer thu thập, dịch và hợp nhất dữ liệu, đồng thời duy trì quyền riêng tư của người dùng. Khi khởi chạy ứng dụng lần đầu, nền tảng AppsFlyer, sử dụng cấu hình do nhà tiếp thị đặt, sẽ chỉ thị SDK cách đặt giá trị chuyển đổi SKAdNetwork.
Để sử dụng Giải pháp SKAdNetwork:
- Nhà phát triển không phải thực hiện bất cứ thao tác nào.
-
SDK AppsFlyer tự động gọi các API SKAdNetwork cần thiết, có nghĩa là
registerAppForAdNetworkAttribution()
vàupdateConversionValue()
. Nhà phát triển không phải gọi các lệnh này. - Không cho phép các SDK khác gọi ra API SKAdNet. Vì như vậy có thể khiến iOS chậm gửi đăng lại tới AppsFlyer và thay đổi giá trị chuyển đổi mà chúng tôi sử dụng để tính toán các số liệu chất lượng người dùng trên bảng điều khiển SKAdNetwork.
- Nhà tiếp thị cần cấu hình đo lường SKAdNetwork trong AppsFlyer.
Không yêu cầu nhà phát triển hoặc nhà tiếp thị phải có hành động hoặc quy trình đăng ký trong cửa hàng ứng dụng.
Để tắt phân bổ SKAdNetwork, hãy sử dụng API disableSKAdNetwork.
3.4 Trì hoãn khởi tạo SDK
Bạn có thể cần trì hoãn việc khởi tạo SDK và gửi dữ liệu cho đến khi người dùng đồng ý (ví dụ: chấp thuận GDPR hoặc COPPA).
Lưu ý: Điều này không liên quan đến ATT được giới thiệu trong iOS 14.
Để trì hoãn việc khởi tạo SDK:
- Ngăn không cho phiên được gửi trong quá trình chuyển đổi nền trước-nền sau. Trong một phương thức sendLaunch() (được gọi trên mọi applicationDidBecomeActive (theo phần 3.3), bao lệnh gọi đến
start
bằng việc kiểm tra điều kiện. Ví dụ:
-(void)sendLaunch:(UIApplication *)application { if (consent_given) { // check the condition [[AppsFlyerLib shared] start]; // Start } }
-
Gửi phiên ngay khi lý do trì hoãn không còn phù hợp (ngay sau khi điều kiện thay đổi). Gọi
start
khi bạn sẵn sàng gửi dữ liệu phiên đầu tiên. Ví dụ:
... consent_given = YES; // change the condition [[AppsFlyerLib shared] start]; // Start ...
4. Kiểm tra lượt cài đặt
Bây giờ bạn đã sẵn sàng để kiểm tra tích hợp SDK bằng cách mô phỏng các lượt cài đặt tự nhiên và không tự nhiên.
Để biết thêm các tình huống và hướng dẫn thử nghiệm, hãy xem thử nghiệm tích hợp SDK.
Lưu ý
Khi bạn hoàn tất thử nghiệm và gỡ lỗi tích hợp SDK, hãy tắt nhật ký SDK.
4.1 Đăng ký thiết bị thử nghiệm của bạn
Trước khi bạn bắt đầu thử nghiệm lượt cài đặt:
- Đảm bảo rằng thiết bị của bạn chưa cài đặt ứng dụng.
- Đăng ký thiết bị bạn sẽ dùng để thử nghiệm.
4.2 Mô phỏng cài đặt tự nhiên
Các lượt cài đặt tự nhiên là cài đặt không phân bổ, thường cài đặt trực tiếp từ các cửa hàng ứng dụng.
Để mô phỏng cài đặt tự nhiên:
- Đảm bảo bạn có thiết bị di động được kết nối với máy tính của mình
- Trong Xcode, hãy mở thiết bị đầu cuối gỡ lỗi.
- Từ Xcode Studio, hãy cài đặt ứng dụng trên thiết bị hoặc trình giả lập.
- Đợi ứng dụng khởi chạy.
- Trong thiết bị đầu cuối gỡ lỗi, hãy tìm tên gói ứng dụng.
Bạn nên xem những nội dung sau:
Gửi start() trong nhật ký cho biết rằng SDK báo cáo một lượt cài đặt. Dữ liệu này có từ phương thức onConversionDataSuccess
trong ủy nhiệm hàm ứng dụng. Nhận dữ liệu chuyển đổi sẽ được thảo luận sau trong hướng dẫn này .
Lưu ý: Bắt đầu SDK V5, onConversionDataSuccess
là tên của phương thức để nhận dữ liệu chuyển đổi. Nếu bạn đang sử dụng phiên bản SDK thấp hơn 5.0.0, tên của phương thức là onConversionDataReceived
. Chúng tôi khuyên bạn nên nâng cấp lên SDK 5.0.0. Để tìm hiểu thêm, bấm ở đây .
Lúc này, một lượt cài đặt tự nhiên sẽ xuất hiện trên trang Overview (Tổng quan) của bảng điều khiển ứng dụng.
Nếu bạn không thấy lượt cài đặt trong bảng điều khiển của ứng dụng, hãy xem hướng dẫn khắc phục sự cố SDK.
4.3 Mô phỏng cài đặt không tự nhiên
Cài đặt không tự nhiên là lượt cài đặt được phân bổ thường theo sau quảng cáo. Bạn có thể mô phỏng cài đặt không tự nhiên bằng cách sử dụng các liên kết phân bổ.
Thực hiện:
- Tìm tên ID itunes ứng dụng của bạn là gì, ví dụ: id123456789.
- Trong URL bên dưới, hãy thay thế <APP_ID> bằng ID itunes ứng dụng của bạn:
Ví dụ:https://app.appsflyer.com/<APP_ID>?pid=sdk_test&c=sdk_test
Tham sốhttps://app.appsflyer.com/id0123456789?pid=sdk_test&c=sdk_test
pid
đại diện cho tên nguồn truyền thông. Tham sốc
đại diện cho tên chiến dịch. - Gửi URL này đến thiết bị (ví dụ: qua email hoặc WhatsApp).
- Trên thiết bị, nhấp vào URL.
- Nếu ứng dụng được liệt kê trong cửa hàng ứng dụng, bạn sẽ được chuyển hướng đến cửa hàng ứng dụng. Không tải xuống ứng dụng từ cửa hàng ứng dụng. Tiếp tục với bước 5.
- Nếu ứng dụng không được liệt kê trong cửa hàng ứng dụng và vẫn đang được phát triển, màn hình sẽ hiển thị thông báo rằng ứng dụng không có sẵn trong cửa hàng ứng dụng. Bạn chỉ cần tiếp tục với bước 5.
- Trong Xcode Studio, hãy mở thiết bị đầu cuối gỡ lỗi.
- Kết nối thiết bị với máy tính của bạn bằng cáp USB.
- Từ Xcode, cài đặt ứng dụng trên thiết bị.
- Trong thiết bị đầu cuối gỡ lỗi, hãy tìm ID itunes của ứng dụng.
Bạn nên xem những nội dung sau:
Lúc này, lượt cài đặt không tự nhiên sẽ xuất hiện trên trang Overview (Tổng quan) của bảng điều khiển ứng dụng.
Tab này giải thích cách ghi nhận các sự kiện trong ứng dụng, doanh thu và cách thiết lập liên kết sâu.
Ghi nhận các sự kiện và doanh thu trong ứng dụng cho phép bạn đo lường chất lượng của người dùng. Liên kết sâu cho phép bạn cung cấp cho người dùng trải nghiệm người dùng tốt hơn.
Tab này chứa các hướng dẫn cho nhà phát triển, nhưng thông tin đầu vào từ nhà tiếp thị là điều cần thiết bởi vì:
- Nhà tiếp thị sẽ quyết định những sự kiện trong ứng dụng nào cần ghi nhận để đo lường chất lượng người dùng.
- Nhà tiếp thị có quyền truy cập vào bảng điều khiển AppsFlyer, được yêu cầu cho việc thiết lập OneLink dành cho liên kết sâu.
5. Ghi nhận sự kiện trong ứng dụng
Các sự kiện trong ứng dụng cung cấp thông tin chi tiết về những gì đang xảy ra trong ứng dụng của bạn. Bạn nên dành thời gian và xác định các sự kiện bạn muốn ghi nhận. Ghi nhận sự kiện trong ứng dụng cho phép bạn đo lường các KPI như ROI (Lợi tức đầu tư) và LTV (Giá trị vòng đời khách hàng).
Có một số cách để ghi nhận các sự kiện trong ứng dụng. Cách phổ biến nhất là gửi các sự kiện thông qua SDK. Chúng ta sẽ thảo luận về cách thức này trong bài viết này. Để tìm hiểu về những cách thức ghi nhận các sự kiện trong ứng dụng khác, vui lòng xem hướng dẫn tổng quan về sự kiện trong ứng dụng .
Nếu ứng dụng của bạn thuộc một cấu trúc dọc nào đó, ví dụ: du lịch, chơi game, thương mại điện tử, v.v., bạn có thể sử dụng danh sách đầy đủ các sự kiện trong ứng dụng được đề xuất cho mỗi cấu trúc dọc.
5.1 Tên và tham số sự kiện trong ứng dụng
SDK chứa hai loại hằng số đại diện cho thông tin liên quan đến sự kiện trong ứng dụng.
- Tên sự kiện - các hằng số này có định dạng
AFEventEventName
.
Ví dụAFEventPurchase
,AFEventAddToCart
. - Tham số sự kiện - Các hằng số này có định dạng
AFEventParameterParameterName
.
Ví dụAFEventParameterRevenue
,AFEventParamaterContentId
.
Chúng tôi đặc biệt khuyến cáo bạn nên sử dụng các hằng số này vì những lý do sau:
- Việc đặt tên theo tiêu chuẩn cho phép AppsFlyer tự động ánh xạ các sự kiện tới các SRN như Facebook, Google, Twitter và Snapchat.
- Khả năng tương thích ngược - nếu AppsFlyer quyết định thay đổi tên của bất kỳ tham số sự kiện hoặc sự kiện nào, thì việc triển khai của bạn là tương thích ngược.
Để sử dụng hai giao diện này, hãy nhập AppsFlyerLib.h nếu sử dụng Objective-C hoặc AppsFlyerLib nếu sử dụng Swift:
Đặt cái này trong tập tin thực thi lớp.
#import AppsFlyerLib.h
Đặt cái này trong tập tin lớp Swift.
import AppsFlyerLib
Dưới đây là danh sách các tên và cấu trúc sự kiện được đề xuất .
5.2 Ghi nhận doanh thu
Bạn có thể gửi doanh thu với bất kỳ sự kiện trong ứng dụng. Sử dụng tham số sự kiện af_revenue
(AFEventParameterRevenue
) để đưa doanh thu vào sự kiện trong ứng dụng. Bạn có thể điền giá trị số bất kỳ, âm hoặc dương.
af_revenue
là tham số sự kiện duy nhất được đếm trên AppsFlyer như doanh thu thực trên dữ liệu thô và bảng điều khiển. Để biết thêm thông tin chi tiết, nhấp vào đây.
Khi gửi sự kiện có doanh thu, hãy ghi nhớ những điều sau:
- Nếu bạn thiết lập mã tiền tệ (xem ví dụ bên dưới), mã đó phải là mã ISO 4217 có 3 ký tự (tiền tệ mặc định là USD).
- Bạn có thể đặt mã tiền tệ cho tất cả các sự kiện bằng cách đặt thuộc tính sau:
- Objective-C:
[AppsFlyerLib shared].currencyCode = @"ZZZ";
, - Swift:
AppsFlyerLib.shared().currencyCode = "ZZZ"
- Objective-C:
- Giá trị doanh thu không được chứa dấu tách dấu phẩy, ký hiệu tiền tệ hoặc văn bản. Ví dụ một sự kiện doanh thu nên tương tự như 1234.56.
Ví dụ: Sự kiện mua sự kiện trong ứng dụng có doanh thu
[[AppsFlyerLib shared] logEvent: @"purchase"
withValues:@{
AFEventParamContentId:@"1234567",
AFEventParamContentType : @"category_a",
AFEventParamRevenue: @200,
AFEventParamCurrency:@"USD"
}];
AppsFlyerLib.shared().logEvent("purchase",
withValues: [
AFEventParamContentId:"1234567",
AFEventParamContentType : "category_a",
AFEventParamRevenue: 200,
AFEventParamCurrency:"USD"
]);
Sự kiện mua ở trên có doanh thu $200, hiển thị dưới dạng doanh thu trong bảng điều khiển.
Ghi nhận doanh thu âm
Có thể có những tình huống mà bạn muốn ghi nhận doanh thu âm.
Ví dụ: người dùng nhận được tiền hoàn lại hoặc hủy đăng ký.
[[AppsFlyerLib shared] logEvent: @"cancel_purchase"
withValues:@{
AFEventParamContentId:@"1234567",
AFEventParamContentType : @"category_a",
AFEventParamRevenue: @-1.99,
AFEventParamCurrency:@"USD"
}];
AppsFlyerLib.shared().logEvent("cancel_purchase",
withValues: [
AFEventParamContentId:"1234567",
AFEventParamContentType : "category_a",
AFEventParamRevenue: -1.99,
AFEventParamCurrency:"USD"
]);
Lưu ý
Lưu ý những điều sau về mã code ở trên:
- Giá trị doanh thu được bắt đầu bằng dấu trừ
- Tên sự kiện có giá trị duy nhất "cancel_purchase" - để cho phép bạn xác định các sự kiện doanh thu âm trong dashboard và báo cáo dữ liệu thô
5.3 Xác nhận mua trong ứng dụng
SDK của AppsFlyer hỗ trợ xác minh máy chủ cho các giao dịch mua trong ứng dụng. Để xác thực việc mua hàng, hãy gọi validateAndLogInAppPurchase
.
Cuộc gọi này sẽ tự động tạo ra một sự kiện trong ứng dụng af_purchase
, với điều kiện là giao dịch mua được xác nhận.
Phần gọi này có hai khối gọi lại, một cho 'thành công' và một cho 'thất bại' (vì lý do bất kỳ, bao gồm cả xác minh thất bại). Khi thành công, một từ điển được trả về với dữ liệu xác nhận biên nhận được cung cấp bởi các máy chủ của Apple.
Ví dụ sử dụng để xác nhận mua hàng:
- (void) validateAndLogInAppPurchase:(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;
[[AppsFlyerLib shared] validateAndLogInAppPurchase:@"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;
}
}];
AppsFlyerLib
.shared()?
.validateAndLogInAppPurchase ("productIdentifier",
price: "price",
currency: "currency",
transactionId: "transactionId",
additionalParameters: [:],
success: {
guard let dictionary = $0 as? [String:Any] else { return }
dump(dictionary)
}, failure: { error, result in
guard let emptyInApp = result as? [String:Any],
let status = emptyInApp["status"] as? String,
status == "in_app_arr_empty" else {
// Try to handle other errors
return
}
// retry with 'SKReceiptRefreshRequest' because
// Apple has returned an empty response
// <YOUR CODE HERE>
})
Khi kiểm tra xác thực mua trong môi trường Sandbox, hãy thêm mã sau đây:
[AppsFlyerLib shared].useReceiptValidationSandbox = YES;
AppsFlyerLib.shared().useReceiptValidationSandbox = true
Lưu ý phải xóa mã này khỏi bản dựng bạn phát triển.
Xác thực mua hàng trong ứng dụng sẽ tự động gửi một sự kiện mua trong ứng dụng tới AppsFlyer. Vui lòng xem bên dưới dữ liệu mẫu được truyền trong tham số event_value:
{
"some_parameter":"some_value", // from additional_event_values
"af_currency":"USD", // from currency
"af_content_id":"test_id", // from purchase
"af_revenue":"10", // from revenue
"af_quantity":"1", // from purchase
"af_validated":true // flag that AF verified the purchase
}
Lưu ý
Việc gọi validateAndTrackInAppPurchase
tự động tạo ra một sự kiện trong ứng dụng af_purchase. Tự gửi sự kiện này tạo ra báo cáo sự kiện trùng lặp gấp đôi.
5.4 Giới hạn sự kiện trong ứng dụng
- Tên sự kiện: tối đa 45 ký tự
- Giá trị sự kiện: không được vượt quá 1000 ký tự - nếu dài hơn chúng tôi có thể cắt bớt nó
- Định giá và doanh thu: chỉ sử dụng các chữ số và số thập phân, ví dụ 5 hoặc 5.2.
- Giá trị định giá và doanh thu có thể có tối đa 5 chữ số sau dấu chấm, ví dụ: 5.12345
- Có hỗ trợ các ký tự không phải tiếng Anh, trong các sự kiện trong ứng dụng, các SDK API khác, bắt đầu từ Android SDK V4.8.1.
5.5 Ví dụ về ghi nhận sự kiện trong ứng dụng
Bạn có thể ghi lại các sự kiện trong ứng dụng bằng cách gọi trackEvent
với các tham số giá trị và tên sự kiện. Xem tài liệu về Sự kiện trong ứng dụng để biết thêm chi tiết.
Dưới đây là một ví dụ đơn giản về cách ghi lại một sự kiện mua hàng. Để biết danh sách đầy đủ các đoạn mã được tạo sẵn cho mỗi cấu trúc dọc, vui lòng xem hướng dẫn của chúng tôi về sự kiện phong phú trong ứng dụng cho mỗi cấu trúc dọc.
Ví dụ: Sự kiện mua trong ứng dụng
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{
AFEventParamRevenue: @200,
AFEventParamCurrency: @"USD",
AFEventParamQuantity: @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"
}];
Lưu ý
- Từ điển giá trị sự kiện được chuyển đến SDK sự kiện phải hợp lệ để chuyển đổi JSON bởi NSJSONSerialization. Để biết thêm thông tin chi tiết, xem ở đây.
- Đối với doanh thu, không thêm bất kỳ ký hiệu tiền tệ nào vì chúng không được công nhận.
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [
AFEventParamRevenue: "200",
AFEventParamCurrency: "USD",
AFEventParamQuantity: 2,
AFEventParamContent: "shoes",
AFEventParamContentId: "092",
AFEventParamReceiptId: "9277"]);
5.6 Ghi nhận các sự kiện trong ứng dụng ngoại tuyến
Nếu người dùng bắt đầu một sự kiện khi không có kết nối internet, Appsflyer vẫn có thể ghi nhận nó. Đây là cách thức hoạt động:
- SDK gửi các sự kiện tới máy chủ của AppsFlyer và chờ đợi phản hồi.
- Nếu SDK không nhận được phản hồi mã 200, sự kiện được lưu trữ trong bộ nhớ cache.
- Khi nhận được phản hồi mã 200 tiếp theo, sự kiện được lưu trữ được gửi lại cho máy chủ.
- Nếu có nhiều sự kiện trong bộ nhớ cache, chúng được gửi đến máy chủ một cách lần lượt và nhanh chóng.
Lưu ý
Bộ nhớ cache của SDK có thể lưu trữ tối đa 40 sự kiện, có nghĩa là chỉ lưu được 40 sự kiện đầu tiên xảy ra ngoại tuyến. Tất cả mọi thứ xảy ra sau đó cho đến phản hồi mã 200 tiếp theo được loại bỏ.
Thời gian sự kiện xuất hiện trong dữ liệu thô là thời gian mà sự kiện được gửi tới AppsFlyer sau khi thiết bị được kết nối internet trở lại. Đây không phải là thời gian thực tế mà sự kiện diễn ra.
5.7 xử lý thành công và sự cố khi ghi nhận các sự kiện trong ứng dụng
- Đã ghi nhận thành công sự kiện trong ứng dụng.
- Có lỗi xảy ra khi ghi nhận sự kiện trong ứng dụng.
[[AppsFlyerLib shared] logEventWithEventName:AFEventPurchase
eventValues: @{
AFEventParamRevenue: @200,
AFEventParamCurrency: @"USD",
AFEventParamQuantity: @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"
}
completionHandler:^(NSDictionary<NSString *,id> * _Nullable dictionary, NSError * _Nullable error){
if(dictionary != nil) {
NSLog(@"In app callback success:");
for(id key in dictionary){
NSLog(@"Callback response: key=%@ value=%@", key, [dictionary objectForKey:key]);
}
}
if(error != nil) {
NSLog(@"In app callback error:", error);
}
}];
AppsFlyerLib.shared().logEvent(name: "In app event name", values: ["id": 12345, "name": "John doe"], completionHandler: { (response: [String : Any]?, error: Error?) in
if let response = response {
print("In app event callback Success: ", response)
}
if let error = error {
print("In app event callback ERROR:", error)
}
})
}
Trong trường hợp xảy ra lỗi khi ghi sự kiện trong ứng dụng, mã lỗi và mô tả chuỗi sẽ được cung cấp, như được chỉ ra trong bảng sau.
Mã lỗi | Mô tả chuỗi |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" (Hết thời gian chờ của sự kiện. Kiểm tra thông số 'minTimeBetweenSessions') |
11 |
"Skipping event because 'isStopTracking' enabled" (Bỏ qua sự kiện vì 'isStopTracking' đã được bật) |
40 |
Network error: Error description comes from Android (Lỗi mạng: Mô tả lỗi đến từ Android) |
41 |
"No dev key" (Không có dev key) |
50 |
"Status code failure" + actual response code from the server ("Lỗi mã trạng thái" + mã phản hồi thực tế từ máy chủ) |
6. Liên kết sâu với OneLink
OneLink là giải pháp của AppsFlyer để phân bổ đa nền tảng, chuyển hướng và liên kết sâu.
6.1 Phát hiện và chuyển hướng thiết bị
OneLink có thể phát hiện loại thiết bị khi nhấp và chuyển hướng người dùng tới đích phù hợp, ví dụ: Google Play, cửa hàng ứng dụng iOS, thị trường ngoài cửa hàng hoặc các trang web.
Hướng dẫn Chuyển hướng OneLink thảo luận về việc triển khai các liên kết phân bổ đa nền tảng (không yêu cầu mã hóa SDK). Đây cũng là cơ sở cho các liên kết sâu.
6.2 Liên kết sâu
Liên kết sâu cho phép bạn gửi người dùng đến các hoạt động cụ thể và phục vụ họ với nội dung tùy chỉnh. Điều này đặc biệt hữu ích khi chạy các chiến dịch nhắm mục tiêu lại.
Để thiết lập liên kết sâu với OneLink, nhà tiếp thị có quyền truy cập vào bảng điều khiển AppsFlyer và nhà phát triển có quyền truy cập vào ứng dụng phải hoạt động cùng nhau.
Xem hướng dẫn của chúng tôi về thiết lập liên kết sâu với OneLink.
6.3 Liên kết sâu bị trì hoãn
Liên kết sâu bị trì hoãn cho phép bạn liên kết sâu người dùng mới và phục vụ họ với nội dung tùy chỉnh sau khi khởi chạyt ứng dụng lần đầu. Liên kết sâu này không giống như liên kết sâu thông thường nơi ứng dụng cần được cài đặt trên thiết bị của người dùng.
Để thiết lập liên kết sâu bị trì hoãn với OneLink, nhà phát triển cũng cần truy cập vào bảng điều khiển AppsFlyer.
Thiết lập cho liên kết sâu bị trì hoãn cũng giống như thiết lập dành cho liên kết sâu. Sự khác biệt duy nhất là bạn cần triển khai logic bổ sung trong ứng dụng để liên kết sâu với người dùng và phục vụ họ với nội dung tùy chỉnh sau khi họ cài đặt và khởi chạy ứng dụng.
Xem hướng dẫn của chúng tôi về liên kết sâu bị trì hoãn để tìm hiểu thêm.
6.4 Nhận dữ liệu liên kết sâu
SDK cung cấp cho bạn dữ liệu chuyển đổi hoặc tương tác sau mỗi lần cài đặt hoặc sự kiện liên kết sâu. Bạn có thể sử dụng dữ liệu này để tùy chỉnh nội dung và hành vi của ứng dụng theo chương trình.
Để có được dữ liệu liên kết sâu khi sử dụng liên kết sâu trực tiếp và đang mở ứng dụng, hãy thực hiện phương thức onAppOpenAttribution.
Để có được dữ liệu tái tương tác liên kết sâu theo cách thủ công bất cứ lúc nào, hãy thực hiện phương thức performOnAppAttribution. Điều này cho phép truy cập vào dữ liệu tái tương tác mà không ghi nhận lượt tái tương tác mới.
Xem hướng dẫn của chúng tôi về dữ liệu liên kết sâu để tìm hiểu thêm.
6.5 Cấu hình giải pháp liên kết sâu thông báo đẩy
Phương thức addPushNotificationDeepLinkPath
cung cấp cho chủ sở hữu ứng dụng một giao diện linh hoạt để cấu hình cách các liên kết sâu được trích xuất từ các tải trọng thông báo đẩy.
Theo mặc định, SDK tìm kiếm giá trị liên kết sâu trong mã khóa af
của tải trọng JSON
của thông báo đẩy. Nhiều nhà cung cấp dịch vụ thông báo đẩy sử dụng các lược đồ JSON
độc quyền mà SDK sẽ không thể giải quyết nếu không được cấu hình bổ sung.
addPushNotificationDeepLinkPath
cho phép bạn cấu hình mã khóa nào trong tải trọng JSON của thông báo đẩy mà SDK nên sử dụng cho giá trị liên kết sâu.
Sử dụng phương thức này nếu bạn đang tích hợp ứng dụng của mình với các nhà cung cấp dịch vụ thông báo đẩy không sử dụng lược đồ JSON thông báo đẩy mặc định mà SDK mong đợi.
Khi gọi ra addPushNotificationDeepLinkPath
, SDK sẽ xác minh rằng:
- Mã khóa được yêu cầu tồn tại trong tải trọng.
- Mã khóa chứa một URL OneLink hợp lệ.
Cấu hình cơ bản
Hãy xem xét lệnh gọi sau tới addPushNotificationDeepLinkPath
[AppsFlyerLib shared] addPushNotificationDeepLinkPath:@[@"deeply", @"nested", @"deep_link"]]
AppsFlyerLib.shared().addPushNotificationDeepLinkPath(["deeply", "nested", "deep_link"])
và các tình huống sau:
Tình huống 1
Ứng dụng của bạn được gọi qua thông báo đẩy. Thông báo đẩy đó chứa một tải trọng có cấu trúc như sau.
{
...
"deeply": {
"nested": {
"deep_link": "https://yourdeeplink2.onelink.me"
}
}
...
}
Trong trường hợp này, SDK trích xuất giá trị của deep_link
và tiếp tục với luồng liên kết sâu.
Tình huống 2
Ứng dụng của bạn được gọi qua thông báo đẩy. Thông báo đẩy đó chứa một tải trọng có cấu trúc như sau.
{
...
"deeply": {
"nested": {
"banana": "https://yourdeeplink2.onelink.me"
}
},
...
}
Trong trường hợp này, khi lệnh gọi thực thi SDK không thể tìm thấy mã khóa deep_link
trong tải trọng. Do đó, không có gì xảy ra.
Tình huống 3
Ứng dụng của bạn được gọi qua thông báo đẩy. Thông báo đẩy đó chứa một tải trọng có cấu trúc như sau.
{
...
"deeply": {
"nested": {
"deep_link": "Corrupted url or regular string"
}
},
...
}
Trong trường hợp này, mặc dù SDK tìm thấy mã khóa deep_link
nhưng giá trị liên kết sâu của SDK lại không hợp lệ. Do đó, khi thực thi lệnh gọi trên thì không có gì xảy ra.
Cấu hình nâng cao
Để cấu hình nhiều cấu trúc tải trọng có thể có, hãy gọi addPushNotificationDeepLinkPath
nhiều lần:
- Lệnh gọi đầu tiên mang lại giá trị liên kết sâu hợp lệ sẽ được sử dụng
- Các lệnh gọi khác bị bỏ qua
Nếu không có cấu trúc tải trọng nào khớp hoặc không tìm thấy URL OneLink hợp lệ nào trong tải trọng, thì không có gì xảy ra.
Ví dụ: hãy xem xét tải trọng sau
{
...
"deeply": {
"nested": {
“deep_link”: “https://yourdeeplink2.onelink.me”
}
},
“this”: {
“is”: {
"banana": "phone"
}
}
...
}
và các lệnh gọi sau tới addPushNotificationDeepLinkPath
.
// this.is.deep_link key isn’t found - nothing happens
[AppsFlyerLib shared] addPushNotificationDeepLinkPath:@[@"this", @"is", @"deep_link"]]
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
[AppsFlyerLib shared] addPushNotificationDeepLinkPath:@[@"this", @"is", @"banana"]]
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
[AppsFlyerLib shared] addPushNotificationDeepLinkPath:@[@"deeply", @"nested", @"deep_link"]]
// this.is.deep_link key isn’t found - nothing happens
AppsFlyerLib.shared().addPushNotificationDeepLinkPath(["this", "is", "deep_link"]);
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
AppsFlyerLib.shared().addPushNotificationDeepLinkPath(["this", "is", "banana"])
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
AppsFlyerLib.shared().addPushNotificationDeepLinkPath(["deeply", "nested", "deep_link"])
7. Lấy dữ liệu chuyển đổi
Nhận dữ liệu chuyển đổi
Bạn có thể truy cập dữ liệu phân bổ người dùng theo thời gian thực đối với mỗi lần cài đặt mới, trực tiếp từ SDK.
Bằng cách này, bạn có thể phục vụ người dùng với nội dung được cá nhân hóa hoặc gửi cho họ các hoạt động cụ thể trong ứng dụng (xem liên kết sâu bị trì hoãn trong bài viết này), điều này có thể giúp tăng cường sự tương tác của họ với ứng dụng của bạn.
Để có được dữ liệu chuyển đổi từ SDK iOS, hãy thực hiện các phương thức sau:
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
NSLog(@"onAppOpenAttribution");
for(id key in attributionData){
NSLog(@"onAppOpenAttribution: key=%@ value=%@", key, [attributionData objectForKey:key]);
}
}
- (void)onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@", [error description]);
}
-(void)onConversionDataSuccess:(NSDictionary*) installData {
BOOL first_launch_flag = [[installData objectForKey:@"is_first_launch"] boolValue];
NSString *status = [installData objectForKey:@"af_status"];
if(first_launch_flag) {
if ([status isEqualToString:@"Non-organic"]){
NSString *sourceID = [installData objectForKey:@"media_source"];
NSString *campaign = [installData objectForKey:@"campaign"];
NSLog(@"This is a non-organic install. Media source: %@ Campaign: %@", sourceID, campaign);
} else {
NSLog(@"This is an organic install");
}
} else {
NSLog(@"Not first launch");
}
}
-(void)onConversionDataFail:(NSError *) error {
NSLog(@"%@", [error description]);
}
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerLibDelegate{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "MY_DEV_KEY"
AppsFlyerLib.shared().appleAppID = "123456789"
AppsFlyerLib.shared().delegate = self
//AppsFlyerLib.shared().isDebug = true
//AppsFlyerLib.shared().appInviteOneLinkID = "ONELINK_ID";
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
AppsFlyerLib.shared().start()
}
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
guard let first_launch_flag = installData["is_first_launch"] as? Int else {
return
}
guard let status = installData["af_status"] as? String else {
return
}
if(first_launch_flag == 1) {
if(status == "Non-organic") {
if let media_source = installData["media_source"] , let campaign = installData["campaign"]{
print("This is a Non-Organic install. Media source: \(media_source) Campaign: \(campaign)")
}
} else {
print("This is an organic install.")
}
} else {
print("Not First Launch")
}
}
func onConversionDataFail(_ error: Error!) {
if let err = error{
print(err)
}
}
func onAppOpenAttribution(_ attributionData: [AnyHashable : Any]!) {
if let data = attributionData{
print("\(data)")
}
}
func onAppOpenAttributionFailure(_ error: Error!) {
if let err = error{
print(err)
}
}
Hai phương thức quan trọng nhất là:
-
onConversionDataSuccess
- cung cấp dữ liệu chuyển đổi cho các lượt cài đặt mới.
Lưu ý: Bắt đầu SDK V5,
onConversionDataSuccess
là tên của phương thức để nhận dữ liệu chuyển đổi. Nếu bạn đang sử dụng phiên bản SDK thấp hơn 5.0.0, tên của phương thức làonConversionDataReceived
. Chúng tôi khuyên bạn nên nâng cấp lên SDK 5.0.0. Để tìm hiểu thêm, bấm ở đây . -
onAppOpenAttribution
- cung cấp dữ liệu chuyển đổi nhắm mục tiêu lại khi một ứng dụng hiện có được khởi chạy, thủ công hoặc thông qua liên kết sâu.
Để tìm hiểu thêm về dữ liệu chuyển đổi, hãy xem hướng dẫn của chúng tôi về các tình huống dữ liệu chuyển đổi.
8. Phân bổ
Đo lường lượt Gỡ cài đặt
Để tìm hiểu cách thiết lập đo lường lượt gỡ cài đặt, hãy đọc tại đây.
Đặt trình xử lý SDK khởi động
Nếu bạn muốn nhận được xác nhận rằng SDK đã khởi động thành công và thông báo cho các máy chủ AppsFlyer, hãy triển khai trình xử lý startWithCompletionHandler
. Sau đó, bạn có thể áp dụng logic để xử lý trạng thái thành công hoặc thất bại của hoạt động khởi chạy SDK.
Ví dụ
[[AppsFlyerLib shared] startWithCompletionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
if (error) {
NSLog(@"%@", error);
return;
}
if (dictionary) {
NSLog(@"%@", dictionary);
return;
}
}];
AppsFlyerLib.shared()?.start(completionHandler: { (dictionnary, error) in
if (error != nil){
print(error ?? "")
return
} else {
print(dictionnary ?? "")
return
}
})
Trong trường hợp xảy ra lỗi trong trình theo dõi yêu cầu, mã lỗi và mô tả chuỗi sẽ được cung cấp, như được chỉ ra trong bảng sau.
Mã lỗi | Mô tả chuỗi |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" (Hết thời gian chờ của sự kiện. Kiểm tra thông số 'minTimeBetweenSessions') |
11 |
"Skipping event because 'isStopTracking' enabled" (Bỏ qua sự kiện vì 'isStopTracking' đã được bật) |
40 |
Network error: Error description comes from Android (Lỗi mạng: Mô tả lỗi đến từ Android) |
41 |
"No dev key" (Không có dev key) |
50 |
"Status code failure" + actual response code from the server ("Lỗi mã trạng thái" + mã phản hồi thực tế từ máy chủ) |
Thiết lập dữ liệu tùy chỉnh bổ sung
Phải có API setAdditionalData
để tích hợp ở cấp SDK với một số nền tảng đối tác bên ngoài, bao gồm Segment, Adobe và Urban Airship.
Chỉsử dụng API này nếu bài viết tích hợp của nền tảng nêu rõ rằng bắt buộc phải có API setAdditionalData
.
Ví dụ về mã setAdditableData:
NSDictionary* customDataMap = [[NSDictionary alloc] initWithObjectsAndKeys:@"value_of_param_1", @"custom_param_1", nil];
[[AppsFlyerLib shared] setAdditionalData:customDataMap];
let customDataMap: [AnyHashable: Any] = [
"custom_param_1" : "value_of_param_1"
]
AppsFlyerLib.shared().customData = customDataMap
Phân bổ các phiên ứng dụng bắt nguồn từ các trang web sở hữu (miền)
Chủ sở hữu ứng dụng sử dụng Liên kết Chung để liên kết sâu (không có OneLink) và có miền được liên kết với ứng dụng của họ có thể phân bổ các phiên được khởi tạo thông qua miền này bằng phương thức appendParametersToDeepLinkingURL
.
Ví dụ: một người dùng tìm kiếm trên Google và nhấp vào miền của bạn, www.example.com:
- Nếu người dùng chưa cài đặt ứng dụng, họ sẽ được chuyển hướng đến trang web (www.example.com).
- Nếu người dùng đã cài đặt ứng dụng trên thiết bị của họ, họ sẽ được liên kết sâu vào ứng dụng được liên kết với www.example.com. Phiên này được phân bổ cho nguồn truyền thông (thông số
pid
) được chỉ định trongappendParametersToDeepLinkingURL
.
Xem tài liệu tham khảo về SDK iOS để biết thêm thông tin.
Lưu ý: Biểu ngữ Thông minh giúp chủ sở hữu ứng dụng chuyển đổi khách truy cập trang web thành người dùng ứng dụng.
9. Các phiên
Tùy chỉnh thời gian giữa các phiên
Theo mặc định, phải mất ít nhất 5 giây giữa hai lần khởi chạy ứng dụng để được tính là hai phiên riêng biệt (tìm hiểu thêm về tính các phiên).
Sử dụng API sau để đặt thời gian tối thiểu giữa các phiên:
[AppsFlyerLib shared].minTimeBetweenSessions = <your_custom_time_in_seconds>;
AppsFlyerLib.shared().minTimeBetweenSessions = <your_custom_time_in_seconds>
Đặt một giá trị cao cho thời gian tùy chỉnh giữa các phiên khởi chạy có thể ảnh hưởng xấu tới API dựa trên dữ liệu các phiên, chẳng hạn như liên kết sâu.
Phiên chạy nền cho ứng dụng tiện ích
Không khả dụng trong iOS.
10. Kênh truyền thông riêng
Giải quyết các URL liên kết sâu được gói
Một số dịch vụ của bên thứ 3 như nhà cung cấp dịch vụ email gói liên kết trong email với tên miền ghi nhận click của riêng họ. Một số dịch vụ thậm chí cho phép bạn thiết lập các miền ghi nhận nhấp chuột của riêng bạn. Nếu OneLink được gói trong các miền như vậy, điều này có thể giới hạn chức năng của nó.
Để khắc phục vấn đề này, bạn có thể sử dụng API setResolveDeepLinkURLs. Sử dụng API này để nhận OneLink từ các miền nhấp chuột khởi chạy ứng dụng. Đảm bảo gọi API này trước khi khởi tạo SDK.
Ví dụ: bạn có ba miền nhấp chuột chuyển hướng đến OneLink của bạn, đó là https://mysubdomain.onelink.me/abCD. Sử dụng API này để nhận OneLink mà miền nhấp chuột của bạn chuyển hướng đến. Phương thức API này nhận được danh sách các miền mà SDK giải quyết.
[AppsFlyerLib shared].resolveDeepLinkURLs = @[@"example.com",@"click.example.com"];
AppsFlyerLib.shared().resolveDeepLinkURLs = ["example.com", "click.example.com"]
Mã ở trên cho phép bạn sử dụng miền nhấp chuột của mình trong khi vẫn duy trì chức năng OneLink. Các miền nhấp chuột có trách nhiệm khởi chạy ứng dụng. API, khi đến lượt, nhận được OneLink từ những miền nhấp chuột và sau đó bạn có thể sử dụng dữ liệu từ OneLink này để liên kết sâu và tùy chỉnh nội dung người dùng.
Ghi nhận thông báo đẩy
Với AppsFlyer, bạn có thể ghi nhận thông báo đẩy như một phần của chiến dịch nhắm mục tiêu lại.
Để kích hoạt tính năng này, hãy gọi phương thức handlePushNotificationData
bên trong AppDelegate.m.
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[AppsFlyerLib shared] handlePushNotification:userInfo];
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
AppsFlyerLib.shared().handlePushNotification(userInfo)
}
Để biết thêm thông tin về đo số lượng thông báo đẩy, hãy đọc tại đây.
Phân bổ Mời người dùng
Việc cho phép người dùng hiện tại mời bạn bè và những mối liên hệ của họ sử dụng ứng dụng có thể là một yếu tố tăng trưởng then chốt với ứng dụng của bạn. Với AppsFlyer, bạn có thể phân bổ và ghi nhận lượt cài đặt bắt nguồn từ lời mời của người dùng trong ứng dụng của bạn.
Để biết thêm chi tiết, hãy xem bài viết Phân bổ mời người dùng.
Phân bổ Quảng cáo chéo
Lưu ý! Quảng cáo chéo của IDFV yêu cầu SDK 6.0.2+. IDFV được thu thập tự động và nhà phát triển không cần thực hiện thêm hành động nào.
Ứng dụng quảng cáo chéo có thể là một yếu tố tăng trưởng chính trong việc thúc đẩy các lượt cài đặt thêm cho ứng dụng của bạn. AppsFlyer cho phép bạn phân bổ và ghi nhận các cài đặt có nguồn gốc từ quảng cáo chéo của một trong những ứng dụng của bạn từ bên trong ứng dụng hiện tại mà người dùng có.Để biết thêm thông tin chi tiết, vui lòng xem bài viết Phân bổ Quảng cáo chéo, tại đây.
11. Bộ định danh người dùng
Nhận ID AppsFlyer
ID duy nhất của AppsFlyer được tạo cho mỗi lần ứng dụng được cài đặt mới. Bạn có thể sử dụng ID này cho nhiều mục đích khác nhau:
- Gửi các sự kiện trong ứng dụng server-to-server .
- Khớp ID với hồ sơ người dùng trong các hệ thống backend của bạn.
- Ánh xạ các mục khi hợp nhất dữ liệu từ API kéo và đẩy.
Sử dụng API sau để lấy ID duy nhất:
NSString *appsflyerId = [AppsFlyerLib shared].getAppsFlyerUID;
let appsflyerId = AppsFlyerLib.shared().getAppsFlyerUID()
Thiết lập ID người dùng Customer User ID
Để thiết lập ID người dùng Customer User ID:
[AppsFlyerLib shared].customerUserID = @"my user id";
AppsFlyerLib.shared().customerUserID = "my user id"
Trong iOS, Customer User ID cần được đặt cho mỗi lần khởi chạy ứng dụng. Chúng tôi khuyên bạn nên đặt Customer User ID sớm trong luồng của ứng dụng, vì nó chỉ được liên kết với các sự kiện được báo cáo sau khi thiết lập:
- Nếu
setCustomerUserId
được gọi trước khi gọistart
, Customer User ID sẽ xuất hiện trong các báo cáo dữ liệu thô cho các lượt cài đặt và sự kiện. - Nếu được đặt sau, Customer User ID chỉ được liên kết với các sự kiện được ghi lại sau khi đặt ID Người dùng Khách hàng.
Nhận Customer User ID:
Để tránh thiết lập lại giá trị ID Người dùng Khách hàng sau lần khởi chạy đầu tiên và để giảm các cuộc gọi đến máy chủ của bạn để lấy Customer User ID, bạn có thể kiểm tra xem giá trị của nó có trống hay không bằng cách:
NSString *customerUserID = [AppsFlyerLib shared].customerUserID;
let customerUserID = AppsFlyerLib.shared().customerUserID
Để biết thêm thông tin về Customer User ID, nhấp vào đây.
Trì hoãn Khởi tạo SDK cho customerUserID
Bạn có thể trì hoãn Khởi tạo SDK cho đến khi Customer User ID được thiết lập. Điều này hữu ích nếu bạn cần là dữ liệu cài đặt và sự kiện chứa customer user ID của bạn.
Thực hiện mã sau:
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSString *customUserId = [[NSUserDefaults standardUserDefaults] stringForKey:@"customerUserId"]; // Your custom logic of retrieving CUID
if (customUserId != nil && ![customUserId isEqual: @""]) {
[AppsFlyerLib shared].customerUserID = customUserId; // Set CUID in AppsFlyer SDK for this session
[[AppsFlyerLib shared] start]; // Start
}
}
func applicationDidBecomeActive(_ application: UIApplication) {
let customUserId = UserDefaults.standard.string(forKey: "customUserId") // your logic to retrieve CUID
if(customUserId != nil && customUserId != ""){
AppsFlyerLib.shared().customerUserID = customUserId // Set CUID in AppsFlyer SDK for this session
AppsFlyerLib.shared().start() // Start
}
}
Để tìm hiểu thêm về việc trì hoãn khởi tạo SDK cho đến khi Customer User ID khả dụng, hãy truy cập tại đây .
Cảnh báo
Chỉ sử dụng API này trong trường hợp phù hợp với logic kinh doanh của bạn. Sử dụng API này sẽ tăng cơ hội tạo ra sự khác biệt và có thể khiến ứng dụng dễ bị gian lận hơn.
12. Quyền riêng tư của người dùng
Lựa chọn không tham gia
Trong một số trường hợp nghiêm trọng, bạn có thể sẽ phải tắt tất cả các tùy chọn ghi dữ liệu SDK để bảo đảm tuân thủ pháp luật và quyền riêng tư. Có thể thực hiện được điều này bằng thuộc tính isStopped. Khi thuộc tính này được đặt thành true, SDK sẽ ngừng hoạt động và không còn giao tiếp với các máy chủ AppsFlyer.
Có một số trường hợp khác nhau để người dùng lựa chọn không tham gia. Chúng tôi khuyên bạn nên thực hiện theo những hướng dẫn chính xác cho từng trường hợp liên quan tới ứng dụng của bạn.
Cảnh báo
Chỉ sử dụng API isStopped trong trường hợp bạn muốn bỏ qua hoàn toàn người dùng này khỏi bất kỳ và tất cả các bản ghi. Việc sử dụng API này ảnh hưởng NGHIÊM TRỌNG đến việc phân bổ, thu thập dữ liệu và cơ chế liên kết sâu của bạn.
[AppsFlyerLib shared].isStopped = true;
AppsFlyerLib.shared().isStopped = true
Trong bất kỳ sự kiện nào, SDK có thể được kích hoạt lại bằng cách gọi API tương tự, nếu kết quả là sai.
Quan trọng!
Không gọi start
nếu isStopped
được đặt là true
Để bắt đầu ghi lại dữ liệu, hãy đặt isStopped
là false
.
Ẩn danh Dữ liệu Người dùng
Sử dụng API này trong quá trình Khởi tạo SDK để ẩn danh hoàn toàn các cài đặt, sự kiện và phiên của người dùng:
[AppsFlyer shared].disableAdvertisingIdentifier = YES;
AppsFlyerLib.shared().disableAdvertisingIdentifier = true
Chức năng ghi dữ liệu có thể được khởi động lại bằng cách đặt anonymizeUser
thành false.
Cảnh báo
Việc ẩn danh người dùng ảnh hưởng đến thông tin phân bổ của bạn.Sử dụng tùy chọn này trong trường hợp bạn bị hạn chế về mặt pháp lý trong việc thu thập thông tin người dùng.
Cấu hình hỗ trợ Minh bạch về Theo dõi Ứng dụng (ATT)
Tin nhắn của Apple cho biết rằng bắt đầu từ iOS 14.5, việc thu thập IDFA sẽ yêu cầu phải có sự cho phép của người dùng. Trên thực tế, điều đó có nghĩa là quyền truy cập IDFA sẽ được điều chỉnh bởi khung Minh bạch về Theo dõi Ứng dụng (ATT). Trên thiết bị iOS từ phiên bản 14+ trở lên, SDK iOS của AppsFlyer sử dụng khung ATT để có quyền truy cập vào IDFA của thiết bị.
Khi phân bổ xảy ra bằng cách sử dụng IDFA, quan trọng là IDFA phải được gửi vào lần khởi chạy đầu tiên. Vì lý do này, SDK cung cấp tiện ích waitForATTUserAuthorization
.
Tổng quan về triển khai
waitForATTUserAuthorization
cho phép bạn định cấu hình thời gian SDK hoãn gửi dữ liệu đến máy chủ AppsFlyer và đợi trạng thái của ATT. Việc triển khai hỗ trợ ATT đầy đủ bao gồm:
- Cấu hình
waitForATTUserAuthorization
trong giai đoạn khởi tạo ứng dụng - Gọi ra
ATTrackingManager.requestTrackingAuthorization
, bất cứ khi nào hộp thoại đồng ý ATT hiển thị
Mô tả waitForATTUserAuthorization
Khi người dùng khởi chạy ứng dụng, trạng thái ATT là notDetermined. Trong thời gian chờ waitForATTUserAuthorization
:
- SDK xếp hàng đợi cho sự kiện khởi chạy và các sự kiện trong ứng dụng liên tiếp trong bộ nhớ, tương tự như cách các sự kiện ngoại tuyến được ghi nhận
- Nếu người dùng cho phép thu thập IDFA:
- SDK sẽ thêm IDFA vào các sự kiện được lưu trong bộ nhớ tạm
- SDK bắt đầu và gửi các sự kiện được lưu trong bộ nhớ tạm cùng với IDFA (mà không cần đợi hết thời gian chờ)
- Nếu người dùng không cho phép thu thập IDFA:
- SDK bắt đầu và gửi các sự kiện được lưu trong bộ nhớ tạm không kèm theo IDFA (mà không cần đợi hết thời gian chờ)
- Nếu thời gian chờ kết thúc và trạng thái ATT vẫn là notDetermined, thì SDK sẽ bắt đầu và gửi các sự kiện đã lưu trong bộ nhớ tạm mà không kèm theo IDFA.
Những điều cần lưu ý
- Nếu người dùng chuyển ứng dụng sang chạy ngầm trong thời gian chờ:
- Bộ hẹn giờ tạm dừng cho đến khi ứng dụng quay trở lại chế độ chạy nổi
- Sự kiện được lưu vào bộ nhớ tạm
- Nếu người dùng tắt theo quy trình hoặc tắt hẳn đột ngột ứng dụng trong thời gian chờ:
- Bộ hẹn giờ được khởi động lại vào lần khởi chạy ứng dụng tiếp theo
- Sự kiện được lưu vào bộ nhớ tạm sẽ bị mất
Hạn chế
-
Trên iOS 14.5+, để thu thập IDFA thì
waitForATTUserAuthorization
là bắt buộc. Không gọi rawaitForATTUserAuthorization
sẽ dẫn đến việc các lượt khởi chạy được gửi mà không có IDFA - Không gọi ra
start
khi gọi lạirequestTrackingAuthorization
. Làm như vậy có thể dẫn đến phân bổ không đầy đủ hoặc bị lỗi
Cấu hình hỗ trợ ATT trong SDK iOS
Để cấu hình hỗ trợ ATT trong SDK iOS:
-
Trong mã khởi tạo của bạn, hãy cấu hình
waitForATTUserAuthorization
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[AppsFlyerLib shared] setAppsFlyerDevKey:@"<AF_DEV_KEY>"]; [[AppsFlyerLib shared] setAppleAppID:@"<APPLE_APP_ID>"]; [[AppsFlyerLib shared] setDelegate:self]; [[AppsFlyerLib shared] waitForATTUserAuthorizationWithTimeoutInterval:60]; return YES; }
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerLibDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { AppsFlyerLib.shared().appsFlyerDevKey = "<AF_DEV_KEY>" AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>" AppsFlyerLib.shared().delegate = self AppsFlyerLib.shared().waitForATTUserAuthorization(timeoutInterval: 60) ... } ... }
-
Trong mã ứng dụng của bạn, hãy gọi ra
ATTrackingManager.requestTrackingAuthorization
để hiển thị hộp thoại đồng ý ATT. Ví dụ: nếu bạn muốn hiển thị cho người dùng hộp thoại đồng ý khi một chế độ xem nhất định tải xong:- (void)viewDidLoad { [super viewDidLoad]; if #available(iOS 14, *) { [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { NSLog(@"Status: %lu", (unsigned long)status); }]; } }
override func viewDidLoad() { super.viewDidLoad() if #available(iOS 14, *) { ATTrackingManager.requestTrackingAuthorization { (status) in } } }
Lệnh gọi này kích hoạt hộp thoại đồng ý ATT.
Tùy chỉnh hộp thoại đồng ý ATT
Tùy chỉnh hộp thoại đồng ý ATT
- Chọn tệp tin
Info.plist
của dự ántrong Trình điều hướng Dự án Xcode. - Thêm một mục nhập vào danh sách: Nhấn
+
bên cạnhInformation Property List
(Danh sách Thuộc tính Thông tin). - Cuộn xuống và chọn
Privacy - Tracking Usage Description
(Quyền riêng tư - Theo dõi Mô tả Lưu lượng sử dụng). - Thêm dưới dạng
giá trị
từ ngữ bạn muốn trình bày với người dùng khi yêu cầu quyền thu thập IDFA.
Ứng dụng dành cho trẻ em
Để cung cấp ứng dụng trong Mục Trẻ em trong App Store, Apple yêu cầu bạn không "truyền phát thông tin nhận dạng cá nhân hoặc thông tin thiết bị cho bên thứ ba". Để tuân thủ điều này, bạn phải tắt khung AdSupport và iAD.
Để tắt các khung quảng cáo:
-
disableCollectASA = true
. Tìm hiểu thêm -
disableAdvertisingIdentifier = true
. Tìm hiểu thêm
[AppsFlyerLib shared].disableCollectASA = YES [AppsFlyerLib shared].disableAdvertisingIdentifier = YES;
AppsFlyerLib.shared().disableCollectASA = true AppsFlyerLib.shared().disableAdvertisingIdentifier = true
Loại trừ các đối tác không được lấy dữ liệu
Trong một số trường hợp, nhà quảng cáo có thể muốn ngừng chia sẻ dữ liệu cấp người dùng với các mạng/đối tác quảng cáo cho những người dùng cụ thể. Lý do cho điều này bao gồm:
- Các chính sách bảo mật như CCPA hoặc GDPR
- Cơ chế chọn lựa không tham gia của người dùng
- Cạnh tranh với một số đối tác (mạng quảng cáo, bên thứ 3)
AppsFlyer cung cấp hai phương thức API để ngừng chia sẻ dữ liệu với một số hoặc tất cả các đối tác:
- setSharingFilter: Được nhà quảng cáo sử dụng để ngăn chặn việc chia sẻ dữ liệu với một số (một hoặc nhiều) mạng/đối tác tích hợp.
- setSharingFilterForAllPartners: Được các nhà quảng cáo sử dụng để ngăn chặn việc chia sẻ dữ liệu với tất cả các mạng lưới/đối tác tích hợp.
Các phương thức lọc này được hỗ trợ từ SDK V5.4.1.
Phương thức lọc phải được gọi mỗi khi SDK được khởi tạo và ảnh hưởng đến toàn phiên. Nếu cần thời gian để xác định xem bạn có cần đặt bộ lọc chia sẻ hay không, thì hãy trì hoãn quá trình khởi tạo SDK.
Khi phương thức này được kích hoạt trước lệnh gọi start đầu tiên:
- Người dùng từ SRN được phân bổ là Tự nhiên và dữ liệu của họ không được chia sẻ với các đối tác tích hợp.
- Người dùng từ mạng quảng cáo lượt nhấp (không phải SRN) được phân bổ chính xác trên AppsFlyer, nhưng không được chia sẻ với mạng quảng cáo thông qua postback, API, báo cáo dữ liệu thô hoặc bằng bất kỳ phương thức nào khác.
Hiện tại, không thể lọc dữ liệu gỡ cài đặt bằng các phương thức này. Tuy nhiên, bạn có thể ngừng gửi sự kiện Gỡ cài đặt cho đối tác bằng cách sử dụng trang thiết lập trong AppsFlyer.
continueUserActivity
Mô tả |
Gọi ra onAppOpenAttribution khi một ứng dụng được mở từ Universal Link cho iOS 9 trở lên. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
currencyCode
Mô tả |
Thiết lập mã tiền tệ cho các sự kiện có doanh thu. Chấp nhận mã tiền tệ ISO. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
anonymizeUser
Mô tả |
Ẩn danh cài đặt, sự kiện và các phiên của người dùng. Để biết thêm thông tin, hãy xem ẩn danh dữ liệu người dùng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
disableCollectASA
Mô tả |
Bắt đầu từ SDK phiên bản 4.8.11, SDK AppsFlyer tự động tải iAd.framework của Apple. Khung này là cần thiết để ghi nhận và đo lường hiệu suất các quảng cáo Tìm kiếm Apple trong ứng dụng của bạn. Nếu bạn không muốn AppsFlyer tải động khung này, hãy đặt thuộc tính này thành true. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
handleOpenUrl
Mô tả |
Phương pháp này báo cáo lược đồ URI cho SDK AppsFlyer khi ứng dụng mở bằng liên kết sâu với lược đồ URI. Phương pháp này được đặt bên trong AppDelegate. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
handlePushNotification
Mô tả |
Đo lường và nhận dữ liệu từ các chiến dịch thông báo đẩy. Để biết thêm thông tin, hãy xem phần ghi nhận thông báo đẩy. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
isDebug
Mô tả |
Hiển thị nhật ký SDK AppsFlyer trong giao diện điều khiển Xcode. Gỡ lỗi chỉ nên được giới hạn trong giai đoạn phát triển. Không phân phối ứng dụng cho các cửa hàng ứng dụng có bật gỡ lỗi. Điều này gây ra những rủi ro lớn về bảo mật và quyền riêng tư. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
isStopped
Mô tả |
Tắt tất cả chức năng SDK. Để biết thêm thông tin, vui lòng xem quyền riêng tư của người dùng - từ chối. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
onAppOpenAttribution
Mô tả |
Nhận dữ liệu liên kết sâu khi một ứng dụng mở thông qua một liên kết sâu. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
onAppOpenAttributionFailure
Mô tả |
Xử lý lỗi khi nhận dữ liệu liên kết sâu. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
onConversionDataSuccess
Mô tả |
Nhận dữ liệu chuyển đổi sau khi cài đặt. Hữu ích cho liên kết sâu bị trì hoãn. Lưu ý: Trong SDK |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
onConversionDataFail
Mô tả |
Xử lý lỗi khi không nhận được dữ liệu chuyển đổi từ các lượt cài đặt. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
didResolveDeepLink
Mô tả |
Đưa người dùng di động đã cài đặt và chưa cài đặt ứng dụng của bạn đến một hoạt động trong ứng dụng cụ thể ngay sau khi ứng dụng được mở. Tìm hiểu thêm |
Chữ ký phương thức |
|
performOnAppAttribution
Mô tả |
Cho phép các nhà phát triển kích hoạt lại onAppOpenAttribution theo cách thủ công bằng một liên kết cụ thể (URI hoặc URL), mà không cần ghi nhận một lần thu hút lại mới. Phương thức này có thể được yêu cầu nếu ứng dụng cần chuyển hướng người dùng dựa trên liên kết đã cho hoặc phân giải URL ngắn của AppsFlyer trong khi vẫn ở nền trước/đã mở. Điều này có thể cần thiết vì lệnh gọi lại onAppOpenAttribution thông thường chỉ được gọi nếu ứng dụng được mở bằng liên kết sâu. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
registerUninstall
Mô tả |
Đo lường lượt gỡ cài đặt. Xem đo lường lượt gỡ cài đặt cho iOS. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
resolveDeepLinkURLs
Mô tả |
Giải quyết OneLink từ các miền nhấp chuột. Để biết thêm thông tin, vui lòng xem giải quyết các URL liên kết sâu được gói. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setAdditionalData
Mô tả |
Thêm dữ liệu bổ sung được gửi đến các nền tảng đối tác bên ngoài. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
Xem cài đặt dữ liệu tùy chỉnh bổ sung. |
setAppInviteOneLink
Mô tả |
Đặt ID mẫu OneLink được sử dụng để tạo liên kết phân bổ tùy chỉnh cho lời mời của người dùng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
Xem cài đặt OneLink để phân bổ lời mời người dùng. |
setAppleAppID
Mô tả |
Đặt ID ứng dụng của bạn (ID itunes) để SDK có thể gửi dữ liệu đến đúng bảng điều khiển ứng dụng. Sử dụng ID đó khi bạn khởi tạo SDK. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
appsFlyerDevKey
Mô tả |
Đặt khóa dev của AppsFlyer để SDK có thể gửi dữ liệu đến đúng bảng điều khiển ứng dụng. Sử dụng khóa đó khi bạn khởi tạo SDK. Để tìm hiểu cách lấy khóa dev, hãy xem tại đây. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
Thiết lập ID người dùng Customer User ID
Mô tả |
Thiết lập Customer User ID. Để biết thêm thông tin, hãy xem thiết lập Customer User ID. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
setPartnerData
Mô tả |
Đối tác và nhà quảng cáo có thể thêm nhiều dữ liệu hơn trong các sự kiện SDK. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setSharingFilter
Mô tả |
Được các nhà quảng cáo sử dụng để đặt một số (một hoặc nhiều) mạng/đối tác tích hợp để loại trừ không được lấy dữ liệu. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setSharingFilterForAllPartners
Mô tả |
Được nhà quảng cáo sử dụng để loại trừ tất cả các mạng/đối tác tích hợp không được lấy dữ liệu. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setShouldCollectDeviceName
Mô tả |
Liệu SDK có nên thu thập tên thiết bị hay không. Mặc định là false. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setUseUninstallSandbox
Mô tả |
Để kiểm tra lượt gỡ cài đặt cho các ứng dụng vẫn đang được phát triển (chưa được phát hành lên Apple App Store), hãy đặt thuộc tính này thành true. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
startWithCompletionHandler
Mô tả |
Kiểm tra xem lệnh start có thành công hay không. Bạn có thể triển khai logic của riêng mình để xử lý các trạng thái thành công hay thất bại của việc khởi chạy SDK. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
logEvent
Mô tả |
Gửi các sự kiện trong ứng dụng tới AppsFlyer. Để biết thêm thông tin, vui lòng xem ghi nhận sự kiện trong ứng dụng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
validateAndLogInAppPurchase
Mô tả |
Đặt khóa dev của AppsFlyer để SDK có thể gửi dữ liệu đến đúng bảng điều khiển ứng dụng. Để tìm hiểu cách lấy khóa dev, hãy xem tại đây. Sử dụng ID đó khi bạn khởi tạo SDK. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
Xem Xác thực mua trong ứng dụng. |
disableAdvertisingIdentifier
Mô tả |
Bắt đầu từ SDK phiên bản 4.8.11, SDK AppsFlyer tự động tải adSupport.framework của Apple. Cần thiết phải có khung này để thu thập IDFA cho các nhu cầu phân bổ. Nếu bạn không muốn AppsFlyer tải động khung này, hãy đặt thuộc tính này thành true. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
[AppsFlyerLib shared].disableAdvertisingIdentifier= YES; AppsFlyerLib.shared().disableAdvertisingIdentifier = true |
waitForATTUserAuthorization
Mô tả |
Sử dụng phương thức này nếu bạn muốn thu thập IDFA trên iOS 14.5+ bằng cách yêu cầu sự cho phép của người dùng. Nếu người dùng chọn tham gia, IDFA sẽ được gửi đến SDK. Khoảng thời gian chờ cấp cho người dùng một khoảng thời gian nhất định để chọn tham gia hoạt động thu thập IDFA. Sau khi bộ định thời hết hạn, IDFA không được thu thập. Để biết thêm chi tiết, hãy xem cách cấu hình hỗ trợ ATT. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
start
Mô tả |
Khi API này được gọi ra, SDK sẽ khởi động, các phiên sẽ được gửi ngay lập tức và tất cả các chuyển đổi nền sau-nền trước sẽ ghi nhận một phiên. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
logLocation
Mô tả |
Ghi nhận vị trí người dùng theo cách thủ công. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
appendParametersToDeepLinkingURL
Mô tả |
Cho phép chủ sở hữu ứng dụng sử dụng Liên kết Chung để liên kết sâu (không có OneLink) để phân bổ các phiên được khởi tạo thông qua miền được liên kết với ứng dụng của họ. Gọi ra phương thức này trước khi gọi lệnh start. Phương thức này yêu cầu:
|
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
addPushNotificationDeepLinkPath
Mô tả |
Cấu hình cách SDK trích xuất các giá trị liên kết sâu từ các tải trọng thông báo đẩy. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
Lệnh gọi này khớp với cấu trúc tải trọng sau:
|
disableSKAdNetwork
Mô tả |
Cho phép bạn tắt phân bổ SKAdNetwork. Đặt thành true để tắt. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
Bình luận
Vui lòng đăng nhập để viết bình luận.