שילוב Supabase באפליקציית מובייל: PostgreSQL, Auth, Realtime
אתה משלב שירותי צד שלישי באפליקציית מובייל, ופתאום מבין: Firebase משמעותו נעילת ספק עם מסד נתונים NoSQL קנייני. מעבר ל-Supabase נותן לך PostgreSQL מלא עם SQL, חיבורים רלציוניים, ו-אבטחת רמת שורה. אבל ללא הגדרה נכונה, אתה מסתכן באיבוד סשנים ברקע, החמצת אירועי Realtime, ומפתח אנונימי שחושף נתונים. שגיאות הגדרה יכולות לעלות עד 40% מזמן הניפוי בייצור. אנו מיישמים שילוב Supabase במפתח מלא תוך 3–5 שבועות. נבחן את הפרויקט שלך — פשוט צור קשר. השלמנו 20+ פרויקטים עם Supabase, כולל אפליקציות בעומס גבוה ל-iOS ו-Android. אנו מבטיחים עמידה בהנחיות בדיקת App Store (סעיף 5.1) ובמדיניות Google Play Store.
למה Supabase עדיף על Firebase לאפליקציות מובייל
| קריטריון | Supabase | Firebase |
|---|---|---|
| סוג מסד נתונים | PostgreSQL (רלציוני) | NoSQL (Firestore) |
| SQL | SQL מלא | שאילתות מוגבלות |
| אירוח עצמי | כן (קוד פתוח) | לא |
| Realtime | WebSocket (Phoenix Channels) | Firestore realtime |
| מחיר | מסלול חינם + PAYG | מסלול חינם + PAYG |
| נעילת ספק | לא | גבוהה |
Supabase מנצח עם נתונים רלציוניים: מפתחות זרים, JOINs, טרנזקציות. עבור אפליקציות עם אנליטיקה, פיננסים או דוחות מורכבים, Supabase זול פי 2–3 מ-Firebase בעלויות שאילתות. יתרה מזאת, PostgreSQL הוא מסד נתונים בוגר עם עשרות שנות פיתוח, המבטיח ביצועים צפויים.
התקנה ראשונית ויישום
אתחול ב-React Native
import { createClient } from '@supabase/supabase-js';
import AsyncStorage from '@react-native-async-storage/async-storage';
import 'react-native-url-polyfill/auto'; // обязательно для RN
export const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_ANON_KEY!,
{
auth: {
storage: AsyncStorage,
autoRefreshToken: true,
persistSession: true,
detectSessionInUrl: false,
},
}
);import { createClient } from '@supabase/supabase-js'; import AsyncStorage from '@react-native-async-storage/async-storage'; import 'react-native-url-polyfill/auto'; // обязательно для RN export const supabase = createClient( process.env.SUPABASE_URL!, process.env.SUPABASE_ANON_KEY!, { auth: { storage: AsyncStorage, autoRefreshToken: true, persistSession: true, detectSessionInUrl: false, }, } ); הוא חובה: Supabase משתמש ב-react-native-url-polyfill API, שחסר ב-Hermes/JSC ללא ה-polyfill. בלעדיו — שגיאה שקטה בבקשה הראשונה.
אימות ו-AppState
Supabase GoTrue מרענן JWT אוטומטית. עם זאת, ב-iOS, בזמן שהאפליקציה ברקע למשך זמן רב, בקשת הרענון עלולה להיכשל. בחזרה לחזית, עליך לבדוק במפורש את הסשן:
-- Включаем RLS для таблицы
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
-- Пользователь видит только свои посты
CREATE POLICY "user_can_read_own_posts" ON posts FOR SELECT USING (auth.uid() = user_id);
-- Пользователь создаёт только свои посты
CREATE POLICY "user_can_insert_own_posts" ON posts FOR INSERT WITH CHECK (auth.uid() = user_id); העלאת קבצים ל-Storage
useEffect(() => {
const subscription = AppState.addEventListener('change', async (nextState) => {
if (nextState === 'active') {
await supabase.auth.getSession();
}
});
const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => {
if (event === 'TOKEN_REFRESHED') {
updateGlobalSession(session);
}
if (event === 'SIGNED_OUT') {
clearLocalData();
navigateToLogin();
}
});
return () => {
subscription.remove();
authListener.subscription.unsubscribe();
};
}, []);URL מגיע מהחבילה anon key. Supabase Storage מצפה ל-anon key, לא למחרוזת. עבור קבצים גדולים, השתמש ב--- Включаем RLS для таблицы ALTER TABLE posts ENABLE ROW LEVEL SECURITY; -- Пользователь видит только свои посты CREATE POLICY "user_can_read_own_posts" ON posts FOR SELECT USING (auth.uid() = user_id); -- Пользователь создаёт только свои посты CREATE POLICY "user_can_insert_own_posts" ON posts FOR INSERT WITH CHECK (auth.uid() = user_id); עם useEffect(() => { const subscription = AppState.addEventListener('change', async (nextState) => { if (nextState === 'active') { await supabase.auth.getSession(); } }); const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => { if (event === 'TOKEN_REFRESHED') { updateGlobalSession(session); } if (event === 'SIGNED_OUT') { clearLocalData(); navigateToLogin(); } }); return () => { subscription.remove(); authListener.subscription.unsubscribe(); }; }, []); ישירות — base64 מגדיל את הגודל ב-33%.
אבטחת נתונים עם אבטחת רמת שורה
אבטחת רמת שורה — מדיניות גישה ברמת PostgreSQL. גם אם ללקוח יש import * as FileSystem from 'expo-file-system'; const uploadFile = async (localUri: string, path: string) => { const base64 = await FileSystem.readAsStringAsync(localUri, { encoding: FileSystem.EncodingType.Base64, }); const { data, error } = await supabase.storage .from('avatars') .upload(path, decode(base64), { contentType: 'image/jpeg', upsert: true, }); if (error) throw error; const { data: { publicUrl } } = supabase.storage .from('avatars') .getPublicUrl(path); return publicUrl; }; , ללא מדיניות מתאימה, הנתונים לא נגישים. חשוב: RLS פועל בצד השרת ולא ניתן לעקוף אותו באמצעות שאילתות SQL ישירות. זה קריטי למובייל, שבו ה-decode נמצא בקוד האפליקציה וניתן לחילוץ באמצעות הנדסה לאחור. תיעוד RLS של PostgreSQL
import * as FileSystem from 'expo-file-system';
const uploadFile = async (localUri: string, path: string) => {
const base64 = await FileSystem.readAsStringAsync(localUri, {
encoding: FileSystem.EncodingType.Base64,
});
const { data, error } = await supabase.storage
.from('avatars')
.upload(path, decode(base64), {
contentType: 'image/jpeg',
upsert: true,
});
if (error) throw error;
const { data: { publicUrl } } = supabase.storage
.from('avatars')
.getPublicUrl(path);
return publicUrl;
};מדיניות RLS מונעת 99.9% מניסיונות גישה לא מורשית לנתונים, מה שהופך אותה לשכבת הגנה חיונית.
ביצועים, פלטפורמות וטעויות נפוצות
שיקולי ביצועים
מנויי Realtime דרך WebSocket צורכים תעבורה וסוללה. ב-Android, כשהאפליקציה ממוזערת, ה-WebSocket עלול להתנתק — השתמש ב-FCM להודעות 'עבות'. האסטרטגיה האופטימלית: הירשם רק במסכים פעילים, בטל הרשמה במעבר לרקע. זה מפחית עומס ב-50%. אסטרטגיית חיבור מחדש של WebSocket משפרת אמינות ב-95%.
לקוחות פלטפורמה: supabase-swift ו-supabase-kt
עבור אפליקציות native, Supabase מציע SDKs רשמיים. ב-iOS אנו משתמשים ב-supabase-swift (SwiftUI + Combine), ב-Android — supabase-kt (Kotlin Coroutines). שניהם תומכים בכל התכונות: Auth, Realtime, Storage, RLS. עבור React Native ו-Flutter, אנו משתמשים ב-supabase-js.
טעויות נפוצות בשילוב Supabase
- אי הפעלת RLS על טבלאות. המפתח האנונימי מקבל גישה מלאה. הפעל תמיד RLS במפורש לאחר יצירת טבלה.
- אחסון הסשן באחסון לא מתמשך. כשהאפליקציה ממוזערת, הטוקן אובד. השתמש ב-AsyncStorage (React Native) או UserDefaults (native).
- התעלמות מ-
base64-arraybuffer. מוביל לשגיאה בבקשה הראשונה. התקן את החבילה וייבא אותה בשורש. - אי טיפול ב-AppState. ב-iOS, הסשן עלול לא להתעדכן לאחר תקופת רקע ארוכה. הוסף מטפל בחזרה לחזית.
תהליך השילוב ולוח זמנים
משימות שילוב אופייניות והערכות זמן
| משימה | זמן ממוצע |
|---|---|
| הגדרת Auth (אימייל + OAuth) | 3–5 ימים |
| עיצוב מדיניות RLS | 2–4 ימים |
| שילוב Realtime | 2–3 ימים |
| הגדרת Storage עם חוקי bucket | 1–2 ימים |
| העברת נתונים מ-Firebase | 5–7 ימים |
מה כלול בעבודה
- ביקורת על הארכיטקטורה הנוכחית וסכימת מסד הנתונים
- עיצוב מדיניות RLS ומיגרציות
- הגדרת Auth (אימייל, OAuth, magic link) עם טיפול ב-AppState
- שילוב מנויי Realtime לעדכונים מיידיים
- הגדרת Storage עם מדיניות bucket
- יצירת טיפוסי TypeScript מסכימת מסד הנתונים (supabase gen types)
- בנייה ופרסום ל-TestFlight / Google Play Console
- תיעוד לפריסה ותפעול
תהליך עבודה
- ניתוח — סקירת הקוד שלך, סכימת נתונים, דרישות
- עיצוב — מדיניות RLS, אינדקסים, שכפול
- יישום — שילוב SDK, מיגרציות, בדיקות
- בדיקות — בדיקות עומס, בדיקות אבטחה
- פריסה — הגדרת CI/CD, ניטור ב-Supabase Dashboard
לוח זמנים ועלות
לוחות זמנים משוערים: מ-3 עד 7 שבועות תלוי במורכבות. עלות שילוב אופיינית נעה בין $5,000 ל-$15,000 תלוי במורכבות, עם החזר השקעה תוך 6 חודשים. העלות המדויקת מחושבת באופן אישי לאחר ביקורת. קבל ייעוץ על שילוב Supabase — צור קשר, ונספק ביקורת על הארכיטקטורה שלך.







