ios - UIWebView 在后台更新我有一个 EXC_BAD_ACCESS

标签 ios objective-c youtube uiwebview

我独自学习 iOS 编程,我想制作 Youtube 应用程序。

我希望我可以在单击主页按钮时收听我想听很多歌曲(比如 youtube 播放列表。但不是我可以在我的表格列表中选择歌曲的列表。)

我使用 youtube-ios-player-libarary https://github.com/youtube/youtube-ios-player-helper我解决了如果我按主页按钮应用程序在后台连续播放的问题。

但我现在有问题。

当我在后台听 YouTube 视频声音并且视频结束时,不播放下一个视频。在应用程序中正在运行,但不在后台运行。我没有像这样登录 Xcode。 (我试过僵尸)

enter image description here

我尝试在主线程中工作,如下所示:

[self performSelectorOnMainThread:@selector(createNewWebView) withObject:nil waitUntilDone:YES];

  dispatch_async(dispatch_get_main_queue(), ^{
        [self.webView removeFromSuperview];

       _webView = [self createNewWebView];
       [self addSubview:self.webView];
    });

但是没有用,现在我发现了这个设备日志:

Date/Time:           2016-01-18 15:42:46.46 +0900
Launch Time:         2016-01-18 15:42:33.33 +0900
OS Version:          iOS 9.2 (13C75)
Report Version:      105

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000001
Triggered by Thread:  13



Thread 13 name:  WebThread
Thread 13 Crashed:
0   libGPUSupportMercury.dylib      0x31e3d322 gpus_ReturnNotPermittedKillClient + 10
1   libGPUSupportMercury.dylib      0x31e3de12 gpusSubmitDataBuffers + 118
2   IMGSGX543RC2GLDriver            0x34bd968c 0x34bd6000 + 13964
3   WebCore                         0x29260792 WebCore::GraphicsContext3D::reshape(int, int) + 434
4   WebCore                         0x299371e2 WebCore::WebGLRenderingContextBase::initializeNewContext() + 502
5   WebCore                         0x29936dd0 WebCore::WebGLRenderingContextBase::WebGLRenderingContextBase(WebCore::HTMLCanvasElement*, WTF::PassRefPtr<WebCore::GraphicsContext3D>, WebCore::GraphicsContext3D::Attributes) + 484
6   WebCore                         0x29931be0 WebCore::WebGLRenderingContext::WebGLRenderingContext(WebCore::HTMLCanvasElement*, WTF::PassRefPtr<WebCore::GraphicsContext3D>, WebCore::GraphicsContext3D::Attributes) + 48
7   WebCore                         0x29936720 WebCore::WebGLRenderingContextBase::create(WebCore::HTMLCanvasElement*, WebCore::WebGLContextAttributes*, WTF::String const&) + 772
8   WebCore                         0x28fcfbca WebCore::HTMLCanvasElement::getContext(WTF::String const&, WebCore::CanvasContextAttributes*) + 250
9   WebCore                         0x28fcfa46 WebCore::JSHTMLCanvasElement::getContext(JSC::ExecState*) + 154
10  WebCore                         0x28fcf988 WebCore::jsHTMLCanvasElementPrototypeFunctionGetContext(JSC::ExecState*) + 88
11  JavaScriptCore                  0x28bad71e llint_entry + 21374
12  JavaScriptCore                  0x28bad338 llint_entry + 20376
13  JavaScriptCore                  0x28bad338 llint_entry + 20376
14  JavaScriptCore                  0x28bad338 llint_entry + 20376
15  JavaScriptCore                  0x28bad338 llint_entry + 20376
16  JavaScriptCore                  0x28ba8190 vmEntryToJavaScript + 336
17  JavaScriptCore                  0x28b016da JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 102
18  JavaScriptCore                  0x288eaa18 JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 344
19  JavaScriptCore                  0x288ea8bc JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 60
20  JavaScriptCore                  0x2897d780 JSC::boundFunctionCall(JSC::ExecState*) + 324
21  JavaScriptCore                  0x28bad71e llint_entry + 21374
22  JavaScriptCore                  0x28bad4ba llint_entry + 20762
23  JavaScriptCore                  0x28bad338 llint_entry + 20376
24  JavaScriptCore                  0x28bad338 llint_entry + 20376
25  JavaScriptCore                  0x28ba8190 vmEntryToJavaScript + 336
26  JavaScriptCore                  0x28b016da JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 102
27  JavaScriptCore                  0x288eaa18 JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 344
28  JavaScriptCore                  0x288ea8bc JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 60
29  JavaScriptCore                  0x2897d780 JSC::boundFunctionCall(JSC::ExecState*) + 324
30  JavaScriptCore                  0x28bad71e llint_entry + 21374
31  JavaScriptCore                  0x28bad338 llint_entry + 20376
32  JavaScriptCore                  0x28ba8190 vmEntryToJavaScript + 336
33  JavaScriptCore                  0x28b016da JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 102
34  JavaScriptCore                  0x288eaa18 JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 344
35  JavaScriptCore                  0x288ea8bc JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 60
36  JavaScriptCore                  0x2897d780 JSC::boundFunctionCall(JSC::ExecState*) + 324`enter code here`
37  JavaScriptCore                  0x28bad71e llint_entry + 21374
38  JavaScriptCore                  0x28bad338 llint_entry + 20376
39  JavaScriptCore                  0x28ba8190 vmEntryToJavaScript + 336
40  JavaScriptCore                  0x28b016da JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 102
41  JavaScriptCore                  0x288eaa18 JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 344
42  JavaScriptCore                  0x289c6f38 JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&, WTF::NakedPtr<JSC::Exception>&) + 64
43  WebCore                         0x28f95df2 WebCore::JSEventListener::handleEvent(WebCore::ScriptExecutionContext*, WebCore::Event*) + 490
44  WebCore                         0x291e17d8 WebCore::EventTarget::fireEventListeners(WebCore::Event*, WebCore::EventTargetData*, WTF::Vector<WebCore::RegisteredEventListener, 1ul, WTF::CrashOnOverflow, 16ul>&) + 532
45  WebCore                         0x28edb96c WebCore::EventTarget::fireEventListeners(WebCore::Event*) + 232
46  WebCore                         0x28fd60a0 WebCore::EventTarget::dispatchEvent(WTF::PassRefPtr<WebCore::Event>) + 64
47  WebCore                         0x291aebe6 WebCore::DOMWindow::dispatchMessageEventWithOriginCheck(WebCore::SecurityOrigin*, WTF::PassRefPtr<WebCore::Event>, WTF::PassRefPtr<Inspector::ScriptCallStack>) + 66
48  WebCore                         0x291aeb62 WebCore::DOMWindow::postMessageTimerFired(WebCore::PostMessageTimer&) + 98
49  WebCore                         0x291b212e WebCore::PostMessageTimer::fired() + 14
50  WebCore                         0x28e89898 WebCore::ThreadTimers::sharedTimerFiredInternal() + 136
51  WebCore                         0x28e897ec WebCore::timerFired(__CFRunLoopTimer*, void*) + 28
52  CoreFoundation                  0x25b919e6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14
53  CoreFoundation                  0x25b91618 __CFRunLoopDoTimer + 936
54  CoreFoundation                  0x25b8f464 __CFRunLoopRun + 1500
55  CoreFoundation                  0x25ae1bb8 CFRunLoopRunSpecific + 516
56  CoreFoundation                  0x25ae19ac CFRunLoopRunInMode + 108
57  WebCore                         0x28ecfcbe RunWebThread(void*) + 422
58  libsystem_pthread.dylib         0x25906c7e _pthread_body + 138
59  libsystem_pthread.dylib         0x25906bf2 _pthread_start + 110
60  libsystem_pthread.dylib         0x25904a08 thread_start + 8

———————————— 16.01.19 尝试过

dispatch_async(dispatch_get_main_queue(), ^{
   if (self.webView != nil) {
      self.webView removeFromSuperview];
      _webView = [self createNewWebView];
      [self addSubview:self.webView];
   }
});

if (self.webView == nil) {
      self.webView removeFromSuperview];
      _webView = [self createNewWebView];
      [self addSubview:self.webView];
   }

但是没有用。

我可以更改或添加什么代码? 请大家帮帮我..

最佳答案

由于后台有 open GL,它崩溃了。 如果应用程序在后台运行,您将需要禁用 open GL。 这是执行此操作的代码:

typedef void (*CallFuc)(id, SEL, BOOL);
typedef BOOL (*GetFuc)(id, SEL);
-(BOOL)webView:(UIWebView*)view enableGL:(BOOL)bEnable
{
BOOL bRet = NO;
do
{
    Ivar internalVar = class_getInstanceVariable([view class], "_internal");
    if (!internalVar)
    {
        NSLog(@"enable GL _internal invalid!");
        break;
    }

    UIWebViewInternal* internalObj = object_getIvar(view, internalVar);
    Ivar browserVar = class_getInstanceVariable(object_getClass(internalObj), "browserView");
    if (!browserVar)
    {
        NSLog(@"enable GL browserView invalid!");
        break;
    }

    id webbrowser = object_getIvar(internalObj, browserVar);
    Ivar webViewVar = class_getInstanceVariable(object_getClass(webbrowser), "_webView");
    if (!webViewVar)
    {
        NSLog(@"enable GL _webView invalid!");
        break;
    }

    id webView = object_getIvar(webbrowser, webViewVar);
    if (!webView)
    {
        NSLog(@"enable GL webView obj nil!");
    }

    if(object_getClass(webView) != NSClassFromString(@"WebView"))
    {
        NSLog(@"enable GL webView not WebView!");
        break;
    }

    SEL selector = NSSelectorFromString(@"_setWebGLEnabled:");
    IMP impSet = [webView methodForSelector:selector];
    CallFuc func = (CallFuc)impSet;
    func(webView, selector, bEnable);

    SEL selectorGet = NSSelectorFromString(@"_webGLEnabled");
    IMP impGet = [webView methodForSelector:selectorGet];
    GetFuc funcGet = (GetFuc)impGet;
    BOOL val = funcGet(webView, selector);

    bRet = (val == bEnable);

}while(NO);

return bRet;
}

当应用程序处于后台时调用[self webView:self.yourWebView enableGL:NO]

关于ios - UIWebView 在后台更新我有一个 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34891639/

相关文章:

c# - YouTube API v3 检查视频处理状态

php - 如何使用正则表达式在字符串中查找所有 YouTube 视频 ID?

ios - 无法使用设备上的沙盒测试用户登录

objective-c - 可以为 block 中的自动合成属性使用下划线(强引用循环)

Objective-C:获取触发 UIEvent 的 UITouch

facebook - 如何为网页上的视频添加Facebook分享按钮

ios - 检测到要删除的 iOS 应用程序?

ios - 具有不同 NSMutableParagraphStyle 的 Nsattributedstring

ios - 只显示我的 float 到某个小数位 - Swift

objective-c - 谷歌搜索引擎 - cocoa