WeexPlus
為解決目前移動(dòng)開(kāi)發(fā)頻繁的迭代、開(kāi)發(fā)周期長(zhǎng)、人員成本高的問(wèn)題,移動(dòng)跨平臺(tái)開(kāi)發(fā)方案層出不窮。 WeexPlus則是一款基于阿里weex跨平臺(tái)方案(android/ios/h5)開(kāi)發(fā)的weex端與android native交互的組件擴(kuò)展庫(kù),提供頁(yè)面導(dǎo)航、數(shù)據(jù)存儲(chǔ)、圖片選擇、二維碼識(shí)別、權(quán)限等原生功能。web開(kāi)發(fā)者不用再為調(diào)用native功能而煩惱,android開(kāi)發(fā)者輕松搞定hybrid開(kāi)發(fā)。
如果你想采用純?cè)焖匍_(kāi)發(fā)方案,請(qǐng)移步:MVVMHabit
框架特點(diǎn)
-
快速集成
不管是web開(kāi)發(fā)者,還是android開(kāi)發(fā)者,都可以快速的集成此庫(kù)。
-
事件模式
整體使用事件派發(fā)思想,weex與native完全解耦,相互不依賴(lài)。weex端指定唯一的Action(動(dòng)作),native端會(huì)根據(jù)Action做出判斷,執(zhí)行對(duì)應(yīng)的邏輯,響應(yīng)結(jié)果。
-
頁(yè)面加載器
WeexPlus提供一個(gè)原生的頁(yè)面加載器,只需要傳入JSBundle文件路徑(本地/網(wǎng)絡(luò)都可以),會(huì)自動(dòng)渲染頁(yè)面,并帶有material design加載效果。加載失敗顯示錯(cuò)誤信息,可點(diǎn)擊重新加載。
1、準(zhǔn)備工作
WeexPlus基于Weex技術(shù),Weex 是一個(gè)使用 Web 開(kāi)發(fā)體驗(yàn)來(lái)開(kāi)發(fā)高性能原生應(yīng)用的框架,所以你需要掌握一定的Weex開(kāi)發(fā)知識(shí)。相關(guān)文檔
根據(jù)官方介紹配置安裝weex開(kāi)發(fā)環(huán)境
1.1、android視角
WeexPlus是集成了weex_sdk、glide、rxpermissions2、rxjava2、matisse、zxing、material的一套android library。提供了頁(yè)面導(dǎo)航、數(shù)據(jù)存儲(chǔ)、圖片選擇、二維碼識(shí)別、權(quán)限等原生功能給weex端調(diào)用,節(jié)約了自己再去開(kāi)發(fā)這樣一套庫(kù)的時(shí)間成本。
不管你是做hybrid開(kāi)發(fā),還是純跨平臺(tái)開(kāi)發(fā),android端直接依賴(lài)此庫(kù)(業(yè)務(wù)邏輯交給前端去搞定 罒ω罒)。
1.1.1、依賴(lài)方式
源碼依賴(lài): 下載例子程序,直接import weexplus module
遠(yuǎn)程依賴(lài):
//添加倉(cāng)庫(kù)支持
repositories {
...
maven { url 'https://jitpack.io' }
}
//遠(yuǎn)程依賴(lài)
implementation 'com.github.goldze:WeexPlus:1.0.0'
建議使用源碼依賴(lài)的方式,方便業(yè)務(wù)擴(kuò)展。
1.1.2、配置Application
繼承weexplus中的WeexApplication,或者在你Application的onCreate方法中調(diào)用:
WeexApplication.initialize(this);
1.1.3、混淆
-keep class me.goldze.weex.** { *; }
-dontwarn me.goldze.weex.**
1.2、web視角
WeexPlus可以讓你在沒(méi)有android開(kāi)發(fā)人員的情況下,滿(mǎn)足native功能調(diào)用的需求。
1.2.1、依賴(lài)方式
下載例子程序,將 android 文件夾整個(gè)放入weex目錄的 platforms 下,不再需要命令weex platform add android生成android程序。
1.2.2、配置app
項(xiàng)目集成好后,通過(guò)android studio打開(kāi)android項(xiàng)目,找到app/src/main/res/values/strings.xml,修改app名稱(chēng)和第一個(gè)頁(yè)面入口url的值。
<!--app名稱(chēng)-->
<string name="app_name">WeexPlus</string>
<!-- 入口url 換成你自己的第一個(gè)頁(yè)面文件,可以是本地, 也可以是網(wǎng)絡(luò) -->
<string name="entrance_url">file://main_demo.js</string>
集成好后執(zhí)行 weex run android 看效果
2、weex調(diào)用
導(dǎo)入 WeexPlus 的 AppModule 組件
//App原生通信模塊
const appModule = weex.requireModule("AppModule");
通過(guò)調(diào)用appModule.event(string,map,function,function)方法,來(lái)實(shí)現(xiàn)與native的通信。其中,
第一個(gè)參數(shù)string:代表action,指調(diào)用功能的動(dòng)作,是打開(kāi)頁(yè)面還是關(guān)閉頁(yè)面還是選擇圖片;</br>
第二個(gè)參數(shù)map:需要傳入的參數(shù);</br>
第三個(gè)參數(shù)function:邏輯成功的回調(diào);</br>
第四個(gè)參數(shù)function:邏輯失敗的回調(diào)。</br>
所有與本地方法的通信都是按照此結(jié)構(gòu)來(lái)操作。
2.1、頁(yè)面導(dǎo)航
2.1.1、打開(kāi)頁(yè)面
打開(kāi)一個(gè)帶有頁(yè)面加載器的新頁(yè)面
appModule.event(
"START_PAGER",
{
url: geRootIp() + "/dist/index.js",
title: "新頁(yè)面",
data: {}
},
function(e) {
//頁(yè)面打開(kāi)完成的回調(diào)
},
function(e) {
//頁(yè)面打開(kāi)失敗的回調(diào)
}
);
START_PAGER:動(dòng)作名,表示需要打開(kāi)一個(gè)新頁(yè)面;</br>
url:新頁(yè)面JSBundle文件路徑;</br>
title:新頁(yè)面的標(biāo)題;注意:當(dāng)值為NO_NAVIGATION時(shí)不顯示標(biāo)題欄;</br>
data:需要傳入到下一個(gè)界面的參數(shù)。
如果需要將參數(shù)傳入下一個(gè)頁(yè)面,這里提供了兩種方法:
- 一種是,將參數(shù)放入url中,例如http:...?user=123&psw=abc,新頁(yè)面通過(guò)weex.config.bundleUrl拿到當(dāng)前url,通過(guò)字符串截取的方式取出參數(shù)值。
- 另一種是,在新頁(yè)面的created方法中,獲取data字段傳入過(guò)來(lái)的數(shù)據(jù)(推薦)。
created: function () {
globalEvent.addEventListener("init", function(e) {
//e.data即是上個(gè)頁(yè)面data字段傳過(guò)來(lái)的值
console.log(e.data);
});
},
2.1.2、關(guān)閉頁(yè)面
關(guān)閉當(dāng)前界面
appModule.event(
"CLOSE_PAGER",
{},
function(e) {
//頁(yè)面關(guān)閉完成的回調(diào)
},
function(e) {
//頁(yè)面關(guān)閉失敗的回調(diào)
}
);
CLOSE_PAGER:動(dòng)作名,表示需要關(guān)閉當(dāng)前界面。
2.2、數(shù)據(jù)存儲(chǔ)
這里說(shuō)明一下:本身weex提供了storage模塊, 為什么這里又要自己寫(xiě)一個(gè)SharedPreferences存儲(chǔ)呢?為的是weex與原生更好的通信。比如混合開(kāi)發(fā)時(shí), 登錄界面是原生界面,登錄成功后本地保存用戶(hù)唯一標(biāo)識(shí),當(dāng)進(jìn)入weex界面時(shí)可以通過(guò)該模塊取出用戶(hù)唯一標(biāo)識(shí),實(shí)現(xiàn)相應(yīng)邏輯。
2.2.1、寫(xiě)入數(shù)據(jù)
將數(shù)據(jù)保存到手機(jī)本地
appModule.event(
"WRITE_DATA",
{
key: "user_info",
value: "{'userName':'張三','age':'18歲'}"
},
function(e) {
toastModule.showShort("寫(xiě)入成功!");
}
);
WRITE_DATA:動(dòng)作名,表示需要寫(xiě)入數(shù)據(jù);</br>
key:鍵名稱(chēng);
value:存入的數(shù)據(jù)。
2.2.2、讀取數(shù)據(jù)
讀取本地存儲(chǔ)的數(shù)據(jù)
appModule.event(
"READ_DATA",
{
key: "user_info"
},
function(e) {
toastModule.showShort(e.value);
}
);
READ_DATA:動(dòng)作名,表示需要讀取數(shù)據(jù);</br>
key:鍵名稱(chēng);</br>
e.value:在成功回調(diào)的方法中,得到存入的值。
2.3、圖片選擇
appModule.event(
"IMAGE_SELECT",
{},
function(e) {
toastModule.showShort("選擇了" + e.imgs.length + "張照片");
},
function(e) {
toastModule.showShort("圖片選擇失敗!");
}
);
IMAGE_SELECT:動(dòng)作名,表示打開(kāi)圖片選擇器選擇圖片;</br>
e.imgs:多張圖片絕對(duì)路徑的集合,WeexPlus 中配置了ImageAdapter,可直接通過(guò)image組件的 :src屬性加載。
2.4、二維碼
2.4.1、識(shí)別二維碼
打開(kāi)二維碼識(shí)別界面(二維碼采用Google ZXing開(kāi)源方案)。
appModule.event(
"SCANNING_QR",
{},
function(e) {
toastModule.showShort(e.result);
},
function(e) {
toastModule.showShort("掃描失敗,請(qǐng)檢查權(quán)限是否打開(kāi)!");
}
);
SCANNING_QR:動(dòng)作名,表示打開(kāi)二維碼識(shí)別界面;</br>
e.result:二維碼識(shí)別的結(jié)果,返回一個(gè)字符串
2.4.2、生成二維碼
功能暫時(shí)屏蔽,大多數(shù)生成二維碼的需求是由服務(wù)端實(shí)現(xiàn)
效果圖
<img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec89746c9a242?w=1080&h=1920&f=png&s=68426" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8a088835e95?w=1080&h=1920&f=png&s=104774" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8a74fe743f2?w=1080&h=1920&f=png&s=73863" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8aeb397d5f0?w=1080&h=1920&f=png&s=810603" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8c00f37d0a8?w=1080&h=1920&f=png&s=54384" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8c40dd9b00a?w=1080&h=1920&f=png&s=1308075" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8c8793597bb?w=1080&h=1920&f=png&s=92304" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8cb1fd994c7?w=1080&h=1920&f=png&s=75377" width="288" hegiht="512" align=center /><img src="https://user-gold-cdn.xitu.io/2018/6/11/163ec8cdd29f96aa?w=1080&h=1920&f=png&s=272309" width="288" hegiht="512" align=center />
<div id="xgwd">相關(guān)文檔</div>
License
Copyright 2018 goldze(曾憲澤)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.