使用 LeanCloud 與 React Native 構建原生應用

qq359907964 8年前發布 | 28K 次閱讀 LeanCloud 移動開發 React Native

來自: http://get.ftqq.com/8375.get

React Native 是 非死book 在今年的 F8 大會上發布的移動應用開發方案。它基于 JavaScript 和 React ,可以讓 Web 應用開發者在保持原有的開發體驗和效率的同時,為 Web 應用帶來原生應用的體驗。

React Native 使用 JavaScript 作為開發語言,其內建的打包系統支持包括 CommonJS 在內的多種模塊化標準,因此很多支持瀏覽器運行環境的 Node Package 也可以運行在 React Native 中。 LeanCloud JavaScript SDK 便是其一。

本文將介紹:

  • 如何在 React Native 中使用 Flux 架構來組織應用的數據流,以配合我們的 JavaScript SDK 向 LeanCloud 云端保存數據,重用代碼和實現平臺差異化。
  • 異步獲取當前用戶對象
  • 文件上傳
  • 向移動端推送消息

在介紹具體內容之前,讀者需要先了解和熟悉 React 和 React Native 的基礎概念,以及 LeanCloud JavaScript SDK 的基本用法,請參考以下資料:

安裝

首先,按照 React Native 文檔 配置開發環境、生成項目腳手架。這一步完成時,你應該能運行文檔中的「AwesomeProject」或者自己的項目。

然后,在項目的根目錄下運行以下命令,安裝 LeanCloud SDK:

npm install avoscloud-sdk@^1.0.0-rc5

最后在 JavaScript 入口文件(一般是 index.(ios|android).js)中引入 SDK 并初始化:

var AV = require('avoscloud-sdk');  
AV.initialize(APP_ID, APP_KEY);

把 APP_ID  和 APP_KEY 替換成實際的應用數據,對應信息在 LeanCloud 的 控制臺 / 設置 / 應用 Key 里可以找到。再次運行或刷新應用,如果沒有報錯的話,說明 LeanCloud SDK 已經正確地加載并執行了。

我們的 實時通訊 SDK 從 2.3.2 版本開始支持 React Native,你可以使用以下命令來安裝最新版本的 SDK:

npm install leancloud-realtime

數據存儲

在 React Native 中使用 LeanCloud SDK 對數據進行增刪改查與在瀏覽器中使用沒區別,具體用法請參考 SDK 文檔的 「對象」 章節以及 LeanCloudRocks Demo 。接下來討論的是 React 與 LeanCloud SDK 應該如何配合工作。

LeanCloudRocks 是一個基礎 Demo,演示了如何在一個 React 組件中將用戶輸入的數據保存到云端。在這個 Demo 中,我們簡單地將渲染視圖、響應用戶操作與操作數據封裝在一個 React 組件中。隨著應用變得復雜,組件之間開始出現需要共享的數據。我們試圖將共享數據交給上級組件維護,卻發現這會造成組件中充斥了數據與事件的代理邏輯,父子組件開始耦合。組件之間的耦合意味著 React 的優點之一的可預知性(predictablility)會大打折扣。解決這個問題的一個方案是 Flux 架構。

Flux 解耦了視圖(View)與數據(Store)。上圖展示了 Flux 中的數據流向:視圖層不再關心數據的變化,只負責將某一個數據快照渲染為頁面,以及觸發事件(Action);預先定義好的有限的事件通過 Dispatcher 派發給訂閱了事件的數據;數據更新自己,然后通知視圖重新渲染。在這個閉環中,React 很好地扮演了視圖的角色,而 LeanCloud SDK 工作在數據層。Flux 架構很好地解耦了 React 與 LeanCloud SDK。

用戶系統

在 React Native 中使用 SDK 需要特別注意的是,獲取當前用戶需要使用新增的異步 API:AV.User.currentAsync()。

AV.User.currentAsync().then((currentUser)=>{  
 // do something with currentUser;  
});

由于 React Native 的 Native JavaScript Bridge 的異步通信機制,React Native 的本地存儲相關 API 是異步的。為此,我們新增了該異步 API,并將 SDK 的運行環境分為兩種:

  • 異步存儲環境(React Native)
  • 同步存儲環境(瀏覽器、Node)

開發者可以通過 AV.localStorage.async 來做判斷。

如果在 異步 存儲環境中使用了同步 API 的 AV.User.current(),SDK 會拋異常。而在 同步 存儲環境中使用了同步 API 或異步 API 的 AV.User.currentAsync() 則都不會有問題。換句話說,如果你不確定你的代碼會在哪里運行,使用異步 API 總是安全的 。

下面介紹一個稍復雜的 Demo: LeanTodo

LeanTodo 是一個使用 LeanCloud SDK 與 React Native 構建的 Todo 應用,支持 iOS 與 Android,通過這個 Demo 你可以學到:

  • 在 React Native 中使用我們的 JavaScript SDK 對數據進行增刪改查。
  • 使用 Flux 來組織應用的數據流。
  • 使用我們 JavaScript SDK 中新的異步用戶 API。
  • 重用代碼,實現平臺差異化。

圖片上傳

React Native 提供了 CameraRoll API 來訪問用戶的照片,與 JavaScript SDK 的文件上傳功能配合使用非常簡單,只需要將 CameraRoll.getPhotos() 獲取到的 image 作為 blob 參數傳給 AV.File 的構造函數即可:

CameraRoll.getPhotos({  
 first: 1  
}, (data) => {  
 var edge = data.edges[0];  
 var image = edge.node.image;  
 var file = new AV.File('image.jpg', {  
   blob: image  
 });  
 file.save()  
   .then(  
     () => console.log('圖片上傳成功'),  
     (err) => console.log('圖片上傳失敗', err)  
   );  
}, console.log);

圖片上傳的完整 Demo: https://github.com/leancloud/react-native-image-upload-demo

需要注意的幾點:

  • CameraRoll 模塊使用前需要先 link,具體操作步驟參見 Linking Libraries
  • 圖片的讀取與發送是直接在 Native 中完成的,并不會出現大量數據在 Native > JS > Native 之間傳遞,不必擔心此類性能問題。
  • CameraRoll 的 Android 實現還沒有開源,在 Android 中調用會報錯。

推送

推送是原生應用最常見的功能之一。對于客戶端,主要需要實現「注冊設備」與「響應推送」兩個功能。React Native for iOS 也可以與 LeanCloud 的推送服務配合使用,并且幾乎不需要寫 Objective-C 或 Swift 代碼。

使用推送服務的完整 Demo: https://github.com/leancloud/react-native-installation-demo 。使用 JavaScript SDK 以及 installation 插件來注冊設備、響應推送的詳細步驟參見 其源碼分析

大家還想用 React Native 與 LeanCloud SDK 實現哪些常用的功能呢?歡迎留言告訴我們。

</div>

 本文由用戶 qq359907964 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!