# APP製作的技術選擇 ## 1.常見的開發方式 1.原生型APP(Native App): 依照平台系統規範的開發語言、開發工具來製作App, 如: Android 使用 Java, C, Kotlin ios 使用swift, Objective-C 2.混合型APP(Hybrid App): 將原生開發方式與web技術結合,如:React Native、Flutter、Cordova、AppCan... 3.Web APP-以PWA(Progressive Web App 漸進式網頁)為例 由Google提出,結合web和app,因本質是網站,所以維護時,從server修改即可 ,且無不同平台需不同版本的問題 ![](https://i.imgur.com/ll7qnkx.png) reference:[你的APP開發適合原生型、混合型還是Web型?](https://reurl.cc/9p6M3a) reference:[【前端的 Flutter 新手村】Day2-為什麼選擇Flutter?React Native、原生開發、PWA不好嗎?](https://reurl.cc/0X4LK9) reference:[開發 App 用 Native 語言還是 Hybrid 好?Coder 你怎麼看?](https://reurl.cc/eOGqMb) ## 2.適合投票機的開發環境 ### Q1.網路是否必要? R1.若沒有辦法總是支持網路(所有行為都交由網路), Web APP就不會是個好選擇(現在的H5有PWA, 可以離線使用;但跟投票機的需求不搭). ### Q2.運算與更新速度會是重點嗎? R2.若運算速度不是追求目標, 原生APP也不是很有必要(若使用者體驗受到影響就需要Native, 因為App裡面放Web會需要使用過多電子元件;效能受到影響的例子: 正常60幀 -> Hybrid App跑30~40幀會比較自然). 小抄->原生APP通常是由“雲服務器數據+APP應用客戶端”兩部份構成,APP應用所有的UI元素、數據內容、邏輯框架均安裝在手機終端上。用戶只能通過App Store和應用商店下載到,每一種移動操作系統都需要獨立的開發項目。一般用於開發純工具類App,無需頻繁更新的應用程序,例如微信客戶端、一些管理應用。 R2.ref:[Native, Hybrid, Web App, Cross App哪一個是開發App最佳方案呢 ?Coder 你怎麼看?](https://reurl.cc/LM5YqL) R2.ref:[Native, Hybrid, Web App, Cross App哪一個是開發App最佳方案呢 ?](https://reurl.cc/eOGqMb) R2.ref:[原生?Web?還是混合開發?我不要你覺得,這次你得聽我的!](https://reurl.cc/qNGkLN) It leads to...Hybrid App! ## 3.Hybrid App 相關的開發方式&可能遇到的問題 #### 1.React Native: ##### a.相較於Android, ios,RN 的發展較不成熟,所以會有比較多未知的問題 ###### Ⅰ. RN的開源資料庫 因很少人能同時精通三種平台,以至在撰寫 RN 開源資料庫時會不一致或產生預料之外的 bug。 ###### Ⅱ. Debug不易 當crash發生在RN和原生之間,因為stack trace並不會在兩者之間跳來跳去,除錯就變得十分困難。 ###### Ⅲ. Native Bridge RN 橋接原生平台的API過於冗長難寫,也有頗多意想不到的錯誤(如 integer常會誤傳成string)。 ##### b.使用者體驗不佳: APP體積會很大(相較Flutter來說),尤其是需要打包許多東西的時候, 導致下載會花很長時間且相較於原生畫面,RN 初始的 render 時間過長 ##### c.兼容性差 (Learn once, write anywhere != Write once, run anywhere) 當涉及底層的功能,需要針對Android 和 IOS 做個別處理, 如 手勢系統,不適合使用 RN 統一執行牽涉複雜手勢的畫面 (但還是有持續研究並最新發佈了 react-native-gesture-handler 1.0 版本)。 ##### d.模擬器無法模擬實際狀況,需要準備測試用的裝置 雖然 Android emulator 跟 iOS simulator 都可以模擬運作程式, 但有時他們的行為會跟實際機器有所不同,而當你需要測試硬體相關的功能時, 例如:相機、藍芽,你會需要實體的測試用機器。 ### RN適合的對象 因此,從上述分析,可看出RN適合規模偏小,且不涉及底層與硬體互動的應用 1.APP沒有串接相機、藍牙、麥克風、陀螺儀等等系統硬體API需求 2.專案在意在時程,人力限制內完成任務 ![](https://i.imgur.com/11EqDKx.png) reference:[從網頁到 App— 從 React 到 React Native 的奇幻旅程](https://reurl.cc/eOGqnQ) reference:[Airbnb: 我們一起寫過的 React Native](https://reurl.cc/NRb3vq) #### 2.Flutter: ##### a.UI跨平臺穩定 ``` Google直接在兩個平臺上在底層重寫了UIKit,不依賴於Css等外部直譯器, 幾乎不存在UI表達不理想,渲染不正常的情況,可以獲得非常穩定的UI表達效果。 ``` ##### b.WidgetTree問題 ``` Flutter提倡“組合”,而不是“繼承”。(需要巢狀組合幾種Widget) widget tree很醜、不容易看懂、也容易造成效能問題->可以用演算法解決 ``` ##### c.APP體積小 ##### d.使用dart語言 ``` Ⅰ. google開發的語言、類似JS的物件導向語言。 Ⅱ. Stateful hot reload 不需要輔助工具來預覽寫出來的UI Ⅲ. 注意StatefulWidget和StatelessWidget不要用錯! 一種是帶狀態的一種是不帶狀態的。 因為StatelessWidget也能存值,其實區別就在於框架重構UI的時候會使用State來重構。 如果是StatelessWidget,暫時存進去的值就沒了。 ``` ![](https://i.imgur.com/htqtviF.png) ### Flutter適合的開發方向 Flutter由於widget的細節可以從高階追源到低階(控制填入的參數可以到很細),因此不管是需要低階控制、還是只要控制高階功能,都可以嘗試用flutter來製作。 reference:[days[2] = "為什麼選擇Dart?"](https://reurl.cc/eOM3vR) reference:[【開發經驗】淺談flutter的優點與缺點](https://reurl.cc/RXYjVe) reference:[days[26] = "為什麼Flutter的渲染樹這麼複雜?(上)"](https://reurl.cc/rR3pzZ) reference:[Flutter與ReactNative的異同](https://reurl.cc/gMeLWQ) #### 3.Cordova: 利用html,css,javascript,cordova plugin來完成實作,其中cordova plugin最為重要,他可以讓原生組件與javascript連接,也就是可以用原生的api來撰寫程式。目前市面上使用率不高。 - 優點 - 好上手 - 可以整合具有地理位置標籤、加速計、攝像頭、指南針、通知、消息等功能的應用程序 - 開源軟體 - 兼容性佳 - 缺點 - 網路資訊不可靠 - 運行速度緩慢,比不過原生app - 不同平台的插件可能與cordova有兼容性問題,因此需要自行修改,造成時間成本 比較圖 ![](https://i.imgur.com/OfJVidw.png) reference : [Cordova App 打包全揭祕](https://reurl.cc/kEnlXn) reference : [cordova與RN大揭密](https://reurl.cc/vWQk7o) #### 4.AppCan: - 優點 - AppCan將App底層複雜的原生功能封裝在引擎、插件中,開發者僅需調用接口、打包編譯,就可以獲得原生功能。 - 開發者可以像開發WebApp一樣開發app的視覺UI,以及絕大部分的交互,當需要使用原生功能(如攝像頭,陀螺儀等功能)時,只需要調用官方的API就可以輕鬆實現Native的效果。 - 缺點 - 不開源,無法修改、優化的動態代碼大眾版和企業版,大眾版免費,但功能有,詳細見附錄暫不支持自行開發/,無法調取android查詢功能框架自帶功能過多,導致應用安裝包偏大。文檔偏少部分系統無法使用IDE進行調試只能在服務器端發布,不能在本地發布IOS發布,需要將證書上傳到服務器 ![](https://i.imgur.com/Aed7pc8.png) reference:[浅谈Native、Web App、Hybrid、RN 和 Weex优劣](https://reurl.cc/V1Y8DZ) reference:[跨平台APP开发框架优缺点比较](https://reurl.cc/W10DvL)