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行のコードをアドバンテージとは考えない。
これは引き分けとしよう。