アプリの一部を JS で記述し、WebView 内で実行しています。UIWebView shouldStartLoadWithRequest メソッドを使用して、JS と obj-c 間の通信手段として http 要求をキャプチャしています。これは、shouldStartLoadWithRequest メソッド内から webview を介して Modal View Controller をロードしようとするまでうまく機能します。これが発生すると、 shouldStartLoadWithRequest は呼び出されなくなります。場合によっては、このモーダル ビュー コントローラーを閉じて Web ビューに戻り、いくつかのことを行ってから、モーダル コントローラーを再提示する必要があります。モーダル コントローラーが初めて正常に表示された後、それを閉じて、JavaScript から URL に移動して再度表示しようとすると、表示されなくなります。shouldStartLoadWithRequest 内の NSLog は実行されません。
私のjavascriptでは、次のようなことをします:
window.location='myapp:whateverMethod';
目的の C コードは次のようになります。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[request URL] absoluteString];
NSLog(@"REQUEST URL: %@", requestString);
if([requestString hasPrefix:@"myapp:"]) {
NSArray *components = [requestString componentsSeparatedByString:@":"];
NSString *function = [components objectAtIndex:1];
if([self respondsToSelector:NSSelectorFromString(function)]) {
[self performSelector:NSSelectorFromString(function)];
}
return NO;
}
return YES;
}
-(void) whateverMethod {
NSLog(@"whateverMethod called!");
// This is a quick way to grab my view controller from the storyboard, so assume it exists
UIViewController *splash = [self.storyboard instantiateViewControllerWithIdentifier:@"splashViewController"];
[self presentModalViewController:splash animated:NO];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
[self dismissModalViewController:splash animated:NO];
});
}
この時点で、私の Web ビューはまだ表示されています。Web アプリケーションでページからページに移動すると、すべての JavaScript がうまく機能しますが、Web ビューの "shouldStartLoadWithRequest" デリゲート メソッドは呼び出されなくなりました。理由がわかりません。誰にもアイデアはありますか?