改造一個項目上 Google Play 與 App Store 時候,選擇了 H5+,就是數字天堂、UniAPP、HBuilder 那家的技術方案。
這里總結下原因分享給大家做個參考,同時把相關的坑也跟大家說下,希望可以在某個時候幫到各位。
選擇這個方案原因后來想想其實很簡單,就是這個應用是先有了 H5 版本,即移動端瀏覽器版本,然后想要復刻到 APP 端,在應用市場售賣。
請注意,“先有 H5 版本”,然后想要轉成APP,不是從零開始哦。
其實參考的技術方案有很多,比如 React Native(Taro),Vue(UniAPP),甚至是 ionic、NativeScript 都簡單試過,當然還有類似的 Cordova。
其實像 React Native(Taro)、Vue(UniAPP)以及 NativeScript 被砍掉其實很簡單,背景就決定除非完全重構,否則這幾個方案就是浪費生命,幾乎等于重寫一遍。這么說的原因有二:
1、H5 版本有的情況下,不論是 DOM 寫法,還是虛擬 DOM 的組件,都是不通用的,比如你無法把 div 直接當做 view 來用,同時也不能將 button 當做 button 用……
2、H5 的 API 與移動端不通用,比如 video 的 API,在 H5 與移動端根本就是兩個東西。
然后就是 ionic 與 Cordova 的排除原因,很簡單:文檔與環境。
1、ionic 與 Cordova 的文檔在國內網絡環境下不好找,出問題很難搞,尤其大概率我這個玩意兒要寫插件……我都寫插件了,那干脆上 OC 和 Java 算了。
2、再就是環境,沒錯,這倆都需要 XCode 與 Android Studio 在你的設備上。雖說我是都有,但是我的目的很單純,就是把 H5 套殼啊,費那么大勁干嘛?一點都不環保。
剩下我還知道且用過的就是 html5plus 與 apicloud 了,后者已經賣身就算了,只剩下 html5plus。
其實吧,這個“土土”的,還是意外的好用的。
這玩意兒怎么用就不介紹了,基本有手就能用。
下載——創建5+項目——把 H5 代碼整進去——運行即可。
這里著重說說遇到的坑。
對了,先看下原來的 H5 效果,避免不知道是干嘛的。
簡單來說,就是通過瀏覽器(或 APP 內置瀏覽器)加載 3D 模型,同時調用攝像頭的圖像,將 3D 模型與攝像頭的拍攝一起繪制出一張圖片,用來演示用。比如做工程的工程模型,在現場比劃比劃就可以大概看出來效果,不需要把場景也建模了。嗯,大概就這么個東西。
H5 端的技術就是 three.js + video + 攝像頭,比較簡單,安卓瀏覽器兼容性良好,蘋果腎8沒問題,其他劉海設備沒測(后面打包成 APP 發現有點問題)。
好了,可以說問題了:
1、瀏覽器可以直接從 a 標簽下載圖片,APP 不行,需要解決授權問題。
2、蘋果設備默認的 video 層級問題。
3、iOS 設備在 APP 內 video 自動播放權限問題。
4、iOS 設備加載本地路徑文件問題。
上面幾個是比較坑的,就是那種想不到卻發生的……
問題1,這個需要把原本 a 標簽下載的 base64 內容,通過原生的 bitmap 進行轉換,最終再將 bitmap 存到相冊。
問題2,先說問題是啥樣的,就是 iOS 會把 video 全屏,且層級賊高,與上面圖完全不同,就只能看到一個帶有“直播”字樣的 video。解決方案很簡單,給 video 標簽添加“webkit-playsinline playsinline”屬性,即可要求同層渲染。
問題3,這個就是老生常談的問題了,屬于想不到,但是遇到有會“果然如此”的問題。沒啥好辦法,不用原生化處理,就只能產品層面變更,所以給加上了“播放”與“停止”的按鈕……
問題4,這個最粗暴,直接把本地地址全部換成遠程 URL 就好了,因為本來就是讓用戶自己傳遠程 URL 的,之前是想要本地演示加載快,所以用了本地地址。
還有就是一些具體的代碼怎么寫,比如如何獲取 Android 與 iOS 的權限狀態與申請權限,這種百度搜下就有了。
請注意,還真得用百度……“土土”的,國內還得是百度。
其實現在用 H5 開發一些東西還是很簡單,畢竟很多功能 H5 基本都能實現了(不考慮兼容性的話),可以看下這個網站,我比較喜歡去,可以定期學習新東西,強烈推薦收藏:What Web Can Do Today
別的沒了,歡迎大家溝通方案,我是被坑的挺難受的,尤其是 iOS……
一階段:
HTML+CSS:
HTML進階、CSS進階、div+css布局、HTML+css整站開發、
JavaScript基礎:
Js基礎教程、js內置對象常用方法、常見DOM樹操作大全、ECMAscript、DOM、BOM、定時器和焦點圖。
JS基本特效:
常見特效、例如:tab、導航、整頁滾動、輪播圖、JS制作幻燈片、彈出層、手風琴菜單、瀑布流布局、滾動事件、滾差視圖。
JS高級特征:
正則表達式、排序算法、遞歸算法、閉包、函數節流、作用域鏈、基于距離運動框架、面向對象基礎、
JQuery:基礎使用
懸著器、DOM操作、特效和動畫、方法鏈、拖拽、變形、JQueryUI組件基本使用。
第二階段:
HTML5和移動Web開發
HTML5:
HTML5新語義標簽、HTML5表單、音頻和視頻、離線和本地存儲、SVG、WebSocket、Canvas.
CSS3:
CSS3新選擇器、偽元素、臉色表示法、邊框、陰影、background系列屬性改變、Transition、動畫、景深和深透、3D效果制作、Velocity.js框架、元素進場、出場策略、炫酷CSS3網頁制作。
Bootstrap:
響應式概念、媒體查詢、響應式網站制作、刪格系統、刪格系統原理、Bootstrap常用模板、LESS和SASS。
移動Web開發:
跨終端WEB和主流設備簡介、視口、流式布局、彈性盒子、rem、移動終端JavaScript事件、手機中常見JS效果制作、Zepto.js、手機聚劃算頁面、手機滾屏。
第三階段:
HTTP服務和AJAX編程
WEB服務器基礎:
服務器基礎知識、Apache服務器和其他WEB服務器介紹、Apache服務器搭建、HTTP介紹。
PHP基礎:
PHP基礎語法、使用PHP處理簡單的GET或者POST請求、
AJAX上篇:
Ajax簡介和異步的概念、Ajax框架的封裝、XMLHttpRequest對象詳細介紹方法、兼容性處理方法、Ajax框架的封裝、Ajax中緩存問題、XML介紹和使用。
AJAX下篇:
JSON和JSON解析、數據綁定和模板技術、JSONP、跨域技術、圖片預讀取和lazy-load技術、JQuery框架中的AjaxAPI、使用Ajax實現爆布流案例額。
第四階段:
面向對象進階
面向對象終極篇:
從內存角度到理解JS面向對象、基本類型、復雜類型、原型鏈、ES6中的面向對象、屬性讀寫權限、設置器、訪問器。
面向對象三大特征:
繼承性、多態性、封裝性、接口。
設計模式:
面向對象編程思維、單例模式、工廠模式、策略模式、觀察者模式、模板方法模式、代理模式、裝飾者模式、適配器模式、面向切面編程。
第五階段:
封裝一個屬于自己的框架
框架封裝基礎:
事件流、冒泡、捕獲、事件對象、事件框架、選擇框架。
框架封裝中級:
運動原理、單物體運動框架、多物體運動框架、運動框架面向對象封裝。
框架封裝高級和補充:
JQuery框架雛形、可擴展性、模塊化、封裝屬于傳智自己的框架。
第六階段:
模塊化組件開發
面向組件編程:
面向組件編程的方式、面向組件編程的實現原理、面向組件編程實戰、基于組件化思想開發網站應用程序。
面向模塊編程:
AMD設計規范、CMD設計規范、RequireJS,LoadJS、淘寶的SeaJS。
第七階段:
主流的流行框架
Web開發工作流:
GIT/SVN、Yeoman腳手架、NPM/Bower依賴管理工具、Grunt/Gulp/Webpack。
MVC/MVVM/MVW框架:
Angular.js、Backbone.js、Knockout/Ember。
常用庫:
React.js、Vue.js、Zepto.js。
第八階段:
HTML5原生移動應用開發
Cordova:
WebApp/NativeApp/HybirdApp簡介、Cordova簡介、與PhoneGap之間的關系、開發環境搭建、Cordova實戰(創建項目,配置,編譯,調試,部署發布)。
Ionic:
Ionic簡介和同類對比、模板項目解析、常見組件及使用、結合Angular構建APP、常見效果(下拉刷新,上拉加載,側滑導航,選項卡)。
ReactNative:
ReactNative簡介、ReactNative環境配置、創建項目,配置,編譯,調試,部署發布、原生模塊和UI組件、原生常用API。
HTML5+:
HTML5+中國產業聯盟、HTML5PlusRuntime環境、HBuilder開發工具、MUI框架、H5+開發和部署。
第九階段:
Node.js全棧開發:
快速入門:
Node.js發展、生態圈、Io.js、Linux/Windows/OSX環境配置、REPL環境和控制臺程序、異步編程,非阻塞I/O、模塊概念,模塊管理工具、開發流程,調試,測試。
核心模塊和對象:
全局對象global,process,console,util、事件驅動,事件發射器、加密解密,路徑操作,序列化和反序列化、文件流操作、HTTP服務端與客戶端。
Web開發基礎:
HTTP協議,請求響應處理過程、關系型數據庫操作和數據訪問、非關系型數據庫操作和數據訪問、原生的Node.js開發Web應用程序、Web開發工作流、Node.js開發Blog案例。
快速開發框架:
Express簡介+MVC簡介、Express常用API、Express路由模塊、Jade/Ejs模板引擎、使用Express重構Blog案例、Koa等其他常見MVC框架。
希望對您有所幫助!~
lus.runtime.openURL()
http://www.html5plus.org/doc/zh_cn/runtime.html
plus.runtime.openURL( url, errorCB, identity );
url: ( String ) 必選 要打開的URL地址
字符串類型,各平臺支持的地址類型存在差異,參考平臺URL支持表。
errorCB: ( OpenErrorCallback ) 可選 打開URL地址失敗的回調
打開指定URL地址失敗時回調,并返回失敗信息。
identity: ( String ) 可選 指定打開URL地址的程序名稱
在iOS平臺此參數被忽略,在Android平臺為程序包名,如果指定的包名不存在,則打開URL地址失敗。
<template>
<view>
<button class="button" type="primary" @click="open(0)">使用第三方程序打開指定URL</button>
</view>
</template>
<script>
export default {
data() {
return {
url: 'https://uniapp.dcloud.io/'
};
},
onLoad(op) {},
methods: {
open(types) {
plus.runtime.openURL(this.url, function(res) {
console.log(res);
});
}
}
};
</script>
plus.runtime.launchApplication( appInf, errorCB );
appInf: ( ApplicationInf ) 必選 要啟動第三方程序的描述信息
errorCB: ( LaunchErrorCallback ) 必選 啟動第三方程序操作失敗的回調函數
啟動第三方程序失敗時回調,并返回失敗信息。
<template>
<view>
<button class="button" type="primary" @click="launchApp">打開淘寶</button>
</view>
</template>
<script>
export default {
data() {
return {
url: 'https://uniapp.dcloud.io/'
};
},
onLoad(op) {},
methods: {
launchApp() {
let _this = this;
// 判斷平臺
if (plus.os.name == 'Android') {
plus.runtime.launchApplication(
{
pname: 'com.taobao.taobao'
},
function(e) {
console.log('Open system default browser failed: ' + e.message);
}
);
} else if (plus.os.name == 'iOS') {
plus.runtime.launchApplication({ action: 'taobao://' }, function(e) {
console.log('Open system default browser failed: ' + e.message);
});
}
}
}
};
</script>
[
// 只在 ios 中生效
{
name: 'App Store',
scheme: 'itms-apps://'
},
{
name: '支付寶',
pname: 'com.eg.android.AlipayGphone',
scheme: 'alipay://'
},
{
name: '淘寶',
pname: 'com.taobao.taobao',
scheme: 'taobao://'
},
{
name: 'QQ',
pname: 'com.tencent.mobileqq',
scheme: 'mqq://'
},
{
name: '微信',
pname: 'com.tencent.mm',
scheme: 'weixin://'
},
{
name: '京東',
pname: 'com.jingdong.app.mall',
scheme: 'openApp.jdMobile://'
},
{
name: '新浪微博',
pname: 'com.sina.weibo',
scheme: 'sinaweibo://'
},
{
name: '優酷',
pname: 'com.youku.phone',
scheme: 'youku://'
}
]
*請認真填寫需求信息,我們會在24小時內與您取得聯系。