一、在uniapp項(xiàng)目添加一個類茎杂,專門用來處理和原生進(jìn)行交互使用;
import Vue from 'vue';
! function(root, factory) {
if (typeof exports == 'object' && typeof module != 'undefined') {
module.exports = factory()
} else if (typeof define == 'function' && define.amd) {
define(factory)
} else {
document.addEventListener('plusready', function() {
// 修改此處為插件命名 ?注釋---1
var moduleName = 'uniappPlugin';
root.plus[moduleName] = factory()
}, false);
}
}(this, function() {
//在此處定義自己的方法 ?注釋---2()
var _BARCODE = 'uniappPlugin';
var plugintest = {
/** 跳轉(zhuǎn)原生登錄頁面 */
JumpNativeLoginView: function(successCallback, errorCallback) {
var success = typeof successCallback !== 'function' ? null : function(args) {
successCallback(args);
},
fail = typeof errorCallback !== 'function' ? null : function(code) {
errorCallback(code);
};
// 注釋---3
var callbackID = plus.bridge.callbackId(success, fail);
? ? ? ? ? ? //注釋---4
? ? ? ? ? ? ?let userName = "";
let userPwd = "";
// 注釋---5
return plus.bridge.exec(_BARCODE, "startLoginActivity", [callbackID,userName,userPwd]);
}
}
return plugintest;
});
代碼注釋說明:
注釋1和注釋2:下面已經(jīng)說明了侠讯,要和原生添加插件類同名淫痰;
注釋3:創(chuàng)建一個回調(diào)ID,uniapp和原生就是通過這個callbackID進(jìn)行識別和通訊
注釋4:添加額外的參數(shù)傳到原生(建議使用字符串或者json字符串)
注釋5:uniapp異步調(diào)用原生插件類的方法
二循衰、在vue頁面或者JS文件中需要調(diào)用的地方添加以下代碼
AndroidPlugin:這個是導(dǎo)入上面代碼類文件的一個別名---import AndroidPlugin from './androidPlugin.js';
AndroidPlugin.JumpNativeLoginView(function(result) {
//這里是處理原生成功后返回的一個回調(diào)(可以獲取登錄返回的用戶信息或者原生返回其它的一些信息等)
}, function(fail) {
//這里是原生失敗后返回的一個回調(diào)(一般這里不會添加什么代碼)
});
三铲敛、在AndroidStudio中添加一個插件類命名為PluginFeature,并將它繼承為StandardFeature(StandardFeature是uniapp打包SDK中的一個插件擴(kuò)展類)会钝;
四伐蒋、在uniapp打包SDK中的assets/data/dcloud_properties.xml文件中添加以下代碼
?
注意:name是要和上面代碼中注釋1和注釋2同名的,大家不要搞錯了顽素,否則會調(diào)用不到咽弦,value就是你創(chuàng)建的插件擴(kuò)展類路徑
public class PluginFeature extends StandardFeature {
private static JSONArray tempArray;
private static IWebview iWebview;
/**
* 調(diào)用原生登錄
*
* @param iWebview uniapp傳過來的webview參數(shù)
* @param array? ? uniapp傳回來的callID和其它的數(shù)據(jù)
*/
public void startLoginActivity(IWebview iWebview, JSONArray array) {
this.tempArray = array;
this.iWebview = iWebview;
//獲取回調(diào)ID(一定要獲取這個,原生通過這個ID來給uniapp回傳數(shù)據(jù)胁出,uniapp也是靠這個ID進(jìn)行解析)
String CallBackID = tempArray.optString(0);
//獲取uniapp傳過來的userName和userPwd
String userName = tempArray.optString(1);
String userPwd = tempArray.optString(2);
//TODO:跳轉(zhuǎn)登錄頁面
Context context = MyApplication.app;
Intent intent = new Intent(context, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
//將數(shù)據(jù)異步回傳到uniapp中
JSUtil.execCallback(iWebview, CallBackID,
"登錄成功后的用戶信息回傳到uniapp中型型,記住一定要字符串,json字符串也可以",
JSUtil.OK, false);
}
}
注意點(diǎn):
(1)插件的擴(kuò)展名一定要一致全蝶,否則是無法互相通訊的
(2)iOS使用這種方法也是可以實(shí)現(xiàn)原生iOS和uniapp的數(shù)據(jù)交互的
(3)本人發(fā)現(xiàn)原生拿到的callBackID只能使用一次闹蒜,原生只要回調(diào)回去后,這個callBackID就失效不能再次使用了(本人也不知道原因抑淫,不過按照個人理解也合理绷落,類似iOS中的委托,使用完就釋放了)
(4)原生回調(diào)傳回去的數(shù)據(jù)是字符串類型的始苇,如果是json字符串砌烁,uniapp需要轉(zhuǎn)換成對象需要使用JSON.parse(result)才方便使用