JavaScriptとObjective-Cの間の通信

6023 ワード

1、JSで変数がOCにあるタイプはOC-JS Bridgeによって変数のタイプが自動的に変換され、基本タイプは自動的に変換されます.JSのnumber、bootleanはOCにおけるNSNumberタイプに変換されます.Stringタイプは自動的にNSStringタイプに変換され、JSでの象はWebScripptObjectオブジェクトに変換されます.関連する属性情報は、Key-Valueの方法で読み取って書き込むことができ、本文の後に関連するコードが見られます.
2、OCでJSメソッドを呼び出してOCでJSメソッドを呼び出すことを実現するのはとても便利です.WebViewにはWindows Script Object属性があります.直接にスクリプトオブジェクトを獲得できます.その後、calWebScript Method:withAgmentsを呼び出してJSのオブジェクトにメッセージを転送する方法とパラメータがあります.簡単な方法で呼び出しても、直接WebViewの方法でstrigByEveraluating JavaScript FroomStringを実行して、文字列を返します.サンプルコード:

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// OC    
- (void)ocAction:(id)sender
{
    NSArray *args = @[@"Hello,JS!"];
    id result = [[webView windowScriptObject] callWebScriptMethod:@"JSFunction" withArguments:args];
    NSLog(@"%@",result);
}
// JS      
function JSFunction(parameter)
{
    //  OC    
    alert(parameter);
    
    //       
    return 'Web        !';
}
3、JSがOCを呼び出す方法はwebViewのframe LoadDelegateを設定することによって、–webView:didClear WindowObject:forFrame:回調方法でローカルオブジェクトを指定し、JSで直接にこのオブジェクトの関連方法を呼び出すことができます.OCのコードは以下の通りです.
//     JS   
- (WebScriptObject *)status:(WebScriptObject *)jsObject
{
    // JS          
    NSString *message = [jsObject valueForKey:@"message"];
    NSLog(@"%@",message);
    
    //       (WebScriptObject        ,            )
    [jsObject setValue:@"          !" forKey:@"message"];
    return jsObject;
}

#pragma mark -
#pragma mark WebFrameLoadDelegate

//     , self   JS  
- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame
{
    [windowObject setValue:self forKey:@"native"];
}

#pragma mark -
#pragma mark WebScriptingProtocol

/*
            ,
   NO       
 */
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
{
    if (selector == @selector(status:))
    {
        return NO;
    }
    return YES;
}

/*
        JS    (      , JS     OC   )
 */
+ (NSString *)webScriptNameForSelector:(SEL)sel
{
    if (sel == @selector(status:))
    {
        return @"ocMethod";
    }
    return nil;
}
JSのコードは以下の通りです.
function CallNative()
{
    if (native)
    {
        //          OC
        var parameter = {'message':'Hello,Objective-C!'};
        var result = native.ocMethod(parameter);
        
        //  OC     
        alert(result['message']);
    }
}