[XCODE] UIWebViewでJS -> Native、Native -> JS連携を行う方法
こんにちは、@yoheiMuneです。
今日はiPhoneアプリでWebViewベース開発する際のTipsの1つ、JS・Nativeのそれぞれの機能を呼び出す方法をブログに書きたいと思います。
多くの機能はJavaScriptで実現しますが、時々Native機能(ダイアログなど)を使いたい場合があります。
また、Native上のボタンを押した際にJavaScriptの機能を呼び出したい場合があります。
そんな要望を実現する機能が、JS・Native連携です。
以下では具体的な実装内容を記載します。
JavaScript側で、以下のような実装を行います。
今回は、someAlertが機能名で、{}に囲まれた内容がsomeAlertで利用する引数です。
上記のリクエストをiPhoneアプリ側でキャッチします。
具体的には、以下のように実装します。
少し長い実装ですが、上記のようにカスタムスキームでのJS -> Native連携を行うことができます。
これは、UIWebViewの機能に用意されているので、簡単に実現することができます。
Objective-Cで以下のように実装します。
上記の例では、「window.yoheim.showError」関数を呼び出すことができます。
- UIWebViewでWebページを表示した際にJSのconsole.logの内容を表示する方法
- UIWebViewでHTML,CSS,JSなどをキャッシュさせない方法
- UIWebViewを用いる際にUserAgentを独自に設定する方法
- UIWebViewの表示コンテンツに独自のCSSを追加適用する方法
- UIWebViewで表示しているコンテンツの高さを取得する方法
- HTML文字列を用いてUIWebViewに表示する方法
今後もUIWebView関連のTipsをブログで紹介できればと思います。
最後までご覧頂きましてありがとうございました。
今日はiPhoneアプリでWebViewベース開発する際のTipsの1つ、JS・Nativeのそれぞれの機能を呼び出す方法をブログに書きたいと思います。
UIWebViewでJSとNative連携をするとは
最近のiPhoneアプリでは、UIWebViewベースで多くのコンテンツはHTML,JS,CSSで実装することもあるかと思います。多くの機能はJavaScriptで実現しますが、時々Native機能(ダイアログなど)を使いたい場合があります。
また、Native上のボタンを押した際にJavaScriptの機能を呼び出したい場合があります。
そんな要望を実現する機能が、JS・Native連携です。
以下では具体的な実装内容を記載します。
JavaScriptから、iPhoneアプリのNative機能を呼び出す
JavaScriptからNative機能を呼び出す方法として、ここではカスタムスキーマを利用します。JavaScript側で、以下のような実装を行います。
// JavaScriptの実装 location.href='api-yoheim://someAlert{message from javascript}';「api-yoheim://」がカスタムスキームと呼ばれるものです。
今回は、someAlertが機能名で、{}に囲まれた内容がsomeAlertで利用する引数です。
上記のリクエストをiPhoneアプリ側でキャッチします。
具体的には、以下のように実装します。
// UIViewControllerでの実装内容 - (void) viewDidLoad { // 上記JSが動いているUIWebViewのdelegateを指定します。 self.webView.delegate = self; } #pragma mark - UIWebViewDelegate // JavaScriptやリンクなどでサーバーへのリクエストが発生した際に呼び出されるメソッド。 - (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // もしNative連携用のURLスキームの場合には、処理する。 NSString *urlStr = request.URL.absoluteString; if ([urlStr hasPrefix:@"api-yoheim://"]) { // %エスケープされた内容を、デコードする。 urlStr = [urlStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 不要な部分を削除する。 urlStr = [urlStr stringByReplacingOccurrencesOfString:@"api-yoheim://" withString:@""]; // カスタムURLスキームで指定された指示を、正規表現を利用して特定します。 NSRegularExpression *regexp = [[NSRegularExpression alloc] initWithPattern:@"^(.*?)\\{(.*?)\\}$" options:0 error:nil]; NSArray *matches = [regexp matchesInString:urlStr options:0 range:NSMakeRange(0, urlStr.length)]; for (NSTextCheckingResult *match in matches) { // URLの内容から、メソッドとその引数を取得します。 NSString *method = [urlStr substringWithRange:[match rangeAtIndex:1]]; NSString *params = [urlStr substringWithRange:[match rangeAtIndex:2]]; // メソッドをコールします。 [self performSelector:NSSelectorFromString([NSString stringWithFormat:@"%@:", method]) withObject:params]; } // カスタムスキームの場合には、リクエストを中止します。 return NO; } // 上記以外は、リクエストが外部へ放出することを許可します。 return YES; } #pragma mark - Actions // JavaScriptから指定されて呼び出されるメソッド。 -(void)someAlert:(NSString *)message { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; }
少し長い実装ですが、上記のようにカスタムスキームでのJS -> Native連携を行うことができます。
NativeからJavaScriptのメソッドを呼び出す
続いて、Objective-CからJavaScriptの機能を呼び出します。これは、UIWebViewの機能に用意されているので、簡単に実現することができます。
Objective-Cで以下のように実装します。
NSString *javascript = @"window.yoheim.showError('message from native');"; [webView stringByEvaluatingJavaScriptFromString:javascript];
上記の例では、「window.yoheim.showError」関数を呼び出すことができます。
関連記事
UIWebViewを使ったiPhoneアプリを開発する際には、上記のようなTips(=ノウハウ)をたくさん持つことが効率的な開発に繋がるのかなぁと思います。 UIWebViewのTipsを上記以外にも紹介しておりますので、もし良ければご覧頂ければ幸いです。- UIWebViewでWebページを表示した際にJSのconsole.logの内容を表示する方法
- UIWebViewでHTML,CSS,JSなどをキャッシュさせない方法
- UIWebViewを用いる際にUserAgentを独自に設定する方法
- UIWebViewの表示コンテンツに独自のCSSを追加適用する方法
- UIWebViewで表示しているコンテンツの高さを取得する方法
- HTML文字列を用いてUIWebViewに表示する方法
最後に
UIWebViewを使うiPhoneアプリなら、良くJavaScriptと連携したいという要望を受けます。今後もUIWebView関連のTipsをブログで紹介できればと思います。
最後までご覧頂きましてありがとうございました。