返回

Cordova 和 Html 交互时一种优雅的方式

IOS







在构建项目之前,你需要指定一组目标平台。你能够运行这些命令取决于您的机器是否支持每一个SDK,合理是否已安装SDK。在MAC上运行命令:

```bash
cordova platform add android
cordova platform add ios

在(cordova项目)下面两个标记出来的文件和文件夹移动…

# 在www文件夹移动
cordova-js-src
cordova-js-src

# 在platforms/android/app/src/main文件夹移动
cordova-android
cordova-android

# 在platforms/android/app/src/main/res/xml文件夹移动
cordova_plugins.xml

# 在platforms/ios文件夹移动
cordova

# 在platforms/ios/ProjectName文件夹移动
www
plugins

然后使用下面的命令运行

cordova build android --release

使用 Certificates and Identifiers创建一个新的distribution证书。 在 xcode项目上开启bitcode。 拖动 ipa 文件到 xcode 项目,更换工程设置的provisioning profile。

然后 使用Xcode运行构建。

以WKWebView为内嵌 WebView,实现封装了与Cordova交互的Native代码的原生类WkwebDelegate 如下:

class WkwebDelegate:NSObject,WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler{
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){
       // 做一些页面加载完成后的事情
   }
// 页面开始加载时调用
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!){
        // 开始加载网页时要做的事情
    }
// 接收到服务器跳转请求之后调用
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!){
        // 接收到服务器跳转请求后做的事情
    }
// 在收到响应后,决定是否跳转
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void){
        // 页面跳转时做的事情
    }
// 在页面加载失败时调用
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error){
        // 页面加载失败时要做的事情
    }
// 如果需要证书验证,与使用自签名证书有关系
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void){
        // 需要证书验证时做的事情
    }
}

以Javasript为内嵌WebView,实现封装了与Cordova交互的Native代码的原生类 CordovaPlugin 如下:

@CordovaPlugin()
public class CordovaPlugin extends CordovaPlugin {
    public static final String TAG = "CordovaPlugin";
    private Context context;
    // 重新初始化cordova插件
    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        super.initialize(cordova, webView);
        context = cordova.getActivity().getApplicationContext();
    }
    // 用来处理JS向原生发送的数据
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (action.equals("helloworld")) {
            String name = args.getString(0);
            Toast.makeText(context, "你好," + name, Toast.LENGTH_SHORT).show();
            callbackContext.success("你好," + name);
            return true;
        } else {
            return false;
        }
    }
}

上面的代码是基于JavaScript调用Native代码的示例。如果您需要从Native代码调用JavaScript,可以参考Cordova官方文档。

使用wkwebview的发送和监听事件消息如下:

# 监听
[self.wkWebView.configuration.userContentController addScriptMessageHandler:self name:@"helloName"];

# 发送
NSString *js = [NSString stringWithFormat:@"hello('%@')", _name];
[self.wkWebView evaluateJavaScript:js completionHandler:nil];

WebView和Cordova的交互。

为了在WebView中嵌入Cordova,您需要使用cordova-plugin-wkwebview-engine插件。该插件允许您使用WKWebView作为WebView,并提供了一个接口来与Cordova API进行交互。

<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript">
function onDeviceReady() {
    // Cordova is now initialized.
}

document.addEventListener("deviceready", onDeviceReady, false);
</script>

上面的代码将加载Cordova.js脚本,并在设备准备好后触发onDeviceReady事件。在onDeviceReady事件处理程序中,您可以使用Cordova API来访问设备功能。

关于Cordova和Html交互的更多信息,请参阅Cordova官方文档。

希望这篇文章对您有所帮助!