我遇到了一個在模擬器以及物理iPhone 4和iPhone 3GS中完美工作的應用程序的問題。該應用程序已獲批准,現在位於App Store中,但從App Store下載的發行版本具有dev/release版本中未顯示的錯誤。UIWebView在應用商店版本中的行爲與開發版本不同
這是一個免費的應用程序,但由本地廣告支持。當應用程序啓動(或從後臺返回)時,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];
同樣,這一切都可以正常工作,每次使用dev/release都會建立在模擬器和物理設備上 - 而不是分佈式構建從應用商店。我甚至將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?
IS_IPAD是如何定義的? – occulus 2011-02-26 01:38:49
我很好奇這個!我已經下載了應用程序,並使用Wireshark通過連接嗅探,但乍看之下找不到任何異常。您是否注意到UIWebView標題在再次彈出視圖之前已設置爲已取消?發生在哪裏? – Rog 2011-02-26 02:21:51
@occulus。'IS_IPAD'的定義如下:'#define IS_IPAD(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad)' – 2011-02-26 16:32:24