JavaScript
iOS

Objective-cとwebview内JavaScriptのやりとり

More than 5 years have passed since last update.

Adventカレンダーのネタに困ってたのだけど、ちょうどObjective-CとJavaScriptの連携ではまったので、備忘録がてらやらせて頂きます。

概要


  • objective-cからwebView内のjavascriptを実行

  • javascriptからObjective-Cに通知してフック


Objective-CからWebViewに対してJavaScriptを実行する

以下のhtmlの javascriptfunction を実行するコード。


main.html

<html>

<body>
hoge
<script>
var msg = hello javascript;

function javascriptfunction(){
alert(msg);
}
</script>



hogeController.m

- (void)viewDidLoad{


 [super viewDidLoad];
NSString *html = @“<html>
<body>
hoge
<script>
var msg = ‘hello javascript’;

function javascriptfunction(){
alert(msg);
}
</script>
</html>“;
// webviewに読み込み
[_video_view loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]];
}


これでセットアップ完了

なんかのアクションに貼り付けてみれば、Objective-Cから実行できて、Alertするはず。


hoge.m

[_webView stringByEvaluatingJavaScriptFromString:@“javascriptfunction();”];


以上でObj-CからJSはおk


JavaScriptからObjective-Cにフック

通知側のJavaScript


main.js

function somefunction(){

// schemeは適当でおk
open("native://js”);
}



hogeController.m

/**

** webViewがリクエスト送った時のDelegate
**/
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)
request navigationType:(UIWebViewNavigationType)navigationType
{
// schemeがnative だった場合
if ([ request.URL.scheme isEqualToString:@"native" ]) {
// 関数を呼べ!
[ self invokeNativeMethod: request ];

// WebViewの読み込みは中断する。
return NO;
}
// 通常のschemeの場合は、フックせずそのまま処理を続ける
else {
return YES;
}
}

// Native処理を呼び出す
-(void)invokeNativeMethod: (NSURLRequest *)request
{
// native://closeWebViewが指定された場合
if ([request.URL.host isEqualToString:@“js”]) {
NSLog(@“js from objs”);
}
}


以上でJSからObjective-Cに通知してフックできます。


感想

自分は開発がほぼ終わりそうな段階で知ったのですが、もっと早く知ってれば無駄なことしなくてよかったのになぁ…とか思ってます。

しょうもない小ネタみたいなかんじで、申し訳ないですが以上になります!


追記

面白そうな資料見つけたので、後で追記します

https://developer.apple.com/library/mac/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/ObjCFromJavaScript.html