Прослушивание событий в UIWebView (iOS) - PullRequest
8 голосов
/ 08 декабря 2011

Я пытаюсь прослушать событие (в частности, нажатие кнопки) с веб-страницы, которую я открыл в UIWebView в моем приложении для iOS.Я знаю, что на других языках есть способы присоединения слушателей событий к определенным веб-вызовам, но я еще не нашел способ сделать это в Objective-C.Я также не нашел никого в Интернете, кто сказал бы, что не может быть сделано, поэтому я решил спросить.В документации я видел, что вы можете выполнять вызовы Objective-C из Javascript, но у меня нет контроля над веб-страницей, которую я хочу отслеживать.Поэтому мне нужно решение, которое позволило бы мне полностью прослушивать это событие в Objective-C.

РЕДАКТИРОВАТЬ: Если конкретная информация поможет, я пытаюсь позволить пользователю сделать пост на Facebook.Я загружаю страницу участника Facebook в UIWebview (http://www.facebook.com/sharer/sharer.php?u=)) и хочу отслеживать, когда пользователь нажимает «Поделиться ссылкой», чтобы я мог закрыть веб-просмотр.

Спасибо всем за ваше время!*

Ответы [ 2 ]

11 голосов
/ 08 декабря 2011

Вы можете использовать UIWebViewDelegate:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

Значения UIWebViewNavigationType:

enum {
  UIWebViewNavigationTypeLinkClicked,
  UIWebViewNavigationTypeFormSubmitted,
  UIWebViewNavigationTypeBackForward,
  UIWebViewNavigationTypeReload,
  UIWebViewNavigationTypeFormResubmitted,
  UIWebViewNavigationTypeOther
};typedef NSUInteger UIWebViewNavigationType;

Можно проверить это, а затем посмотреть NSURLRequest, чтобы получить информацию об этом

5 голосов
/ 26 марта 2013

Используйте нестандартную схему. Когда пользователь нажимает кнопку, пингуйте URL-адрес с пользовательской схемой (myScheme: // buttonTapped) и либо:

  1. Поймайте это в методе делегата веб-просмотра shouldStartLoadWithRequest... (т.е. проверьте, содержит ли URL-адрес вашу пользовательскую схему) и направьте его к соответствующему селектору c. Или

  2. Зарегистрируйте собственный протокол URL и настройте его для обработки вашей пользовательской схемы URL. Примерно так:

@implementation MyURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
    return [[[request URL] scheme] isEqualToString:@"myScheme"];
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
{
    return request;
}

- (void)startLoading
{
    NSURLRequest * request = [self request];
    id client = [self client];

    NSData * data = [NSMutableData dataWithCapacity:0];
    NSHTTPURLResponse * response = [[[NSHTTPURLResponse alloc] initWithURL:[request URL] statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:nil] autorelease];
    [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    [client URLProtocol:self didLoadData:data];
    [client URLProtocolDidFinishLoading:self];

    [[NSNotificationCenter defaultCenter] postNotificationName:kSchemeNotification object:nil userInfo:payload];
}

- (void)stopLoading
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...