谷歌分析 SDK iOS10

Posted

技术标签:

【中文标题】谷歌分析 SDK iOS10【英文标题】:Google Analytics SDK iOS10 【发布时间】:2016-08-09 12:03:40 【问题描述】:

我已经从 cocoa pod 3.14 版安装了 Google Analytics

id<GAITracker> tracker =  [[GAI sharedInstance] trackerWithTrackingId:oneTrackId];

ios 10 在代码行中崩溃

NSString *user_id = [tracker get:kGAIUserId];

错误 * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[GAITrackerModel valueForKey:]: 尝试检索 nil 键的值'

【问题讨论】:

【参考方案1】:

Apple 在 iOS 10 中更改了 valueForKey: 方法的行为。 以前使用参数nil 调用valueForKey: 会导致使用nil 调用valueForUndefinedKey:,如果此方法未被覆盖,则会失败。但是现在如果没有这个调用,它会立即失败。

GAITrackerModel 已覆盖 valueForUndefinedKey:,无论输入参数如何都返回 nil。

我可以提供方法调配来恢复以前的行为作为临时解决方案(Google 应该解决这个问题,并且这段代码还没有准备好生产,但在那之前):

#import <objc/runtime.h>

void SwizzleInstanceMethod(Class classToSwizzle, SEL origSEL, Class myClass, SEL newSEL) 
  Method methodToSwizzle = class_getInstanceMethod(classToSwizzle, origSEL);
  Method myMethod = class_getInstanceMethod(myClass, newSEL);
  class_replaceMethod(classToSwizzle, newSEL, method_getImplementation(methodToSwizzle), method_getTypeEncoding(methodToSwizzle));
  class_replaceMethod(classToSwizzle, origSEL, method_getImplementation(myMethod), method_getTypeEncoding(myMethod));


@interface FixGoogleSDKiOS10 : NSObject

@end

@implementation FixGoogleSDKiOS10

+ (void)load 
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^
    SwizzleInstanceMethod([NSObject class], @selector(valueForKey:), [self class], @selector(yb_valueForKey:));
  );


- (nullable id)yb_valueForKey:(NSString *)key 
  if (!key) 
    return [self valueForUndefinedKey:key];
  
  return [self yb_valueForKey:key];


@end

【讨论】:

【参考方案2】:

我们发布了 3.17 版的 Google Analytics(分析)iOS SDK。它包含许多改进和错误修复,包括针对此问题的修复。

CocoaPod:https://cocoapods.org/pods/GoogleAnalytics

SDK下载:https://developers.google.com/analytics/devguides/collection/ios/v3/sdk-download

【讨论】:

以上是关于谷歌分析 SDK iOS10的主要内容,如果未能解决你的问题,请参考以下文章

用于 IOS 的谷歌分析 SDK 不再跟踪屏幕或事件。曾经工作

融云分析iOS 基于实时音视频 SDK 实现屏幕共享功能

trigger.io — 谷歌分析

测试 iOS/Android 应用谷歌分析

将谷歌分析集成到 iOS 应用程序中

将谷歌分析与 ios 集成时出错?