読者です 読者をやめる 読者になる 読者になる

【swift】画面遷移をJLRoutesを使ってurlルーティングで管理 by web感覚

はじめに

webのフレームワークだと、アクセスされたurlを解析して対象のコントローラを呼び出すっていうのが一般的な処理の流れです。
iosアプリでも同じような形で実装できればコードの見通しがよくなると思って調べてみたのが今回の経緯でした。

で、調べてみるとJLRoutesというのが有名どころでありました
今回はこれを使った実装例をメモしておきます

導入方法(準備)

githubをみるとcocoapodsから導入できるぽいのですが、なぜかpod installしても処理が終わらないので、、、
今回は直接ダウンロードして使いました

example-Bridging-Header.h

swiftからobjective-cのファイルを使うのでおきまりのやつです

#import "JLRoutes.h"
Info.plistの編集

「Information Property List」の「URL types」の「URL Schemes」に「myapp」として追加(myappは例です)

f:id:yoppy0066:20151018204623p:plain

実装方法

AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        ・・・

        // ルーティング処理        
        JLRoutes.addRoute("/:page") { (params: [NSObject : AnyObject]!) -> Bool in

            let page = params["page"] as! String

            // myapp://profile/*** (プロフィール画面を開きます)
            if page == "profile"
            {
                let viewController: ProfileViewController = ProfileViewController()
                viewController.params = params
                self.navigationController?.pushViewController(viewController, animated: true)
            }
            // myapp://setting (設定画面を開きます)
            else if page == "setting"
            {
                let viewController: SettingViewController = SettingViewController()
                self.navigationController?.pushViewController(viewController, animated: true)
            }
            return true
        }

        return true
    }
}

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return JLRoutes.routeURL(url)
}
呼び出し側のViewController
var url = "myapp://profile?id=99999"
UIApplication.sharedApplication().openURL(NSURL(string: url))
呼び出される側のViewController
class ProfileViewController: UIViewController {

    // urlパラメータ取得用    
    var params: AnyObject?

    override func viewDidLoad() {

        // self.params?["id"]でパラメータ取得
    }

おわりに

おきゃくさんにディープリンクのルールを教えてくれって言われた際に、?になってしまった。。。
で、ディープリンクについて調べて画面をurlで呼び出せることがわかって、特定の画面だけでなくアプリ全体にこのルールを適用できれば
見通しのよいコードが書けるなぁということでした。

以上でした