2015-06-25 6 views
1

Я использую последнюю версию Fabric и Fabric/Crashlytics cocoapods (так, версия 3.0.8 в соответствии с выходом отладчика) для интеграции Crashlytics в расширение клавиатуры iOS. Недавно он просто прекратил сообщать о сбоях с расширением клавиатуры. Я проверил оба моих кода, который инициализирует Crashlytics и фазу сборки сценария Crashlytics моего проекта, оба выполняются (и фаза сборки находится в моей цели расширения клавиатуры).Crashlytics не работает в расширении клавиатуры iOS

Это трудно сказать, если это связано, но когда я запускаю приложение, я вижу 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

это могло быть связано? Кто-нибудь столкнулся и разрешил эту проблему?

ответ

1

Спустя несколько минут после публикации этого вопроса мне удалось установить символическую точку останова на [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:] вместо тех методов, которые я пытался в прошлом. Точка останова попала в код Crashlytics.

Чтобы исправить это, я swizzled 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 
0

Clashlytics отличается BundleIdentidfier, кажется, работает. Главное приложение, расширение приложения - это другой идентификатор Bundle.

В этом же идентификаторе Bundle Identifier и Keyboard App вы создадите еще один новый проект. Если вы установите значок расширения клавиатуры для нового проекта, было бы лучше. Значок будет использоваться на веб-странице Clashlytics.

Установите clashlytics на вновь созданный проект и заполните. Теперь он также работает с оригинальным проектом. Когда вы закончите, вы можете удалить новый проект.

Я работал таким образом.

 Смежные вопросы

  • Нет связанных вопросов^_^