【发布时间】:2011-02-25 22:09:29
【问题描述】:
我遇到了一个在模拟器中完美运行的应用程序以及物理 iPhone 4 和 iPhone 3GS 的问题。该应用已获得批准,现已在 App Store 中,但从 App Store 下载的分发版本出现了开发/发布版本中未发现的错误。
这是一款免费应用,但受本地广告支持。当应用程序启动(或从后台返回)时,AppDelegate 会尝试从我们的广告服务器下载一些 HTML,如果成功,则会显示一个带有 UIWebView 的模态视图控制器,并传递一个包含 HTML 的 NSData 变量。在开发/发布版本中,这非常有效;应用启动,几秒钟后,一个视图向上滑动并显示广告,可以通过一个按钮将其关闭。
但是,来自 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];
再一次,这一切都可以完美运行,每次都在模拟器和物理设备中使用开发/发布版本——只是不适用于应用商店的分发版本。我什至将 NSData 转换为 NSString 并使用 NSLog() 将其输出,只是为了证明 HTML 是在模态显示 AdView 之前下载的。
[叹气...]
编辑 1:如果我的原始帖子不清楚,webViewDidFinishLoad 永远不会在分发版本中被调用(但它会在开发/发布版本中调用)。
编辑 2:另外,就在我打电话之前
[webView loadData:adData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil];
在 AdViewController 中,我添加了一个临时的 NSLog() 并将 adData 转换为 NSString 并将其记录到控制台,HTML 就在那里。那么,UIWebView 只是拒绝加载 NSData?
【问题讨论】:
-
我很好奇这个!我已经下载了该应用程序并使用 Wireshark 嗅探连接,但乍一看找不到任何异常。您是否注意到 UIWebView 标题在再次弹出视图之前设置为 Canceled?这是在哪里发生的?
-
@oculus。
IS_IPAD定义如下:#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) -
@Rog,UIWebView 位于添加到导航控制器的视图中,当计时器到期时(因为从未调用过
webViewDidFinishLoad),我有一个设置标题的方法导航控制器“取消”并关闭视图控制器。
标签: iphone ipad ios uiwebview modal-dialog