340
iOSのUIWebViewで、ロードしたページ内のjavascriptを呼び出し戻り値をiOS側に格納したいです。 どのような方法があるでしょうか？
CC BY-SA 3.0
2014-12-04T01:11:24.453
333
2014-12-04T07:10:29.333
525
question
javascript ios
iOSのwebViewでjavascriptを呼び出し、返り値を取得したい
webViewにロードしたhtmlが例えば次のようになっていた場合、

```

    <html>
    <head>
    <script>
        function test(value){
            return JSON.stringify({result : value * 2});
        }
    </script>
    </head>
    <body>
    </body>
    </html>
    
```

次のように[stringByEvaluatingJavaScriptFromString:](https://developer.apple.com/library/ios/documentation/uikit/Reference/UIWebView_Class/index.html#//apple_ref/occ/instm/UIWebView/stringByEvaluatingJavaScriptFromString:)を呼び出すことで、返り値を取得できます。

```

    NSString *function = [NSString stringWithFormat: @"test(%i)", 1];
    NSString *jsonString = [webView stringByEvaluatingJavaScriptFromString:function];
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"json: %@", json);
    
```

なお、`stringByEvaluatingJavaScriptFromString:`の戻り値はNSStringなので、シンプルなデータであればJSONで受け渡しする必要はないです。

また、Objective-C -> JSは以上のように簡潔にできますが、JS -> Objective-
Cについては、`UIWebView`には、C#の`WebBrowser`にある`ObjectForScripting`のような実装がないので簡潔には書けません（OSXであれば、[windowScriptObject](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/index.html#//apple_ref/occ/instm/WebView/windowScriptObject)というのが使えるようです）。C#の`WebBrowser`では、例えば、

```

    window.external.CSharpMethod(arg1, arg2);
    
```

のように書けます。

ここでのトピックから外れますので詳細については割愛しますが、 [JavaScriptからObjective-
Cにフック](http://qiita.com/ozw_sei/items/62d9cd1938cf6ea012bd#2-2)や[Calling
Objective-C code from UIWebView](http://pablin.org/2013/08/31/interfacing-
with-a-uiwebview-from-a-uiviewcontroller/)などを参考にして下さい。
CC BY-SA 3.0
2014-12-04T04:10:35.697
340
2014-12-04T07:10:29.333
2014-12-04T07:10:29.333
351
351
333
answer