9

我的iOS應用程序有鏈接到蘋果的App Store中,我試圖追蹤這些事件。iOS應用程序轉到後臺時,我們如何派遣Google Analytics事件?

問題是,我們無法讓我的應用程序在進入後臺之前正確分配GA事件。我們正在使用iOS SDK v2beta4。

這裏是我們使用的代碼的概述。你可以看到我們已經投入了很多我稱之爲「保險策略」的代碼,因爲我們認爲是正確的方式不起作用。但即使是保險政策代碼並不總是在我的應用程序進入後臺之前調度事件。它只能工作大約50%的時間,其餘時間我必須返回到應用程序才能派發事件。

我們相信正確的方法是在「applicationDidEnterBackground」中派發事件並通過「beginBackgroundTaskWithExpirationHandler」請求iOS額外的時間來完成此操作。我們已經嘗試了這個代碼,但沒有使用我的「保險單」代碼。至少我相信我們正確地評論了每一行保險代碼。

請注意,我們設置全局變量UIBackgroundTaskIdentifier bgTask;與代碼

UIBackgroundTaskIdentifier bgTask; 

這裏AppDelegate.h頭文件是我們認爲是這樣做的正確方法的代碼:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplication *app = [UIApplication sharedApplication]; 

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     [[GAI sharedInstance] dispatch]; 

     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
} 

上面的代碼是什麼,我們認爲應該工作,但不不。注意:App Store不是一個普通的應用程序,而是一個應用程序中的網站,如果這有所幫助的話。

正如我們已經做了哪些調度事件有關的50%的時間一些其他的東西保單:

第[GAI sharedInstance]調度]在功能立即調用其中跟蹤已設置

的源代碼:

- (IBAction)goToAppStore:(id)sender 
{  
    ... 
    // Tracking 
    // Using events (pressing on buttons) 

    id <GAITracker> tracker = [[GAI sharedInstance] defaultTracker]; 

    [tracker sendEventWithCategory:@"App Checkout" 
         withAction:@"Checkout Button Pressed" 
         withLabel:nameApp.text 
         withValue:nil]; 

    [[GAI sharedInstance] dispatch]; 
    ... 
} 

我們也把它放在 「applicationWillResignActive」

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    ... 
    [[GAI sharedInstance] dispatch]; 
} 

最後當你徹底關閉應用程序的另一個GA派遣被稱爲這個

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    [[GAI sharedInstance] dispatch]; 
} 

無運作時間的100%。只有大約50%的時間。所以我們這樣做:當你重新進入應用程序(也不要緊,如果從背景或應用已經完全關閉)我們發送調度

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[GAI sharedInstance] dispatch]; 
} 

利用這最後一點的調度事件,但只有當用戶返回到我的應用程序。雖然我不是100%確定是否這個代碼在我回到應用程序時返回應用程序或GA默認調度時分派事件。

回答

2

[[GANTracker sharedTracker] dispatchSynchronous:]使用

dispatch方法將執行一個異步操作。因此,它將立即返回而無需等待調度操作完成。在實際調度操作完成之前,您的應用程序可能已暫停。

- 編輯 -

看起來dispatchSynchronous:方法是在谷歌Analytics(分析)庫的最新版本了。由於GANTrackerDelegate也沒有了,就我所見,沒有辦法找出派遣操作何時完成。因此,我建議在預定義的超時後調用endBackgroundTask:方法。這並不完美,但它比dispatch之後立即打電話要好。

您的代碼應該是這樣的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [[GAI sharedInstance] dispatch]; 

    double dispatchTimeout = 10.0; // 10 seconds timeout 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(dispatchTimeout * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_current_queue(), ^(void){ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
    }); 
}); 
+0

啊,甚至認爲蘋果的代碼在列表3-3中這裏說使用dispatch_Async? http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html – Will 2013-03-19 04:21:47

+0

@我的意思是'dispatchSynchronous:''GANTracker'的方法,但顯然它不存在於v2中的圖書館。更新了最新版本的答案。 – murat 2013-03-19 10:23:31

+0

謝謝。我非常感謝幫助,並會嘗試計時器方法。此外,我正在嘗試dispatch_async(dispatch_get_global ...而不是dispatch_async這似乎改善了一些事情,但會導致未知的問題? – Will 2013-03-19 15:40:51

2

爲 'dispatch_get_current_queue()' 目前棄用iOS 6後,您現在可以使用下面的代碼:

UIApplication *app = [UIApplication sharedApplication]; 
__block UIBackgroundTaskIdentifier bgTask; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [[GAI sharedInstance] dispatch]; 

    double dispatchTimeout = 10.0; // 10 seconds timeout 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(dispatchTimeout * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
}); 
1

在Google分析3.14有dispatchWithCompletionHandler:我使用它是這樣的:

//track any event here as usual and then call: 

GAI.sharedInstance().dispatchWithCompletionHandler({ (_) -> Void in 
    UIApplication.sharedApplication().openURL(URL) 
}) 

而且它似乎 好好工作。

相關問題