civil-and-structural-engineering
יישום עדכון נתונים בזמן אמת עם Firebase ב-Ios Apps
Table of Contents
מדוע מידע בזמן אמת באפליקציות מודרניות
משתמשים מצפים שאפליקציות ניידות ירגישו בחיים - הודעות צ'אט צריכות להופיע מיד, לוחיות צריכות לעדכן ללא רענון ידני, וכלים שיתופיים צריכים לשקף שינויים שנעשו על ידי אחרים בזמן אמת.עבור מפתחי iOS, לספק חוויה חלקה זו דורש שכבת סינכרון נתונים בזמן אמת.בסיס Firebase, פלטפורמת פיתוח יישומים ניידים ואינטרנט של גוגל, מספקת פתרון משכנע עם יכולות מסד הנתונים בזמן אמת.
בניגוד ל- API מסורתיים הדורשים בדיקת או רענון ידני, מסד הנתונים של Firebase בזמן אמת (RTDB) ו- Firehouse מציעים עדכונים המונעים על ידי אירועים.כאשר נתונים משתנים בשרת, ה- SDK דוחף את השינויים האלה לכל לקוח מחובר, לעתים קרובות בתוך מילימטרים.זה הופך אותו אידיאלי לשימוש במקרים כגון צ'אטים חיים, עריכת שיתופיים, ציוני ספורט חיים, וניטור ביעילות על ידי קצה זה, יש לך הבנה ברורה של אש, כדי למנוע את ה- iOS, כדי לאלתול של שימוש במקרים של לוחמת, כדי להטמיע את מסד נתונים משותף, כדי להטמיע את הגדרות ההפעלה שלך, כדי לאמת את הגדרות ההפעלה, כדי לאמת את הגדרות ההפעלה שלך, כדי לאמת את הגדרות ההפעלה, כדי לאמת את הגדרות ההפעלה, כדי להטמיעו של iOS, כדי להטמיעו של לוחמת, כדי לאמת את הגדרות ההפעלה, כדי להטמיעו, כדי להטמיעו, כדי למנוע את הגדרות ההפעלה, כדי להטמיעו, כדי לאמת את הגדרות ההפעלה, כדי למנוע את הגדרות ההפעלה, כדי למנוע את הגדרות ההפעלה, כדי לאמת את ה- iOS, כדי לאמת את הגדרות ההפעלה, כדי לאמת את הגדרות ההפעלה, כדי למנוע את הגדרות ההפעלה, כדי להטמיעו, כדי לאמת את הגדרות ההפעלה, כדי
Firehouse Database Realtime Database vs. Cloud Firehouse
Firebase מציעה שני פתרונות מסד נתונים עיקריים: מסד הנתונים המקורי של Realtime Database (RTDB) ואת חנות Cloud Firehouse החדשה יותר בענן, בעוד שניהם תומכים בסינכרון בזמן אמת, הם שונים במודל נתונים, מיומנויות השאילתה ותמחור. בחירת הימין היא ההחלטה הקריטית הראשונה.
מסד נתונים בזמן אמת (RTDB)
RTDB מאחסן נתונים כעץ גדול יחיד של JSON.זה פשוט להגדיר ולעבוד טוב עבור נתונים קטנים בגודל בינוני עם קינון רדודה. RTDB מצטיין בעדכונים בעלי נטיות נמוכה והוא בחירה נהדרת כאשר האפליקציה שלך צריכה לסנכרן קטן, לעתים קרובות שינוי נתונים כמו נוכחות או מצב משחק.
חנות אש
Firehouse הוא מסד נתונים בוגר יותר, מוכוון מסמך NoSQL. Data מאורגן לתוך מסמכים בתוך אוספים, המאפשר מבנים היררכיים, שאילתות מורכבות, ושכפול רב-אזורי אוטומטי. Firehouse מציעה תמיכה בשאילתה עשירה יותר, כולל סינון מתקדם, מיון ו aggregation. זה גם מספק ערבויות עקביות חזקות יותר ועקשנות בלתי-מודעת של הקופסה. עבור פרויקטים חדשים ביותר, Firehouse הוא הבחירה המומלצת לתרחישים המשתנים שלה לעתים קרובות יותר, אך המשתנים שלה הוא המשתנים.
לשם מאמר זה, אנו נתמקד ב-Cloud Firehouse כפי שהוא הסטנדרט המודרני.עם זאת, המושגים של מאזינים וטיפול בנתונים חלים באופן דומה על RTDB עם שינויים קלים בסנמס.
הקמת בסיס אש בפרויקט iOS
לפני שאתה יכול להתחיל להקשיב לשינויים בנתונים, עליך לשלב את בסיס האש בפרויקט Xcode שלך.התהליך כולל שלושה שלבים עיקריים: יצירת פרויקט בסיס Fire, רישום אפליקציית iOS שלך, ולהתקין את ערכת בסיס האש SDK.
שלב 1: יצירת פרויקט Firebase
עבור אל ה-FLT:0.Firebase ConsoleFLT:1 ולחצו על "פרויקט תוספת" בצע את ההוראות כדי לקרוא את הפרויקט שלך (למשל, "MyTimeApp") אתה יכול לאפשר ל-Google Analytics אם תרצה, אם כי הוא אופציונלי לפונקציונליות מסד נתונים.
שלב 2: לרשום את אפליקציית iOS
בסקירה של פרויקט Firebase Console, הקש על סמל iOS להוסיף אפליקציית iOS.You תזדקק מזהה החבילה של האפליקציה שלך (הנמצא ב- Xcode תחת הגדרות הכלליות של היעד שלך) באופן אופאלי, הזן כינוי כמו "ייצור iOS" ו- App Store מזהה (אפשר להשאיר ריק לפיתוח).
גרור את קובץ ה-FLT:1 לשורש פרויקט ה- Xcode שלך, ודא כי הוא הוסיף לכל המטרות וכי "פריטים קופי אם יש צורך" נבדק.אל תוסיף אותו ל- Info.plist - זה צריך להישאר קובץ נפרד.
שלב 3: התקנת בסיס האש SDK
ניתן להתקין בסיס Fire באמצעות CocoaPods, Swift Pack Manager, או באופן ידני. Swift Pack Manager הוא עכשיו הגישה הסטנדרטית. in Xcode, לנווט ל-FLT:0File > הוסף חבילות ל-ALT:1 ל- Firebase Repository URL: FLT:2 בחר את הגרסה (בדרך כלל עד "הגדול" עבור הספרות האחרונות אתה צריך באמת: 4.Ftime שלך, אם אתה צריך לכלול את ה-F לפחות, אם אתה צריך להוסיף את ה-F.
לאחר הוספת החבילה, Xcode יפתור את התלויים ויורד את ה- SDK. ואז לייבא את המודולים בקבצי Swift שלך.
שלב 4: הקמת בסיס האש
(ב) ב-[[1924]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]
import UIKit
import FirebaseCore
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
return true
}
}
עבור יישומים SwiftUI באמצעות מחזור החיים החדש, ניתן להשתמש ב- 1010 או לזרז את ה-FLT:11 של ה-FLT:12:
import SwiftUI
import FirebaseCore
@main
struct MyApp: App {
init() {
FirebaseApp.configure()
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
יישום מידע בזמן אמת עם Firehouse
Firehouse מאפשר לך להקשיב לשינויים במסמך, אוסף או שאילתה.המאזינים יורים בתחילה בנתונים הנוכחיים, ולאחר מכן שוב בכל פעם שמתרחשת שינוי.
האזנה ל-one Document
נניח שיש לך מסמך פרופיל משתמש שניתן לעדכן על ידי המשתמש או על ידי מנהל.You יכול להקשיב למסמכים ולעדכן את UI באופן אוטומטי:
import FirebaseFirestore
let db = Firestore.firestore()
let docRef = db.collection("users").document("user123")
docRef.addSnapshotListener { documentSnapshot, error in
guard let document = documentSnapshot else {
print("Error fetching document: \(error!)")
return
}
guard let data = document.data() else {
print("Document data was empty.")
return
}
print("Current data: \(data)")
// Update UI with the new data
}
המאזינים האלה עדיין רשומים עד שתסירו אותם במפורש או את האובייקט המקשיב הוא מצורף.כדי להפסיק להקשיב, לשמור על התייחסות לרישום המאזינים:
var listener: ListenerRegistration?
func startListening() {
listener = docRef.addSnapshotListener { snapshot, error in
// handle snapshot
}
}
func stopListening() {
listener?.remove()
}
האזנה לאוסף עם Queries
לעתים קרובות אתה צריך להקשיב לאיסוף המסונן על ידי תנאים מסוימים - למשל, כל ההודעות בחדר צ'אט הורה על ידי פעמיםtamp. Firehouse תומך שאילתות בזמן אמת כי גם להשתמש תמונות:
let query = db.collection("messages")
.whereField("roomId", isEqualTo: "room123")
.order(by: "timestamp", descending: false)
query.addSnapshotListener { querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error listening to messages: \(error!)")
return
}
snapshot.documentChanges.forEach { change in
switch change.type {
case .added:
print("New message: \(change.document.data())")
case .modified:
print("Message updated: \(change.document.data())")
case .removed:
print("Message removed: \(change.document.data())")
}
}
}
באמצעות שימוש ב-FLT 18 מאפשר לך להעביר עדכונים ביעילות - רק פריטים שמשתנים מדווחים, לא כל התוצאה נקבעת.
עדכון נתונים יעיל
עדכונים בזמן אמת הם חזקים, אבל הם יכולים גם להוביל לבעיות ביצועים ושימוש ברשת מופרז אם לא מטופלים כראוי. בואו לחקור את השיטות הטובות ביותר לניהול עדכוני נתונים באפליקציית ייצור iOS.
אופטימיזציה של Payload Size
כל תמונה מחזירה את הנתונים של מסמך שלם, גם אם רק שדה אחד השתנה.כדי להפחית רוחב פס, לשקול שימוש במסמכים קטנים יותר.לדוגמה, במקום אחסון נתונים בינאריים גדולים (כמו תמונות או קטעי וידאו) ב- Firehouse, לאחסן כתובות ל-Cloud Storage.בנוסף, גם להימנע מאחסן נתונים מעוננים עמוק במסמך אחד - פיצול זה ל subcollections אם יש צורך בהאשמות Firehouse על בסיס וכותב על גודל, כך לשמור על מסמכים ושמירת גם כן, ולשמור גם על סוללות.
שימוש ב-Offline Persistence
Firehouse מציעה עקשנות לא מקוונת עבור לקוחות ניידים.כאשר מופעל, ה- SDK מצלם את הנתונים באופן מקומי.אם המכשיר מאבד את הרשת, האפליקציה יכולה להמשיך לקרוא ולכתוב נתונים; כאשר קישוריות חוזרת, היא מסנכרנת באופן אוטומטי.
כדי לאפשר עקשנות לא מקוונת, להוסיף קו אחד לפני הקריאה ל-FLT:19:
let settings = FirestoreSettings()
settings.isPersistenceEnabled = true
let db = Firestore.firestore()
db.settings = settings
עם עקשנות מופעלת, רמקולי צילום יאשו לראשונה עם הנתונים החזוכים (אם בכלל), ולאחר מכן לעדכן כאשר נתוני השרת מגיעים.זה יכול לגרום לאפליקציית להרגיש מהר יותר, במיוחד ברשתות איטיות.
ארכיון תגיות: Lifecycle
כל מאזינים פעילים צורכים משאבים (network, Memory, CPU) באפליקציות UIKit, כדאי להוסיף מאזינים ב-FLT:21 ולהסיר אותם ב-FLT:22 ב- SwiftUI, באפשרותך להשתמש ב-FLT:23/reaLT:24 מדגמים, להשתמש או להטביע אותם כדי לנהל מנויים.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
startListeningToMessages()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
stopListening()
}
טעויות קשות
רשתות נכשלות, וכך גם Firebase מדי פעם.בלוק ההשלמה של ההאזנה שלך מקבל פרמטר שגיאה.תמיד לבדוק את זה.אם המאזינים נכשלים, ייתכן שתרצה להראות כפתור "Retry" או אינדיקטור סטטוס. להיות זהיר לגבי retrying אוטומטי באופן אוטומטי - אתה יכול ליצור לולאה אינסופית.
שגיאות נפוצות כוללות הרשאות (כללי אבטחה), מכסות לא מספיקות, או פסיקות רשת.להבטיח שחוקי האבטחה של בסיס האש שלך מוגדרים כראוי כדי לאפשר קריאה / טקסים רק כאשר אתה מתאים.
« « ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
בעת עדכון מסמכים מרובים בבת אחת (למשל, סימון הודעה כקריאה ועדכון פעמים קריאה אחרונות של צ'אט), השתמש בקובץ Firehouse כדי להבטיח אטומיות:
let batch = db.batch()
let messageRef = db.collection("messages").document("msg1")
batch.updateData(["read": true], forDocument: messageRef)
let userRef = db.collection("users").document("user123")
batch.updateData(["lastRead": Timestamp()], forDocument: userRef)
batch.commit { error in
if let error = error {
print("Batch write failed: \(error)")
} else {
print("Batch write succeeded.")
}
}
עבור פעולות הדורשות קריאת נתונים לפני כתיבת, השתמש בעסקאות.לדוגמה, כדי לבטל ספירת מניות, עליך לוודא שאף לקוח אחר לא ישנה אותו בין עסקאות Firehouse להתמודד עם זה עם מטבע מבוזר אופטימי.
בדיקות מתקדמות ל-Real-Time Apps
לאחר שהאינטגרציה הבסיסית של זמן אמת עובדת, ייתכן שתרצה לטפל בנושאים מתקדמים יותר כגון אבטחה, קנה מידה, ושילוב עם שירותי בסיס אש אחרים.
חוקי אבטחה בבסיס האש
גישה בזמן אמת בצד הלקוח פירושה שכל אחד עם כתובת מסד הנתונים שלך יכול לנסות לקרוא או לכתוב. כללי אבטחה הם קו ההגנה הראשון שלך.כללים כתובים במס דמויי JSON. for Firehouse, אתה יכול לאכוף כי משתמשים יכולים לקרוא או לשכתב את הנתונים שלהם:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
match /messages/{message} {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update, delete: if request.auth != null && resource.data.authorId == request.auth.uid;
}
}
}
תמיד לבדוק את הכללים שלך במגרש החוקים של Firebase Console לפני פריסת.
Authentication and Userנוכחות
רוב היישומים בזמן אמת דורשים אימות משתמש. Firebase Authentication תומך ב-mail/password, Google Sign-in, Apple Sign-in, וספקים רבים אחרים.לאחר אימות, כל להאזין יכול להשתמש באובייקט של FLT:29 כדי לסנן נתונים.עבור נוכחות (הצגת מי הוא מקוון), אתה יכול להשתמש Firebase בזמן אמת מסד הנתונים של Fire בזמן אמת:30 מטפל, אשר כותב באופן אוטומטי ערך כאשר הלקוח יכול להשתמש ב-reatives.
פונקציות ענן לעיבוד Server-Side
חלק מהפעולות לא צריכות לקרות על הלקוח - למשל, מידע מצטבר, שליחת הודעות דחיפה, או סנקציות של קלטות. פונקציות ענן עבור בסיס האש מאפשר לך להפעיל קוד בצד השרת המופעל על ידי אירועי Firehouse. לדוגמה, כאשר מסמך הודעה חדש נוצר, פונקציה יכולה לשלוח הודעה לנמען.זה שומר את קוד הלקוחות שלך אור ומאובטח.
exports.onNewMessage = functions.firestore
.document('messages/{messageId}')
.onCreate((snap, context) => {
const message = snap.data();
// Send push notification using Firebase Cloud Messaging
});
ביצוע Scaling
סולמות Firehouse באופן אוטומטי למספרים מסיביים של קשרים במקביל, אבל עליך לעצב את מודל הנתונים שלך עם יכולת דרוגית בראש. להימנע מכתיבה לתעודה אחת לעתים קרובות מדי (למשל, נגד גלובלי) - להשתמש בדלפקים מבוזרים או להסתמך על אגרורגות.לעקוב אחר השימוש שלך ב-Firebase Console כדי להימנע מפגיעה במגבלות כמו 1 לכתוב לשנייה לתעודה אחת.
מסקנה
יישום עדכוני נתונים בזמן אמת באפליקציות iOS עם Firebase הופך ממשקים סטטיים לחוויות דינמיות, שיתופיות. על ידי בחירת מסד הנתונים הנכון (איור עבור רוב הפרויקטים החדשים), הגדרת כראוי את ה- SDK, ושימוש במאזינים צילום, אתה יכול לשמור על ה- UI של האפליקציה שלך בסנכרון עם שינויים אחוריים כמעט באופן מיידי.
לקריאה נוספת, לחקור את ה-FLT הרשמי:0 (איור) תיעוד של ההרחבה 1:1 ואת ה-FLT:2Firebase iOS ReferenceFLT 3: בנוסף, כללי אבטחת בסיס FLT:4Firebase (ראה פרק: 5) יעזרו לך לאבטח את הנתונים בזמן אמת שלך ביעילות.