NativeScript でプラットフォームごとにファイルやプロパティを切り替え
はじめに
NativeScript(NativeScript-Vue) でプラットフォームごとにファイルやプロパティを切り替える方法。
チートシート
| 種別 | iOS | Android |
|---|---|---|
| View ファイル分割 | xx.ios.vue |
xx.android.vue |
| View 内で分岐 | <ios></ios> |
<android></android> |
| プロパティで分岐 | ios:prop |
android:prop |
| スタイルシートファイル分岐 | xx.ios.(s)css |
xx.android.(s)css |
| JS ファイル分岐 | xx.ios.js |
xx.android.js |
| JS 内で分岐 | isIOS |
isAndroid |
TL;DR
ios,androidをファイル名や、プロパティの prefix などに使う- 詳細は チートシート や各事例を参照
目次
環境・条件
1 | $ sw_vers |
詳細
参考: Platform-Specific Development with NativeScript - DEV
※自分の記事は NatvieScript-Vue での事例になってるけど、大本は NativeScript での話なので Angular でもいけると思う。
チートシート
| 種別 | iOS | Android |
|---|---|---|
| View ファイル分割 | xx.ios.vue |
xx.android.vue |
| View 内で分岐 | <ios></ios> |
<android></android> |
| プロパティで分岐 | ios:prop |
android:prop |
| スタイルシートファイル分岐 | xx.ios.(s)css |
xx.android.(s)css |
| JS ファイル分岐 | xx.ios.js |
xx.android.js |
| JS 内で分岐 | isIOS |
isAndroid |
View ファイル(Vue ファイル)を分ける
Hoge.ios.vueとHoge.android.vueを作成import Hoge from './Hoge'とするとプラットフォームに応じたファイルが読み込まれる
以下は app/main.js での例。xxxx.vue 内でも同様のことができると思う。
1 | import Hoge from './Hoge' |
ちなみに Hoge.vue が存在していても、Hoge.ios.vue と Hoge.android.vue がある場合はそちらが優先される模様。
View ファイル(Vue ファイル)内で分岐
参考: Blocks of Markup Within a View
<ios></ios> タグ、<android></android> タグを使うと、表示を分岐させることができる。
1 | <Page> |
タグ内(プロパティ)で分岐
各タグのプロパティの prefix として ios:, android: を付けると、プロパティの値を分岐させることができる。
これも ios:, android: が優先される模様。(つまり ↓ の text="common" は無視される)
1 | <Label |
Vue の v-bind も問題なく使えた。
1 | <Label |
スタイルシートファイルを分ける
app/app.ios.scss, app/app.android.scss を作成することで、個別のスタイル設定が可能になる。
※app/app.scss は無視されてしまうため、xxxx.ios.scss と xxxx.android.scss を作って、app.scss 内から @import 'xxxx'; とするのが良さそうかも。
スタイルシート内で分岐(※有料プラグイン)
参考: One CSS File, Multiple Platforms
これは有料プラグイン(@proplugins/nativescript-platform-css)が必要。
.ios, .android クラスを頭に付けると設定を分けることができるようになるらしい。
1 | .ios Label { color: red; } |
JS ファイルを分ける
hoge.ios.js, hoge.android.js を作成することで、JS ファイルを分けることができる(らしい。未検証)。
JS 内で分岐
参考: Code Blocks
JS 内でプラットフォームを確認して分岐できる。
自分は NativeScript-Vue なので、DeviceType.js という mixin を作成して使っている。
app/mixins/DeviceType.js
1 | import { isIOS, isAndroid } from "tns-core-modules/platform"; |
app/main.js
1 | import Vue from 'nativescript-vue' |
xxxx.vue や xxxx.js で以下のように使っている。
1 | if (this.isIOS) { |
まとめ
ios,androidをファイル名や、プロパティの prefix などに使う- 詳細は チートシート や各事例を参照
参考文献
- Platform-Specific Development with NativeScript - DEV
- Platform-specific CSS - Styling - NativeScript Docs
関連記事
- NativeScript, JsBarcode でバーコードを 生成/描画
- NativeScript でデバイスの輝度(明るさ)を制御する
- NativeScript で入力範囲外タップでキーボードを非表示にする
- NativeScript-Vue で次入力欄にフォーカスする方法
- NativeScript で Locale を意識した DatePicker/TimePicker
- NativeScript-Vue でページ読み込み後にページ移動やダイアログの表示
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア