1. ホーム
  2. javascript

[解決済み] iOS JavaScriptブリッジ

2022-11-27 11:54:39

質問

HTML5のUIWebViewとiOSのネイティブフレームワークを併用するアプリを制作しています。私は、JavaScriptとObjective-Cの間の通信を実装できることを知っています。この通信を簡単に実装するためのライブラリはありますか?HTML5とjavascriptでiOSネイティブアプリを作成するためのライブラリがいくつかあることは知っています(例えば、AppMobi、PhoneGap)が、JavaScriptを多用するiOSネイティブアプリの作成を支援するライブラリがあるかどうかはわかりません。必要なのは

  1. Objective-C から JS メソッドを実行する
  2. JSからObjective-Cのメソッドを実行する
  3. Objective-CからJSのネイティブイベント(例えば、DOM readyイベント)をリッスンする。

どのように解決するのですか?

いくつかのライブラリがありますが、大きなプロジェクトで使用したことはないので、試してみるのもいいかもしれません。

-

しかし、簡単なことだと思うので、自分で試してみてもいいかもしれませんね。私自身は、まさにそれが必要なときに行いました。また、自分のニーズに合った簡単なライブラリを作ってもいいかもしれません。

1. Objective-CからJSのメソッドを実行する

これは本当に1行のコードだけです。

NSString *returnvalue = [webView stringByEvaluatingJavaScriptFromString:@"your javascript code string here"];

詳細は公式 UIWebView ドキュメント .

2. JSからObjective-Cのメソッドを実行する

これは残念ながら少し複雑で、Mac OSX に存在する windowScriptObject プロパティ (およびクラス) がないため、2 つの間で完全な通信ができないからです。

しかし、javascript からカスタムメイドの URL を簡単に呼び出すことができます。

window.location = yourscheme://callfunction/parameter1/parameter2?parameter3=value

そして、Objective-Cからこのように傍受します。

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
   NSURL *URL = [request URL]; 
   if ([[URL scheme] isEqualToString:@"yourscheme"]) {
       // parse the rest of the URL object and execute functions
   } 
}

これは、(あるいはwindowScriptObjectを使うことで)それほどきれいではありませんが、動作します。

3. Objective-CからネイティブJSイベントをリッスンする(たとえばDOM readyイベントなど)

上記の説明から、これを行うには、いくつかの JavaScript コードを作成し、それを監視したいイベントにアタッチして、正しい window.location を呼び出し、それをインターセプトする必要があります。

繰り返しになりますが、本来あるべき姿のきれいなものではありませんが、動作はしています。