שילוב Salesforce עם אפליקציית מובייל
אתה מפתח אפליקציית מובייל לצוות מכירות שצריכה לסנכרן לידים, אנשי קשר, הזדמנויות ופניות עם Salesforce. הגישה הסטנדרטית דרך Salesforce Mobile SDK מוסיפה 15+ מגה-בייט לגודל האפליקציה וקושרת אותך ל-SDK, מה שלא תמיד נוח. אנו מציעים אינטגרציה גמישה: מלקוח REST קל משקל ועד סנכרון מלא באמצעות Platform Events לעדכונים בזמן אמת. לצוות שלנו יש ניסיון של 5+ שנים בפיתוח מובייל ואינטגרציית CRM — סיפקנו 20+ פרויקטים כאלה במפתח מלא.
Salesforce היא פלטפורמת CRM בוגרת עם REST API מתועד היטב (developer.salesforce.com) וכמה SDKים למובייל. בניגוד ל-1C או Bitrix24, יש בה פחות מגבלות API בלתי צפויות, אבל יותר מושגים ללמוד: Connected App, זרימות OAuth 2.0, SOQL, SOSL, Apex REST ו-Platform Events. אנו מבטיחים שהאינטגרציה תעמוד בהנחיות App Store Connect ו-Google Play Console.
איך להגדיר Connected App ו-OAuth 2.0 לאפליקציית מובייל?
הכל מתחיל ביצירת Connected App בהגדרות Salesforce: App Manager ← New Connected App. ציין Callback URL (קישור עמוק של האפליקציה), אפשר היקפי OAuth: api, refresh_token offline_access, AppAuth.
האפליקציה למובייל משתמשת ב-OAuth 2.0 Authorization Code Flow או JWT Bearer Flow לתקשורת בין שרתים. להקשר משתמש, אנו משתמשים ב-Authorization Code. אנו מסתמכים על ספריות מוכחות: AppAuth לאנדרואיד ו-ASWebAuthenticationSession ל-iOS.
באנדרואיד עם AppAuth:
val serviceConfig = AuthorizationServiceConfiguration(
Uri.parse("https://login.salesforce.com/services/oauth2/authorize"),
Uri.parse("https://login.salesforce.com/services/oauth2/token")
)
val request = AuthorizationRequest.Builder(
serviceConfig,
clientId,
ResponseTypeValues.CODE,
Uri.parse("myapp://oauth/callback")
).setScope("api refresh_token offline_access").build()
authService.performAuthorizationRequest(request, pendingIntent)לאחר החלפת הקוד בטוקן, אנו שומרים את val serviceConfig = AuthorizationServiceConfiguration( Uri.parse("https://login.salesforce.com/services/oauth2/authorize"), Uri.parse("https://login.salesforce.com/services/oauth2/token") ) val request = AuthorizationRequest.Builder( serviceConfig, clientId, ResponseTypeValues.CODE, Uri.parse("myapp://oauth/callback") ).setScope("api refresh_token offline_access").build() authService.performAuthorizationRequest(request, pendingIntent) , access_token ו-refresh_token — כתובת ה-URL הבסיסית לכל קריאות ה-API (לכל ארגון Salesforce יש תת-דומיין משלו).
REST API ו-SOQL: איך לאחזר נתונים ביעילות?
REST API הוא הממשק הראשי. כתובת URL בסיסית: instance_url. בחר את גרסת ה-API בהתאם לגרסת ה-API המינימלית של Salesforce שהלקוח שלך תומך בה.
בקשת SOQL (Salesforce Object Query Language):
GET /services/data/v60.0/query/?
q=SELECT+Id,Name,Amount,StageName,CloseDate,Account.Name
+FROM+Opportunity
+WHERE+OwnerId='{userId}'+AND+IsClosed=false
+ORDER+BY+CloseDate+ASC+LIMIT+50SOQL דומה ל-SQL אבל עם מגבלות: אין {instance_url}/services/data/v60.0/ במובן הרגיל; אובייקטים קשורים דרך שאילתות יחסים (GET /services/data/v60.0/query/? q=SELECT+Id,Name,Amount,StageName,CloseDate,Account.Name +FROM+Opportunity +WHERE+OwnerId='{userId}'+AND+IsClosed=false +ORDER+BY+CloseDate+ASC+LIMIT+50 ). המקסימום של JOIN הוא 2000. עבור מערכי נתונים גדולים, השתמש ב-Account.Name עם LIMIT מהתשובה.
יצירת רשומה: queryMore עם גוף JSON. עדכון: nextRecordsUrl. שים לב: Salesforce משתמשת ב-POST /services/data/v60.0/sobjects/Opportunity/, לא ב-PATCH /services/data/v60.0/sobjects/Opportunity/{id} לעדכונים.
למה להשתמש ב-Platform Events לעדכונים בזמן אמת?
Salesforce Platform Events הוא מנגנון פרסום/הרשמה. השרת מפרסם אירוע (PATCH), לקוחות מקבלים אותו דרך CometD (פרוטוקול Bayeux, polling ארוך).
מידע נוסף על CometD ויישום
במובייל — Salesforce Mobile SDK או יישום CometD מותאם אישית. ה-Mobile SDK כולל לקוח PUT ו-OpportunityUpdated__e מוכן, אבל ה-SDK כבד — 15+ מגה-בייט, מה שיכול להיות קריטי לחלק מהפרויקטים.
חלופה קלה יותר: לקוח CometD מותאם אישית על OkHttp:
val cometdClient = BayeuxClient(
"${instanceUrl}/cometd/60.0",
LongPollingTransport.create(null, okHttpClient)
)
cometdClient.handshake()
cometdClient.getChannel("/event/OpportunityUpdated__e")
.subscribe { message ->
val payload = message.dataAsMap
handleOpportunityUpdate(payload)
}כאשר הזדמנות מתעדכנת ב-Salesforce → Platform Event → CometD → לקוח המובייל מעדכן את המסך. זמן השהיה: 1-3 שניות.
עבור לקוח אחד, הפחתנו את זמן השהיית הסנכרון מ-5 שניות לפחות משנייה אחת באמצעות Platform Events ולקוח CometD מותאם אישית, תוך שמירה על גודל APK מינימלי.
השוואת גישות אינטגרציה
| קריטריון | Salesforce Mobile SDK | אינטגרציה מותאמת אישית |
|---|---|---|
| OAuth | מובנה | AppAuth / מותאם אישית |
| לא מקוון | SmartStore (SQLCipher) | Room / Core Data |
| Push | מובנה | FCM/APNs ישירות |
| גודל | +15 מגה-בייט | מינימלי |
| גמישות | מוגבל על ידי SDK | מלא |
| זרימת OAuth | מקרה שימוש | נתמך במובייל |
|---|---|---|
| Authorization Code | הקשר משתמש, דורש דפדפן | כן (AppAuth, ASWebAuthenticationSession) |
| JWT Bearer | בין שרתים (ללא משתמש) | לא |
| Client Credentials | סנכרון רקע | לא מומלץ |
איך להעלות קבצים ל-Salesforce מאפליקציית מובייל?
קבצים ב-Salesforce הם SFRestAPI ו-StreamingAPI. העלאת קובץ מאפליקציית מובייל:
POST /services/data/v60.0/sobjects/ContentVersion/
Content-Type: multipart/form-data
{
"Title": "Фото клиента",
"PathOnClient": "photo.jpg",
"FirstPublishLocationId": "{opportunityId}"
}
+ binary dataval cometdClient = BayeuxClient( "${instanceUrl}/cometd/60.0", LongPollingTransport.create(null, okHttpClient) ) cometdClient.handshake() cometdClient.getChannel("/event/OpportunityUpdated__e") .subscribe { message -> val payload = message.dataAsMap handleOpportunityUpdate(payload) } הוא האובייקט שאליו הקובץ מצורף. מגבלה: קובץ אחד לכל בקשה. עבור קבצים מרובים, השתמש בבקשות רציפות או ב-Salesforce Bulk API.
מה כלול בעבודת האינטגרציה
- ניתוח מבנה ה-CRM הנוכחי ודרישות הסנכרון.
- הגדרת Connected App וזרימות OAuth (Authorization Code / JWT Bearer).
- פיתוח לקוח REST עם מטמון וטיפול בשגיאות.
- שילוב Platform Events להודעות בזמן אמת.
- בדיקות על ארגוני Salesforce בסביבת sandbox וייצור.
- תיעוד API והוראות פריסה.
- תמיכה לאחר השקה (חודש אחד).
לוחות זמנים ותמחור
אינטגרציה בסיסית (OAuth, שאילתות SOQL, CRUD עבור Opportunity/Contact): 1-2 שבועות. Platform Events, מטמון לא מקוון, הודעות push: תוספת של 1-2 שבועות. אפליקציה מלאה עם Salesforce Mobile SDK, SmartStore וסנכרון: 1.5-2 חודשים. העלות מחושבת באופן אישי. שלח לנו בקשה להערכת מחיר.







