FirebaseとParseでの認証

このシリーズのパート1とパート2では、アプリの作成プロセスとフレームワークをXCodeプロジェクトに統合するプロセスを比較し、FirebaseとParseデータベースが似ているようで異なる特徴を持ち、あなたのユースケースによりフィットする可能性があることを説明した。

この第3部では、コーディングを開始し、サインアップ/サインイン処理を両方のプラットフォームで動作させるために必要なコードの量を評価します。

何を作るか

両プラットフォームは基本的に同じタスクを行うので、まったく同じビュー・コントローラー設計を使用し、すべてのコントロールを同様に作成する:

メインのビューコントローラは、サインアップビューコントローラとサインインビューコントローラにセグし、それぞれのアクションを実行します。

Firebaseのコード

前編で説明したようにFirebase SDKをインストールしたら、AppDelegate.swiftで初期化します:

import Firebase

そして application:didFinishLaunchingWithOptions メソッドの中で、FirebaseApp オブジェクトを初期化する必要があります:

FirebaseApp.configure()

ここで、サインインしたユーザーのプライベートな情報を必要とするすべてのViewに、サインインの状態が変わるたびに呼び出されるFIRAuthオブジェクトをリッスンするコードを追加する必要があります。

このコードを置くのに良い場所は、viewWillAppearメソッドで、許可されていない場合、ビューがデータをロードしないようにします:

handle = Auth.auth().addStateDidChangeListener { (auth, user) in
  // Any other actions that happen upon state change can be written here
}

また、Viewから離れる前にリスナーをデタッチする必要があるので、viewWillDisappearメソッドに以下のコードを追加します:

Auth.auth().removeStateDidChangeListener(handle!)

新規ユーザーのサインアップは SignUpViewController で行うので、ユーザーが Singn-Up ボタンを押したときに呼び出されるメソッドにこのコードを追加しましょう:

Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
  // Code for error handling and other actions can be put here
}

上記のメソッドに対する適切なエラー処理は次のようになる:

guard let user = authResult?.user, error == nil else {
    print("ERROR CREATING USER \(user.email!).")
    print(error!.localizedDescription)
    return
}
print("\(user.email!) successfuly created.")

ユーザーのサインインは SignInViewController で行われ、ユーザーが Sign In ボタンをクリックしたときに行われます。ユーザーにサインインするコードは次のようになります:

Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
  guard let strongSelf = self else { return }
  // Aditional code for error handling and other actions can be put here
}

そして、このコードを使ってログインしたユーザーの詳細を取得することができる:

if let user = user {
  let uid = user.uid
  let email = user.email
  // Aditional properties can be retrieved here 
}

サインアウトの手続きは、次のようにして行う:

firebase.auth().signOut().then(function() {
  // Sign-out successful.
}).catch(function(error) {
  // An error happened.
});

さて、これは非常にシンプルでわかりやすい。
Parseのアプローチを見てみよう:

Parse コード

Firebaseと同様に、まずはParse IOS SDKをインストール、AppDelegate.swiftで初期化します:

import Parse

Parseは実質的にどこでもホストできるため、App ID、キー、使用するParseホストのURLも設定する必要があります:

let configuration = ParseClientConfiguration {
    $0.applicationId = "PASTE_YOUR_APPLICATION_ID_HERE"
    $0.clientKey = "PASTE_YOUR_CLIENT_ID_HERE"
    $0.server = "https://parseapi.back4app.com"
}
Parse.initialize(with: configuration)

viewDidAppearメソッドでは、ユーザーがすでにログインしているかどうかをチェックし、データを表示することができます:

let currentUser = PFUser.current()
if currentUser != nil {
    // User is NOT logged in. Do not display data.
}

SignUpViewController に、Sign-Up ボタンがクリックされたときにユーザーを作成するコードを追加しましょう:

let user = PFUser()
user.username = signUpUsernameField.text
user.password = signUpPasswordField.text
user.signUpInBackground { (success, error) in
    UIViewController.removeSpinner(spinner: sv)
    if success{
        // Success signing up. Display data for this user.
    }else{
        if let descrip = error?.localizedDescription{
            // Error signing up. Do not display data and show error message.
        }
    }
}

サインインは SignInViewController で行われ、ユーザーが Sign In ボタンをクリックしたときに行われます:

PFUser.logInWithUsername(inBackground: signInUsernameField.text!, password: signInPasswordField.text!) { (user, error) in
    if user != nil {
        // User signed In. Display data.
    }else{
        if let descrip = error?.localizedDescription{
            // User not signed in. Do not display data and show error message
        }
    }
}

サイン・アウトを行う:

PFUser.logOutInBackground { (error: Error?) in
    if (error == nil){
        // Success logging out
    }else{
        // Error logging out. Display error message.
    }
}

結論

Firebaseのサインアップとサインインに必要なコードはParseより数行少ないが、Parseは実質的にどこでもホストできる。

どちらもサインアップ、サインイン、サインアウトのプロセスを提供し、エラー処理と簡単なコード管理ができる。

そうであるように、3、4行のコードをアドバンテージとは考えない。
これは引き分けとしよう。


Leave a reply

Your email address will not be published.