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

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

アイコン一括作成サービス紹介

アプリのアイコンを作るのは手間で面倒くさい。と、思いながらPhotoshopで一つ一つサイズを変えて作っていたのですが、 簡単につくれるサービスやっぱりありました。Macのスクリプトだったり、Webサービスだったりと揃っていましたので共有します。

CoreTextでTextViewの一文字の向きを変える(#2)

さて、サンプルそのままだと面白くないので、本日6月から開始する自転車規制強化 にのっかったサンプル<自転車の転だけ横に曲げる>にしてみます。(14歳以上が対象。自転車のイヤホン装着や片手走行、 酔っ払い運転、歩道運転、片手スマホ、、、、今まで誰もがやり通してきたことが「逮捕や補導の対象」となるようです。赤切符もきられる ようになるとのことで、自転車に酔っ払ってのって自動車の免停なんかになりかね無いので注意です)

CoreTextをイラストで理解してみる

上記がAppleのCoreText説明に記載されているイラスト図ですが正直よくわかりません。文章を三角や丸等の領域に表示したり、一行だけ表示したり、一文字だけ表示したり、 と様々な使い方ができるようです。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!