【问题标题】:Loading a local React app inside WKWebView iOS在 WKWebView iOS 中加载本地 React 应用程序
【发布时间】:2018-07-06 11:35:52
【问题描述】:

我已经在 React 中构建了一个站点,并且希望在 iOS WKWebView 中使用构建文件。


跟进

为了运行 React 构建文件夹,必须提供它,因此目前实现此目的的唯一方法是在 iOS 应用程序内构建服务器,提供 React 构建文件,并在 WKWebView 中加载本地 url。

我为服务器找到的最佳选择是 https://criollo.io/#getting-started

为什么是最好的?

  • 同时适用于 Objective-C 和 Swift 代码库
  • 易于使用的文档
  • 开发者的大力支持

【问题讨论】:

  • React 应用程序需要托管在服务器上,因此您可以在应用程序中实现 Web 服务器或在其他地方托管 React 应用程序并在 WebView 中声明该 URL。而且 WebView 确实支持 localStorage。
  • 我希望将构建文件包含在本机代码库中,以便它可以离线运行。到目前为止,我偶然发现了一些基于 iOS 的服务器,但没有关于简单地在 WKWebView 中加载构建。
  • 如果你还没有看到那个,试试github.com/robbiehanson/CocoaHTTPServer
  • 我正在做 reactjs + cordova 并且遇到了 file:// 的问题,这个插件帮助了我 github.com/TheMattRay/cordova-plugin-wkwebviewxhrfix

标签: javascript reactjs webview wkwebview


【解决方案1】:

您不一定需要构建 React 应用然后在本地加载这些文件。它可以工作,但更好的方法是启动您的本地服务器,即yarn start,然后像这样将您的网址(通常为http://localhost:3000/,可能根据您的设置而有所不同)指定为load in the WKWebView

    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let configuration = WKWebViewConfiguration()
        // (optional) your configuration 
        webView = WKWebView(frame: .zero, configuration:configuration)
        view = webView

        let url = URL(string: "http://localhost:3000")!
        let request = URLRequest(url: url)
        webView.load(request)
    }

由于您的服务器通过http 加载文件,iOS 的App Transport Security 将阻止它。它只允许通过https 协议加载文件。为了允许 ATS 通过 http 加载,您需要为 localhost127.0.0.1 或您的服务器正在运行的任何本地 ipaddr 添加异常。为此,open info.plist as source code 并粘贴以下内容,

<key>NSAppTransportSecurity</key>  
<dict>  
    <key>NSExceptionDomains</key>  
    <dict>  
        <key>127.0.0.1</key>  
        <dict>  
            <key>NSExceptionAllowsInsecureHTTPLoads</key>  
            <true/>  
        </dict>  
        <key>localhost</key>  
        <dict>  
            <key>NSExceptionAllowsInsecureHTTPLoads</key>  
            <true/>  
        </dict>  
    </dict>  
</dict> 

现在你应该可以在 WKWebView 中访问你的 React 应用了。

【讨论】:

  • 如果你通过npm start 命令使用webpack-dev-server,或者通过create react app,不建议在生产中使用(添加实时重载和其他开发工具)。您的反应代码库也不是在影响性能的生产模式下构建的。最好的办法是构建代码并提供服务(在外部或通过嵌入在应用程序中的静态服务器)
【解决方案2】:

您可以在没有服务器的情况下运行本地 React 应用程序。只需使用功能 WkWebView.loadFileURL(url, allowingReadAccessTo: url) 。您可以在answer 中查看将 React 应用文件添加到 xcode 项目的详细步骤。

记得通过在 package.json 中设置 "homepage": "./" 来配置您的 React 应用以使用相对路径。

【讨论】:

  • 太棒了!迫不及待想试试这个。这是 WkWebView 更新吗? @ncasas
  • 看来loadFileURL 一直在那里since iOS 9.0,不确定allowingReadAccessTo 参数,这是这里的关键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多