Перевод вашего приложения в автономный режим с помощью Salesforce Mobile SDK

Перевод вашего приложения в автономный режим с помощью Salesforce Mobile SDK

21 мая 2022 г.

В прошлом году мы с женой получили первый опыт строительства нового дома. Процесс был веселым и захватывающим, но мы также столкнулись с неожиданными перебоями в работе интернета, которые часто сопровождают новостройки.



Хотя эти сбои повлияли на возможность моей семьи пользоваться потоковыми сервисами, такими как Amazon Prime, Hulu и Netflix, я продолжал работать над своим текущим проектом из-за преднамеренной разработки возможности работать в изолированном (или автономном) состоянии. . Это всегда было полезно во время авиаперелетов, когда я работал в Неваде и Флориде в течение года.


Это заставило меня задуматься, почему многие мобильные приложения не предназначены для продолжения работы во время перерывов в работе интернета.


В этой публикации я покажу, как легко сделать ваше мобильное приложение пригодным для использования в автономном режиме. Поскольку я недавно провел некоторое время с Salesforce Mobile SDK, я хотел продолжить изучение этого вариант мобильного приложения.


Автономная работа с Salesforce Mobile SDK


Прежде чем мы приступим к написанию кода, давайте кратко коснемся того, как автономные функции работают с Salesforce Mobile SDK.



В левой части иллюстрации представлен традиционный способ использования приложения Salesforce. Справа представлен общий обзор Salesforce Mobile SDK.



Нативные приложения, работающие на устройствах Android или iOS, могут быть написаны в Android Studio, Xcode или React Native. Эти приложения включают в себя пользовательский интерфейс, некоторый уровень бизнес-логики и объекты модели, представляющие элементы, которые в конечном счете находятся в Salesforce.


Salesforce Mobile SDK включает аспект SmartStore, который делает данные доступными, когда мобильное приложение не может получить доступ к службе Salesforce. Уровень модели можно легко спроектировать для использования SmartStore, когда требуется (или предпочтителен) автономный режим, но он готов синхронизировать все изменения с Salesforce, когда доступен онлайн-статус.


Если вы хотите узнать больше об этом дизайне, ознакомьтесь с « [Использование SmartStore для безопасного хранения данных в автономном режиме] (https://developer.salesforce.com/docs/atlas.en-us.noversion.mobile_sdk.meta/mobile_sdk/ offline_intro.htm)».


Добавление офлайн-возможности в Finny’s Foods


Ранее в этом году я изучил Salesforce Mobile SDK и создал вымышленное приложение под названием Finny’s Foods. Я трижды создавал приложение, используя Android, iOS и React Native. Я думал, что начну с публикации, в которой использовалась версия Salesforce для iOS/xCode (Swift). Mobile SDK, а затем используйте его для обеспечения автономной работы.


Репозиторий GitLab для оригинальной статьи указан ниже:


https://gitlab.com/johnjvester/finnys-foods-ios


Первым шагом является установка объекта Meal__c в файле userstore.json, который используется функциональностью SmartStore.


```javascript


"супы": [


"soupName": "Еда__c",


"индексы": [


{ "путь": "идентификатор", "тип": "строка"},


{ "путь": "имя", "тип": "строка"},


{ "путь": "Рейтинг__c", "тип": "целое число"},


{ "путь": "local", "тип": "строка"}


Затем обновите файл usersyncs.json, чтобы сделать текущий список блюд доступным в автономном режиме:


```javascript


"синхронизирует": [


"syncName": "syncDownMeals",


"syncType": "syncDown",


"soupName": "Еда__c",


"target": {"type": "soql", "query": "ВЫБЕРИТЕ идентификатор, имя, рейтинг__c ИЗ Meal__c ORDER BY Name ASC"},


"options": {"fieldlist":["Id", "Name", "Rating__c", "LastModifiedDate"], "mergeMode":"LEAVE_IF_CHANGED"}


Вы можете прочитать все о конфигурации синхронизации SmartStore в « [Регистрация Soups с файлами конфигурации] (https://developer.salesforce.com/docs/atlas.en-us.noversion.mobile_sdk.meta/mobile_sdk/offline_config_files.htm) ».



Имея конфигурацию SmartStore, я провел рефакторинг класса MealsListModel.swift, как показано ниже.


```javascript


класс MealsListModel: ObservableObject {


@Published var food: [Meal] = []


var store: SmartStore?


var syncManager: SyncManager?


частная переменная syncTaskCancellable: AnyCancellable?


частный var storeTaskCancellable: AnyCancellable?


в этом() {


store = SmartStore.shared(withName: SmartStore.defaultStoreName)


syncManager = SyncManager.sharedInstance(хранить: хранить!)


функция fetchMeals(){


syncTaskCancellable = syncManager?.publisher(для: "syncDownMeals")


.receive(на: RunLoop.main)


.sink (receiveCompletion: { _ в }, ReceiveValue: { _ в


self.loadFromSmartStore()


self.loadFromSmartStore()


частная функция loadFromSmartStore() {


storeTaskCancellable = self.store?.publisher(for: "выберите {Meal__c:Id}, {Meal__c:Name}, {Meal__c:Rating__c} из {Meal__c}")


.receive(на: RunLoop.main)


.tryMap {


$0.map { (строка) -> Еда в


пусть r = строка как! [Нить?]


return Meal(id: r[0] ?? "", Name: r[1] ?? "", Rating__c: (r[2]! as NSString).doubleValue)


.catch { ошибка -> Just<[Meal]> в


распечатать (ошибка)


вернуть Just(Еда)


.assign(к: \MealsListModel.meals, на: себя)


Я обновил функцию fetchMeals(), чтобы она взаимодействовала со SmartStore по умолчанию, вызывая Salesforce при необходимости, но позволяя использовать данные, хранящиеся в приложении, если устройство находится в автономном режиме.


Верьте или нет, это все, что требуется.


Finny’s Foods в автономном режиме


После запуска Finny’s Foods из XCode и эмулятора iPhone 8 мы видим следующий экран, отображаемый так же, как и в оригинальной публикации.



Теперь, если я отключу свое устройство от Интернета и перезагружу приложение, в XCode появятся следующие журналы:


```javascript


2022-03-14 16:14:15.544412-0400 FinnysFoodsIOS[88679:6546397] [MobileSync] КЛАСС: SFSyncDownTask runSync не удалось: { ... } причина: Ошибка вызова сервера для синхронизации errorError Domain=NSURLErrorDomain Code=-1009 "The Интернет-соединение отключено».


Однако приложение по-прежнему загружается и предоставляет данные из SmartStore. На самом деле, не просматривая логи в XCode, я бы и понятия не имел, что работаю с локальной версией данных.


Для автономных приложений, которые позволяют добавлять или обновлять данные, SmartStore имеет возможность объединять автономные и онлайн-данные с помощью диспетчера синхронизации. Дополнительные сведения см. в Синхронизация данных.


Вывод


Хотя подключение к Интернету продолжает улучшаться, надежное соединение не гарантируется на 100%. Дальновидные разработчики функций должны принять соответствующие меры, чтобы их приложения могли продолжать работать, когда подключение к Интернету недоступно. Спросите себя: как мое приложение может быть лучше, когда оно работает в отключенном состоянии?


С 2021 года я стараюсь жить в соответствии со следующим заявлением о миссии, которое, как мне кажется, применимо к любому ИТ-специалисту:


  • «Сосредоточьте свое время на предоставлении возможностей/функциональности, которые повышают ценность вашей интеллектуальной собственности. Используйте фреймворки, продукты и услуги для всего остального».**
    **
    - Дж. Вестер*

В этой статье я привел пример того, как легко реализовать автономную функциональность с помощью Salesforce Mobile SDK. Инженеры Salesforce разработали точку интеграции на уровне модели, и это лучшее место, где можно определить, можно ли получить оперативные данные или следует вернуть данные SmartStore.


Ясно, что Salesforce придерживается моей личной миссии, предлагая дизайн, который легко использовать без большого количества шаблонного кода.


Если вас интересует исходный код этой статьи, вы можете найти его на GitLab здесь:


https://gitlab.com/johnjvester/finnys-foods-ios


Хорошего дня!



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE