【swift】ログイン・ログアウト処理

はじめに

今回やりたかったのは、ありがちなログイン・ログアウト処理。
初回起動時にログイン画面を表示。1度ログイン後は次回起動時にもログイン画面は表示しないということ。

方法としてはuserDefaultsという端末のストレージにログイン状態を保存しておくというやりかたになります。

実装方法

AppDelegate

まずは起動時の処理をAppDelegateに記述します。
userDefaultに値isLoginがセットされていればログイン中用のMemberViewControllerを表示。
セットされていなければ未ログイン用のVisitorViewControllerを表示。

AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var navigationController: UINavigationController?

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

        // ログイン判定
        var ud = NSUserDefaults.standardUserDefaults()
        var isLogin: Bool? = ud.objectForKey("isLogin") as? Bool

        // 未ログインの場合        
        if isLogin != nil && isLogin! {
            var viewController: MemberViewController = MemberViewController()
            navigationController = UINavigationController(rootViewController: viewController)
            self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
            self.window?.rootViewController = navigationController
            self.window?.makeKeyAndVisible()
        // ログイン中の場合
        } else {
            var viewController: VisitorViewController = VisitorViewController()
            navigationController = UINavigationController(rootViewController: viewController)
            self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
            self.window?.rootViewController = navigationController
            self.window?.makeKeyAndVisible()
        }
        return true
    }

    ・・・
}
未ログイン画面の作成

次に未ログイン用のVisitorViewControllerを作成します。
実際にはサーバに用意されたapiにパスワードなどを送信して認証処理などを行う形になると思います。
ここでやっていることはuserDefaultsにログイン識別用の値isLoginをセットして、MemberViewControllerを開きます。

VisitorViewController.swift

class VisitorViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.whiteColor()
        
        var buttonLogin: UIButton = UIButton()
        ・・・
        buttonLogin.addTarget(self, action: "onButtonLogin:", forControlEvents: .TouchUpInside)
        self.view.addSubview(buttonLogin)
    }

    // ログイン処理
    func onButtonLogin(sender: UIButton) {
        var ud = NSUserDefaults.standardUserDefaults()
        ud.setObject(true, forKey: "isLogin")
        
        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        appDelegate.window?.backgroundColor = UIColor.whiteColor()
        appDelegate.window?.rootViewController = MemberViewController()
        appDelegate.window?.makeKeyAndVisible()
    }
}
ログイン済み画面

最後にログイン中用のVisitorViewControllerを作成します。
ログアウトを押された時の処理を記述します。userDefaultsからisLogoutを削除してVisitorViewControllerを表示します

MemberViewController.swift

class MemberViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.whiteColor()
        
        // ログアウトボタン
        var buttonLogout: UIButton = UIButton()
        ・・・
        buttonLogout.addTarget(self, action: "onButtonLogout:", forControlEvents: .TouchUpInside)
        self.view.addSubview(buttonLogout)
    }

    // ログアウト処理
    func onButtonLogout(sender: UIButton) {
        var ud = NSUserDefaults.standardUserDefaults()
        ud.removeObjectForKey("isLogin")
        
        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        appDelegate.window?.rootViewController = VisitorViewController()
        appDelegate.window?.makeKeyAndVisible()
    }
}

さいごに

知っていれば簡単なんですけど、自分が今回知ったことは
ViewControllerからAppDelegateを呼び出してwindowにviewControllerをセットすることができるということでした

知っていると色々使えそうですね
以上です