GAITrackedViewController和UITableViewController


69

对于iOS v2的Google Analytics(分析),Google建议将其GAITrackedViewController类替换为UIViewController。对于UITableViewController,我们该怎么办?

资源

#import "GAITrackedViewController.h"

@interface AboutViewController : GAITrackedViewController

Answers:


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

参考

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 2013年

2
为什么要调用sendView viewWillAppear?寄送会更好viewDidAppear吗?
Vadim

13
我必须#import“ GAIFields.h”才能使用kGAIScreenName
XY

1
最好在viewDidAppear文档中GAITrackedViewController.h这样说。
2014年

1
只需添加:如果您使用的不是最新的旧版v3,则最后一行应该是:[tracker send:[[GAIDictionaryBuilder createAppView] build]];
micnguyen 2014年

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
“以这种方式使用扩展程序可能不适当”……不,这实际上是对扩展程序的完全正确使用。实际上,这让我感到困惑,因为Google自己没有这样做。使您所有的视图控制器成为GAITrackedViewController的子类只是为了进行分析跟踪,这是不正确的。如果您想使用其他一些框架,这些框架也需要继承其自定义View Controller类,该怎么办?不,扩展是要走的路。好答案!
Richard Venable

1
“实际上让我感到困惑的是Google本身并没有做到这一点”,然后“如果您想使用其他框架该怎么办” ...因此,如果2个服务创建了一个具有“ 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 2015年

1
仅需注意-不推荐使用createAppView。请改用createScreenView。
micnguyen 2015年

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)No visible @interface for 'GAITrackedViewController' declares the selector 'initWithStyle:' 2)Property 'clearsSelectionOnViewWillAppear' not found on object of type 'MenuViewController *'
palmi

那是因为这些是UITableViewController而不是UIViewController的属性。不必在viewcontroller上调用“ initWithStyle:”,而必须让viewcontroller在其拥有的UITableView实例上设置样式。与clearsSelection属性相同。
s73v3r 2013年

1
如果由于简单的跟踪框架而不得不更改整个体系结构,那确实是错误的。我不明白为什么Google不对ITableViewController进行覆盖。也许是因为手动跟踪是如此简单。我说:不要理会Google的覆盖。手动执行此操作还可以为您提供更多控制。
esbenr 2014年

UITableViewController比实现UITableViewDatasource还要做更多的工作。如果您将输入字段设置为单元格内的第一响应者,它还可以处理滚动表视图的操作。如果不从UITableViewController继承,则会失去此功能以及更多其他功能。
esbenr 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.