Измерение приложения Omniture для iphone вызывает проблему, когда приложение переходит в фоновый режим

Чтобы реализовать отслеживание Omniture в приложении для iPhone, я загрузил программное обеспечение AppMeasurement с сайта SiteCatalyst (AppMeasurement.h, libAppMeasurement.a, libAppMeasurementNoThumb.a).

Я использую библиотеку измерения приложений Omniture для iphone, связанную с библиотеками релиза и разработки. Я создаю их с помощью метода singleton (getInstance). Реализовано, как показано ниже

#import "OmnitureTracking.h"
#import "AppMeasurement.h"

AppMeasurement *s = nil;


@implementation OmnitureTracking

+ (void)beginTracking {
s  = [[AppMeasurement getInstance] retain];
s.account = @"";
s.debugTracking = YES;
}

Вызов этого «beginTracking» в AppDelegate для инициации отслеживания, для отслеживания страниц реализован другой метод, как показано ниже:

+ (void)trackViewForPage:(NSString *)pageName {
NSLog(@"trackViewForPage::s instance::%@::",s);
if (s == nil)
return;

[s clearVars];
[s track:[NSDictionary dictionaryWithObjectsAndKeys:pageName, @"pageName", nil]];
}

Реализация работает нормально и получает журнал ниже:

2012-06-21 01:53:20.953 MyApp[857:607] App Measurement Library compile time = Aug  4 2011 16:29:52
2012-06-21 01:53:21.418 MyApp[857:607] trackViewForPage::s instance::<AppMeasurement: 0x28c4b0>::
2012-06-21 01:53:21.795 MyApp[857:607] 
Omniture App Measurement Debug: http://MyApp.net/b/ss/MyAppiosappdev/0/OIP-2.1.2/s2253418?AQB=1&ndh=1&t=21/5/2012%205%3A53%3A20%204%20240&vid=01398194867219045&ce=UTF-8&pageName=MyApp%201.2%20%281.2%29%20Launch&ts=2362139876678&events=event7%2Cevent5&c1=D%3Dv2&c2=D%3Dv6&c3=D%3Dv11&v2=MyApp%201.2%20%281.2%29&v4=0&v5=0&v6=20&v7=5&v8=Thursday&v9=4.3.3&v12=D%3Dv3&v13=D%3Dv3&s=320x480&c=24&AQE=1

Но когда приложение переходит в фоновый режим и выходит на передний план, приложение падает из-за отслеживания и получения журнала, как показано ниже:

Jun 21 03:07:41 unknown MyApp[467] <Warning>: trackViewForPage::s instance::(
    ""
)::
Jun 21 03:07:41 unknown MyApp[467] <Error>: -[__NSCFArray clearVars]: unrecognized selector sent to instance 0x28c4b0
Jun 21 03:07:41 unknown MyApp[467] <Error>: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray clearVars]: unrecognized selector sent to instance 0x28c4b0'

Экземпляр «AppMeasurement» становится нулевым или пустым, когда приложение переходит в фоновый режим и выходит на передний план, но я не могу понять, является ли это проблемой библиотеки iPhone Site Analyst или проблемой кодирования.

Чтобы справиться с аварией, я сделал нулевую проверку, но она не подпадает под нулевой регистр.

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

Спасибо


person dev4u    schedule 21.06.2012    source источник
comment
s — локальная переменная. У вас не должно быть доступа к нему из trackViewForPage. Я подозреваю, что происходит что-то еще, чего вы нам не показываете. Как trackViewForPage получает доступ к s?   -  person wadesworld    schedule 21.06.2012
comment
я обновил код, пожалуйста, проверьте   -  person dev4u    schedule 21.06.2012
comment
почему этот вопрос заминусован?   -  person Giacomo    schedule 21.06.2012
comment
Ничто из того, что вы обновили, не вносит ясности. S по-прежнему является локальной переменной. По-видимому, также есть глобальная переменная с именем s, которую использует trackViewForPage, но, поскольку вы не показываете, как она устанавливается, мы не знаем, каково ее значение.   -  person wadesworld    schedule 21.06.2012
comment
извините за многократные правки   -  person dev4u    schedule 21.06.2012
comment
@wadesworld — для реализации приложения Omniture для iphone сам Site Catalyst предоставил пакет с файлом реализации (AppMeasurement.h) и файлами lib. - Все, что нам нужно сделать, это получить экземпляр AppMeasurement.h и использовать его переменную и методы. - OmnitureTracking.h — это интерфейс, который я использовал для обработки всех вещей Omniture.   -  person dev4u    schedule 26.06.2012
comment
- s является экземпляром AppMeasurement.h, trackViewForPage является статическим методом, который вызывает методы clearVars и track класса AppMeasurement.h. В приложении везде, где требуется отслеживание, я активирую этот метод. Например на главной странице - [OmnitureTracking trackViewForPage:@"homepage"];   -  person dev4u    schedule 26.06.2012


Ответы (2)


Наконец, я понял вещи. Прости за все неудачи.

Все, что я делаю, это использую стороннюю библиотеку для реализации приложения Omniture Tracking for iPhone, которое предоставляется самим Site Catalyst.

Пожалуйста, обратитесь к приведенному ниже URL-адресу библиотеки: Библиотека Site Catalyst Omniture предназначена для приложений, разработанных для всех устройств iOS, включая iPhone, iPad и iPod Touch

Есть проблема с самой библиотекой, у нее много проблем с управлением памятью.

Они предоставили новую библиотеку с исправлениями утечки памяти.

Загружены новые библиотеки для решения проблемы.

Получил проблему в поддерживающем классе - OmnitureTracking.m при установке свойства AppMeasurement.h:

//Use best practices plugin
s.useBestPractices = YES;

Из-за этого свойства отслеживание omniture вызывается всякий раз, когда приложение переходит в активное состояние, т. е. запускается. Поскольку у библиотек возникают проблемы с управлением памятью, приложение падает, когда приложение переходит в фоновый режим и выходит на передний план.

Спасибо за ответы.

Но все же одна вещь не дает мне покоя, как проверить пустой экземпляр класса

Если экземпляр есть, он попадает в NSLog как

2012-06-21 01:53:21.418 MyApp[857:607] trackViewForPage::s instance::<AppMeasurement: 0x28c4b0>::

Но в случае ошибки получение экземпляра в NSLog как

Jun 21 03:07:41 unknown MyApp[467] <Warning>: trackViewForPage::s instance::("")::

Увидев это, я думаю, что это ПУСТОЙ ЭКЗЕМПЛЯР. Как проверить это дело? Это не проверка под нулевой проверкой.

person dev4u    schedule 28.06.2012

Этот код беспорядок; трудно сказать, что не так по причинам, упомянутым в комментариях к вашему вопросу.

  • ни один метод не должен иметь префикс get, если только он не имеет особого типа

  • beginTracking пропускает все, что назначено s

Итак... s назначается экземпляру NSArray либо потому, что плохо названный getInstance возвращает NSArray, либо вы чрезмерно выпускаете этот объект.

person bbum    schedule 21.06.2012
comment
Спасибо за ответ. - Метод getInstance — это метод по умолчанию, представленный в AppMeasurement.h (SiteAnalayst SDK). справочная ссылка — developer.omniture.com/en_US/gallery/app-measurement -for-ios Я не получаю никаких ошибок или предупреждений в коде. - person dev4u; 21.06.2012