Утечка памяти, когда Google Analytics отправляет хит

Я пытаюсь использовать Google Analytics SDK v3.10 для iOS.

Я добавил все зависимости и заголовки, а затем в своем делегате приложения метод:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

, я добавил эти строки:

[[GAI sharedInstance] setDispatchInterval:20.0];
[[GAI sharedInstance] trackerWithTrackingId:@"UA-XXXXXXXX-X"];
[[GAI sharedInstance].logger setLogLevel:kGAILogLevelVerbose];

с правильным идентификатором отслеживания.

В моем посадочном представлении методом viewDidAppear я добавил строки

id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
[tracker set:kGAIScreenName value:@"MyLandingView"];
[tracker send:[[GAIDictionaryBuilder createAppView] build]];

Это приводит к ужасной утечке памяти (около +1 мб/с) и зависанию с этими логами:

Apr 20 08:07:47 iPad-of-Pitt MyAppName[920] <Warning>: void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode

Это известная ошибка? Любая подсказка о том, как этого избежать?

Заранее спасибо !

РЕДАКТИРОВАТЬ: продублировал этот вопрос в группах Google https://groups.google.com/forum/?fromgroups#!topic/ga-mobile-app-analytics/0goRZOc3vk0

РЕДАКТИРОВАТЬ 2: также разместил проблему здесь https://code.google.com/p/analytics-issues/issues/detail?id=617&thanks=617&ts=1429543879


person Pierre Mardon    schedule 20.04.2015    source источник
comment
Это известная ошибка? Любая подсказка о том, как этого избежать? (без понятия, но я могу пропинговать команду разработчиков и узнать)   -  person DaImTo    schedule 20.04.2015
comment
К вашему сведению @DaImTo , первое предложение страницы справки GA: Лучшее место, где можно задать вопросы об использовании и разработке с помощью API, библиотек и SDK Google Analytics, — это Stack Overflow или один из официальных разработчиков Analytics. форумы.   -  person Pierre Mardon    schedule 20.04.2015
comment
Да, и причина этого в том, что они следят за этим форумом. Я только что слышал, что проблема была открыта, и кто-то изучает ее.   -  person DaImTo    schedule 20.04.2015
comment
У вас есть ссылка на проблему, которую вы упоминаете, или это моя? Вы говорите, что кто-то изучает это? Кто и где вы это видите? Кроме того, я, возможно, неправильно понял ваш первый комментарий, который звучит так, будто вы не сделали для меня домашнее задание, и именно поэтому я разместил два своих предыдущих комментария.   -  person Pierre Mardon    schedule 20.04.2015
comment
Ошибка регистрируется внутри команды разработчиков Google Analytics, и вы не можете ее увидеть. Я отправил им вашу проблему по электронной почте напрямую. Они отвечают мне по электронной почте, что они зарегистрировали это как проблему   -  person DaImTo    schedule 20.04.2015
comment
Большое спасибо @DaImTo!   -  person Pierre Mardon    schedule 20.04.2015
comment
Я не думаю, что Analytics использует webView. Используете ли вы webView в своем приложении? Судя по вашему описанию, это связано с использованием webView, а не с Analytics.   -  person djabi    schedule 22.04.2015
comment
Да, но я не занимаюсь этим для своих тестов GA.   -  person Pierre Mardon    schedule 22.04.2015


Ответы (2)


Я была такая же проблема.

В моем случае это произошло потому, что я использую Core Data и NSManagedObjectContextDidSaveNotification для объединения обновлений из фонового процесса, что приводит к исключению, как описано в этот пост :

Решение, которое я использовал, состояло в том, чтобы добавить сам manageObjectContext в качестве объекта объявления NSNotificaition:

ObjC

[[NSNotificationCenter defaultCenter] addObserver:self 
                                  selector:@selector(managedObjectContextDidSave:) 
                                  name:NSManagedObjectContextDidSaveNotification 
                                  object:self.managedObjectContext];

Быстрый

NSNotificationCenter.defaultCenter().addObserverForName(NSManagedObjectContextDidSaveNotification,
            object: self.managedObjectContext,
            queue: nil)

Сделал трюк для меня, больше нет утечки памяти.

Надеюсь, это поможет.

person Mory    schedule 01.09.2015

После запуска событий потребуется несколько минут, чтобы они отобразились на панели инструментов. Ожидается, что у пользователя должно быть немного терпения. Это один из способов взглянуть на это.

Что касается кода, лучше отправлять события вручную. ИТ обязательно будет отражено на приборной панели.

id newTracker = [[GAI sharedInstance]trackerWithTrackingId:googlePropertyId];
[GAI sharedInstance].defaultTracker = newTracker; // Set newTracker as the default tracker globally.
[GAI sharedInstance].debug = YES;
DebugLog(@"Events log : %@",objAnalytics.event_description);
[newTracker trackEventWithCategory:objAnalytics.event_name
                            withAction:objAnalytics.event_description
                             withLabel:objAnalytics.event_name
                             withValue:[NSNumber numberWithInt:100]];

Попробуйте отправить события вручную. Это точно сработает (по крайней мере у меня так сработало).

[[GAI sharedInstance]dispatch];
person Sankar Narayanan    schedule 20.04.2015
comment
Ваш код несовместим с SDK версии 3.10 (в GAI нет свойства отладки). Устанавливать единственный инстансированный трекер как трекер по умолчанию не имеет смысла. Вы не решаете мою главную проблему: утечку памяти. Поэтому я проголосовал за ваш ответ. Спасибо, в любом случае ! - person Pierre Mardon; 20.04.2015