15

アップデート

2015 年 8 月 19 日-3.13変更ログに記載されているのは"Fixed an issue which caused crashes when using setCampaignParametersFromUrl". あなたがそうするようにそれを取ってください。

2015 年 6 月 8 日- まだこの問題が発生しています。イベントの自動送信を無効にしても ( [GAI sharedInstance].dispatchInterval = -1;)、それでもエラーが発生します。したがって、問題はイベントを Google アナリティクス SQLite データベースに挿入することにあり、現在進行中の自分のデータベース ステートメントがどうにかしてvoid.

2015 年 6 月 10 日- まだクラッシュが発生しています。コントローラーを削除GAITrackedViewControllerして、トラックを手動で拡張および送信しようとcreateScreenViewしましたが、クラッシュの頻度は変わりませんでした。

2015 年 6 月 25 日- まだクラッシュが発生しています。


はじめに

を iPhone アプリに追加しましたGoogle Analytics SDK 3.12が、すべてが期待どおりに機能しています。アプリを実行すると、設定したすべてのヒットとイベントが Web インターフェイスで表示されます。

AppDelegate次のように、右の の上部でSDK を初期化していますdidFinishLaunchingWithOptions

[[GAI sharedInstance] trackerWithTrackingId:GOOGLE_ANALYTICS_ID];

問題

ただし、SQLite を自分で使用しようとすると、Google Analytics を実行するとエラーが発生することがわかりました。次のような重大なエラーとして現れることがあります。

  • "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 分以内にアプリがクラッシュします。


先制質問応答

  1. 8.3 (12F70) を実行している iPhone 6 でこれを実行しています。

  2. アプリのアンインストールと再インストールを試みました。

  3. Google アナリティクスが機能するための前提条件をすべて追加しました。すべての.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
4

1 に答える 1

0

SDK の新しいバージョン ( ) にアップグレードすると、3.13この問題は (少なくとも私にとっては) 修正されましたが、変更ログには特に言及されていません。

于 2015-08-19T08:42:40.607 に答える