Google AnalyticsSDK会创建SQLite错误

cjh*_*ill 15 sqlite google-analytics objective-c ios google-analytics-sdk

更新

20158月19日 - 在3.13更新中似乎已经修复了Bug ,即使他们在更改日志中列出的唯一内容是"Fixed an issue which caused crashes when using setCampaignParametersFromUrl".想拿就拿吧.

20156月8日 - 仍然遇到这个问题.如果我禁用自动发送事件([GAI sharedInstance].dispatchInterval = -1;)然后我仍然收到错误.因此,我认为问题在于将事件插入到谷歌分析SQLite数据库中,不知何故我正在进行的数据库语句正在变为现实void.

20156月10日 - 仍然遇到崩溃.试图删除我的控制器,手动扩展GAITrackedViewController和发送createScreenView轨道,不会改变崩溃频率.

20156月25日 - 仍然遇到崩溃.


介绍

我已经添加Google Analytics SDK 3.12到我的iPhone应用程序,一切都按预期工作 - 我运行应用程序,可以看到我在Web界面上设置的所有点击和事件.

我正在我的AppDelegate右上角初始化SDK didFinishLaunchingWithOptions,如下所示:

[[GAI sharedInstance] trackerWithTrackingId:GOOGLE_ANALYTICS_ID];
Run Code Online (Sandbox Code Playgroud)

问题

但是,我发现当我尝试自己使用SQLite时,运行Google Analytics会产生错误.它们可能表现为严重错误,例如:

  • "Database disk image is malformed" 然后insta-crashes
  • "Disc i/O error" 每当我运行一个查询(虽然没有崩溃)

而且它们也会导致我自己的SQLite查询失败,例如:

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

    if (sqlite3_step(_statement) == SQLITE_ROW) {
Run Code Online (Sandbox Code Playgroud)

将随机导致以下错误:

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

如果我注释掉SDK的初始化,那么一切都会变得非常稳定.再次取消注释它会在一分钟内崩溃应用程序.


先发制人的问题回答

  1. 我在运行8.3(12F70)的iPhone 6上运行此功能.

  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];
Run Code Online (Sandbox Code Playgroud)

访问课程

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

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

[db finalise];
Run Code Online (Sandbox Code Playgroud)

班级

(已指出错误与评论一起出现的位置)

@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
Run Code Online (Sandbox Code Playgroud)

cjh*_*ill 0

升级到新版本的 SDK ( 3.13) 解决了这个问题(至少对我来说),尽管他们的更新日志没有具体提到它。