Khái quát: SDK iOS V6.X của AppsFlyer, được gọi là SDK, cung cấp chức năng báo cáo sự kiện và phân bổ ứng dụng cho các ứng dụng iOS đồng thời cho phép chủ sở hữu và nhà phát triển ứng dụng chuẩn bị cho bản phát hành iOS 14 sắp tới. Phiên bản SDK này kết hợp những thay đổi đáng kể về phương thức so với các phiên bản trước.
Ghi chú phát hành (lên đến phiên bản V6.0.4)
Quan trọng!
SDK iOS V5.4.4 hoạt động hoàn toàn với iOS 14. Tuy nhiên, chúng tôi đề nghị bạn nên cập nhật lên SDK V6 để đả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. đối với các bản cập nhật iOS trong tương lai. Xem Cập nhật lên SDK iOS V6.
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ợ |
---|---|
iOS 13 trở xuống |
|
iOS 14 trở lên (đã thử nghiệm bằng iOS 14 beta 7) |
|
* 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 |
Hướng dẫn cách sử dụng API lõi SDK. Các API này cho phép bạn đo lường các sự kiện và doanh thu trong ứng dụng, thực hiện liên kết sâu và thu thập dữ liệu chuyển đổi. |
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. |
Hướng dẫn cách triển khai và sử dụng các API tùy chọn như đo lường lượt gỡ cài đặt, lượt giới thiệu (phân bổ lời mời của người dùng) và thông báo đẩy. |
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 nhanh các API SDK cho nhà phát triển |
|
1.2 Khả năng tương thích của SDK với iOS
- SDK này:
- Tương thích với tất cả các thiết bị iOS và tvOS (iPhone, iPod, iPad, Apple TV) với iOS phiên bản 6 trở lên và tvOS phiên bản 9 trở lên.
- Phù hợp với mạng IPv6 DNS64/NAT64 của Apple.
Lưu ý
Sắp có các Clip về Ứng dụng iOS 14 của Apple!
Hãy tìm hiểu trong Clip Hướng dẫn Toàn tập về Ứng dụng dành cho Nhà phát triển của chúng tôi
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 Thêm khung hỗ trợ quảng cáo
SDK này sử dụng các khung gốc dưới đây:
- 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
- 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 muốn xóa các khung này và tắt chức năng thu thập IDFA:
- Để tắt chức năng thu thập IDFA, hãy xem hướng dẫn tại đây.
- Để tắt iAd.framework, hãy xem hướng dẫn tại đây.
Để thêm khung hỗ trợ quảng cáo:
- Trong dự án Xcode của bạn, hãy chọn mục tiêu của dự án.
- Chọn tab Tổng quan cho mục tiêu của bạn.
- Mở rộng phần 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 triển khai và khởi tạo Unity SDK iOS của AppsFlyer.
3.1 Lấy khóa dev của bạn
AppsFlyer sử dụng khóa dev để xác định duy nhất tài khoản của bạn. Khóa dev là bắt buộc vì khóa cho phép SDK gửi và truy xuất dữ liệu một cách an toàn thuộc tài khoản AppsFlyer của bạn.
Thực hiện:
- Đi tới bảng điều khiển ứng dụng của bạn.
- Trong bảng điều khiển, dưới phần Cấu hình nhấp Cài đặt Ứng dụng
- Sao chép khóa dev của bạn
3.2 Cấu hình SDK trong ủy nhiệm hàm ứng dụng
In AppDelegate.h, thực hiện những việc sau:
- Nhập
AppsFlyerLib/AppsFlyerLib.h
. - Thêm
AppsFlyerLibDelegate
vào phần khai báo giao diện.
#import <UIKit/UIKit.h>
#import <AppsFlyerLib/AppsFlyerLib.h>
#import <AppTrackingTransparency/ATTrackingManager.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerLibDelegate>
@end
In AppDelegate.swift, thực hiện những việc sau:
- Import AppsFlyerLib.
- Thêm
AppsFlyerLibDelegate
vào phần khai báo lớp.
import AppsFlyerLib
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerLibDelegate {
// your code here
}
3.3 Khởi tạo SDK
#import "AppDelegate.h"
#import <AppsFlyerLib/AppsFlyerLib.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/** APPSFLYER INIT **/
[AppsFlyerLib shared].appsFlyerDevKey = @"<YOUR_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 none organic install. Media source: %@ Campaign: %@",sourceID,campaign);
} else if([status isEqualToString:@"Organic"]) {
NSLog(@"This is an organic install.");
}
}
-(void)onConversionDataFail:(NSError *) error {
NSLog(@"%@",error);
}
//Handle Direct Deep Link
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
NSLog(@"%@",attributionData);
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@",error);
}
@end
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 {
UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
UIApplication.shared.registerForRemoteNotifications()
}
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Start the SDK (start the IDFA timeout set above, for iOS 14 or later)
AppsFlyerLib.shared().start()
}
// Open Univerasal Links
// For Swift version < 4.2 replace function signature with the commented out code:
// func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
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: AppsFlyerTrackerDelegate
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.4 Hỗ trợ phân bổ SKAdNetwork
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.
3.4 Hỗ trợ cho cảnh đại diện
Để hỗ trợ liên kết sâu, bắt đầu bằng việc hướng người dùng đến cảnh mặc định của ứng dụng, hãy thêm mã sau vào SceneDelegate cho cảnh mặc định mà bạn muốn người dùng liên kết sâu vào.
1. Nhập thư viện
Trong SceneDelegate.h, nhập AppsFlyerLib/AppsFlyerLib.h
:
#import <AppsFlyerLib/AppsFlyerLib.h>
Trong SceneDelegate.swift, hãy nhập AppsFlyerLib
:
import AppsFlyerLib
2. Thêm thực hiện
#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
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.7 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.
4.1 Đưa thiết bị thử nghiệm của bạn vào danh sách cho phép
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.
- Đưa thiết bị bạn sẽ tiến hành thử nghiệm vào danh sách cho phép.
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:
Tham sốhttps://app.appsflyer.com/<APP_ID>?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.
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.
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>
})
[AppsFlyerLib shared].useReceiptValidationSandbox = YES;
AppsFlyerLib.shared().useReceiptValidationSandbox = true
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.
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
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
Để 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 sẽ làm ảnh hưởng NGHIÊM TRỌNG đến thông tin phân bổ của bạn.CHỈ sử dụng tùy chọn này cho các khu vực mà pháp luật nghiêm cấm thu thập thông tin của người dùng.
Hỗ trợ AppTrackingTransparency (ATT)
Thông báo của Apple cho biết rằng trong tương lai, iOS 14 sẽ yêu cầu ủy quyền của người dùng để thu thập IDFA.
Hiện tại, IDFA được thu thập theo mặc định. Tuy nhiên, đối với từ iOS 14 beta 7 trở lên, bạn có tùy chọn yêu cầu ủy quyền người dùng để thu thập IDFA thông qua hộp thoại đồng ý. Nếu người dùng chọn không tham gia thì IDFA sẽ không được thu thập. Khoảng thời gian chờ sẽ trì hoãn việc gửi yêu cầu đến máy chủ AppsFlyer. Sau khi bộ định thời hết hạn, yêu cầu sẽ được gửi đi.
Để yêu cầu ủy quyền người dùng thu thập IDFA, hãy thêm mã sau trước start()
:
// The following block is for applications wishing to give users the option to block IDFA collection.
// for iOS 14 and above - The user can be prompted to block IDFA collection.
// If user opts-out, the IDFA will not be collected by the SDK.
// for iOS 13 and below - The IDFA will be collected by the SDK. The user will NOT be prompted to block collection.
if #available(iOS 14, *) {
// Set a timeout for the SDK to wait for the IDFA collection before handling app launch
// If timeout expires before user asks to block IDFA collection, the IDFA will be collected.
[[AppsFlyerLib shared] waitForATTUserAuthorizationWithTimeoutInterval:60];
// Show the user the Apple IDFA consent dialog
(AppTrackingTransparency)
// MUST be called here before start() in order to prevent IDFA collection by the SDK
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
//....
}];
}
// The following block is for applications wishing to give users the option to block IDFA collection.
// for iOS 14 and above - The user can be prompted to block IDFA collection.
// If user opts-out, the IDFA will not be collected by the SDK.
// for iOS 13 and below - The IDFA will be collected by the SDK. The user will NOT be prompted to block collection.
if #available(iOS 14, *) {
// Set a timeout for the SDK to wait for the IDFA collection before handling app launch
// If timeout expires before user asks to block IDFA collection, the IDFA will be collected.
AppsFlyerLib.shared().waitForATTUserAuthorization(timeoutInterval: 60)
// Show the user the Apple IDFA consent dialog (AppTrackingTransparency)
// MUST be called here before start() in order to prevent IDFA collection by the SDK
ATTrackingManager.requestTrackingAuthorization { (status) in
}
}
Để định cấu hình văn bản được hiển thị cho người dùng trong cửa sổ bật lên:
- 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.
Lưu ý: văn bản đề xuất cho ATT
- Để phục vụ bạn nội dung dựa trên sở thích cá nhân của bạn, ứng dụng cần bạn cho phép
- Để phục vụ bạn nội dung được cá nhân hóa phù hợp, ứng dụng cần quyền truy cập vào ID thiết bị của bạn cho các nhà quảng cáo
Các hành động người dùng có thể thực hiện trong cửa sổ bật lên ATT và kết quả (dựa trên bộ định thời do nhà phát triển đặt trong phương thức waitForATTUserAuthorization) được liệt kê trong bảng sau.
Lưu ý: Sau khi bộ định thời hết hạn, SDK AppsFlyer sẽ được khởi chạy, có hoặc không thu thập IDFA.
Hành động của người dùng | Kết quả |
---|---|
Lựa chọn tham gia hoạt động thu thập IDFA trước khi bộ định thời hết hạn |
IDFA được thu thập |
Lựa chọn không tham gia hoạt động thu thập IDFA trước khi bộ định thời hết hạn |
IDFA không được thu thập |
Để mặc cửa sổ bật lên ở chế độ nền |
Bộ định thời tạm dừng cho đến khi người dùng đưa nó trở lại nền trước |
Để mặc cửa sổ bật lên ở chế độ nền trước, sau đó lựa chọn tham gia sau khi bộ định thời hết hạn |
IDFA được thu thập |
Để mặc cửa sổ bật lên ở chế độ nền trước, sau đó lựa chọn tham gia sau khi bộ định thời hết hạn |
IDFA không được thu thập |
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 ý: Bắt đầu từ SDK V5, |
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 |
|
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 |
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. |
disableAdvertiserIdentifier
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].disableAdvertiserIdentifier= YES; AppsFlyerLib.shared().disableAdvertiserIdentifier = true |
waitForATTUserAuthorization
Mô tả |
Được sử dụng nếu bạn muốn yêu cầu ủy quyền người dùng thông qua cửa sổ bật lên trước khi truy cập dữ liệu liên quan đến ứng dụng để ghi nhận người dùng hoặc thiết bị (ví dụ: IDFA). Nếu người dùng chọn tham gia, IDFA sẽ được chuyển đế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. |
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 |
|
Bình luận
Vui lòng đăng nhập để viết bình luận.