HOME > UIWebViewからネイティブコール
以前の記事UIWebViewの最後に、UIWebViewからのネイティブコールの実行の云々に関してコメントが書かれているのを見つけましたのでSwiftでの方法を記載します。
参考:ねとなび:FINAL FANTASY Record Keeper の作り方#2
UIWebViewで読み込んだhtmlですが、その際に外部サイトへアクセスする際(例えばaリンクをクリックした時)のイベントを受け取る方法があります。
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の中身です
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リンククリック時にはイベントが取れていますので、ここを微調整します。htmlを以下の様に調整して実行すると。
以下のように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からlocation.href="nativecall"等を実行すれば実行可能です。
2021-05-14 14:21:41 | WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。
AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、
昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は... |
2021-05-06 14:04:37 | LINEのアニメーションスタンプ制作の落とし穴、、、失敗談
ゴールデンウィークにLINEスタンプを作成してみました。
作り切って申請も通したんですが、意図したアニメーションと違う、、、、
LINEクリエーターの画面だと、アニメーションのプレビュー... |
2021-05-01 18:05:35 | 久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。
忘れないようにメモ
エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。
ターゲット→ex... |
Tweet | |||
|