У меня проблема с приложением, которое отлично работает в симуляторе, а также на физическом iPhone 4 и iPhone 3GS. Приложение было одобрено и теперь находится в App Store, но в сборке дистрибутива, загруженной из App Store, обнаружена ошибка, не замеченная в сборке dev / release.
Это бесплатное приложение, но поддерживается местной рекламой. Когда приложение запускается (или возвращается из фона), AppDelegate пытается загрузить некоторый HTML-код с нашего рекламного сервера и в случае успеха представляет контроллер модального представления с UIWebView и передает переменную NSData, содержащую HTML-код. В сборках разработки / выпуска это работает ОТЛИЧНО; приложение запускается, и через несколько секунд открывается вид и показывается реклама, которую можно закрыть кнопкой.
Однако сборка дистрибутива из App Store отличается. Когда модальный контроллер представления скользит вверх, UIWebView никогда не загружается. Помните, что я представляю контроллер представления ТОЛЬКО в том случае, если он может загружать рекламные данные, иначе представление никогда не отображается.
К счастью, я реализовал таймер в контроллере просмотра рекламы, который заставит модальное представление закрывать себя, если webViewDidFinishLoad никогда не срабатывает (когда таймер отключен), так что, по крайней мере, пользователи приложения не слишком раздражены. Но все-таки некрасиво, что пустой контроллер представления скользит вверх, а затем скользит без видимой причины.
Вот соответствующие методы в AppDelegate:
- (void)launchAd
{
[NetworkActivity showFor:@"ad"];
if (!alreadyActive && [ServerCheck serverReachable:@"openx.freewave-wifi.com" hideAlert:YES])
{
alreadyActive = YES;
[self performSelectorInBackground:@selector(downloadAdData) withObject:nil];
}
[NetworkActivity hideFor:@"ad"];
}
- (void)downloadAdData
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *baseURL = @"http://appdata.freewave-wifi.com/ad/";
NSString *file = (IS_IPAD) ? @"ipad.php" : @"iphone.php";
NSURL *adURL = [NSURL URLWithString:[baseURL stringByAppendingString:file]];
adData = [[NSData alloc] initWithContentsOfURL:adURL];
[self performSelectorOnMainThread:@selector(presentAdModal) withObject:nil waitUntilDone:NO];
[pool release];
}
- (void)presentAdModal
{
if (adData)
{
AdViewController *adView = [[AdViewController alloc] initWithNibName:nil bundle:nil];
[adView setAdData:adData];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:adView];
[navController setModalPresentationStyle:UIModalPresentationFormSheet];
[navController setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[tabBarController presentModalViewController:navController animated:YES];
[navController release], navController = nil;
[adView release], adView = nil;
}
else
LogError(@"Not presenting ad; unable to create data object.");
}
Кстати, adData определяется в заголовке с NSData *adData;
AdViewController просто содержит UIWebView, который загружается с
[webView loadData:adData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil];
Опять же, все это работает ОТЛИЧНО, КАЖДЫЙ ВРЕМЯ со сборками dev / release в симуляторе и на физических устройствах - только не при сборке дистрибутива из магазина приложений. Я даже преобразовал NSData в NSString и отключил его с помощью NSLog (), чтобы доказать, что HTML был загружен до модального представления AdView.
[Вздох ...]
EDIT 1 : В случае, если мой оригинальный пост был неясен, webViewDidFinishLoad
никогда не вызывается при сборке дистрибутива (но это происходит при сборке dev / release).
РЕДАКТИРОВАТЬ 2 : Кроме того, непосредственно перед тем, как я позвоню
[webView loadData:adData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil];
в AdViewController я добавил временный NSLog()
, преобразовал adData в NSString и зарегистрировал его в консоли, и HTML-код был там. Итак, UIWebView просто отказывается загружать NSData?