المصادقة على Firebase & Parse
في الجزء الأول والجزء الثاني من هذه السلسلة، قارنا عملية إنشاء تطبيق ودمج الأطر في مشروع XCode الخاص بك، وكيف أن قاعدتي بيانات Firebase و Parse لهما ميزات متشابهة ومميزة قد تتناسب بشكل أفضل مع حالة استخدامك.
في هذا الجزء الثالث، سنبدأ في البرمجة وتقييم مقدار التعليمات البرمجية اللازمة للحصول على عملية تسجيل الدخول/ تسجيل الدخول التي تعمل على كلا النظامين الأساسيين.
ما سنقوم ببنائه
نظرًا لأن كلتا المنصتين ستقومان بنفس المهام بشكل أساسي، سنستخدم نفس تصميم وحدات التحكم في العرض بالضبط مع إنشاء جميع عناصر التحكم بشكل مماثل:
ستؤدي وحدة تحكم العرض الرئيسية إلى وحدتي تحكم عرض التسجيل وتسجيل الدخول، اللتين ستنفذان الإجراءات المعنية.
كود Firebase
بعد تثبيت Firebase SDK كما هو موضح في الجزء 1، نحتاج إلى تهيئته في ملف AppDelegate.swift الخاص بنا:
import Firebase
ثم، داخل تطبيقنا:didFinishLaunchingWithOptions، علينا تهيئة كائن FirebaseApp، ووضع السطر التالي فوق عبارة الإرجاع صحيح:
FirebaseApp.configure()
والآن، يجب أن نضيف شيفرة إلى جميع طرق العرض التي تحتاج إلى معلومات خاصة بالمستخدم الذي قام بتسجيل الدخول للاستماع إلى كائن FIRAuth، والذي سيتم استدعاؤه في كل مرة تتغير فيها حالة تسجيل الدخول.
المكان الجيد لوضع هذه الشيفرة هو في طريقة viewWillAppear، لذا لن تقوم طريقة العرض بتحميل البيانات إذا لم يكن مصرحًا بها:
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
// Any other actions that happen upon state change can be written here
}
من الضروري أيضًا فصل المستمع قبل أن نغادر طريقة العرض هذه، لذا في طريقة 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.")
ستتم عملية تسجيل دخول المستخدمين في وحدة تحكم تسجيل الدخول، عندما ينقر المستخدم على زر تسجيل الدخول. تبدو شيفرة تسجيل دخول المستخدم كما يلي:
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 عمليًا في أي مكان، فمن الضروري أيضًا إعداد معرف التطبيق والمفتاح وعنوان URL لمضيف Parse الذي تستخدمه:
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)
في طريقة العرضDidAppear، يمكننا التحقق مما إذا كان المستخدم قد سجل دخوله بالفعل، حتى نتمكن من عرض البيانات:
let currentUser = PFUser.current()
if currentUser != nil {
// User is NOT logged in. Do not display data.
}
في SignUpViewController، دعنا نضيف بعض التعليمات البرمجية لإنشاء المستخدم عند النقر فوق زر التسجيل:
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، عندما ينقر المستخدم على زر تسجيل الدخول:
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 أسطر من التعليمات البرمجية ميزة.
سأعتبر هذا تعادلاً.