2013-05-14 3 views
0

Я заметил постоянные воспроизводимые аварии, которая происходит в UIWebView: Здесь трассировки стеки:UIWebView падает, когда приложение возобновляется с фона

Incident Identifier: 4729DA31-A946-436D-97AC-EB3C8746E0FF 
CrashReporter Key: 92eabebd7d2b07f27dde132a3c28d6bb7cf92df4 
Hardware Model:  iPad3,6 
Process:   ... [3120] 
Path:   /var/mobile/Applications/10173A06-48D0-48F7-A832-9AC6961B045D/...app/... 
Identifier:  ... 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 

Date/Time:  2013-05-09 19:07:31.997 +0100 
OS Version:  iOS 6.1.3 (10B329) 
Report Version: 104 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x00000008 
Crashed Thread: 2 

... 

Thread 2 name: WebThread 
    Thread 2 Crashed: 
    0 WebCore       0x3772a03a WebCore::ThreadTimers::sharedTimerFiredInternal() + 130 
    1 WebCore       0x37729f86 WebCore::timerFired(__CFRunLoopTimer*, void*) + 62 
    2 CoreFoundation     0x31741854 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 12 
    3 CoreFoundation     0x317414fe __CFRunLoopDoTimer + 270 
    4 CoreFoundation     0x31740172 __CFRunLoopRun + 1226 
    5 CoreFoundation     0x316b3238 CFRunLoopRunSpecific + 352 
    6 CoreFoundation     0x316b30c4 CFRunLoopRunInMode + 100 
    7 WebCore       0x37697390 RunWebThread(void*) + 440 
    8 libsystem_c.dylib    0x39a530de _pthread_start + 306 
    9 libsystem_c.dylib    0x39a52fa4 thread_start + 4 

Происходит со следующими шагами:

  1. сделать UIWebView нагрузки запрос (NSURLRequest)
  2. Отправить заявку на фоновое изображение до того, как запрос будет загружен
  3. Подождите несколько минут
  4. Возобновление приложения из фона приведет к сбою с примерами трассировки стека информации.

Кто-нибудь знает, почему это происходит? Любая помощь очень ценится!

EDIT: Код, используемый для выполнения запроса

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    [self.webView loadRequest:urlRequest]; 
} 

Мой UIViewController также делегат UIWebView и я реализовать следующие методы:

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
-(void)webViewDidFinishLoad:(UIWebView *)webView 

приложение врезались перед любым из этих методов.

+0

UIWebView всегда сбой, если он работает на вторичной резьбе. и я понимаю, что когда приложение возобновляется с фона, WebView запускается во вторичном потоке вместо основного потока, поэтому он сбой. Если вы хотите опубликовать код, который вы используете, то мы сможем определить это –

+0

@AhmedZ. Я добавил дополнительную информацию. – aumanets

+0

Солнечный дал решение .. проверьте ниже ответ –

ответ

3

для решения этой проблемы вы можете добавить уведомление, и когда приложение переходит в фоновый процесс, в это время передайте значение nil в веб-представление.

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(handleEnteredBackground:) 
              name: UIApplicationDidEnterBackgroundNotification 
              object: nil]; 

или место ниже коды в applicationDidEnterBackground методе замораживает все задачи, до тех пор пока приходит к foreGround процессу.

UIApplication *app = application; 


    [app beginBackgroundTaskWithExpirationHandler:^{ 
     // Synchronize the cleanup call on the main thread in case 
     // the task actually finishes at around the same time. 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      //   if (bgTask != UIBackgroundTaskInvalid) 
      //   { 
      //    // [app endBackgroundTask:bgTask]; 
      //    // bgTask = UIBackgroundTaskInvalid; 
      //   } 
     }); 
    }]; 

    // Start the long-running task and return immediately. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do the work associated with the task. 


     // Synchronize the cleanup call on the main thread in case 
     // the expiration handler is fired at the same time. 
     dispatch_async(dispatch_get_main_queue(), ^{ 

     }); 
    }); 
+0

Я пробовал этот подход, и он по-прежнему падает. Мне нужно что-то положить в startBackgroundTaskWithExpirationHandler? – aumanets

+0

да в это время пропустите ni на ваш веб-просмотр. – Balu

+0

Не могли бы вы пояснить, что вы подразумеваете под «в то время передают значение nil в веб-представление». Передавать ноль для делегата? – Maitreya

Смежные вопросы