IOS Iphone应用随机挂起无限期

时间:2011-12-06 14:40:51

标签: ios

应用程序构建在Xcode 4上,基本IOS级别为4及以上,在各种IP上进行了测试。应用中的信息是从JSON Feed加载的。

在我试图追踪正在发生的事情的过程中,我通过这个应用程序反复调试,这是一个相当基本的应用程序,有一些视图,总体而言,就应用程序来说,没什么惊人的或新的。

问题偶尔会出现,在我们的测试中很多时候,如果我们关闭Wifi来测试蜂窝连接,应用程序在加载时会挂起。

会发生启动画面,白色旋转活动轮旋转,好像它正在加载广告(广告显示为整个加载过程的一部分),但它只是在那里旋转。

那么,最明显的问题是广告的问题是什么?是大还是慢?不,JSOn订阅源速度很快(我们会在每次应用程序挂起时进行检查,并确保所有内容都加载正常),广告大约为20k。

调试得到了我将在下面列出的didFinishLaunchingWithOptions方法,它到达该方法的末尾,而调试器基本上没有报告任何其他内容。它只是坐在那里,在XCode调试导航器中没有任何可见,没有破坏点。

如果单步执行该方法,一旦它到达最后它将大约6-7步进入编译代码然后只是做同样的事情。

以下是该方法的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions { 

    [self loadData];

    splashViewController = [[OurSplashViewController alloc] initWithNibName:nil bundle:nil];
    splashViewController.delegate = self;

    OurWebViewController *webViewController = (OurWebViewController *)[[[tabBarController viewControllers] objectAtIndex:2] topViewController];
    webViewController.url = [NSURL URLWithString:@"http://m.testURL.com/this_app/"];
        webViewController.path = @"/MyPath/Sample";

    [window addSubview:splashViewController.view];
        [window makeKeyAndVisible];

    return YES;
}

因此,它达到了该方法的“是”,然后调试器进入了零和零的范围,没有任何报告并挂起应用程序。

有没有人知道可能导致这种情况的原因?

更新:

似乎已经隔离了挂起归结为发送但未收到响应的JSON调用。所以我的代码应该在一段时间后处理。

这是JSON代码,也许有人可以注意到我在那里缺少的东西:

- (void)fetchWithURL:(NSURL *)URL {
     if (!URL) {
        return;
    }

    self.jsonURL = URL;

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]     initWithURL:self.jsonURL];
    if (timeout) {
        [request setTimeoutInterval:timeout];
    }
    [request addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];   

    connection_ = [[NSURLConnection alloc] initWithRequest:request 
                                              delegate:self 
                                      startImmediately:YES];
    [request release];

    if (connection_ != nil) {
        if ([self.delegate     respondsToSelector:@selector(JSONFetchWillBeginDownload:)]) {
            [self.delegate JSONFetchWillBeginDownload:self];
        }
        receivedData_ = [[NSMutableData alloc] initWithCapacity:0];
    } else {
        if ([self.delegate respondsToSelector:@selector(JSONFetch:downloadDidFailWithError:)]) {
            [self.delegate JSONFetch:self downloadDidFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorUnknown userInfo:nil]];
        }
    }
}

根据查尔斯的回应失败的原因是:

客户端在收到整个响应之前已关闭连接

我想知道我的超时时间太短了吗?

3 个答案:

答案 0 :(得分:1)

使用Charles代理调试与远程服务和广告服务器的数据交换。

请参阅此tutorial以了解所有内容。

答案 1 :(得分:1)

如果出现旋转轮(可能是启动画面的一部分),那么您发布的方法显然有效。如果启动画面没有消失,那么开始调试的显而易见的地方就是发送请求的代码和接收响应的代码然后关闭启动画面。

使用像Charles这样的代理来验证请求是否已经发出并且响应正在响应。如果是这种情况,请调试接收响应的代码并关闭启动屏幕。如果不是这种情况,请调试发送请求的代码。

如果你没有到达任何地方,我建议发布相关代码。

答案 2 :(得分:0)

看起来我的超时时间对于广告来说太短了,因此如果用户关闭了WiFi,那么JSON加载时间太长,导致问题。

通过将超时提升到正常水平来修正它。