《React Native 精解與實戰》書籍連載「iOS 平臺與 React Native 混合開發」

来源:https://www.cnblogs.com/parry/archive/2018/08/29/react-native-ios-mixture.html
-Advertisement-
Play Games

此文是我的出版書籍[《React Native 精解與實戰》](http://rn.parryqiu.com/)連載分享,此書由機械工業出版社出版,書中詳解了 React Native 框架底層原理、React Native 組件佈局、組件與 API 的介紹與代碼實戰,以及 React Native... ...


此文是我的出版書籍《React Native 精解與實戰》連載分享,此書由機械工業出版社出版,書中詳解了 React Native 框架底層原理、React Native 組件佈局、組件與 API 的介紹與代碼實戰,以及 React Native 與 iOS、Android 平臺的混合開發底層原理講解與代碼實戰演示,精選了大量實例代碼,方便讀者快速學習。

書籍還配套了視頻教程「80 節實戰課精通 React Native 開發」,此視頻課程建議配合書籍學習,書籍中原理性的東西講解的比較清晰,而視頻教程對於組件、API 等部分的代碼實戰開發講解比較直觀。

書籍相關所有資料請訪問:http://rn.parryqiu.com

本章將詳細講解在 React Native 框架下,iOS 平臺混合開發的原理以及詳細實現方法,並依然通過案例進行實際應用學習。本章需要具備 iOS 平臺開發語言 Objective-C 或 Swift 以及 iOS 核心類庫的基本知識。

11.1 iOS 平臺混合開發簡介

當我們需要使用一些 iOS 平臺的 API,而 React Native 框架目前還沒有提供對應的 JavaScript API 時,我們就需要自己編寫 React Native 框架與 iOS 平臺結合的混合開發代碼,使得 React Native 框架可以直接與 iOS 平臺的原生代碼進行通信。
混合開發的其他使用場景還包括對一些現有的 Objective-C、Swift 或者 C++ 代碼進行復用,或者編寫一些用於圖片處理、資料庫或一些其他高級特性的高性能或多線程的代碼。React Native 都開放了對應的介面供開發者調用。

接下來在原理講解的章節,我們通過結合一個簡單的實例詳細講解一下 React Native 中與 iOS 平臺混合開發的通信機制,這部分內容稍顯複雜,可能需要反覆閱讀理解其底層原理,並結合小實例進行體會學習,在第二部分還將有一個真實的混合開發示例,繼續加深你對混合開發的理解。

這部分內容屬於 React Native 開發的高階內容,即使不掌握也不影響你在學習了 React Native 基礎知識後進行 App 的開發,不過理解並掌握了這部分的話,更加有助於你理解 React Native 的底層原理與實現。

11.2 iOS 平臺混合開發原理詳解

這一章節,我們通過實現在 React Native 框架中調用我們在 Objective-C 中編寫的原生代碼,Objective-C 中的函數返回了一個簡單的字元串,React Native 框架中通過 JavaScript 代碼將字元串獲取到在 View 中的 Text 組件上顯示。功能雖然簡單,但是我們主要是通過此簡單功能的實現流程,深入學習 React Native 中與 iOS 平臺結合的混合開發原理。

iOS 平臺混合開發實現的過程包括如下幾個過程:

  1. 在 iOS 平臺的原生代碼中定義混合開發的入口,用於與 React Native 中的 JavaScript 代碼進行通信;
  2. 設置 iOS 平臺下項目的編譯必備設置;
  3. 在 React Native 項目中通過 JavaScript 代碼調用混合開發實現的 iOS 平臺原生功能。

完整代碼在本書配套源碼的 11-02 文件夾。

11.2.1 iOS 原生代碼實現

原生模塊使用 Objective-C 的類定義來實現與 React Native 框架通信的協議介面 RCTBridgeModule,註意 RCT 是 ReaCT 取的幾個大寫字母的縮寫。
首先我們通過 React Native CLI 命令初始化一個空的項目,命令執行如圖 11-1 所示。

截圖
圖 11-1 初始化一個空項目

使用 Xcode 打開 ios 文件夾下的 xcodeproj 項目文件,後續的混合開發我們將在 Xcode 中進行。
我們將我們混合開發的模塊命名為 MyModule,併在 Xcode 中分別建立兩個對應的文件,一個為頭文件 MyModule.h,另一個為使用 Objective-C 來實現的類 MyModule.m。建立時可以在 Xcode 新建視窗中選擇文件類型,如圖 11-2 所示。

截圖
圖 11-2 Xcode 下新建文件選擇類型

頭文件 MyModule.m 文件中初始化的代碼使用如下代碼。

1.  #import "RCTBridgeModule.h"  
2.    
3.  @interface MyModule : NSObject <RCTBridgeModule>  
4.    
5.  @end  

代碼第一行導入了 React Native 框架與原生代碼通信的協議頭文件 RCTBridgeModule.h。

為了通過類對 RCTBridgeModule.h 的實現,類中還需要包含 RCT_EXPORT_MODULE() 的巨集定義,RCT_EXPORT_MODULE() 中還可以傳入參數,命名自定義原生組件的名稱,如我們之前定義的文件名為 MyModule,這裡可以通過傳遞參數重新定義模塊名稱,RCT_EXPORT_MODULE(RenameMyModule) 這樣就將導出的模塊命名成了 RenameMyModule。如果不傳遞參數,那麼就使用類文件的名稱,即 MyModule.m 的名稱 MyModule。如果模塊類文件包含 RCT 開頭的文件名,那麼最終的模塊名稱將自動不包含 RCT 字元串。

MyModule.m 文件中的代碼實現如下。

1.  #import "MyModule.h"  
2.    
3.  @implementation MyModule  
4.    
5.  // 需要包含的巨集定義  
6.  RCT_EXPORT_MODULE()  
7.    
8.  // 定義了一個返回的字元串  
9.  - (NSDictionary *)constantsToExport {  
10.   return @{@"hello": @"你好,這是我編寫的第一個 iOS 原生模塊!"};  
11. }  
12.   
13. // 定義了一個可被調用的函數  
14. RCT_EXPORT_METHOD(squareMe:(NSString *)number:(RCTResponseSenderBlock)callback) {  
15.   int num = [number intValue];  
16.   callback(@[[NSNull null], [NSNumber numberWithInt:(num*num)]]);  
17. }  
18.   
19. @end  

此段代碼定義了一個固定的字元串輸出,方法為 constantsToExport,返回了名稱為 hello 的字元串。第二個定義了一個可以供 React Native 的 JavaScript 代碼調用的函數,函數功能非常簡單,就是將傳遞過來的 int 參數進行平方計算,計算後將計算的值返回。

函數的定義需要使用巨集命令 RCT_EXPORT_METHOD 進行顯式地定義。定義的函數都會被非同步地調用,所以函數的定義不是直接使用 return 返回一個值,和固定的字元串返回不一樣。
squareMe 是定義了此函數的函數名稱,參數為一個 NSString 型的值,名稱為 number,另一個參數為函數的回調函數,用於獲取原生代碼的執行結果。

函數的 callback 第一個參數為錯誤的返回(這裡沒有錯誤就返回了一個 null),第二個為計算後的值,供函數回調使用。

11.2.2 iOS 項目編譯設置

如上代碼都編寫完成後,在 Xcode 中執行項目編譯,點擊 Xcode 中的 Build 命令,如圖 11-3 所示。

截圖
圖 11-3 Xcode 項目的編譯

如果在編譯時遇到 fatal error: 'RCTBridgeModule.h' file not found 的錯誤,即 'RCTBridgeModule.h 文件找不到的問題,錯誤如圖 11-4 所示。

截圖
圖 11-4 RCTBridgeModule.h 文件找不到的錯誤

解決的方法為在 Xcode 的項目設置“Build Settings”選項卡下找到“Header Search Paths”設置節點,並確認在其中包含瞭如圖 11-5 所示的定義,即添加了 $(SRCROOT)/../node_modules/react-native/React 值的定義併在下拉選項中選擇了“recursive”。

截圖
圖 11-5 設置 Xcode 的 Search Paths

進行瞭如上的設置後,再次編譯項目即可解決此錯誤問題。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS介紹 CSS(Cascading Style Sheet,層疊樣式表)定義如何顯示HTML元素。 當瀏覽器讀到一個樣式表,它就會按照這個樣式表來對文檔進行格式化(渲染)。 CSS實例 每個CSS樣式由兩個組成部分:選擇器和聲明。聲明又包括屬性和屬性值。每個聲明之後用分號結束 CSS註釋 CSS ...
  • 在項目中,常常遇到一些問題,可以通過CSS來快速解決,比如受到佈局影響會導致內容溢出,這個時候就可以使用CSS換行解決 自動換行: { word-wrap:break-word; } 強制不換行: { white-space:nowrap; } 允許在英文單詞內斷行: { word-break:br ...
  • 作為前端最火的構建工具,是前端自動化工具鏈 最重要的部分 ,使用門檻較高。本系列是筆者自己的學習記錄,比較基礎,希望通過 問題 + 解決方式 的模式,以前端構建中遇到的具體需求為出發點,學習 工具中相應的處理辦法。(本篇中的參數配置及使用方式均基於 ) 本篇摘要: 本篇主要介紹基於 的`splitC ...
  • 前言:前端小白一枚,剛註冊博客,先發個學習過程中新碰到小問題試試水吧~ 摘要:最近在學習bootstrap,偶然碰到了一個小問題,bootstrap網站也沒有做過多的解釋,今天分享給大家。 問題描述:使用bootstrap的dropdown部件,打開網頁後點擊dropdown,報瞭如下錯誤:erro ...
  • 一、正則對象的方法 1、test() 語法:regObj.test(str) 對字元串執行搜索 返回值:布爾值。測試str中是否存在匹配regObj模式的字元串,存在返回true,不存在返回false 註意:該方法在正則對象是否帶有全局屬性(g)下的表現不同 先介紹下正則對象的lastIndex屬性 ...
  • 頁面樣式CSS代碼使用rem或者em相對單位即可! ...
  • 一、JS數據類型 1.基本數據類型 (檢測數據類型:typeof,返回的是字元串) (1) undefined 未定義的 只有一個值:undefined ; 兩種情況會導致undefined類型:沒有聲明:a ; 只聲明未賦值:var a ; 用typeof檢測數據類型,返回‘undefined’。 ...
  • 很長時間沒有進行webpack打包配置了,想起來都快有些忘記了,這個東西不是經常用到,只有在新建個項目的時候用到,不用官方模板,自己去動手配置的時候,有時候覺得還是有點難度。今天就想著自己動手進行配置一下,可是還是遇到坑了,折騰了一會,現在的webpack版本都4.x了,有些插件都有些改變。 今天就 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...