Listening for events in a UIWebView (iOS)

11,847

Solution 1

You can use the UIWebViewDelegate:

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

The UIWebViewNavigationType values are :

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

Can check this and then look at the NSURLRequest to get info about that

Solution 2

Use a custom scheme. When the user taps the button, ping a url with the custom scheme (myScheme://buttonTapped) and either:

  1. Catch this in the webview delegate method shouldStartLoadWithRequest... (ie check if the URL contains your custom scheme) and route it to the appropriate objective c selector. Or

  2. Register a custom URL protocol and set it up to handle your custom URL scheme. Something like the below:

@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
{

}
Share:
11,847
WendiKidd
Author by

WendiKidd

Programmer by profession and passion~

Updated on July 18, 2022

Comments

  • WendiKidd
    WendiKidd almost 2 years

    I'm trying to listen for an event (specifically a button click) from a webpage I have opened in a UIWebView in my iOS app. I know that in other languages there are ways to attach event listeners to certain web calls, but I haven't yet found a way to do it in Objective-C. I also haven't found anyone online who says it can't be done, so I decided I should ask. I saw in the documentation that you can make Objective-C calls from Javascript, but I do not have control of the webpage I am wanting to monitor. So I need a solution that allows me to listen for this event entirely in Objective-C.

    EDIT: If specifics would help, I am trying to allow the user to make a wallpost on Facebook. I am loading the Facebook sharer page in a UIWebview (http://www.facebook.com/sharer/sharer.php?u=) and wanting to monitor when the user clicks "Share Link" so that I can close the web view.

    Thank you all for your time!

  • WendiKidd
    WendiKidd over 12 years
    I implemented that function and the method gets called when webpages are being loaded. Unfortunately, it is not called when the button is clicked.
  • WendiKidd
    WendiKidd over 12 years
    Oh, I'm sorry, I'm a bit new to this and I was trying to use "enter" to go down to a new line but it submitted the comment before I was ready. Sorry! To continue, perhaps it would help if I gave a bit more information about the button I am trying to receive events for. I am attempting to allow the user to compose a facebook wallpost. I am opening up the facebook sharer page (facebook.com/sharer/sharer.php?u=) and then wanting to monitor when the "Share Link" button is pressed so I can close the webview. Otherwise it appears as if nothing happened even when the wallpost is made