Ответ 1
Кажется, нет официального способа сделать это. Однако стандарт включает в себя чтение и анализ входящих запросов URL-адресов, в основном сворачивание собственного сериализованного протокола обмена сообщениями. Обработка сообщений должна выполняться в методе webView:shouldStartLoadWithRequest:navigationType
вашего контроллера вида.
Примечание: существует несколько бесплатных библиотек (PhoneGap, QuickConnect, JS-to- Cocoa Bridge), которые обертывают эту функциональность (плюс делают намного больше), Чтобы изобрести колесо (или знать, почему это круто, так сказать), читайте дальше.
Из JavaScript вы вызовете обратный вызов, пытаясь перейти к новому URL-адресу:
// In JavaScript
window.location = 'myapp:myaction:param1:param2'; // etc...
В Objective-C выполните UIWebViewDelegate
протокол в файле .h
:
// In your header file
@interface MyAppViewController : UIViewController <UIWebViewDelegate> {
...
}
@end
Затем реализуем метод в вашем файле .m
:
// In your implementation file
-(BOOL)webView:(UIWebView *)webView2
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
{
// Break apart request URL
NSString *requestString = [[request URL] absoluteString];
NSArray *components = [requestString componentsSeparatedByString:@":"];
// Check for your protocol
if ([components count] > 1 &&
[(NSString *)[components objectAtIndex:0] isEqualToString:@"myapp"])
{
// Look for specific actions
if ([(NSString *)[components objectAtIndex:1] isEqualToString:@"myaction"])
{
// Your parameters can be found at
// [components objectAtIndex:n]
// where 'n' is the ordinal position of the colon-delimited parameter
}
// Return 'NO' to prevent navigation
return NO;
}
// Return 'YES', navigate to requested URL as normal
return YES;
}
Две важные заметки:
-
Контекст: переход к
myapp:whatever
будет (конечно) завершен в любом другом контексте. Имейте это в виду, если вы загружаете межплатформенные страницы. -
Сроки: если второй вызов
window.location =
выполняется до первого возврата, он будет "потерян". Таким образом, объедините свои вызовы вместе, задержите выполнение вручную или реализуйте очередь, которая объединяет вышеперечисленное с JS-запросы в Objective-C объекты.