Crashlytics在iOS键盘扩展程序中不起作用

时间:2015-06-25 16:32:24

标签: ios crashlytics ios-keyboard-extension

我使用最新版本的FabricFabric/Crashlytics cocoapods(因此,根据调试器输出版本3.0.8)将Crashlytics集成到iOS键盘扩展中。最近,它只是停止报告键盘扩展的崩溃。我已经检查了初始化Crashlytics的代码和我的项目的Crashlytics脚本构建阶段,两者都已执行(构建阶段在我的键盘扩展名的目标中)。

很难判断这是否相关,但是当我运行该应用时,我看到Crashlytics尝试提交崩溃,

[Crashlytics:Crash:Reports] Submitting async /var/mobile/Containers/Data/PluginKitPlugin/[some-numbers]/Library/Caches/com.crashlytics.data/com.myCompnay.myApp.extension/v3/prepared/[some-more-numbers-idk-if-they're-supposed-to-be-secret].multipartmime

然后读取相应数量的消息

2015-06-25 09:22:33.063 com.myCompany.myApp.extension[5975:1649412] Attempted to create a task in a session that has been invalidated

让我相信这是Crashlytics中的一个错误。最新版本的更改日志提到了后台任务的问题

Fixed an issue that would incorrectly default to enabling NSURLSession background uploads in extensions

这可能与此有关吗?有没有人遇到并解决了这个问题?

2 个答案:

答案 0 :(得分:1)

发布此内容后几分钟,它发现我实际上在[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:]上设置了一个符号断点,而不是我过去尝试过的方法。断点在Crashlytics代码中被击中。

为了解决这个问题,我使用返回默认配置的方法调用了backgroundSessionConfigurationWithIdentifer:。实施如下:

static Class URLSessionClass;

@implementation NSURLSessionConfiguration (FixCrashlyticsBug)

+ (void)load {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    URLSessionClass = object_getClass((id)self);
  });
}

+ (NSURLSessionConfiguration *)defaultSessionConfigurationWithIdentifier:(NSString *)__unused identifer {
  return [self defaultSessionConfiguration];
}

@end

@implementation CrashlyticsInterfaceManager

+ (void)startCrashlyticsFromExtension {
//Do the swizzle here instead of in load, so we don't do it in the container app as well
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    SEL originalSelector = @selector(defaultSessionConfigurationWithIdentifier:);
    SEL swizzledSelector = @selector(backgroundSessionConfigurationWithIdentifier:);
    Class class = URLSessionClass;
    Method swizzledMethod = class_getClassMethod(class, swizzledSelector);
    Method originalMethod = class_getClassMethod(class, originalSelector);
    BOOL didAddMethod = class_addMethod(class,
                                        originalSelector,
                                        method_getImplementation(swizzledMethod),
                                        method_getTypeEncoding(swizzledMethod));
    if (didAddMethod) {
      class_replaceMethod(class,
                          swizzledSelector,
                          method_getImplementation(originalMethod),
                          method_getTypeEncoding(originalMethod));
    } else {
      method_exchangeImplementations(originalMethod, swizzledMethod);
    }
    [Crashlytics startWithAPIKey:@"MyAPIKey"];
  });
}

@end

答案 1 :(得分:0)

Clashlytics以BundleIdentidfier为特色,似乎有效。 主应用程序,App Extension是一个不同的Bundle Identifier。

在同一个Bundle Identifier和Keyboard App中,您将创建另一个新项目。如果将Keyboard App Extension的图标设置为新项目,则会更好。图标将用于Clashlytics网页。

将clashlytics安装到新创建的项目中,然后完成。 现在,它也适用于原始项目。 完成后,您可以删除新项目。

我是这样工作的。