WebViewでのJavaScriptとObjective-Cのインタラクション


MacOS開発においてWebViewは既にブラウザの基本機能を実現しており、使い勝手は非常に便利である.WebViewでJS呼び出しObj-cのコード個人感覚を実現するにはいくつかの基本手順が必要である.
1.WebViewを使用するにはWebKitを追加する必要があります.framework.
2.WindowにWebViewを追加した後、右側のプロパティのconnectionでframeLoadDelegate、resourceLoadDelegate、UIdelegateを設定する必要があります.
3.Obj-cコードを呼び出すために、JSの他の変数(externalなど)を定義します.
- (void)webView:(WebView *)webView windowScriptObjectAvailable:(WebScriptObject *)windowScriptObject {

    [windowScriptObject setValue:self forKey:@"external"];
}

4.1 Obj-cでJSに対してオープンな関数を宣言します.
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector {

    if ( selector == @selector(Login:password:)) {
        return NO;
    }
    return YES;
}

4.2ネーミングインデックスを作成します.
+ (NSString *) webScriptNameForSelector:(SEL)sel {

    if (sel == @selector(Login:password:)) {
        return @"Login";
    }
    return nil;
}

JSではexternalのみ使用する.Login(account,password)は、Obj-cの[self Login:account password:password]を呼び出します.5.1 ResultがObj-cの変数であるObj-cに対して、JSに対してオープンな変数を宣言します.
+ (BOOL) isKeyExcludedFromWebScript:(const char *)name {
    
    if (strcmp(name, "Result") == 0) {
        return NO;
    }
    
    return YES;
}

5.2変数インデックスを作成します.
+ (NSString *) webScriptNameForKey:(const char *)name {
    
    if (strcmp(name, "Result") == 0) {
        return @"js_result";
    }
    return nil;
}
JSで同じ変数名を使用している場合は、この関数で宣言しなくてもよい.JSでexternalを押します.js_resultはObj-cのResult変数にアクセスして変更できます.
注意すべき点はxcode SDK 10である.7では変数のインデックスをよりスマートに作成するが、SDK 10.6 JSがObj-cの変数付与タイプを統一しないとプログラムがクラッシュする可能性があるので、SDKが10.7から10.6に切り替わると問題になる可能性があります.
これらの関数は、非公式プロトコルWebScriptingで定義されています.
Obj-c呼び出しJSを実装するコードは、scriptStrで合法的なJSコードである次の関数を使用して実装できます.
NSString * resultStr = [theWebView stringByEvaluatingJavaScriptFromString: scriptStr];

参照先:
XcodeヘルプドキュメントにはCallJSプロジェクトがあり、これらの基本的な機能を実現しています.