gpt4 book ai didi

ios - iPhone 应用程序在 WebThread MPVolumeSlider 上崩溃

转载 作者:技术小花猫 更新时间:2023-10-29 10:10:40 25 4
gpt4 key购买 nike

问个问题好像很笼统,但是这个bug很烦人,很难修复。

这是我从 Crashlytics 获得的 WebThread 的崩溃日志。

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

我在开发过程中从未见过这种崩溃(如果我能通过断点和控制台日志捕获它,我会非常高兴),但只有在它上线时才会出现在用户面前。

只能由 crashlytics 报告。

可能的原因;

应用程序使用 MagicalRecord并在启动时在后台从服务器获取数据。这使用多线程,当 webkit 使用 UIKit 部分并锁定时,另一个主线程似乎要访问它。所以我试图删除所有 dispatch_sync 并将其更改为 dispatch_async 但是在进行了一些功能调用后崩溃再次发生。

我想知道的是,为什么 WebCore 正在运行,而我从未在 UIWebView 上请求 MPVolumeController。

由于某种原因即使它们可以在后台运行,为什么它会崩溃?它经常发生,用户提示。

其他人有同样的问题吗?

最佳答案

这个错误发生在 iOS 8 之后。

加载包含 audiovideo 元素的 HTML 的 UIWebView 会随机崩溃。

我是这样修复的:

@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

关于ios - iPhone 应用程序在 WebThread MPVolumeSlider 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29523902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com