しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【iOS】Smile-Lockでパスコードロック機能を実現する

Smile-Lockというライブラリを試してみました。
URL見るとリクルートライフスタイルで出しているライブラリなんですね。

github.com

インストール

CocoaPodsでインストールしました。

target 'MyApp' do
  use_frameworks!

  pod 'SmileLock'
end

使い方

下のようにWindowやViewに貼り付ける事で利用します。

import UIKit
import SmileLock

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let kPasswordDigit = 6
        let contentView = PasswordContainerView.createWithDigit(kPasswordDigit)
        if let window = view.window {
            let baseView = UIView(frame: window.bounds)
            baseView.addSubview(contentView)
            contentView.center = baseView.center
            window.addSubview(baseView)
        }
    }
}

実行すると下のような表示になります。

f:id:llcc:20161217214232p:plain

パスコードを入力した時の動作はプロトコルに記述します。
passwordInputComplete:input:は入力が完了した時に呼ばれます。

extension ViewController: PasswordInputCompleteProtocol {
    func passwordInputComplete(_ passwordContainerView: PasswordContainerView, input: String) {
        print(input)
    }
    
    func touchAuthenticationComplete(_ passwordContainerView: PasswordContainerView, success: Bool, error: NSError?) {
        
    }
}

パスコードが違う場合のシェイクはwrongPasswordメソッドを使います。
入力のクリアだけしたい場合はclearInputメソッドを使えば良さそうです。

extension ViewController: PasswordInputCompleteProtocol {
    func passwordInputComplete(_ passwordContainerView: PasswordContainerView, input: String) {
        passwordContainerView.wrongPassword()
    }
    
    func touchAuthenticationComplete(_ passwordContainerView: PasswordContainerView, success: Bool, error: NSError?) {
        
    }
}

それとPasswordContainerViewのプロパティーを触る事で少しだけデザインを変更できます。
ボタンの色を変えるtintColor、ハイライト時の色を変えるhighlightedColor、曇りガラス風デザインに変更できるisVibrancyEffectなどがあります。

f:id:llcc:20161217220112p:plain

タッチIDが使える場合は自動的にViewにタッチボタンが表示されます。

f:id:llcc:20161217220703p:plain

押すとタッチIDを求める表示になります。

f:id:llcc:20161217220830p:plain

指紋認証が完了するとdelegateのtouchAuthenticationCompleteメソッドが呼ばれます。

extension ViewController: PasswordInputCompleteProtocol {
    func passwordInputComplete(_ passwordContainerView: PasswordContainerView, input: String) {
    }
    
    func touchAuthenticationComplete(_ passwordContainerView: PasswordContainerView, success: Bool, error: NSError?) {
        print(success)
    }
}

今回は触れないのですが、PasswordUIValidationというクラスを使ったアプローチもあるようです。

THPinViewControllerとの比較

THPinViewControllerより自由度が高いのが良さそうでした。
THPinViewControllerは良く使っているんですが、「パスコード正解時は自動的にdissmissされる為、確認ページへ遷移させるのが難しい」みたいな問題があってそれが解決するだけでも良さそうです。
それと指紋認証を標準で対応してくれているのもありがたいです。

www.cl9.info