Google Analytics SDK создает ошибки SQLite

Обновления

19 августа 2015 г. — похоже, ошибка исправлена ​​в обновлении 3.13, хотя в списке изменений указано только "Fixed an issue which caused crashes when using setCampaignParametersFromUrl". Принимайте это как хотите.

8 июня 2015 г. – эта проблема не устранена. Если я отключу автоматическую отправку событий ([GAI sharedInstance].dispatchInterval = -1;), то все равно буду получать ошибки. Поэтому я предполагаю, что проблема заключается во вставке события в базу данных SQLite Google Analytics, что каким-то образом мой собственный оператор базы данных, который в настоящее время выполняется, становится void.

10 июня 2015 г. – по-прежнему возникают сбои. Попытался удалить мои контроллеры, расширяющие GAITrackedViewController, и отправить дорожку createScreenView вручную без изменения частоты сбоев.

25 июня 2015 г. – сбои продолжаются.


вступление

Я добавил Google Analytics SDK 3.12 в свое приложение для iPhone, и все работает так, как ожидалось — я запускаю приложение и вижу все обращения и события, которые я настроил, через веб-интерфейс.

Я инициализирую SDK в моем AppDelegate прямо над моим didFinishLaunchingWithOptions, вот так:

[[GAI sharedInstance] trackerWithTrackingId:GOOGLE_ANALYTICS_ID];

Проблема

Однако я обнаружил, что запуск Google Analytics создает ошибки, когда я пытаюсь использовать SQLite для себя. Они могут проявляться как серьезные ошибки, такие как:

  • "Database disk image is malformed" и тут же вылетает
  • "Disc i/O error" всякий раз, когда я запускаю запрос (хотя и не падает)

И они также могут привести к сбою моих собственных запросов SQLite, например:

if (! sqlite3_prepare_v2(_db, [sql UTF8String], -1, &_statement, NULL) == SQLITE_OK) {`
    // ..
    // ..

    if (sqlite3_step(_statement) == SQLITE_ROW) {

Случайным образом приведет к следующей ошибке:

sqlite3_prepare_v2 EXC_BAD_ACCESS (code=1, address=0x6800000000)

Если я прокомментирую инициализацию SDK, все вернется к невероятной стабильности. Раскомментируйте его еще раз, и через минуту приложение рухнет.


Упреждающий ответ на вопрос

  1. Я запускаю это на iPhone 6 под управлением 8.3 (12F70).

  2. Пробовали удалить и переустановить приложение.

  3. Я добавил все предварительные условия для работы Google Analytics; все файлы .m в библиотеку, файл libGoogleAnalyticsServices.a, а также файл Linked Frameworks and Libraries.

  4. У меня также есть Crashlytics, но я попытался закомментировать его из кода ([Fabric with:@[CrashlyticsKit]];) и удалить его библиотеку из Linked Frameworks and Libraries с точно такими же результатами.


Код

Настройка класса

// In didFinishLaunchingWithOptions
[Db setup];
[Db connect];

Доступ к классу

Db * db = [[Db alloc] init];

if ([db prepare:@"SELECT * FROM `table` WHERE `id` = ?" withBindings:@[@"123"]]) {
    while ([db stepThrough]) {
        // ..
    }
}

[db finalise];

Класс

(указали, где появляются ошибки с комментариями)

@implementation Db

static sqlite3  * _db;
static NSString * _dbPath;

#pragma mark - Setup

+ (BOOL)setup {
    NSString      * sqlBundlePath   = [[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"];
    NSString      * documentsFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString      * sqlDocumentPath = [[documentsFolder stringByAppendingPathComponent:@"db"] stringByAppendingPathExtension:@"sqlite"];
    NSFileManager * fileManager     = [NSFileManager defaultManager];

    if (! [fileManager fileExistsAtPath:sqlDocumentPath]) {
        NSError * error;
        BOOL success = [fileManager copyItemAtPath:sqlBundlePath toPath:sqlDocumentPath error:&error];

        if (! success) {
            return NO;
        }
    }

    _dbPath = sqlDocumentPath;
    return YES;
}

+ (BOOL)connect {
    sqlite3_config(SQLITE_CONFIG_SERIALIZED);
    return sqlite3_open([_dbPath UTF8String], &_db);
}

#pragma mark - Querying

- (BOOL)prepare:(NSString *)sql withBindings:(NSArray *)bindings {
    // ERROR CAN OCCUR ON THE FOLLOWING LINE
    if (! sqlite3_prepare_v2(_db, [sql UTF8String], -1, &_statement, NULL) == SQLITE_OK) {
        NSLog(@"Error whilst preparing query: %s", sqlite3_errmsg(_db));
        sqlite3_finalize(_statement);
        return NO;
    }

    for (int i = 0; i < [bindings count]; i++) {
        sqlite3_bind_text(_statement,
                          i + 1,
                          [bindings[i] isKindOfClass:[NSNull class]] ? [@"" UTF8String] : [bindings[i] UTF8String],
                          -1,
                          SQLITE_TRANSIENT);
    }

    return YES;
}

- (BOOL)stepThrough {
    // ERROR CAN OCCUR ON THE FOLLOWING LINE
    if (sqlite3_step(_statement) == SQLITE_ROW) {
        return YES;
    }

    sqlite3_finalize(_statement);
    return NO;
}

- (void)finalise {
    sqlite3_finalize(_statement);
}

@end

person cjhill    schedule 26.05.2015    source источник
comment
Кажется, вы делаете это правильно. Можно ли использовать другую платформу для аналитики?   -  person webo80    schedule 12.06.2015
comment
В идеале мы хотели бы использовать Google Analytics, так как мы также используем его для нашего веб-сайта, поэтому он будет связан с нашими целями конверсии и т. д.   -  person cjhill    schedule 13.06.2015


Ответы (1)


Обновление до новой версии SDK (3.13) устранило эту проблему (по крайней мере, для меня), хотя в их журнале изменений об этом конкретно не упоминается.

person cjhill    schedule 19.08.2015