![](https://habrastorage.org/files/230/81c/56d/23081c56d81744a686c0916ba25a2e2b.png)
React Nativeとは何ですか?
![](https://habrastorage.org/files/7ea/73c/834/7ea73c834aaf4b5e9ca0f6384869805e.png)
ネイティブモジュールとは
![](https://habrastorage.org/files/0f4/185/a7f/0f4185a7f44e4afe96805f2de1ad4da0.png)
「アプリはプラットフォームAPIにアクセスする必要があり、React Nativeにはまだ対応するモジュールがありません。 JavaScriptで再実装することなく、既存のObjective-C、Swift、またはC ++コードを再利用したり、画像処理、データベース、または任意の数の高度な拡張機能などの高性能なマルチスレッドコードを記述したりできます。
これはまさに私たちのケースです。クライアントSDK voximplantには、ビデオ/オーディオコーデック、webrtc、srtp、ws、その他の怖い言葉など、かなり低レベルで記述された場合にのみ正常に機能するものがたくさんあります。 また、React Nativeアプリケーションの開発者はあまり関心がなく、アプリケーション全体がほぼ連続したjavascript / jsxであるため、理解可能な高レベルのjavascript APIに対処したいと考えています。 低レベルコードをReact Nativeモジュールにパックすると、開発者はアプリケーション開発に集中でき、内部の魔法を心配する必要がなくなります。
ネイティブモジュールアーキテクチャ
ネイティブモジュールには、c / c ++、objective-c、およびjavascriptコードが含まれる場合があります。 低レベルのコードでは、クラウド(c、c ++、libwebrtc、および小さなライブラリの束)とビデオ表示(objective-c)とのネットワーク相互作用を取り除いた。 高レベルのJavaScriptコードにより、クラウドラッパーと2つのReactウィジェットが残りました。1つは自分の動画をプレビューするためのもので、もう1つは対話者の動画を表示するためのものです。
![](https://habrastorage.org/files/7cb/ea0/958/7cbea09582004f3fa917da8f8368fc6f.png)
技術的には、低レベルコードと高レベルコードの分離は次のとおりです。Reactが提供するRCTBridgeModuleクラスを継承するObjective-Cクラスを作成します。 タイプRCT_EXPORT_METHODのマクロを使用して、javascriptコードで相互作用点を指定します。一方、objective-cコードでは、オペレーティングシステム、c / c ++ライブラリと相互作用し、ネイティブiOSウィジェットを作成し、他の必要で便利なことを実行できます。
既製のネイティブモジュールはさまざまな方法で配布できます。最も簡単なのは、ソースを.npmパッケージの形式で収集し、リポジトリに公開することです。 この場合、モジュールをプロジェクトに追加するには、「npm install」を実行し、.xcodeprojとアセンブルされたライブラリを追加するだけで十分です(ユーザーがパッチを使用してlibwebrtcを自分の場所に集めたくないので、それでも喜びです)。
機能的
![](https://habrastorage.org/files/7b3/d67/069/7b3d6706939a46b796a4a2d9d977b5ac.png)
React Nativeアプリケーションでモジュールを使用する
モジュールのインストールは、プロジェクトディレクトリで非常に簡単に見えます。
npm install react-native-voximplant@latest --save
![](https://habrastorage.org/files/6cc/8da/82d/6cc8da82d84548cc86a51e645145b755.png)
![](https://habrastorage.org/files/364/ff0/5a0/364ff05a07b94ee4bd662febd2eb5840.png)
「ビルド設定」タブで、「基本」ではなく「すべて」が選択されていることを確認し、ヘッダー検索パスを見つけて、 $(SRCROOT)/../ react-native / Reactおよび$(SRCROOT)/があることを確認します../../Reactと両方とも「再帰的」としてマークされます。
以上で、接続されたモジュールを使用するアプリケーションを作成できます。
いくつかのコード
var VoxImplant = require('react-native-voximplant'); // Adding SDK event listener RCTDeviceEventEmitter.addListener( 'ConnectionSuccessful', () => { console.log('Connection successful'); } ); ... componentDidMount: function() { VoxImplant.SDK.connect(); VoxImplant.SDK.setCameraResolution(320,240); }, … makeCall: function() { VoxImplant.SDK.createCall(number, settings_video, null, function(callId) { currentCallId = callId; VoxImplant.SDK.startCall(callId); }); }, ...
モジュールに慣れる作業を簡素化するために、ページの指示に従ってgithubから取得してコンパイルできるデモアプリケーションを作成しました。 結果は次のとおりです。
![](https://habrastorage.org/getpro/habr/post_images/3cd/39e/3c7/3cd39e3c72a3434cdff7c517f05d67d1.gif)
おわりに
多くの人が、ネイティブコードと比較したjavascriptのパフォーマンスについてReact Nativeを批判しています。 実際、このようなテクノロジーにより、両方の長所を組み合わせることが可能になります。アプリケーションロジックコードには高レベルで簡潔なJavaScriptが使用され、ライブラリおよびロジックの速度が重要なセクションには低レベルのc / c ++ / Objective-Cコードが使用されます。 このアプローチにより、アプリケーションの各部分の複雑さを均等に分散させることができ、1か所での蓄積を回避できます。これにより、コードが過度に複雑になり、サポートされなくなります。
質問、コメント、批判? 私たちは伝統的にコミュニケーションする準備ができています。