在原生app中常常會使用到H5頁面,好比說電商中的活動頁,一些電商中的詳情頁,等等...這些頁面都有一個特色,那就是在將來修改的可能性,和一次性的概率特別的大。因此用H5的頁面是最睿智的一種選擇。
一旦使用了H5那麼就少不了和原生開發的一些交互(Android, IOS)以下的方案可以幫助你解決。 其實現原理是原生在js的window對象中注入一個js方法,以備原生應用進行處罰觸發,就和咱們平時去調用onclick的方法同樣簡單。 js代碼:前端
// mobile/index.js 經常使用js 調用原生的方式都在這裏體現。
export default {
/**
* 調用移動端方法
*
* @param {*} {name, params, call} 移動端注入的方法名 | 參數 | 回調
*/
callMoblieMethods({name, params, call}){
// 移動端安卓的環境
if(window.android) {
// 移動端使用java因此不能直接解析json,只能解析字符串或者json字符串
window.android[name](JSON.stringify(params));
}
// 移動端IOS的環境
if(window.webkit && window.webkit.messageHandlers) {
window.webkit.messageHandlers[name].postMessage(params);
}
}
}
複製代碼
調用方式java
if(window.android || (window.webkit && window.webkit.messageHandlers.activityDetails)) {
mobile.callMoblieMethods({ name: 'activityDetails', params: {activityId: item.act_id}});
}
複製代碼
這個判斷條件你們看起來可能很詭異,我測試過這各類機器的機型,安卓機window確定是沒有的屬性,可是在IOS上他會自帶webkit屬性因此咱們先判斷他是否有webkit屬性在判斷他是否有注入的方法名這樣他就能很好的調用這個方法了;android
爲了方便你們查找這裏也附上移動端的代碼:程序員
//Android
public class AndroidJavascriptInterface {
Activity mActivity;
public AndroidJavascriptInterface(Activity activity) {
this.mActivity = activity;
}
//診所詳情
@JavascriptInterface
public void clinicDetails(String jsonData) {
Log.i("znh", "H5-JS-診所詳情");
Intent intent = new Intent(mActivity, OutPatientActivity.class);
Bundle bundle = new Bundle();
bundle.putString(Constants.CLINIC_ID, GsonUtil.getJSONObjectKeyVal(jsonData, "clinicId"));
intent.putExtras(bundle);
mActivity.startActivity(intent);
}
//活動詳情
@JavascriptInterface
public void activityDetails(String jsonData) {
Log.i("znh", "H5-JS-活動詳情");
Intent intent = new Intent(mActivity, ActivityDetailActivity.class);
Bundle bundle = new Bundle();
bundle.putString("id", GsonUtil.getJSONObjectKeyVal(jsonData, "activityId"));
intent.putExtras(bundle);
mActivity.startActivity(intent);
}
}
//IOS
#import <JavaScriptCore/JavaScriptCore.h>
WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
[wkWebConfig.userContentController addScriptMessageHandler:self name:@"clinicDetails"];
[wkWebConfig.userContentController addScriptMessageHandler:self name:@"activityDetails"];
複製代碼
經過這個流程你們就能很方便的調用原生的方法了。web
咱們須要在短信中使用某個連接去打開原生應用若是沒有那麼就會提示他去下載某個應用,首先原生的應用須要定義一個url連接以備前端程序員在瀏覽器中調用,先給你們看一下連接示例:json
// IOS
iOSStarClinic://
// Andriod
yjjkyl://starclinic
複製代碼
短小精悍,你只須要調用這個就能夠了瀏覽器
那麼在js中要怎麼作呢?bash
if(this.isIOS) {
window.location.href = 'iOSStarClinic://';//與APP約定的一個協議URL
} else {
var state = null;
try {
state = window.open('yjjkyl://starclinic', '_blank');//與APP約定的一個協議URL
} catch(e) {}
if (state) {
window.close();
} else {
window.location.href = gbs.patientDownUrl;
}
}
複製代碼
先判斷一下當前是IOS仍是安卓環境,其實如今的瀏覽器已經不能經過偏方(計時的方法)來解決檢查當前時候有沒有安裝應用了,由於瀏覽器會彈出提示框用戶確認才能跳轉因此用戶一旦不點擊確認那麼瀏覽器就會進行跳轉!因此在當前頁應該要給用戶顯示一些內容以便用戶未打開應用的時候有其餘的業務流程。app
-完-post