2011-02-25 61 views
1

我遇到了一個在模擬器以及物理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?

+0

IS_IPAD是如何定義的? – occulus 2011-02-26 01:38:49

+0

我很好奇這個!我已經下載了應用程序,並使用Wireshark通過連接嗅探,但乍看之下找不到任何異常。您是否注意到UIWebView標題在再次彈出視圖之前已設置爲已取消?發生在哪裏? – Rog 2011-02-26 02:21:51

+0

@occulus。'IS_IPAD'的定義如下:'#define IS_IPAD(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad)' – 2011-02-26 16:32:24

回答

2

HOLY COW。我知道了。

好的,在我說出我發現的內容之前,我確實想糾正自己的原始措辭:模式廣告從未在模擬器中工作,但始終在設備上工作。我知道模擬器可能有它的怪癖,所以我從來沒有想過它,特別是因爲它始終在設備上工作。我知道這是本次討論中缺少的重要細節,但是自從我參與這個項目之後已經過了幾個星期,直到今天我都忘記了這一切。

現在,然後......在修補東西時,我注意到AdView.xib不在我的項目文件列表中。我擴大了幾個文件夾,可能是因爲偶然地將其拖入了其中一個文件夾中,但它沒有被列出。但是,這確實令我感到困惑 - Xcode從不抱怨缺少資源(沒有警告或錯誤;總是一個完美的編譯)。

因此,我導航到物理位置並將AdView.xib添加到項目中。現在,模擬廣告顯示在模擬器中,這是第一個。我認爲,自從現在應用程序在模擬器中正常工作,它應該在分佈構建中正常工作(奇怪的相關性,但是我的更新直到我的更新命中App Store)。

顯然,我會提交一個更新,所以我不會接受我自己的答案,直到更新命中App Store(假設我已經修復它)。

+0

應用程序昨天獲得批准,問題就消失了。仍然嘲笑說,所有這一次失蹤XIB將被忽視。 – 2011-03-03 01:57:54

0

好吧,這是一個非常長的鏡頭,但也許值得考慮。

docs for NSData表示與initWithContentsOfURL有關「返回的對象可能與原始接收者不同。「所以,如果不同的對象,而其中一個實際上自動釋放,可以考慮在這行代碼:

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

這不會增加對ADDATA一個保留計數 - 你沒有寫self.adData =或類似的東西,所以,考慮到所提到的場景,返回的NSData是自動發佈的:你的方法downloadAdData將它的內容封裝在一個NSAutoreleasePool中,這是正確的做法,但這可能會導致adData在發佈之前被釋放主線程因此...

在presentAdModal中,您只需檢查adData是否爲零 - 但它不能爲零,並且仍然是h已經被NSAutoreleasePool從內存中釋放 - 因此,你在這種情況下觸發「顯示Web視圖」代碼,但試圖加載已被刪除的NSData對象。這可能會包含完整的垃圾,因此沒有成功的「Web視圖加載」調用。正如我所說的那樣,一個長鏡頭,但在這一點上突然出現在我身上的事情。

UPDATE:

一個完全不同的問題的原因可能是這樣的:

測試環境(即非應用商店構建)正在從互聯網的某一部分請求(即您的辦公室)有權訪問包含廣告的網絡服務器,因爲IP阻止或任何網絡設置,而您的App Store發佈版本試圖從互聯網的禁止部分訪問廣告服務器。再次,可能不是這種情況,但值得一提。

+0

下載廣告HTML從未出現過問題。但是,爲了測試您的第一個想法,我將adData轉換爲一個字符串,並在「presentAdModal」中的if(adData)之前將其打印出來,並且HTML位於控制檯中,但UIWebView未加載。不錯,但!這值得拍攝。 – 2011-02-26 16:30:57

相關問題