2014年8月29日金曜日

UIWebViewとアプリの連携


UIWebViewDelegateの shouldStartLoadWithRequest を使ったアプリとの連携例を、先日アップした"UIWebViewで閲覧中のページ内の検索"に追加しました。
サンプルコードダウンロード: TheSearcher2

shouldStartLoadWithRequestはページ移動が発生したときに呼ばれ、基本的には移動を許すかどうかを判断するものですが、ここでアプリの処理を追加することができます。

リンク先のURLをrequestから取得し、それに基づいて処理を行います。
TheSearcher2にhashとprotocolを利用してアプリへの処理要求かどうかを判断し、JavaScriptでUIWebViewに表示する例を加えてあります。

・アイコンイメージをタップ
protocol=file://でurl末尾が".png"
アイコンイメージをstringByEvaluatingJavaScriptFromStringで切替

・"Home Directory"をタップ
protocol=file://でhash="#homedir"
NSHomeDirectory()内のフォルダ一覧を作成し、stringByEvaluatingJavaScriptFromStringでdirDiv内に表示。
各フォルダの情報は<a>タグに設定、hrefにフルパスをセット。
protocolは"filename://"とする。

・フォルダ一覧のリンクをタップ
protocol="filename://"
パス内のファイル、フォルダ一覧をstringByEvaluatingJavaScriptFromStringでdirDiv内に表示。

上記の場合に、NOを返し、ページ移動はキャンセルする。







2014年8月22日金曜日

warning: no rule to process file ... of type sourcecode.javascript

JavaScriptなどコンパイル対象でないファイルをプロジェクトに追加したとき、
no rule to process file ... of type ...というエラーが発生する。

warning: no rule to process file '/Users/..../UIWebViewSearch.js' of type sourcecode.javascript for architecture i386

プロジェクトのBuild Phases > Complie Sources から当該ファイルを削除する。

UIWebViewで閲覧中のページ内の検索

UIWebViewで閲覧中のHTML内で文字検索をしたいと思い、なにかいい方法がないか探したところ、サンプルアプリを添付してくれているページがありました。
第一のポイントはstringByEvaluatingJavaScriptFromString:の使い方で、てっきりHTMLに既にあるscriptの呼び出しに使うかと思っていたのですが、この引数で渡すjavascriptHTML Documentに適用して結果を返してくれる、つまりscriptを事実上追加することができるのです。このjavascriptで適用した変数(var)やfunctionは、それ以降のメソッド呼び出しで使用することができ、グローバル変数は値も保持されます。

このサンプルのJavaScriptをもう少し単純化できないか試したのですが、書き直してはいるものの、ハイライト部分はほとんど同じ方法になっています。

このサンプルを基に作成したTheSearche2をアップします。
TheSearcher2

TheSearche2はオリジナルに次のような変更を加えています。

Storyboardを使用。
検索ヒット箇所の前後移動を追加。
初期HTMLをGoogle、Yahoo、Bingへのリンクとし、実際のWebページ内での検索を実行。
UIWebViewのサブクラスをdelegateを使用する方法に変更。

UIWebViewのドキュメントには"The UIWebView class should not be subclassed."と書かれています。

このサンプルには"UIWebViewとアプリの連携"のコードも含まれています。