プロジェクト内の JavaScript 関数から UIViewController を呼び出そうとしています。新しい UIViewController を呼び出す必要があるこのアプリにいくつかの変更を加えるように依頼されました。JavaScript 関数を呼び出すことができる場所を見つけましたが、別の方法でテキストを含む UIViewController を開く必要があります。Xcodeプロジェクトコードでこれを行う方法のサンプルはありますか?
ありがとうございました。
プロジェクト内の JavaScript 関数から UIViewController を呼び出そうとしています。新しい UIViewController を呼び出す必要があるこのアプリにいくつかの変更を加えるように依頼されました。JavaScript 関数を呼び出すことができる場所を見つけましたが、別の方法でテキストを含む UIViewController を開く必要があります。Xcodeプロジェクトコードでこれを行う方法のサンプルはありますか?
ありがとうございました。
単純な呼び出しにはJSBridgeを使用します。これには、JSBridge.js ヘッダー ファイルを 1 つ追加して、JavaScript 側を変更する必要があります。私はそれをテストしましたが、動作します。
一般的な考え方は、JavaScript が実際に閲覧しているアドレスをリダイレクトできるということです。それが発生すると、ネイティブ コールバック- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
が特別なコマンドを含む URL で呼び出されます。この URL は JavaScript から渡され、コールバックでこの URL を解析し、適切なアクションを呼び出すことができます。
一般的に言えば、独自の JSBridge 機能を作成できます。次のように動作するはずです。
コマンドを実行する場合は、JavaScript で次のように呼び出します。
window.location.href= "command://goToHomeViewController"
このjavaScriptでそのページをロードしたwebViewのデリゲートで、コマンドのフックを作成します。
あなたのViewController.mで
(BOOL)webView:(UIWebView *)p_WebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
BOOL result = YES;
NSString *urlString = [[request URL] absoluteURL];
if ([urlString compare:@"command://goToHomeViewController"] == NSOrderedSame)
{
result = NO;
[self goToHomeViewController];
}
return result;
}
このようにして、shouldStartLoadWithRequest でコマンドをインターセプトしてから、ViewController ネイティブ コードでコマンドを実行し、webView がページの読み込みをキャンセルする NO を返します。