ソースコード
JavaScript
私のサーバ側でこんな感じに返ってくるようにしてあります。
JSブリッジ!
とかいうふざけたボタンがあるのでそれを押すと稼働します!
index.js
location.href = 'app-callback://views?name=success&age=6';
Swift
ViewController.swift
//
// ViewController.swift
// JsBridge
//
// Created by nnsnodnb on 2016/07/23.
// Copyright © 2016年 nnsnodnb. All rights reserved.
//
import UIKit
// MARK: - UIViewController
class ViewController: UIViewController {
@IBOutlet weak var webView: UIWebView!
// MARK: - Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
private func setup() {
webView.delegate = self
let url = NSURL(string: "https://nnsnodnb.moe/js-bridge/")
if let request = url {
let requestUrl = NSURLRequest(URL: request)
webView.loadRequest(requestUrl)
}
}
private func showAlert() {
let alert: UIAlertController = UIAlertController(title: "成功!",
message: nil,
preferredStyle: .Alert)
let okButton = UIAlertAction(title: "OK",
style: .Default,
handler: nil)
alert.addAction(okButton)
presentViewController(alert, animated: true, completion: nil)
}
}
// MARK: - UIWebViewDelegate
extension ViewController: UIWebViewDelegate {
func webView(webView: UIWebView,
shouldStartLoadWithRequest request: NSURLRequest,
navigationType: UIWebViewNavigationType) -> Bool {
if let scheme = request.URL?.scheme where scheme.hasPrefix("http") {
return true
}
if let action = request.URL?.description,
let query = request.URL?.query {
let queryDicitionary = QueryParser.queryDictionary(query)
if action.hasPrefix("app-callback://views") {
if queryDicitionary["name"] == "success" {
print("Success")
showAlert()
}
}
return false
}
return false
}
func webViewDidStartLoad(webView: UIWebView) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
}
func webViewDidFinishLoad(webView: UIWebView) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}
}
パラメタをパースするためのクラス
QueryParser.swift
import Foundation
class QueryParser {
class func queryDictionary(query: String) -> [String:String] {
var queries = [String: String]()
let pairs = query.componentsSeparatedByString("&");
for pair in pairs {
let elements = pair.componentsSeparatedByString("=")
let key = elements[0].stringByRemovingPercentEncoding
let value = elements[1].stringByRemovingPercentEncoding
if let key = key, value = value {
quereies[key] = value
}
}
return queries
}
}
Swift始めたばかりで全然できないですが、これを利用してアプリ側のViewControllerに移動できたりするのは楽しいです!
(Obj-Cではできたけど、SwiftだとUnwrap関係で怒られた。ダレカタスケテェェェ---!!)
一応書いておくと下のようなコードを書きました。
画面遷移
...
if queryDicitionary["name"] == "success" {
let vc: SuccessViewController = self.storyboard?.instantiateViewControllerWithIdentifier("SuccessViewController") as! SuccessViewController
self.presentViewController(vc, animated: true, completion: nil)
}
...
叫び
上司の後に出したので丸パクリになってしまった感がすごいですが、同じソースコード(Obj-C)を見てたので仕方ないですよね?震え((((;゚Д゚))))