NSBlogger

意識高いブログ

UIWebViewで特定のURLの末尾にパラメータをつける

UIWebViewでページを読み込む前のイベントをキャッチ

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
//WebView内のロードする前に呼ばれる
}

UIWebViewDelegateの「webView:shouldStartLoadWithRequest:navigationType:メソッドを使えば、WebViewでページを読み込む前のイベントをキャッチできます。つまり、WebView内でリンクをクリックしてそのページが読み込まれる前に呼ばれます。navigationTypeでクリックしたかどうかなどを判定できます。

http, https以外のリンクは特定のアプリにとばす

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *urlScheme = request.URL.scheme;
    if (![urlScheme isEqualToString:@"http"] && ![urlScheme isEqualToString:@"https"] && [[UIApplication sharedApplication] canOpenURL:request.URL]) {
            [[UIApplication sharedApplication] openURL:request.URL];
            return NO;
    }
}

引数の「request」からURLを判断して、特定のアプリになげることも可能です。returnをNOにすることで、WebView内でのロードをストップさせてます。

特定のURLの末尾にパラメータを付加

- (BOOL)webView:(UIWebView *)_webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url=request.URL.absoluteString;
    NSString *param = @"smartphone=1";
    NSRange extraParam=[url rangeOfString:param];
    NSRange hatena = [url rangeOfString:@"?"];
    NSRange conditionURL =[url rangeOfString:@"hogehoge.com/hoge/"];
    
    if(extraParam.location == NSNotFound && hatena.location == NSNotFound && conditionURL.location != NSNotFound){
        url = [url stringByAppendingString:[NSString stringWithFormat:@"?%@", param]];
        NSURLRequest *newRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:url]];
        [_webView loadRequest:newRequest];
        return NO;
    }else if (extraParam.location == NSNotFound && hatena.location != NSNotFound && conditionURL.location != NSNotFound){
        url = [url stringByAppendingString:[NSString stringWithFormat:@"&%@", param]];
        NSURLRequest *newRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:url]];
        [_webView loadRequest:newRequest];
        return NO;
    }
    
    return YES;
}

次に表示するURLに特定の文字列が含まれている場合、それを付加するという処理になっています。パラメータがある場合とない場合で連結する文字が「&」「?」で変わるので分岐してます。
あとはloadRequest:メソッドで文字列を付加したページを読み込みにいけばOK。

パラメータを付加しない場合もあるので、その際はそのままWebView内の処理を続ければよいのでreturn YESを返しておきます。