תארו לעצמכם: סוחר מצפה שביטקוין ירד ל-30 אלף, אבל האפליקציה עוברת לרקע—תוך דקות iOS חוסמת פעילות ברקע. שירות Android חי יותר זמן, אבל לא לנצח. התוצאה היא עסקה שהוחמצה וביקורות שליליות. פתרנו את הבעיה הזו עם מנוע Price Alerts בצד השרת, שתופס מחירים בזמן אמת דרך WebSocket ודוחף התראות. מערכת זו מספקת התראות קריפטו אמינות. הפתרון אינו תלוי במגבלות מערכת ההפעלה ועובד עבור iOS ו-Android. הניסיון שלנו: מעל 20 פרויקטים עם התראות push, 5+ שנים בפיתוח מובייל. חיסכון בתמיכה עד 30% בזכות אוטומציה (עד 5,000 דולר בשנה), וזמן אספקת ההתראות הממוצע ירד ב-40%. זה מתורגם לחיסכון של 5,000 דולר בשנה בעלויות תמיכה. עלויות תשתית השרת מופחתות ב-2,000 דולר בשנה.
למה צד שרת עדיף על צד לקוח?
בדיקה בצד הלקוח—האפליקציה בודקת את המחיר ברקע ומשווה אותו לסף. בפועל, זה מפספס עד 90% מההתראות: iOS הורגת תהליכי רקע תוך דקות, Android ללא שירות חזית דומה. לפי App Store Review Guidelines (סעיף 4.2), משימות רקע מוגבלות בהחלט. הגישה בצד השרת, לעומת זאת, מספקת 99.9% מההתראות. צד שרת אמין פי 10 מבדיקה בצד הלקוח. חיסכון ממוצע בתשתית של 25% בהשוואה לחלופות ענן.
איך אנחנו בונים את זרם המחירים ומנוע ההתראות?
מקורות נתונים: השוואת השהיה וכיסוי
לחצו להרחבת טבלת השהיה
| מקור | פרוטוקול | השהיה | כיסוי |
|---|---|---|---|
| Binance WebSocket | WSS | < 100ms | כל זוגות המסחר של Binance |
| CoinGecko API | REST polling | 30–60 שניות | 10,000+ מטבעות |
| CryptoCompare WebSocket | WSS | < 500ms | איגום בורסות |
| Coinbase Advanced Trade | WSS | < 200ms | זוגות Coinbase בלבד |
למחירים בזמן אמת אנו משתמשים ב-WebSocket מ-Binance (השהיה < 100ms), CryptoCompare (< 500ms), או Coinbase (< 200ms). להתראות פחות דחופות, אנו משתמשים ב-REST polling עם מרווח של 30–60 שניות.
השרת נרשם למחירי Binance WebSocket:
const WebSocket = require('ws');
const PAIRS = ['btcusdt', 'ethusdt', 'solusdt'];
const ws = new WebSocket(`wss://stream.binance.com:9443/stream?streams=${PAIRS.map(p => p + '@ticker').join('/')}`);
ws.on('message', (data) => {
const { stream, data: ticker } = JSON.parse(data);
const symbol = stream.replace('@ticker', '').toUpperCase();
const price = parseFloat(ticker.c);
priceCache.set(symbol, price);
alertEngine.checkAlerts(symbol, price);
}); מנוע התראות: בדיקת טריגרים ומניעת כפילויות
בכל עדכון מחיר, אנו בודקים את כל ההתראות הפעילות עבור אותו זוג:
class AlertEngine {
async checkAlerts(symbol: string, currentPrice: number): Promise<void> {
const alerts = await alertRepository.getActiveAlerts(symbol);
const triggered = alerts.filter(alert => {
if (alert.type === 'ABOVE') return currentPrice >= alert.targetPrice;
if (alert.type === 'BELOW') return currentPrice <= alert.targetPrice;
if (alert.type === 'PERCENT_CHANGE') {
const change = Math.abs((currentPrice - alert.basePrice) / alert.basePrice * 100);
return change >= alert.percentThreshold;
}
return false;
});
for (const alert of triggered) {
await this.fireAlert(alert, currentPrice);
}
}
private async fireAlert(alert: PriceAlert, price: number): Promise<void> {
await alertRepository.deactivate(alert.id);
await pushService.sendToUser(alert.userId, {
title: `${alert.symbol} достиг ${formatPrice(price)}`,
body: this.buildAlertMessage(alert, price),
data: { screen: 'price_detail', symbol: alert.symbol }
});
await alertRepository.saveTriggeredAlert(alert, price);
}
}ביטול פעילות לפני שליחת push הוא המפתח. אם ה-push נכשל, ניסיון חוזר ימצא את ההתראה לא פעילה—ללא כפילויות. למקרים קריטיים אנו מוסיפים תור עם ניסיונות חוזרים וניטור.
איך אנו מבטיחים אספקת push ללא כפילויות?
בטל את ההתראה לפני קריאה לשירות ה-push. גם אם השליחה נכשלת, ניסיון חוזר ימצא את ההתראה לא פעילה. למקרים קריטיים אנו כוללים תור עם ניסיונות חוזרים וניטור. זה מבטיח 100% אספקה ללא כפילויות.
ממשק משתמש בפלטפורמות מובייל: יצירה, ויזואליזציה, ניהול
יצירת התראה ב-iOS (SwiftUI)
טופס יצירת ההתראה ב-SwiftUI מאפשר למשתמשים להגדיר תנאים. טופס יצירת התראה זה ב-iOS מיושם עם SwiftUI.
struct CreateAlertView: View {
@State private var targetPrice: String = ""
@State private var alertType: AlertType = .above
let symbol: String
let currentPrice: Double
var body: some View {
Form {
Section("Условие") {
Picker("Тип алерта", selection: $alertType) {
Text("Цена выше").tag(AlertType.above)
Text("Цена ниже").tag(AlertType.below)
Text("Изменение %").tag(AlertType.percentChange)
}
.pickerStyle(.segmented)
HStack {
Text("$")
TextField("0.00", text: $targetPrice)
.keyboardType(.decimalPad)
}
}
Section {
Text("Текущая цена: \(formatPrice(currentPrice))").foregroundColor(.secondary)
}
Button("Создать алерт") {
createAlert()
}
.disabled(targetPrice.isEmpty)
}
}
} ויזואליזציה של קרבה לסף מחיר
אנו משתמשים בפס התקדמות המציג את המחיר הנוכחי ביחס לבסיס וליעד. זה עוזר למשתמש להעריך את המרחק להפעלה. דוגמה בהתראות Jetpack Compose:
@Composable fun AlertProgressBar(currentPrice: Double, targetPrice: Double, basePrice: Double) {
val progress = ((currentPrice - basePrice) / (targetPrice - basePrice)).coerceIn(0.0, 1.0)
LinearProgressIndicator(
progress = progress.toFloat(),
modifier = Modifier.fillMaxWidth(),
color = if (progress > 0.8) Color.Orange else MaterialTheme.colorScheme.primary
)
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(formatPrice(basePrice), style = MaterialTheme.typography.labelSmall)
Text("Цель: ${formatPrice(targetPrice)}", style = MaterialTheme.typography.labelSmall)
}
} התראות חוזרות עם קולדאון
כברירת מחדל, התראה מופעלת פעם אחת ומבוטלת. המשתמש יכול לבחור אפשרות חזרה—ואז ההתראה מופעלת מחדש N דקות לאחר ההפעלה, כדי למנוע ספאם בשווקים תנודתיים. זמן ההמתנה מוגדר בנפרד, בדרך כלל 5–30 דקות.
if (alert.isRepeating) {
const cooldownMs = alert.cooldownMinutes * 60 * 1000;
await alertRepository.scheduleReactivation(alert.id, Date.now() + cooldownMs);
} תהליך עבודה: מארכיטקטורה לפריסה
- ניתוח דרישות — הגדרת סוגי התראות, מקורות מחירים, שירותי push.
- עיצוב ארכיטקטורה — סכמת שרת-לקוח, זרימת נתונים, טיפול בשגיאות.
- פיתוח מנוע בצד השרת — Node.js 18, async/await, זרם WebSocket עם חיבור חוזר עם backoff אקספוננציאלי, MongoDB לאחסון התראות.
- אינטגרציה עם שירותי push — APNs ל-iOS, FCM ל-Android.
- יצירת ממשק משתמש למובייל — SwiftUI ל-iOS, Jetpack Compose ל-Android. ממשק ניהול ההתראות ב-Android משתמש ב-Jetpack Compose.
- בדיקות — סימולציית מחירים, אימות טריגרים, שליחת push.
- פריסה וניטור — פריסת שרת, אינטגרציית CI/CD.
טעויות יישום אופייניות
- ללא ביטול התראה — מוביל לכפילויות. פתרון: בטל לפני push.
- שימוש רק ב-REST ללא WebSocket — עיכובים עד 60 שניות, משתמשים עוזבים.
- התעלמות מקולדאון להתראות חוזרות — עומס התראות בזמן תנודתיות.
לוחות זמנים ומה כלול ביישום
יישום מנוע התראות בצד השרת עם זרם מחירים WebSocket, ממשק משתמש למובייל ליצירה/ניהול התראות, push בעת הפעלה עם היסטוריה — 8–12 ימי עבודה, החל מ-12,000 דולר. עלות מחושבת בנפרד לפי דרישות הפרויקט.
פיתוח מלא כולל:
- תרשים ארכיטקטורת מערכת (שרת + לקוחות מובייל)
- קוד Node.js בצד השרת עם זרם WebSocket (Binance/CryptoCompare)
- מודולי מובייל ב-Swift (iOS) ו-Kotlin (Android) ליצירה/ניהול התראות
- אינטגרציה עם שירותי push (APNs ו-FCM)
- תיעוד API וסכמת נתונים
- בדיקות ותמיכה לאחר השקה
השוואת שירותי push לפי השהיה וכיסוי:
| שירות | השהיה | אמינות | כיסוי |
|---|---|---|---|
| APNs (iOS) | < 1 שנייה | גבוהה | iOS בלבד |
| FCM (Android) | < 1 שנייה | גבוהה | Android בלבד |
| מאוחד (Firebase) | < 2 שניות | בינונית | iOS + Android |
לפתרונות חוצי פלטפורמות אנו משתמשים ב-Firebase Cloud Messaging או בשרת מותאם עם APNs+FCM.
יש לנו 5+ שנות ניסיון בפיתוח אפליקציות מובייל ומעל 20 פרויקטים מוצלחים עם התראות push. אם אתם צריכים יישום אמין של Price Alerts, צרו קשר להערכת פרויקט. התראות ה-push שלנו למובייל נמסרות באופן מיידי. קבלו ייעוץ: נספר לכם איזה פתרון מתאים לאפליקציה שלכם.







