Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC


JavaScriptからのObjective-Cの使用

Web KitのWebスクリプティング機能を使って、JavaScriptスクリプティング環境からObjective-CのプロパティにアクセスしたりObjective-Cのメソッドを呼び出したりできます。

1つ、重要でありながら必ずしも明白ではない事実があります。それは、このブリッジがいかなるJavaScriptスクリプトも、Objective-Cにアクセスすることを許可していないということです。カスタムプラグインがインストールされていない限り、Objective-Cのプロパティとメソッドに、Webブラウザからアクセスすることはできません。ブリッジは、カスタムプラグインとWeb Kitオブジェクト(たとえばWebView)内で囲まれたJavaScript環境を使用している人を対象としています。

Contents:

JavaScriptでのObjective-Cの使用方法
サンプルのObjective-Cクラス


JavaScriptでのObjective-Cの使用方法

WebScriptObject.hで定義されている非形式プロトコルのWebScriptingは、Objective-Cクラスに実装できるメソッドを定義して、そのインターフェイスをJavaScriptなどのスクリプティング環境に公開します。メソッドとプロパティの両方を公開できます。あるメソッドをエクスポート対象として有効にするには、そのメソッドの戻り型とすべての引数がObjective-Cオブジェクトか、またはintfloatなどの基本データ型であることを確実にする必要があります。構造体と非オブジェクトポインタは、JavaScriptには渡されません。

メソッドの引数と戻り型は、スクリプティング環境に適した型に変換されます。たとえば、

その他すべてのクラスのインスタンスは、スクリプトに渡される前にラップされ、Objective-Cに戻るとラップ解除されます。

サンプルの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セレクタ

セレクタのデフォルトのスクリプト名

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




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
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