对于 iOS v2 的 Google Analytics,Google 建议将他们的类子GAITrackedViewController类化以代替UIViewController. 在 UITableViewController 的情况下我们该怎么办?
#import "GAITrackedViewController.h"
@interface AboutViewController : GAITrackedViewController
    对于 iOS v2 的 Google Analytics,Google 建议将他们的类子GAITrackedViewController类化以代替UIViewController. 在 UITableViewController 的情况下我们该怎么办?
#import "GAITrackedViewController.h"
@interface AboutViewController : GAITrackedViewController
    请记住,扩展 GAITrackedViewController 只是跟踪屏幕视图的一种方法。手动方式同样简单。
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    // returns the same tracker you created in your app delegate
    // defaultTracker originally declared in AppDelegate.m
    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    // manual screen tracking
    [tracker sendView:@"Home Screen"];
}
#import "GAI.h"
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"
...
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    // returns the same tracker you created in your app delegate
    // defaultTracker originally declared in AppDelegate.m
    id tracker = [[GAI sharedInstance] defaultTracker];
    // This screen name value will remain set on the tracker and sent with
    // hits until it is set to a new value or to nil.
    [tracker set:kGAIScreenName
           value:@"Home Screen"];
    // manual screen tracking
    [tracker send:[[GAIDictionaryBuilder createScreenView] build]];
}
https://developers.google.com/analytics/devguides/collection/ios/v2/screens#manual https://developers.google.com/analytics/devguides/collection/ios/v3/screens#manual
为了清理我的 Swift 项目中的手动跟踪代码,我创建了以下  UIViewController扩展。
extension UIViewController {
    func trackScreenView(screenName: String) {
        let tracker = GAI.sharedInstance().defaultTracker
        tracker.set(kGAIScreenName, value: screenName)
        tracker.send(GAIDictionaryBuilder.createAppView().build())
    }
}
以这种方式使用扩展可能不合适,因为我没有使用 UIViewController 中的任何属性,但这是一种比全局方法感觉更好的便捷方式。如果您不介意使用类名而不是格式良好的名称,您甚至可以使用NSStringFromClass(self.dynamicType)来获取 ViewController 类名,如下所示:
extension UIViewController {
    func trackScreenView() {
        let tracker = GAI.sharedInstance().defaultTracker
        tracker.set(kGAIScreenName, value: NSStringFromClass(self.dynamicType))
        tracker.send(GAIDictionaryBuilder.createAppView().build())
    }
}
这允许我使用以下代码从我的 UITableViewControllers 添加手动跟踪:
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    trackScreenView("Detail View")  //Or call this without any arguments if using the NSStringFromClass idea 
}
干净整洁。享受!
由于 Sdk 缺少 GAITrackedTableViewController,我创建了一个简单整洁的手动屏幕 viev 跟踪实现。
为 GAI 类创建一个类别,因为它已经是单例且易于访问。
#import "GAI+Tracking.h"
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"
@implementation GAI (Tracking)
- (void)trackScreenView:(NSString *)screenName
{
    [self.defaultTracker set:kGAIScreenName value:screenName];
    [self.defaultTracker send:[[GAIDictionaryBuilder createAppView] build]];
}
@end
现在只需像这样跟踪屏幕视图
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [[GAI sharedInstance] trackScreenView:@"Counts map screen"];
}
这种方式推翻了谷歌同时拥有多个跟踪的想法。(我还没有需要)。为了适应这一点,只需在它使用的跟踪器之后重命名您的跟踪方法,然后使用您想要的任何跟踪器。
#import "GAI+Tracking.h"
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"
@implementation GAI (Tracking)
- (void)trackDefaultScreenView:(NSString *)screenName
{
    [self.defaultTracker set:kGAIScreenName value:screenName];
    [self.defaultTracker send:[[GAIDictionaryBuilder createAppView] build]];
}
@end
    确保所有 viewDidAppear 调用 [super viewDidAppear]
然后确保你的 UITableViewController 的每一个子类也是 myTableViewController 的子类
在 [myTableViewController viewDidAppear] 中,实现所有其他答案。
只是补充所有其他好的答案。这样你就可以得到和 GAITrackedViewController.h 一样好的东西
同样的方式,我确保我所有的其他 UIViewController 子类也是超级 UIViewController 的子类,然后我做同样的事情。
对于 Swift,您可以使用
AppDelegate.appDelegateIns.defTrackerIns?.set(kGAIScreenName, value: "Enter Your Screen Name")
        AppDelegate.appDelegateIns.defTrackerIns?.send(GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject])
将其包含在您的 App Delegate 中
static let appDelegateIns = AppDelegate()
    let gai = GAI.sharedInstance()
    let defTrackerIns = GAI.sharedInstance().tracker(withTrackingId: "Your Tracking Id")
    let gaDefTargetURL = "https://developers.google.com/analytics"
    假设他们自己没有 UITableViewController 的子类,我不明白为什么你不能使用他们的 GAITrackedViewController,然后自己实现 UITableViewDataSource 和 UITableViewDelegate 协议。
UITableViewController 继承自 UIViewController : UIResponder : NSObject
On 可以将 GAITrackedViewController 子类化,并且对于从 UIViewController 继承的几乎任何类型的 ViewController 都不做任何额外的事情。