アップデート
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 分以内にアプリがクラッシュします。
先制質問応答
8.3 (12F70) を実行している iPhone 6 でこれを実行しています。
アプリのアンインストールと再インストールを試みました。
Google アナリティクスが機能するための前提条件をすべて追加しました。すべての
.m
ファイルをライブラリ、libGoogleAnalyticsServices.a
ファイル、およびLinked Frameworks and Libraries
.私も 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