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, то все снова становится невероятно стабильным. Раскомментируйте его еще раз, и это приведет к падению приложения в течение минуты.
Упреждающий ответ на вопрос
Я запускаю это на iPhone 6 под управлением 8,3 (12F70).
Попытался удалить и переустановить приложение.
Я добавил все необходимые условия для работы Google Analytics; Все
.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
1 ответ
Обновление до новой версии SDK (3.13
) исправил эту проблему (по крайней мере, для меня), хотя в их списке изменений не упоминается об этом.