2011-02-25 2 views
1

시뮬레이터와 실제 iPhone 4 및 iPhone 3GS에서 완벽하게 작동하는 앱에 문제가 있습니다. 앱이 승인되어 현재 App Store에 있지만 App Store에서 다운로드 한 배포 빌드는 dev/release 빌드에없는 버그를 보여줍니다.UIWebView는 dev 버전보다 앱 스토어 버전에서 differnetly 역할을합니다.

무료 앱이지만 현지 광고가 지원합니다. 앱이 실행되거나 백그라운드에서 돌아 오면 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 단순히

[webView loadData:adData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil]; 
에로드되는있는 UIWebView를 포함하여 헤더에 정의되어 있습니다

다시 말하지만,이 모든 작업은 시뮬레이터와 물리적 장치에서 dev/release 빌드를 사용하여 매 시간마다 완벽하게 작동합니다. 앱 스토어에서. NSString을 NSString으로 변환하고 NSLog()를 사용하여 AdView를 모달로 표시하기 전에 HTML을 다운로드했음을 증명하기 위해 바코드로 변환했습니다.

[한숨 ...]

편집 1 : 내 원래의 게시물이 명확하지 않았다 경우, (하지만 dev에/릴리스 빌드에서 수행) 유통 빌드에서 호출되지 도착 결코 webViewDidFinishLoad.

편집 2가 : 또한,이 AdViewController에

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

를 호출하기 직전에, 나는 임시 NSLog()을 추가하고있는 NSString에 adData를 변환 콘솔에 로그인하고 HTML이 있었다. 그래서, UIWebView 그냥 NSData를로드 거부?

+0

IS_IPAD는 어떻게 정의됩니까? – occulus

+0

나는 이것에 대해 궁금하다! 나는 앱을 다운로드하고 연결을 통해 냄새를 맡으려고 Wireshark를 사용했지만 처음에는 이상한 것을 찾을 수 없었습니다. 뷰에서 다시 튀어 나오기 전에 UIWebView 제목이 취소됨으로 설정되어 있는지 확인하십니까? 그런 일이 어디 있니? – Rog

+0

@culus.'IS_IPAD'는 다음과 같이 정의됩니다 :'#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)' –

답변

2

거룩한 여드름. 나는 그것을 알아 낸다.

좋아, 내가 찾은 것을 말하기 전에 모덜 광고는 시뮬레이터에서 작동 한 적이 없지만 항상 기기에서 작동한다는 것을 알았습니다. 나는 시뮬레이터가 그 단점을 가질 수 있다는 것을 안다. 그래서 나는 결코 그것의 어떤 것도 생각하지 않았다. 나는 이것이이 토론을 위해 빠진 중요한 세부 사항이라는 것을 알고 있지만, 나는이 프로젝트를 작업한지 2 주가 지나서야 오늘까지 모든 것을 잊었다.

이제는 ... 상황을 고치면서 AdView.xib가 내 프로젝트 파일 목록에 없다는 것을 알았습니다. 나는 우연히 그들 중 하나에 끌려 갔을 수도 있다고 생각한 폴더 몇 개를 확장했지만 전혀 열거되지 않았다. Xcode는 누락 된 리소스 (경고 또는 오류없이 항상 완벽한 컴파일)에 대해 불평하지 않았습니다.

그래서 실제 위치로 이동하여 AdView.xib를 프로젝트에 추가했습니다. 이제 첫 번째 인 모달 광고가 시뮬레이터에 표시됩니다. 나는 앱이 시뮬레이터에서 올바르게 작동하기 때문에 배포판 빌드 (이상한 상관 관계)에서 제대로 작동해야한다고 생각하지만 내 업데이트가 앱 스토어에 도착할 때까지 얻은 것입니다.

분명히, 나는 업데이트를 제출할 것이므로 업데이트가 App Store에 도착할 때까지 내 대답을 받아들이지 않을 것입니다. (실제로 그것을 고쳤다 고 가정 할 때).

+0

어제 승인을 받아 문제가 해결되었습니다. 이번에는 XIB가 누락되었다는 사실을 아직도 알지 못했습니다. –

0

좋아, 이것은 매우 긴 샷이지만 고려해 볼만한 가치가 있습니다.

docs for NSData initWithContentsOfURL과 관련하여 "반환 된 개체는 원래 수신기와 다를 수 있습니다.그것은 는 오토 릴리즈 사실이었다 다른 개체, 한 있다면 "그래서, 코드에서이 줄을 고려해

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

이 adData에 대한 유지 수를 추가하지 않습니다 - 당신은하지 않았다 self.adData = 또는 비슷하게 작성하십시오. 반환 된 NSData가 자동 릴리스 된 시나리오를 염두에 두십시오. downloadAdData 메서드는 해당 내용을 NSAutoreleasePool에 래핑합니다. 그러나 올바른 결과를 얻으려면 adData가 릴리스되어야합니다. 그러면 presentAdModal이 호출됩니다. 그래서 ...

presentAdModal에서는 adData가 nil이 아닌지 확인합니다.하지만 nil이 아니거나 여전히 h가 될 수는 없습니다. 그 시점에서 메모리에서 NSAutoreleasePool에 의해 할당 해제되었습니다. 따라서 은 "show web view"코드를 트리거하지만 휴지통에 있던 NSData 객체를로드하려고 시도 할 것입니다. 아마도 아마도 완전한 쓰레기를 담고있을 것이고, 따라서 성공적인 "웹 뷰로드"호출은 없을 것입니다.

내가 말했듯이, 긴 샷이지만,이 시점에서 나에게 튀어 나오는 것입니다.

UPDATE : 문제의

완전히 다른 원인이 될 수 있습니다

테스트 환경 (즉, 비 앱 스토어 빌드) 인터넷의 특정 부분의 요청을하고있다 (즉, 귀하의 사무실)은 IP 차단이나 어떤 네트워크 설정으로 인해 광고가 포함 된 웹 서버에 액세스 할 수있는 권한을 가지지 만 앱 스토어 릴리스 빌드는 금지 된 인터넷 부분에서 광고 서버에 액세스하려고 시도합니다. 다시 말하지만, 아마도 그런 경우는 아니지만 언급 할만한 가치가 있습니다.

+0

광고 HTML을 다운로드하는 데 문제가 없었습니다. 그러나 첫 번째 아이디어를 테스트하기 위해 adData를 문자열로 변환하고'presentAdModal'의'if (adData)'직전에 출력했으며 HTML은 콘솔에 있지만 UIWebView는로드되지 않았습니다. 그래도 좋은 생각이야! 그럴만 한 가치가있었습니다. –