Iphone UIWebView在应用商店版本和开发版本中的作用不同

Iphone UIWebView在应用商店版本和开发版本中的作用不同,iphone,ipad,ios,uiwebview,modal-dialog,Iphone,Ipad,Ios,Uiwebview,Modal Dialog,我遇到了一个问题,这个应用程序在模拟器中运行得很好,就像物理版的iPhone4和iPhone3GS一样。该应用程序已获得批准,现在已在应用程序商店中,但从应用程序商店下载的分发版本显示了开发/发布版本中未发现的错误 这是一个免费的应用程序,但由本地广告支持。当应用程序启动(或从后台返回)时,AppDelegate尝试从我们的ad服务器下载一些HTML,如果成功,则向模态视图控制器提供UIWebView,并传递包含HTML的NSData变量。在开发/发布版本中,这是完美的;该应用程序启动,几秒钟后

我遇到了一个问题,这个应用程序在模拟器中运行得很好,就像物理版的iPhone4和iPhone3GS一样。该应用程序已获得批准,现在已在应用程序商店中,但从应用程序商店下载的分发版本显示了开发/发布版本中未发现的错误

这是一个免费的应用程序,但由本地广告支持。当应用程序启动(或从后台返回)时,AppDelegate尝试从我们的ad服务器下载一些HTML,如果成功,则向模态视图控制器提供UIWebView,并传递包含HTML的NSData变量。在开发/发布版本中,这是完美的;该应用程序启动,几秒钟后,一个视图向上滑动并显示广告,只需一个按钮即可取消该广告

但是,应用商店的发行版构建是不同的。当模态视图控制器向上滑动时,UIWebView从不加载。请记住,我仅在能够下载广告数据时才显示视图控制器——否则,视图永远不会显示

谢天谢地,我在ad view控制器中实现了一个计时器,如果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构建时——只是不在appstore的分发构建中。我甚至将NSData转换为NSString并使用NSLog()将其输出,只是为了证明HTML是在以模态方式呈现AdView之前下载的

[叹息…]

编辑1:如果我的原始帖子不清楚,那么
webviewdiffinishload
永远不会在分发版本中被调用(但在开发/发布版本中会被调用)

编辑2:另外,就在我打电话之前

[webView loadData:adData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil];

在AdViewController中,我添加了一个临时的
NSLog()
,并将adData转换为NSString并将其记录到控制台,HTML就在那里。因此,UIWebView只是拒绝加载NSData?

好的,这是一个非常漫长的过程,但可能值得考虑

一个状态,关于它的内容,URL“返回的对象可能不同于原来的接收者”。因此,如果它是一个不同的对象,实际上是一个自动恢复的对象,那么考虑代码中的这行:

adData = [[NSData alloc] initWithContentsOfURL:adURL];
这不会为adData添加保留计数——您没有编写
self.adData=
或类似内容。因此,请记住前面提到的自动删除返回的NSData的场景:您的方法DownloadAddData将其内容包装在NSAutoreleasePool中。这是正确的做法。但是,这可能会导致在主线程上调用presentAdModal之前释放adData。所以

在PresentAddModel中,您只需检查adData是否为nil——但它可以不是nil,并且在此时NSAutoreleasePool仍已从内存中释放出来——因此,在这种情况下,您可能会触发“show web view”代码,但会尝试加载已被破坏的NSData对象。它可能包含完全的垃圾,因此没有成功的“web视图加载”调用

正如我所说,这是一个远射,但在这一点上,唯一的东西向我跳出来

更新:

问题的另一个完全不同的原因可能是:


由于IP阻塞或任何网络设置,您的测试环境(即非应用商店构建)正在从互联网的某个部分(即您的办公室)发出请求,该部分有权访问包含广告的web服务器,而你的应用商店发布版本正试图从互联网上被禁止的部分访问广告服务器。再说一遍,可能不是这样,但值得一提。

天哪。我知道了

好的,在我说出我的发现之前,我确实想纠正我自己最初的措辞:模态广告从未在模拟器中工作过,但总是在设备上工作。我知道模拟器有它的怪癖,所以我从来没有想过它,特别是因为它总是在设备上工作。我知道这是一个重要的细节,在这次讨论中遗漏了这个细节,但自从我参与这个项目已经有两个星期了,直到今天我都忘记了

那么现在。。。在修补东西时,我注意到AdView.xib不在我的项目文件列表中。我扩展了几个文件夹,以为可能是不小心被拖进了其中一个文件夹,但根本没有列出。但这确实让我感到困惑——Xcode从未抱怨过缺少资源(没有警告或错误;总是一个完美的编译)

因此,我导航到物理位置并将AdView.xib添加到项目中。现在,模态广告显示在模拟器中,这是第一次。我认为,既然现在应用程序在模拟器中正常工作,那么它在发行版构建中应该可以正常工作(奇怪的相关性,但在我的更新进入应用商店之前,这是我所得到的一切)


显然,我会提交一个更新,所以我不会接受我自己的答案,直到更新到达应用商店(假设我已经修复了它)。

我对这个很好奇!我已经下载了这个应用程序,并使用Wireshark对连接进行嗅探,但乍一看没有发现任何异常。您是否注意到UIWebView标题在再次弹出视图之前已设置为取消?发生在哪里?@ockulus
IS_IPAD
的定义如下:
#define IS_IPAD(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
@Rog,UIWebView位于添加到navi的视图中