J'ai un problème avec une application qui fonctionne parfaitement dans le simulateur, ainsi qu'un iPhone 4 et un iPhone 3GS physiques. L'application a été approuvée et est maintenant disponible sur l'App Store, mais la version de distribution téléchargée depuis l'App Store présente un bogue qui n'a pas été détecté dans la version de développement/publication.UIWebView agit différemment dans la version de l'application que la version de développement
Ceci est une application gratuite, mais est soutenu par la publicité locale. Lorsque l'application démarre (ou revient de l'arrière-plan), AppDelegate tente de télécharger du code HTML à partir de notre serveur publicitaire et, en cas de succès, présente un contrôleur de vue modale avec une UIWebView et transmet une variable NSData contenant le code HTML. Dans les versions de développement/publication, cela fonctionne PARFAITEMENT; l'application se lance, et après quelques secondes, une vue glisse et affiche l'annonce, qui peut être rejetée avec un bouton. Cependant, la distribution construite à partir de l'App Store est différente. Lorsque le contrôleur de vue modale glisse, l'UIWebView ne se charge jamais. Rappelez-vous, je présente le contrôleur de vue SEULEMENT si capable de télécharger les données de l'annonce - sinon, la vue n'est jamais présentée. Heureusement, j'ai implémenté une minuterie dans le contrôleur d'affichage des annonces, ce qui a pour conséquence que la vue modale se ferme si WebViewDidFinishLoad ne se déclenche jamais (le minuteur est invalidé), au moins les utilisateurs d'applications ne sont pas trop ennuyés. Mais il est toujours moche d'avoir un contrôleur de vue vide qui glisse vers le haut et puis glisse loin pour apparemment aucune raison.
Voici les méthodes pertinentes du 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.");
}
Par ailleurs, adData est définie en-tête avec NSData *adData;
Le AdViewController contient simplement un UIWebView, qui est chargé avec
[webView loadData:adData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil];
Encore une fois, tout cela fonctionne PARFAITEMENT, CHAQUE FOIS avec des builds de dev/release dans les simulateurs et les périphériques physiques - mais pas sur la construction de la distribution du magasin d'applications. J'ai même converti le NSData à un NSString et l'ai échangé avec NSLog() juste pour prouver que le HTML a été téléchargé avant de présenter l'AdView modalement.
[soupir ...]
EDIT 1: Dans le cas où mon message d'origine n'a pas été clair, la webViewDidFinishLoad
ne sera jamais appelé dans la construction de la distribution (mais il en dev/release build).
EDIT 2: Aussi, juste avant d'appeler
[webView loadData:adData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil];
dans le AdViewController, j'ai ajouté un NSLog()
temporaire et converti adData à NSString et enregistré sur la console, et le HTML était là. Ainsi, l'UIWebView refuse simplement de charger le NSData?
Comment IS_IPAD est-il défini? – occulus
Je suis curieux à propos de celui-ci! J'ai téléchargé l'application et utilisé Wireshark pour renifler la connexion, mais je n'ai rien trouvé d'anormal au premier coup d'œil. Remarquez-vous que le titre UIWebView est défini sur Annulé avant qu'il ne ressorte de la vue? Où cela se passe-t-il? – Rog
@occulus.'IS_IPAD' est défini comme suit:' #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ' –