《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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...