2015-11-02 3 views
1

Я строй приложения с помощью UIWebView и JSExport введенных в ссылке: https://www.bignerdranch.com/blog/javascriptcore-example/EXC_BAD_ACCESS когда JSContext доступа в UIWebView

MyConsole код:

@objc protocol ConsoleJSExports : JSExport { 
    static func log(message: String) -> Void 
    static func error(message: String) -> Void 
} 

@objc public class MyConsole : NSObject, ConsoleJSExports { 

public class func log(message: String) { 
    print("JS Log:\(message)") 
} 

public class func error(message: String) { 
    print("JS Error:\(message)") 
} 

MyClass код:

extension MyClass: UIWebViewDelegate { 
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
     return true 
    } 

    func webViewDidFinishLoad(webView: UIWebView) { 
     weak var context = webView!.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext 
     context?.setObject(MyConsole.self, forKeyedSubscript: "console") 
    } 

} 

Это приложение работает нормально, но после я убью его и запустить его несколько раз, это приведет к краху, когда я пытаюсь получить доступ к контексту Webview снова:

func initMyJSCode(myId: String, rootUrl: String) { 
    let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext 
    context.objectForKeyedSubscript("initMyJSCode").callWithArguments([myId, rootUrl]) 
} 

Ошибка у меня:

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Subtype: KERN_INVALID_ADDRESS at 0x000000010a58beb8 
Triggered by Thread: 6 
Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0: 
0 JavaScriptCore     0x00000001832f36b8 JSC::BytecodeGenerator::BytecodeGenerator(JSC::VM&, JSC::FunctionBodyNode*, JSC::UnlinkedFunctionCodeBlock*, JSC::DebuggerMode, JSC::ProfilerMode) + 4712 
1 JavaScriptCore     0x00000001832f32d4 JSC::BytecodeGenerator::BytecodeGenerator(JSC::VM&, JSC::FunctionBodyNode*, JSC::UnlinkedFunctionCodeBlock*, JSC::DebuggerMode, JSC::ProfilerMode) + 3716 
2 JavaScriptCore     0x0000000183595250 JSC::UnlinkedFunctionExecutable::codeBlockFor(JSC::VM&, JSC::SourceCode const&, JSC::CodeSpecializationKind, JSC::DebuggerMode, JSC::ProfilerMode, bool, JSC::ParserError&) + 468 
3 JavaScriptCore     0x00000001833e8794 JSC::ScriptExecutable::newCodeBlockFor(JSC::CodeSpecializationKind, JSC::JSFunction*, JSC::JSScope**, JSC::JSObject*&) + 628 
4 JavaScriptCore     0x00000001833e8d40 JSC::ScriptExecutable::prepareForExecutionImpl(JSC::ExecState*, JSC::JSFunction*, JSC::JSScope**, JSC::CodeSpecializationKind) + 120 
5 JavaScriptCore     0x00000001831d10bc JSC::LLInt::setUpCall(JSC::ExecState*, JSC::Instruction*, JSC::CodeSpecializationKind, JSC::JSValue, JSC::LLIntCallLinkInfo*) + 600 
6 JavaScriptCore     0x000000018350204c llint_entry + 24636 
7 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
8 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
9 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
10 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
11 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
12 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
13 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
14 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
15 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
16 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
17 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
18 JavaScriptCore     0x0000000183502058 llint_entry + 24648 
19 JavaScriptCore     0x00000001834fbdf0 callToJavaScript + 304 
20 JavaScriptCore     0x000000018346a454 JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 44 
21 JavaScriptCore     0x00000001831d5554 JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 416 
22 JavaScriptCore     0x00000001831d52e0 JSObjectCallAsFunction + 556 
23 JavaScriptCore     0x00000001834d8964 -[JSValue callWithArguments:] + 288 

Может кто-нибудь, пожалуйста, помогите с этим?

+0

Несколько вещей. 1) Не могли бы вы опубликовать версию вашего кода, которая выйдет из строя на github? 2) Вы излишне сделали контекст слабой переменной в webViewDidFinishLoad, избегайте слабых, если это возможно. 3) JavaScriptCore намного проще работать с Objective-C, чем с Swift. –

ответ

0

Я узнаю, что получение JSContext из UIWebView не является хорошей идеей. Поскольку это не общедоступный API, не гарантируется, что JSContext всегда доступен во время выполнения.

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