|
|
Log In | Not a Member? |
Contact ADC |
Web KitのWebスクリプティング機能を使って、JavaScriptスクリプティング環境からObjective-CのプロパティにアクセスしたりObjective-Cのメソッドを呼び出したりできます。
1つ、重要でありながら必ずしも明白ではない事実があります。それは、このブリッジがいかなるJavaScriptスクリプトも、Objective-Cにアクセスすることを許可していないということです。カスタムプラグインがインストールされていない限り、Objective-Cのプロパティとメソッドに、Webブラウザからアクセスすることはできません。ブリッジは、カスタムプラグインとWeb Kitオブジェクト(たとえばWebView)内で囲まれたJavaScript環境を使用している人を対象としています。
JavaScriptでのObjective-Cの使用方法
サンプルのObjective-Cクラス
WebScriptObject.hで定義されている非形式プロトコルのWebScriptingは、Objective-Cクラスに実装できるメソッドを定義して、そのインターフェイスをJavaScriptなどのスクリプティング環境に公開します。メソッドとプロパティの両方を公開できます。あるメソッドをエクスポート対象として有効にするには、そのメソッドの戻り型とすべての引数がObjective-Cオブジェクトか、またはintやfloatなどの基本データ型であることを確実にする必要があります。構造体と非オブジェクトポインタは、JavaScriptには渡されません。
メソッドの引数と戻り型は、スクリプティング環境に適した型に変換されます。たとえば、
JavaScriptの数値は、NSNumberオブジェクトか、またはintやfloatなどの基本データ型に変換されます。
JavaScriptの文字列は、NSStringオブジェクトに変換されます。
JavaScriptの配列は、NSArrayオブジェクトにマップされます。
それ以外のJavaScriptオブジェクトはWebScriptObjectインスタンスとしてラップされます。
その他すべてのクラスのインスタンスは、スクリプトに渡される前にラップされ、Objective-Cに戻るとラップ解除されます。
サンプルクラスを1つ見ていきましょう。ここではObjective-Cのアドレス帳クラスを作成し、JavaScriptに公開します。クラス定義から始めます。
@interface BasicAddressBook:NSObject { |
} |
+ (BasicAddressBook *)addressBook; |
- (NSString *)nameAtIndex:(int)index; |
@end |
次に、JavaScriptにBasicAddressBookインスタンスを発行するコードを記述します。
BasicAddressBook *littleBlackBook = [BasicAddressBook addressBook]; |
id win = [webView windowScriptObject]; |
[win setValue:littleBlackBook forKey:@"AddressBook"]; |
以上です。これで、JavaScript環境から基本的なアドレス帳にアクセスし、標準のJavaScript関数を使ってアドレス帳を操作することができます。次に、BasicAddressBookクラスインスタンスをJavaScriptで使用する方法を示すサンプルを作成します。ここでは、アドレス帳の特定の見出しにある人物の名前をプリントします。
function printNameAtIndex(index) { |
var myaddressbook = window.AddressBook; |
var name = myaddressbook.nameAtIndex_(index); |
document.write(name); |
} |
上記のサンプルコードを見ると、1つ変形があることが分かります。JavaScriptがObjective-CのnameAtIndexメソッドを呼び出した後にあるアンダースコア(_)で、JavaScriptにおいてnameAtIndex_と呼ばれています。これは、メソッド名のデフォルトの変更方法の実例です。
カスタム名を返すwebScriptNameForSelectorを実装しない限り、デフォルトの構成方法が使われます。返される名前がこのメソッドを呼び出しているスクリプトにとって一意であることを保証するのは、実装側の責任です。webScriptNameForSelectorの実装でnilを返すようにしている場合や、これを実装していない場合、セレクタのデフォルトの名前は次のように構成されます。
Objective-Cセレクタのコロン(“:”)は、すべてアンダースコア(“_”)に置き換えられます。
Objective-Cセレクタのアンダースコアにはすべて、前にドル記号(“$”)が付けられます。
Objective-Cセレクタのドル記号にはすべて、前にもう1つドル記号が付けられます。
次の表は、デフォルトのメソッド名コンストラクタの結果の例を示しています。
Objective-Cセレクタ | セレクタのデフォルトのスクリプト名 |
|---|---|
setFlag: | setFlag_ |
setFlag:forKey:withAttributes: | setFlag_forKey_withAttributes_ |
propertiesForExample_Object: | propertiesForExample$_Object_ |
set_$:forKey:withDictionary: | set$_$$_forKey_withDictionary_ |
メソッド名のデフォルトの構成はObjective-Cの名前によっては混乱することがあるため、webScriptNameForSelectorを実装して自分のメソッドをわかりやすい名前で返すようにすると、自分自身とそのクラスのユーザの利益になります。
BasicAddressBookに戻り、今度はnameAtIndexメソッドにwebScriptNameForSelectorを実装します。サンプルのBasicAddressBookクラスの実装で、以下を追加します。
+ (NSString *) webScriptNameForSelector:(SEL)sel |
{ |
... |
if (sel == @selector(nameAtIndex:)) |
name = @"nameAtIndex"; |
return name; |
} |
これでJavaScriptコードが、より論理的なメソッド名を示すように変更できます。
function printNameAtIndex(index) { |
var myaddressbook = window.AddressBook; |
var name = myaddressbook.nameAtIndex(index); |
document.write(name); |
} |
セキュリティの理由から、メソッドまたはKVCキーはデフォルトではJavaScript環境に公開されません。その代わり、クラスは次のメソッドを実装する必要があります。
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector; |
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name; |
デフォルトでは、すべてのセレクタとキーを除外します。いくつかのセレクタとキー名についてNOを返すと、そのセレクタやキーはJavaScriptに公開されます。
JavaScript環境からメソッドとプロパティを除外する方法についての詳細は、Web Kit Objective-C Framework Referenceを参照してください。
Last updated: 2007-07-10
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |