【新サービス告知】いつでもどこでもイベントを開催できる。スマホのWebカメラを利用したVRイベントスペースサービス(Meetatcube.com)
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > UIWebViewからネイティブコール

UIWebViewからネイティブコール

以前の記事UIWebViewの最後に、UIWebViewからのネイティブコールの実行の云々に関してコメントが書かれているのを見つけましたのでSwiftでの方法を記載します。
参考:ねとなび:FINAL FANTASY Record Keeper の作り方#2

shouldStartLoadWithRequestを利用してネイティブコールを実行する

UIWebViewで読み込んだhtmlですが、その際に外部サイトへアクセスする際(例えばaリンクをクリックした時)のイベントを受け取る方法があります。

UIWebViewnativecallのサンプル画像

shouldStartLoadWithRequestを利用してネイティブコールを実行させます。以下コードはローカルファイルのリンククリックイベントを取得しています。(localfile.htmlをプロジェクトに追加した状態で)詳細は以前の記事をご参照ください。


import UIKit

class ViewController: UIViewController,UIWebViewDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myWebView : UIWebView = UIWebView()
        myWebView.delegate = self
        myWebView.frame = self.view.bounds
        self.view.addSubview(myWebView)
        if let url = NSBundle.mainBundle().URLForResource("localfile", withExtension: "html") {
            myWebView.loadRequest(NSURLRequest(URL: url))
        }
    }
    //この箇所でイベントを受け取る
    func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
        println(request);
        println(navigationType);
        return true
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
}

以下がlocalfile.htmlの中身です

UIWebViewnativecallのサンプル画像

shouldStartLoadWithRequest引数の中身(NSURLRequestとUIWebViewNavigationType)の検証

NSURLRequestの中身。aリンクをクリックした場合は以下データが格納されています


 { URL: http://www.google.com/, headers: {
    Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_10 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365";
} }

NSURLRequestとUIWebViewNavigationTypeの中身。


LinkClicked

このUIWebViewNavigationTypeはEnumとなっています。こんかいはaリンクをクリックしたのでLinkClickedが実行されています。(※これを利用するとアプリからSafariを利用してサイトを開くことも可能です)

名称説明
BackForward 進むか戻るボタンを押した時
FormResubmitted フォームを再度処理した時
FormSubmitted フォームを処理した時
LinkClicked リンクをクリックした時
Other その他何かを実行した時
Reload リロードボタンを押した時

aリンククリックからのネイティブコールの実行

上記例にありますように、aリンククリック時にはイベントが取れていますので、ここを微調整します。htmlを以下の様に調整して実行すると。

UIWebViewnativecallのサンプル画像

UIWebViewnativecallのサンプル画像

以下のようにnativecallの名前のファイルにアクセスしようとしている処理のイベントがあります


 
{ URL: file:///Users/swiftsalaryman/Library/Developer/CoreSimulator/Devices/
68EC673F-BA90-48C1-B56B-08EE39C9A8D2/data/Containers/Bundle/Application
/48642F17-BF36-41E7-BC05-402E95F04E47/test.app/nativecall, headers: {
} }

ここを以下の様に修正してイベントをとります。もちろんaリンクからはnativecallではなくどんな名称でも大丈夫です


  func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {

        if let r = request.URL.absoluteString?.rangeOfString("nativecall") {
            println("nativecallを発見しました。ここでネイティブコールを実行します。");
            return false;
        }

        return true
    }

JSからのネイティブコールの実行

こちらは上の応用となります、JSからlocation.href="nativecall"等を実行すれば実行可能です。

↓こんな記事もありますよ!


2021-04-22 14:54:53

かっこいいカルーセル厳選3点!WebGLを使った渋い画像スライダー。

昨日カッコいいスライダーを探す旅にでていました。 よく使われるswiper など、シンプルで使いやすくデザインも良いのですが、何かもの足りない、、、。 そこで調べていくと、webglを使...

2021-04-20 14:46:43

Twillioとは何??skywayとは何が違うのか。webrtcを使う際に判断する情報。

先日webrtc開発で「twillio」といった名前を聞きました。 以前自分でskywayを使ってwebrtcを試していた際に調べた時には、無かったような気もするんだけと、KDDIが絡んでいる...

2021-04-19 13:58:21

先日久々にアップデートした妊娠週刊パパのAndroid版も。アカウント移管したいんだけど、注文ID見当たらないよ。

先日の妊娠、出産、育児関連のアプリ「妊娠週刊パパ」をAndroid studioで再リリースしようと思ってるんだけど、コンパイル失敗してエミュレータで動かせない。 多分sdkとかapiのバージ...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!