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

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

新しくなったLawsonの無料WiFiを試してみた

ネットでローソン無料Wifiを調べていたのですがネットを接続するにはアプリが必要との誤情報が多かった(今まではアプリが必要だった)ですが、2015年の6月からはアプリの必要ありません。 Wifiで接続して登録すればPCからでも利用できました。手順を記載してまいります。

SQLiteを使いたい。ラッパーを検証してみる。(#2)

前回の記事でSQLiteのラッパのRMDB, SWiftData,SQLite.swiftの検証をトライしまいたが、時間の問題で頓挫してしまいましたので続きです。 。ある程度準備が完了しましたので、それぞれのサンプルを動かしてみてみようと思います。InsertとSelectとインストール感を比較してみます。

AppleWatchアプリの申請

AppleWatchアプリの申請が4月1日から始まりましたので、少しトライしてみました。ハマった箇所を共有です。 アプリをArchiveしてValidateしてから2パターンの不具合、あとはアップロードには成功したのですが、Itunesに反映されなかった 現象を共有です
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!