2015-04-08 4 views
15

Похоже, что очень широкий вопрос, но это очень раздражает и трудно исправить ошибку.Приложение для iPhone падает на WebThread MPVolumeSlider

Вот краш-журнал для WebThread, который я получил от Crashlytics.

Thread : Crashed: WebThread 
0 libobjc.A.dylib    0x0000000193e97bd0 objc_msgSend + 16 
1 UIKit       0x0000000187f65dd8 +[UIViewAnimationState popAnimationState] + 332 
2 MediaPlayer     0x0000000185953358 -[MPVolumeSlider volumeController:volumeValueDidChange:] + 92 
3 MediaPlayer     0x00000001859c5fc4 -[MPVolumeController updateVolumeValue] + 260 
4 MediaPlayer     0x0000000185952cb0 -[MPVolumeSlider didMoveToSuperview] + 144 
5 UIKit       0x0000000187f2c1dc -[UIView(Hierarchy) _postMovedFromSuperview:] + 484 
6 UIKit       0x0000000187f37cbc -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1764 
7 MediaPlayer     0x0000000185955f54 -[MPVolumeView _createSubviews] + 264 
8 MediaPlayer     0x00000001859549d4 -[MPVolumeView _initWithStyle:] + 240 
9 MediaPlayer     0x0000000185954a60 -[MPVolumeView initWithFrame:style:] + 88 
10 WebCore      0x0000000191ba4684 -[WebMediaSessionHelper initWithCallback:] + 132 
11 WebCore      0x0000000191ba3db8 WebCore::MediaSessionManageriOS::MediaSessionManageriOS() + 96 
12 WebCore      0x0000000191ba3d28 WebCore::MediaSessionManager::sharedManager() + 56 
13 WebCore      0x0000000191ba2890 WebCore::MediaSession::MediaSession(WebCore::MediaSessionClient&) + 44 
14 WebCore      0x00000001916e8604 WebCore::HTMLMediaSession::create(WebCore::MediaSessionClient&) + 36 
15 WebCore      0x00000001916d0fb0 WebCore::HTMLMediaElement::HTMLMediaElement(WebCore::QualifiedName const&, WebCore::Document&, bool) + 1100 
16 WebCore      0x000000019170a2b4 WebCore::HTMLVideoElement::create(WebCore::QualifiedName const&, WebCore::Document&, bool) + 68 
17 WebCore      0x00000001916bdd9c WebCore::videoConstructor(WebCore::QualifiedName const&, WebCore::Document&, WebCore::HTMLFormElement*, bool) + 92 

Я никогда не видел такого рода аварии во время развития (я был бы очень рад, когда я могу поймать его с точки останова и лог консоли), но появляется только для пользователей, когда он в прямом эфире.

Сообщается только о катастрофе.

Возможная причина;

Приложение использует MagicalRecord и получает данные от сервера в фоновом режиме при запуске. Это использует многопоточность, и когда webkit использует часть UIKit и блокировку, другой основной поток, похоже, получает доступ к ней. Итак, я попытался удалить все dispatch_sync и поменять его на dispatch_async, но сбой происходит снова после нескольких функциональных вызовов.

Что я хочу знать, почему работает WebCore, и я никогда не запрашивал MPVolumeController в UIWebView.

Даже они могут бежать по фонам по какой-то причине, почему он падает? Это происходит часто, и пользователи жалуются.

У кого-нибудь другая проблема?

+0

То же здесь ... Это мой самый частый треск, и он начал появляться в прошивке 8. Я проводил дни в поисках решения, но безрезультатно .... – cujo30227

+0

Увидев также, ничего не вижу на форумах разработчиков Apple или что-то еще. – bpapa

+0

Удивление, если бы переход от UIWebView к WKWebView помог, но еще не пробовал. – bpapa

ответ

2

Эта ошибка произошла, поскольку прошивка 8.

UIWebView, который загружает HTML, содержащий audio или video элементов будет врезаться в случайном порядке.

Я исправил это так:

@interface H5WebKitBugsManager : NSObject 

+ (void)fixAllBugs; 

@end 


#import "H5WebKitBugsManager.h" 
#import <objc/runtime.h> 

void H5Swizzle(Class c, SEL orig, SEL new) 
{ 
    Method origMethod = class_getInstanceMethod(c, orig); 
    Method newMethod = class_getInstanceMethod(c, new); 
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { 
     class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    } else { 
     method_exchangeImplementations(origMethod, newMethod); 
    } 
} 

@implementation H5WebKitBugsManager 

+ (void)fixAllBugs 
{ 
    [self fixBug_MediaPlayerVolumeView]; 
} 

+ (void)fixBug_MediaPlayerVolumeView 
{ 
    CGFloat systemVersion = [UIDevice currentDevice].systemVersion.floatValue; 

    if (systemVersion < 8.0f || systemVersion > 9.1) { 
    // below ios version 8.0 has no VolumeView 
     return; 
    } 

    Class cls = NSClassFromString(@"WebMediaSessionHelper"); 
    NSString *allocateVolumeView = @"allocateVolumeView"; 
    SEL orig = NSSelectorFromString(allocateVolumeView); 
    SEL new = @selector(H5WKBMAllocateVolumeView); 
    Method newMethod = class_getInstanceMethod(self, new); 

    if(class_addMethod(cls, new, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { 
     H5Swizzle(cls, orig, new); 
    } 
} 

- (void)H5WKBMAllocateVolumeView 
{ 
    // WebKit's MediaSessionManageriOS is a singleton,in MediaSessionManageriOS.m. svn version181,859. 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      // must be dispatch in background thread 
      [self H5WKBMAllocateVolumeView]; 
     }); 
    }); 
} 

@end 
+0

Кажется, что 'MPVolumeView'' alloc' 'init' в bg thread вызывает проблему. 'allocateVolumeView' уже в WebThread (bg thread). – ooops

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