Інтеграція Salesforce з мобільним додатком
Salesforce — зріла CRM-платформа з добре задокументованим REST API та кількома SDK для мобільних. На відміну від 1С або Bitrix24, тут менше неочікуваних обмежень API, натомість більше концепцій для вивчення: Connected App, OAuth 2.0 flows, SOQL, SOSL, Apex REST, Platform Events.
Connected App та OAuth
Все починається зі створення Connected App у Salesforce Setup: App Manager → New Connected App. Указуєте Callback URL (deeplink додатка), включаєте OAuth scopes: api, refresh_token offline_access.
Мобільний додаток використовує OAuth 2.0 Authorization Code Flow або JWT Bearer Flow для server-to-server. Для контексту користувача — Authorization Code.
На Android — бібліотека 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)
Після обміну коду на токен зберігаємо access_token, refresh_token та instance_url — базовий URL для всіх API-викликів (в кожної Salesforce організації свій поддомен).
REST API та SOQL
Salesforce REST API — головний інтерфейс. Базовий URL: {instance_url}/services/data/v60.0/. Вибирайте версію API під мінімально підтримувану версію у клієнта.
Запит через 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+50
SOQL — SQL-подібна мова, але з власними обмеженнями: немає JOIN у звичайному розумінні, пов'язані об'єкти через relationship query (Account.Name). LIMIT максимум 2000. Для більших наборів — queryMore з nextRecordsUrl із відповіді.
Створення запису — POST /services/data/v60.0/sobjects/Opportunity/ з JSON-тілом. Оновлення — PATCH /services/data/v60.0/sobjects/Opportunity/{id}. Важливо: Salesforce використовує PATCH, не PUT для оновлення.
Platform Events для real-time
Salesforce Platform Events — publish/subscribe механізм. Сервер публікує подію (OpportunityUpdated__e), клієнти отримують через CometD (Bayeux протокол, long polling).
На мобільному — Salesforce Mobile SDK або власна реалізація CometD. Mobile SDK включає готовий SFRestAPI та StreamingAPI клієнт. Але 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 → мобільний клієнт оновляє екран. Latency: 1-3 секунди.
Salesforce Mobile SDK vs кастомна інтеграція
| Salesforce Mobile SDK | Кастомна інтеграція | |
|---|---|---|
| OAuth | Вбудований | AppAuth / кастомний |
| Offline | SmartStore (SQLCipher) | Room / Core Data |
| Push | Вбудований | FCM/APNs напрямку |
| Розмір | +15 МБ | Мінімальний |
| Гнучкість | Обмежена SDK | Повна |
SDK виправданий, якщо додаток переважно Salesforce-орієнтований. Для додатків, де Salesforce — одна з кількох інтеграцій — краще кастомний підхід.
Salesforce Files та вложення
Файли в Salesforce — ContentDocument та ContentVersion. Загрузка файлу з мобільного додатка:
POST /services/data/v60.0/sobjects/ContentVersion/
Content-Type: multipart/form-data
{
"Title": "Фото клієнта",
"PathOnClient": "photo.jpg",
"FirstPublishLocationId": "{opportunityId}"
}
+ binary data
FirstPublishLocationId — об'єкт, до якого прив'язується файл. Обмеження: один файл за запит. Для кількох — послідовні запити або Salesforce Bulk API.
Терміни
Базова інтеграція (OAuth, SOQL-запити, CRUD для Opportunity/Contact): 1-2 тижні. Platform Events, офлайн-кеш, push-уведомлення: плюс 1-2 тижні. Повноцінний додаток з Salesforce Mobile SDK, SmartStore та синхронізацією: 1,5-2 місяці. Вартість розраховується індивідуально.







