12

有没有办法捕捉各种用户交互,但首先是在 iOS 应用程序中按下按钮?我有兴趣使用时间戳记录这些事件,最好使用它们出现的屏幕名称。

我想最简单的方法是将自定义日志函数的调用插入到按钮调用的每个操作中。但这也太费劲了。

我也考虑过 subclassing UIButton,但这仍然需要我更改现有应用程序中的每个按钮,并且仅适用于按钮(例如,不适用于表格中的单元格)。

有没有一点我可以拦截一般的触摸?或者我特别知道按下了一个按钮并且我引用了那个按钮?

(我们研究移动应用程序的可用性测试,因此我们的目标是一个易于重用的模块化解决方案,并且需要尽可能少的手动更改代码。但是欢迎任何建议,因为我意识到这可能并不那么容易。)

4

2 回答 2

14

你可以继承 UIApplication:

  • 创建一个 UIApplication 子类
  • 重写-(BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event方法,记得调用超级实现
  • 在实现中放置一个NSLog或其他诊断代码

例如,这将在每次按下 UIButton 时打印一个日志:

-(BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event
{
    if ([sender isKindOfClass:[UIButton class]])
    {
        NSLog(@"Action: %@ - %@ - %@", NSStringFromSelector(action), target, sender);
    }

    return [super sendAction:action to:target from:sender forEvent:event];
}


2013-07-08 14:46:18.270 UIApplicationSubclass[94764:c07] Action: anAction: - <ViewController: 0x76790a0> - <UIRoundedRectButton: 0x767b9b0; frame = (103 66; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x767bad0>>
2013-07-08 14:46:27.378 UIApplicationSubclass[94764:c07] Action: anAction: - <ViewController: 0x76790a0> - <UIRoundedRectButton: 0x767b9b0; frame = (103 66; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x767bad0>>

此外,要子类化 UIApplication,您必须像这样更改 main.m 文件(在我的情况下,UIApplication 子类名为 FLApplication,请查看 UIApplicationMain 函数的第三个参数和 FLApplication.h 的导入)

#import "AppDelegate.h"
#import "FLApplication.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, NSStringFromClass([FLApplication class]), NSStringFromClass([AppDelegate class]));
    }
}
于 2013-07-08T12:50:15.613 回答
1

您真正需要的是 Google Analytics。记录每个用户交互不是正确的方法。您可以使用谷歌分析来跟踪您的应用程序中的用户交互。

于 2013-07-01T11:03:07.153 回答