Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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"等を実行すれば実行可能です。

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

UIButton

基本的なボタンを動的にコーディングだけで作成する説明をしています。

アップルWatchから親アプリケーションへデータ送信

前回の記事では実機上で親アプリケーションからAppleWatchにイベントを送るのができなかった。 Notificationでできるはずなのですが、動作してくれなかった、、、、、。今回はいったん逆の時計から親アプリへのデータ送信の方法サンプルサイト をQiita様の中の記事でみつけましたので検証してみます。

willsetとdidsetでプロパティを監視。意味あるのか???

クラスのプロパティにはWillsetとdidsetという監視用の関数があると聞いたのですが、用途は分かるにしても メリットとしてはどういうものなのかなと、うーん、と考えていました。調べていると海外のサイトでは同じように疑問にもつ質問があがっていました。 getとsetで同じことができるのでは?との私と同じスタンスです。解決されていましたので、順に説明していきます。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!