GAITrackedViewController和UITableViewController GAITrackedViewController是一个视图控制器类,它可以跟踪用户在应用程序中的行为。UITableViewController是一个表格视图控制器类,它可以轻松地创建带有表格的视图控制器。

69

在 iOS 版 Google Analytics v2 中,Google 建议我们将 GAITrackedViewController 类子类化来替代 UIViewController。那么,在 UITableViewController 的情况下该怎么办呢?

来源

#import "GAITrackedViewController.h"

@interface AboutViewController : GAITrackedViewController
7个回答

126

手动屏幕跟踪

请记住,扩展GAITrackedViewController只是跟踪屏幕视图的一种方式。手动方式同样简单。

SDK v2

- (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"];
}

SDK v3

#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]];
}

Reference

https://developers.google.com/analytics/devguides/collection/ios/v2/screens#manual https://developers.google.com/analytics/devguides/collection/ios/v3/screens#manual


2
请确保在您的.h文件中包含以下行:#import "GAITrackedViewController.h" - dmzza
2
为什么你在 viewWillAppear 中调用 sendView?在 viewDidAppear 中调用会更好吗? - Vadim
13
为了让kGAIScreenName可用,我不得不 #import "GAIFields.h"。 - X.Y.
1
最好在 viewDidAppear 中完成,GAITrackedViewController.h 的文档也是这么说的。 - db42
1
只是补充一下:如果你正在使用旧版本的 v3,而不是最新版本,那么最后一行应改为:[tracker send:[[GAIDictionaryBuilder createAppView] build]]; - micnguyen
显示剩余11条评论

14
为了清理我的 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 
}

干净整洁。祝您愉快!


非常好,而且实现起来也非常容易,谢谢。 - Arbitur
4
“这种方式使用扩展可能不太恰当”……不,这是使用扩展的完全正确方式。事实上,我很惊讶谷歌自己没有这样做。把所有的视图控制器都作为 GAITrackedViewController 的子类来进行分析跟踪才是不恰当的。如果你想要使用其他需要将自定义视图控制器类作为子类的框架怎么办?不,扩展是更好的选择。很棒的答案! - Richard Venable
1
事实上,我真的很困惑为什么谷歌自己没有做这件事。 如果您想使用其他框架怎么办?...所以,如果两个服务创建了一个具有“trackScreenView”方法的类别,构建很可能会失败,如果它们不同,那么您需要在每个viewDidAppear中调用2种方法。 这种解决方案没有胜利之处。 对于这种情况的答案是始终为视图控制器使用自定义超类。 在超类上覆盖视图已显示并从那里调用任何调用。 - Matic Oblak

4
由于Sdk缺少GAITrackedTableViewController,我创建了一个简单而整洁的手动屏幕视图跟踪实现。
为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

这是一个干净的实现,可以为UITableViewControllers节省复制/粘贴到各个地方的时间。干杯,伙计。 - micnguyen
1
请注意 - createAppView已经被弃用,请改用createScreenView。 - micnguyen

1
请确保所有的viewDidAppear都调用了[super viewDidAppear]。
然后,请确保你的UITableViewController子类也是myTableViewController的子类。
在[myTableViewController viewDidAppear]中,实现所有其他答案。
只需补充所有其他好的答案。这样你就能得到像GAITrackedViewController.h一样好的东西。
我通过确保所有其他的UIViewController子类也是超级UIViewController子类,然后做同样的事情。

0

对于Swift,您可以使用

AppDelegate.appDelegateIns.defTrackerIns?.set(kGAIScreenName, value: "Enter Your Screen Name")
        AppDelegate.appDelegateIns.defTrackerIns?.send(GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject])

将此代码包含在您的应用程序委托中

static let appDelegateIns = AppDelegate()
    let gai = GAI.sharedInstance()
    let defTrackerIns = GAI.sharedInstance().tracker(withTrackingId: "Your Tracking Id")
    let gaDefTargetURL = "https://developers.google.com/analytics"

-1
假设他们没有UITableViewController的子类,我不明白为什么你不能使用他们的GAITrackedViewController,然后自己实现UITableViewDataSource和UITableViewDelegate协议。

这让我有两个错误。注释以下行会消除错误,但是 UITableViewController 就不会加载任何行了。 :(
  1. GAITrackedViewController 的没有可见的 @interface 声明选择器 'initWithStyle:'。
  2. 在类型为 'MenuViewController *' 的对象上找不到属性 'clearsSelectionOnViewWillAppear'。
- Pouria Almassi
这是因为这些属性属于UITableViewController,而不是UIViewController。你不能在视图控制器上调用“initWithStyle:”,而是必须让视图控制器设置它所拥有的UITableView实例的样式。清除选择属性也是同样的道理。 - s73v3r
1
如果因为一个简单的跟踪框架而不得不改变整个架构,那么肯定出了问题。我不明白为什么谷歌没有为ITableViewController制作覆盖。也许是因为手动跟踪非常简单。我建议:不要费心使用谷歌的覆盖。手动操作还可以给你更多的控制。 - esbenr
UITableViewController不仅仅实现UITableViewDatasource协议,还能处理TableView的滚动。如果你在单元格内设置了一个输入框作为第一个响应者,它也能滚动TableView。如果没有继承UITableViewController,你将失去这个功能和更多其他功能。 - esbenr

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接