SlideShare a Scribd company logo
NativeModuleの実装や
ライブラリ導入をした話
【シューマイ】Tech Lead Engineerから最新技術を学べ!ReactNative編 2019/02/27
自己紹介
 大津 穂高
 OPEN8 Inc.
@14__oz
プロダクト
https://video-b.com
https://letronc-m.com https://lxtrip.com
https://open8.com/business/video-tap
概要
 サードパーティ利用の話
 NativeModules作成の話
 CustomView作成の話
メリット・デメリット
 メリット
 自分で用意する手間が省ける
 公式でサポートされていないものが利用できる
 かっこいいものがある
 デメリット
 バグを含んでいる可能性がある
 更新がされない可能性がある
サードパーティ利用の話
 サードパーティ利用の話
 NativeModules作成の話
 CustomView作成の話
react-native-image-picker
 https://github.com/react-community/react-native-image-picker
 test_image_react_native.png (空白あり)
 data:image/pngが取得できる
 test_image react_native.png (空白なし)
 nullとなる
react-native-image-picker
 事前に空白をなくすようにした
 https://developer.android.com/reference/android/webkit/MimeTypeMap
NativeModules作成の話
 サードパーティ利用の話
 NativeModules作成の話
 iOS: https://facebook.github.io/react-native/docs/native-modules-ios
 Android: https://facebook.github.io/react-native/docs/native-modules-android
 CustomView作成の話
Repro
JavaJavaScript トラッキング名
ReproModuleComponent
@ReactMethod
private void customTrack(final String trackEvent) {
UiThreadUtil.runOnUiThread(new Runnable() {
@Override
public void run() {
Repro.track(trackEvent);
}
});
}
import { NativeModules } from 'react-native';
NativeModules.ReproAndroid.customTrack(
'CustomTrackName’
);
ReproのReactNative対応
動画の復号
JavaJavaScript
暗号化されたファイルのパス(配列)
復号したファイルのパス
CipherModuleVideoComponent
@ReactMethod
private void getDecryptVideoPaths(
String key, String iv, ReadableArray videoPaths, Callback callback
) {
try {
//復号処理...
callback.invoke(videoPath);
} catch (Exception e) {
Bugsnag.notify(e);
}
}
コールバックで値を返却した理由
The return type of bridge methods is always void. React Native bridge is
asynchronous, so the only way to pass a result to JavaScript is by using callbacks or
emitting events (see below).
 自作したNativeModuleから値を返却するには、
コールバックかイベント発行となる(iOS/Android)
 イベントの発行について
 https://facebook.github.io/react-native/docs/native-modules-
android#sending-events-to-javascript
CustomView作成の話
 サードパーティ利用の話
 NativeModules作成の話
 CustomView作成の話
 iOS: https://facebook.github.io/react-native/docs/native-components-ios
 Android: https://facebook.github.io/react-native/docs/native-components-android
CustomView
CustomViewのサイズを可変できない
 Android側のrequestLayoutを呼び出してもサイズが変更されない
 描画の領域はCustomViewを呼び出す前に決まっているらしい
 描画にはLayoutShadowNodeが使われている
参考:https://nicholasmarais1158.github.io/2017/07/React-Native-Custom-Measuring
ReactTextShadowNode ReactTextInputShadowNode
LayoutShadowNode
ReactBaseTextShadowNode
・・・・・・
ReactShadowNodeImpl
Yoga
LayoutShadowNode
ReactSliderShadowNode ・・・・・・
Yoga
 Facebookが公開しているクロスプラットフォームのレイアウトエンジン
 github: https://github.com/facebook/yoga
 document: https://yogalayout.com/docs
 ReactNativeのレイアウトエンジンYogaの仕組み
 前編: https://blog.engineer.adways.net/entry/2018/08/24/202254
 後編: https://blog.engineer.adways.net/entry/2018/08/31/180000
 続編: https://blog.engineer.adways.net/entry/2018/09/07/193000
LayoutShadowNodeの拡張
public class ShadowNode extends LayoutShadowNode implements YogaMeasureFunction {
public Integer viewTagToShadowNode = 0;
public ShadowNode() {
this.setMeasureFunction(this);
}
@Override
public long measure(
YogaNode node,
float width, YogaMeasureMode widthMode,
float height, YogaMeasureMode heightMode) {
int yogaWidth = 1080;
int yogaHeight = 607;
Integer viewWidth = viewToWidth.get(this.viewTagToShadowNode);
Integer viewHeight = viewToHeight.get(this.viewTagToShadowNode);
if (viewWidth != null && viewHeight != null) {
yogaWidth = viewWidth;
yogaHeight = viewHeight;
}
return YogaMeasureOutput.make(yogaWidth, yogaHeight);
}
}
まとめ
 サードーパーティは便利だけど選定は気をつける
 Yoga、LayoutShadowNodeを用いてサイズを変更している

More Related Content

PDF
Open Fab Night Sensor Special - Android編
PDF
リコーUCSの開発をリーンスタートアップ的視点でふりかえる
PDF
2015年に「画面テストの動画録画」を作って「流行れ!」 と願ったが、流行らんかった上ロストした話 #seleniumjp
PDF
第5回業開中心会議
PPTX
Stack2017 自動化困難な状況での活動方法
PDF
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
PPTX
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
PPTX
Dot netconf2017 - VS拡張
Open Fab Night Sensor Special - Android編
リコーUCSの開発をリーンスタートアップ的視点でふりかえる
2015年に「画面テストの動画録画」を作って「流行れ!」 と願ったが、流行らんかった上ロストした話 #seleniumjp
第5回業開中心会議
Stack2017 自動化困難な状況での活動方法
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
Dot netconf2017 - VS拡張

What's hot (20)

PDF
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
PDF
脱・独自改造! GebでWebDriverをもっとシンプルに
PDF
Dockerで楽しむ自宅サーバ
PPTX
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
PDF
20161218 selenium study4
PDF
去年のデブサミの「日本Seleniumユーザーコミュニティ」のLTが真面目すぎてイマイチだったので、今年は何とかしようと色々がんばった結果ww
PPTX
Androidアプリ開発のテスト環境
PPTX
Unity(再)入門
PDF
Jenkins Bootcamp Premiumのご紹介 in デブサミ2016冬
PDF
ポストJenkins時代のCI戦略
PPTX
SI-Toolkitでテスト自動化を実現する現場で遭遇したこと
PPTX
Cordovaコトハジメ( Html5fun×senchUG )
PPTX
プログラムで映像をつくるとは?? ~超入門編~
PDF
JSオジサン openframeworks emscripten
PDF
サイドプロジェクトで使う Azure DevOps
PDF
Selenium boot campの紹介
PDF
快適なVRコンテンツ制作に必要な情報源のまとめ
PPTX
スマホアプリディレクターが考えていること
PDF
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
PPTX
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
脱・独自改造! GebでWebDriverをもっとシンプルに
Dockerで楽しむ自宅サーバ
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
20161218 selenium study4
去年のデブサミの「日本Seleniumユーザーコミュニティ」のLTが真面目すぎてイマイチだったので、今年は何とかしようと色々がんばった結果ww
Androidアプリ開発のテスト環境
Unity(再)入門
Jenkins Bootcamp Premiumのご紹介 in デブサミ2016冬
ポストJenkins時代のCI戦略
SI-Toolkitでテスト自動化を実現する現場で遭遇したこと
Cordovaコトハジメ( Html5fun×senchUG )
プログラムで映像をつくるとは?? ~超入門編~
JSオジサン openframeworks emscripten
サイドプロジェクトで使う Azure DevOps
Selenium boot campの紹介
快適なVRコンテンツ制作に必要な情報源のまとめ
スマホアプリディレクターが考えていること
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
Ad

Native modules and ui components