コアコンセプト / JavaScriptを介したネイティブAPIへのアクセス

JavaScriptを介したネイティブiOSおよびAndroid APIへのアクセス

この記事では、JavaScriptを使用してネイティブAPIにアクセスする方法の基本概念を説明します。 私たちの焦点は、JavaScriptと対応するネイティブプラットフォーム間でプリミティブ型がどのようにマッピングされるかです。 次に、複雑なオブジェクトがどのように表されアクセスされるかを説明します。 最後に、AndroidおよびiOS開発プラットフォーム用のTypeScript定義を提供するTypeScriptとtns-platform-declarationsアドオンについて説明します。

NativeScriptを使用すると、基盤となるプラットフォームからすべてのネイティブAPIにアクセスできます。 この動作を実現するために、多くのことが内部で発生します。それらの1つはマーシャリング(JavaScriptと、iOSのObjective-Cデータ型とAndroidのJavaデータ型間の変換)です。

この記事では、さまざまなデータ型パラメーターを使用してJavaScriptからネイティブAPIを呼び出す方法を学習します。 詳細については、iOSランタイムおよび Androidランタイムセクションのデータ変換に関するプラットフォーム固有のリソースを参照してください。

数値型

すべてのネイティブ数値型(例:iOSではchar、short、int、double、float、Androidではbyte、short、int、long、double、float)は、暗黙的にJavaScript数値に変換されます。 たとえば、iOSで次のコードを実行すると:

文字列

JavaScript文字列は暗黙的にAndroidではjava.lang.Stringに、iOSではNSStringにマーシャリングされ、その逆も同様です。

これの例外は、instancetype(initメソッドとファクトリーメソッド)を返すように宣言されたNSStringクラスのメソッドです。 つまり、Objective-Cの戻り値の型がinstancetypeであるNSString.stringWithStringの呼び出しは、 JavaScript文字列ではなくNSStringインスタンスのラッパーを返します。

例外: instancetypeを返すと宣言されたNSStringクラスのメソッド(initメソッドおよびファクトリーメソッド)、 たとえば、NSString.stringWithStringを呼び出すと、instancetypeの結果がObjective-Cに返されます。 NativeScriptコードでは、このような呼び出しは、JavaScript文字列ではなくNSStringインスタンスのラッパーを返します。

論理値

JavaScriptの論理値は、Androidではboolean、とiOSではBOOLに暗黙的にマーシャリングされ、その逆も同様です。

配列

JavaScript配列は、AndroidおよびiOS上ではNSArrayの、特殊なJava配列にマップされます。

クラスとオブジェクト

JavaScriptの世界では、すべてのネイティブクラスはコンストラクター関数によって表されます。 ネイティブクラスの各静的メソッドはJavaScriptコンストラクター関数の関数になり、各インスタンスメソッドはJavaScriptプロトタイプの関数になります。 非常に直感的ですが、JavaScriptを介してオブジェクトをインスタンス化し、メソッドを呼び出すには、いくつかの特徴があります(特にiOSの場合)。

iOSでのクラスとオブジェクトの操作

JavaScriptでNSMutableArrayクラスのインスタンスが作成および利用される方法の例を次に示します。

let array = new NSMutableArray();
array.addObject(new NSObject());
let array = new NSMutableArray();
array.addObject(new NSObject());

このスニペットは、NSMutableArrayのインスタンスを作成し、addObject(object)メソッドを使用してオブジェクトを追加します。 カーテンの後ろで起こることは次のとおりです。new NSMutableArray()は、iOSランタイムによって[[NSMutableArray alloc] init]の呼び出しに変換されます。 このインスタンスは、JavaScriptオブジェクトにラップされ、配列変数に格納されます。 プロトタイプチェーンには、NSMutableArray(およびその基底クラス)によって公開されているすべてのパブリックプロパティとメソッドが含まれています。 addObject(object)の呼び出しは簡単ですが、Objective-CセレクターをJavaScript関数にマッピングする方法を定義するいくつかの単純なルールに従って、より多くの引数を使用してObjective-Cメソッドを呼び出します。 次のNSMutableArrayセレクター、replaceObjectsInRange:withObjectsFromArray:range:を考えてみましょう。 JavaScriptでは、次の関数で表されます:replaceObjectsInRangeWithObjectsFromArrayRange(objectsToRange、souceArray、sourceRange)(引数名は任意です)。 ここで、関数名は、Objective-Cセレクターで定義された引数の名前を最初の引数に小さい文字で開始し、その後に大文字を追加することで生成されることに注意してください。

NSDictionary

ほとんどの場合、NSDictionaryインスタンスをパラメーターとして受け入れるメソッドに遭遇します。NSDictionaryインスタンスを作成する方法はいくつかあります。

2番目の例では、JSONリテラルをメソッドに渡します。 NSHTTPCookieDomainは変数であり、その値を得るために計算されたプロパティ名を使用する必要があります(そうでなければ、キーとして"NSHTTPCookieDomain"を取得しています)。

Androidでクラスとオブジェクトを操作する

次のコードスニペットは、JavaScriptでandroid.widget.Buttonのインスタンスが作成される方法を示しています。

let context = ...;
let button = new android.widget.Button(context);
button.setText("My Button"); // "My Button" is converted to java.lang.String
let context = ...;
let button = new android.widget.Button(context);
button.setText("My Button"); // "My Button" is converted to java.lang.String

上記のとおり、ネイティブJava型は、対応するパッケージを通じて公開されています。 つまり、ネイティブJava型にアクセスするには、含まれているパッケージを知り、明示的に指定するだけです。 ネイティブJavaメソッドは、通常のJavaScriptメソッドと同じ方法(メソッド識別子を使用し、必要な引数を指定する)でアクセスされます。 AndroidでのJavaパッケージの詳細については、こちらをご覧ください。

UndefinedおよびNull

JavaScriptのUndefinedおよびNullは、 JavaのnullポインターとObjective-Cのnilに変換されます。ネイティブのnull値はJavaScriptのnullに変換されます。

IntelliSenseとTypeScriptを介したネイティブAPIへのアクセス

ネイティブAPIにアクセスしてIntellisenseを使用するには、開発者の依存関係をtns-platform-declarationsに追加する必要があります。

インストールして有効にする手順

d.tsファイルには大量のメモリとCPUが必要であることに注意してください。 tsconfig.jsonskipLibCheckオプションをに追加することを検討してください。 詳細については、tns-platform-declarationsのGitHubリポジトリを参照してください。

入門

コアコンセプト

ユーザーインターフェース

ツール

ハードウェアアクセス

プラグインの開発

リリース

アプリテンプレート

パフォーマンスの最適化

フレームワークモジュール

ガイド

サポートを受ける

トラブルシューティング

Siedkick