UIWebView的differnetly行为在App Store的版本比开发版(UIWebView

2019-09-29 08:52发布

我有与在模拟器以及一个物理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的与它barfed出()只是为了证明,HTML是模态呈现的AdView之前下载。

[叹...]

编辑1:如果我原来的职位还不清楚,该webViewDidFinishLoad不会被调用的分布版本(但在开发/发行版本一样)。

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

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

在AdViewController,我添加了一个临时NSLog()并转换到ADDATA和NSString的它记录到控制台,并且HTML在那里。 所以,一个UIWebView只是拒绝加载NSData的?

Answer 1:

天啊。 我看着办吧。

好吧,在我说什么,我发现,我要纠正我自己原来的措辞:模态广告从来没有在模拟器上工作,但始终在设备上。 我知道这个模拟器可以有它的怪癖,所以我从来没有想过它是什么,特别是因为它始终在设备上工作。 我知道这是失踪了这次讨论一个重要的细节,但它是一个几个星期,因为我曾在这个项目上,我都忘了所有关于它,直到今天。

那么现在,虽然用的东西修修补补,我发现AdView.xib是不是在我的项目文件列表。 我扩大了几个文件夹想,也许有人不小心被拖入其中之一,但它没有列出所有。 这确实有我摸不着头脑,虽然 - Xcode中从来没有抱怨过缺少的资源(无警告或错误;总是一个完美的编译)。

于是,我浏览到的物理位置,并且增加了AdView.xib到项目中。 现在,模态广告显示在模拟器,这是第一。 我估计,因为现在的应用程序正常工作在模拟器,它应该在分配建设工作的罚款(奇相关之作,但它是我的一切,直到我碰到更新在App Store)。

很显然,我会提交的更新,所以我不会接受我自己的答案,直到更新点击应用程序商店后(假设其实我有固定的)。



Answer 2:

好吧,这是一个非常长的镜头,但也许值得考虑。

在为NSData的文档状态至于initWithContentsOfURL“返回的对象可能会比原来的接收器不同的。” 所以,如果这一个不同的对象,其中一个是其实自动释放,可以考虑在这行代码:

adData = [[NSData alloc] initWithContentsOfURL:adURL];

这不会增加保留计数ADDATA -你没有写self.adData =或相似。 因此,在铭记方案中提到,由此返回NSData的是自动释放:你的方法downloadAdData其包装在NSAutoreleasePool内容。 这是正确的做法。 然而,这可能导致ADDATA释放之前presentAdModal称为主线程。 所以...

在presentAdModal你刚才检查ADDATA不是零-但它可以不为零,而且还已经从内存中在这一点上你的NSAutoreleasePool释放-因此,你在这种情况下触发“显示Web视图”代码,但可以尝试加载遭到打砸的NSData对象。 这可能会包含完整的垃圾,因此呼吁没有成功的“加载Web视图”。

正如我所说的,一个长镜头,但跳出我在这一点上ONY的事情。

更新:

你的问题完全不同的原因可能是这样的:

测试环境(即非应用商店构建)从网络中的某一部分发出请求(即你的办公室),其有权访问含有广告的Web服务器,因为无论是IP阻塞或任何网络设置存在,而您的App Store发布版本正在试图从被禁止上网的部分访问广告服务器。 此外,可能并非如此,但值得一提的。



文章来源: UIWebView acts differnetly in app store version than dev version