将本地存储从 swift 注入到 WKWebview

Posted

技术标签:

【中文标题】将本地存储从 swift 注入到 WKWebview【英文标题】:Inject local storage from swift to WKWebview 【发布时间】:2017-12-15 12:18:03 【问题描述】:

我的 Swift 代码:

self.webView.evaluatejavascript("javascript: localStorage.setItem('usr_dtls', 'vivek')")  (result, error) -> Void in
            print(result)
            print(error)
        

Error message in cosole:
nil
Optional(Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo=WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=SecurityError (DOM Exception 18): The operation is insecure., WKJavaScriptExceptionColumnNumber=25, WKJavaScriptExceptionSourceURL=about:blank, NSLocalizedDescription=A JavaScript exception occurred)

知道有什么问题吗?

【问题讨论】:

尝试删除javascript: 控制台中仍然出现相同的错误消息:Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo=WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=SecurityError (DOM Exception 18): 操作不安全。 , WKJavaScriptExceptionColumnNumber=13, WKJavaScriptExceptionSourceURL=about:blank, NSLocalizedDescription=发生 JavaScript 异常 【参考方案1】:
//Found a solution.Execute Javascript after webView finished loading
//Sample code:

    self.webView.navigationDelegate = self

    func webView(_ webView: WKWebView,
                     didFinish navigation: WKNavigation!)
        
            self.webView.evaluateJavaScript("localStorage.setItem('usr_dtls', 'vivek')")  (result, error) -> Void in

                print("Finished navigation and Local storage injection.")
            
        
    //Run the app and debug using Safari Technology Preview
    //You will see the injected data as Show in the image below:

    [![Screenshot][1]][1]


      [1]: https://i.stack.imgur.com/tzGUc.png

【讨论】:

完美工作【参考方案2】:

由于evaluateJavaScript 就像从 Safari Inspector 的控制台执行代码一样,所以不使用 javascript:

附带说明,javascript: 前缀用于从 URL 执行 JavaScript(您可以通过 键入(不是复制粘贴)javascript: alert('howdy') 到您的地址栏中来测试浏览器)。

【讨论】:

以上是关于将本地存储从 swift 注入到 WKWebview的主要内容,如果未能解决你的问题,请参考以下文章

从应用程序的文档目录加载本地 html 文件 swift wkwebview

从 URL 加载图像并使用 Swift4 将它们存储在本地

Swift - 如何将本地存储的对象数组(文件管理器)转换为较新的对象? (带有附加属性)

将领域从 Bundle 复制到 Documents,然后将其读入本地常量,在 Swift 2.0 中

我可以使用Swift包管理器创建本地模块吗?

Android Web-View:将本地 Javascript 文件注入远程网页