En julio pasado, comencé a escribir una serie centrada en cómo se puede utilizar la plataforma Salesforce sin un cliente tradicional de Salesforce. Aquí hay enlaces a los otros artículos de la serie:
A continuación se muestra una representación gráfica de la serie:
La ilustración anterior muestra cómo varios marcos de clientes pueden acceder a los datos de Salesforce sin utilizar realmente los clientes proporcionados por el ecosistema de Salesforce.
En noviembre de 2021, comencé una nueva serie para demostrar el SDK móvil de Salesforce , que aprovecha el poder de la plataforma de Salesforce dentro de las aplicaciones móviles independientes.
A continuación se muestra una representación gráfica de esta nueva serie:
“ Explorando el SDK móvil de Salesforce con React Native ” fue el primer artículo de esta serie SDK móvil. Luego cambié de tema para el artículo “ Explorando el SDK móvil de Salesforce usando Android Studio ” para aprovechar Android Studio. En este artículo, me enfocaré en usar Xcode para producir la misma aplicación.
El SDK móvil de Salesforce proporciona varios beneficios para los ingenieros de software:
Si su panorama de aplicaciones utiliza Salesforce para aspectos clave de la operatividad comercial, entonces considere aprovechar el SDK móvil de Salesforce. Al hacerlo, puede integrar datos mantenidos por Salesforce en ubicaciones de componentes clave, lo que le permite tomar decisiones comerciales sólidas.
Si su base de clientes requiere soporte para dispositivos iOS y desea utilizar Xcode para el desarrollo de aplicaciones, encontrará valor en la CLI de forceios
para comenzar rápidamente con la funcionalidad de Salesforce.
Las características clave para los equipos que emplean Xcode incluyen:
Puede ser obvio, pero debe tener una computadora Apple para usar Xcode. Para este artículo, usaré mi MacBook Pro de 16” de marzo de 2020.
Ahora que estamos listos para sumergirnos, revisemos brevemente nuestro caso de uso.
Tener un hijo (Finny) nacido con necesidades especiales introdujo un deseo personal de comprender y apreciar los productos que usamos en nuestra vida diaria. Años antes de que naciera Finny, mi esposa (Nicole) y yo llevábamos un estilo de vida saludable. Sin embargo, cuando Nicole comenzó a profundizar en los ingredientes de los alimentos que componían nuestra dieta diaria, recibimos una llamada de atención muy necesaria.
Avance rápido hasta hoy, nuestra dieta consiste en pocos alimentos procesados, sin gluten, bajo en azúcar y muy pocos productos lácteos. En la medida de lo posible, nuestra proteína proviene de fuentes alimentadas con pasto y siempre favorecemos las opciones orgánicas. No me hagas empezar con OMG.
Para esta serie, nuestra aplicación Finny's Foods proporciona una lista simple de comidas que son aceptables para nosotros y que Finny prefiere. Por ahora, incluiremos dos atributos simples para cada comida:
Con el tiempo, planeo introducir otros atributos (como resumen, ingredientes, direcciones e incluso una foto), pero caminemos antes de correr.
Además de instalar git
y npm
en mi MacBook Pro, me aseguré de que mi versión de Xcode estuviera actualizada. Luego, visité la siguiente URL para asegurarme de que todo estaba configurado y configurado como se esperaba:
Configure su entorno de desarrollo de iOS
Estos pasos incluyen asegurarse de que Xcode, CocoaPods, node.js, npm y la CLI de forceios
estén todos instalados.
A continuación, forceios
desde una sesión de terminal con las siguientes opciones:
forceios create Enter your application type (native_swift or native, leave empty for native_swift): native_swift Enter your application name: FinnysFoodsIOS Enter your package name: com.gitlab.johnjvester.finnysfoods.ios Enter your organization name (Acme, Inc.): JVC Enter output directory for your app (leave empty for the current directory): Once completed, I followed the steps provided by the forceios CLI: ****************************************************************************** * * Next steps: * * Your application project is ready in FinnysFoodsIOS. * To use your new application in XCode, do the following: * - open FinnysFoodsIOS/FinnysFoodsIOS.xcworkspace in XCode * - build and run * Before you ship, make sure to plug your OAuth Client ID and Callback URI, * and OAuth Scopes into FinnysFoodsIOS/FinnysFoodsIOS/bootconfig.plist * ******************************************************************************
Antes de poder comenzar a crear una nueva aplicación en Xcode, necesitaba establecer el objeto Meal en Salesforce.
Ya tenía una organización de desarrollador que podía usar. (Puede crear uno nuevo aquí ). Entonces, simplemente inicié sesión con mi dirección de correo electrónico y contraseña para esa organización. A continuación, navegué a Aplicaciones | App Manager y la perspectiva de Configuración en Salesforce.
Creé una nueva aplicación Lightning llamada Meal:
En las pantallas de configuración restantes, seleccioné todas las configuraciones predeterminadas y otorgué acceso a todos los perfiles de usuario de Salesforce.
A continuación, visité Objetos y campos | Opción de menú Gestor de objetos en la Configuración de Salesforce. Una vez que localicé el elemento de comida recién creado, usé el componente desplegable para editar el objeto.
Cambié del submenú Detalles a la opción Campos y relaciones . Rápidamente me di cuenta de que no necesitaba crear una propiedad Nombre para mi objeto Comida, ya que Salesforce ya se encargó de eso por mí. Solo necesitaba agregar el campo Calificación.
Con el botón Nuevo , seleccioné el tipo de campo numérico y completé el Paso dos como se indica a continuación:
Usé los valores predeterminados y guardé mi nuevo campo. Ahora, puedo usar los campos de nombre y calificación en mi aplicación de iOS.
Con el cliente de Salesforce, rellené algunos datos de origen para desarrollar la aplicación en Xcode. A continuación se muestra un resumen de los valores enviados:
Según los datos de la muestra, Finny siempre prefiere "Pizza" a "Pollo y arroz".
Con el objeto de origen y los datos configurados, utilicé mi aplicación Xcode para abrir el proyecto finnys-foods-ios
por primera vez.
De forma predeterminada, la CLI de forceios
crea una aplicación funcional que muestra información de cuenta y contacto para la organización de Salesforce vinculada a la cuenta de usuario cuando se ejecuta por primera vez. Para facilitar las cosas, decidí seguir adelante y eliminar los siguientes archivos del proyecto:
Dado que planeo cubrir la funcionalidad fuera de línea en un artículo futuro, actualicé los datos de configuración en userstore.json
a:
{ "soups": [ ] }
El archivo usersyncs.json
también se eliminó como se muestra a continuación:
{ "syncs": [ ] }
A continuación, creé una vista de lista básica para el objeto Meal__c
en Salesforce, llamada MealsListView.swift
.
import Foundation import SwiftUI import Combine import SalesforceSDKCore struct MealsListView: View { var body: some View { Text("Finny's Foods (iOS)").bold() } } struct MealsList_Previews: PreviewProvider { static var previews: some View { MealsListView() } }
Para usar la vista de lista de comidas cuando se inicia la aplicación, actualicé el método setupRootViewController()
en el archivo SceneDelegate.swift
como se muestra a continuación:
func setupRootViewController() { // Setup store based on config userstore.json MobileSyncSDKManager.shared.setupUserStoreFromDefaultConfig() // Setup syncs based on config usersyncs.json MobileSyncSDKManager.shared.setupUserSyncsFromDefaultConfig() self.window?.rootViewController = UIHostingController( rootView: MealsListView() ) }
En este punto, tenemos una aplicación iOS funcional que simplemente mostrará "Finny's Foods (iOS)" en negrita.
Antes de construir el resto de la aplicación, quería ver lo fácil que sería agregar íconos de Font Awesome en una aplicación Swift creada en Xcode. Como recordará, esta tarea fue muy fácil con React Native y no tan fácil en Android Studio.
Pude seguir los pasos proporcionados en la siguiente URL para que todo funcionara en unos 15 minutos. Espero que aquellos con experiencia en Xcode completen estos pasos en una fracción del tiempo:
Como resultado de estos pasos, los siguientes archivos de soporte ahora forman parte de mi proyecto:
La aplicación Xcode necesita comprender el objeto Meal__c
que está impulsando la aplicación Finny's Foods. Creé un archivo MealsListModel.swift
que contenía la siguiente información:
import Combine import SmartStore import MobileSync struct Meal: Hashable, Identifiable, Decodable { let id: UUID = UUID() let Id: String let Name: String let Rating__c: Int } struct MealResponse: Decodable { var totalSize: Int var done: Bool var records: [Meal] } class MealsListModel: ObservableObject { @Published var meals: [Meal] = [] private var mealsCancellable: AnyCancellable? func fetchMeals(){ let request = RestClient.shared.request(forQuery: "SELECT Id, Name, Rating__c FROM Meal__c ORDER BY Name ASC", apiVersion: nil) mealsCancellable = RestClient.shared.publisher(for: request) .receive(on: RunLoop.main) .tryMap({ (response) -> Data in response.asData() }) .decode(type: MealResponse.self, decoder: JSONDecoder()) .map({ (record) -> [Meal] in record.records }) .catch( { error in Just([]) }) .assign(to: \.meals, on:self) } }
Este archivo presenta un objeto Meal que contiene los metadatos para cada objeto Meal__c
almacenado en Salesforce. También hay un objeto MealResponse
, que representa la carga proporcionada por Salesforce cuando solicita datos de Meal__c
.
Con esas dos estructuras clave definidas, el método fetchMeals()
realiza una llamada API RESTful a Salesforce y luego asigna cualquier dato de respuesta a una lista de objetos Meal . El archivo MealsListView.swift
creado anteriormente procesa estos datos.
Con el modelo de lista de comidas listo, la vista de lista de comidas ahora se puede expandir para integrarse con Salesforce y presentar datos en un dispositivo iOS. Lo primero que tuve que hacer fue establecer una variable para el Modelo de Lista de Comidas en el archivo MealsListView.swift
:
struct MealsListView: View { @ObservedObject var viewModel = MealsListModel()
A continuación, actualicé la variable del cuerpo en el archivo MealsListView.swift
como se muestra a continuación:
var body: some View { Text("Finny's Foods (iOS)").bold() List(viewModel.meals) { dataItem in HStack(spacing: 10) { VStack(alignment: .leading, spacing: 3) { HStack { Text(dataItem.Name) } } } } .onAppear{ self.viewModel.fetchMeals() }
En este punto, la aplicación de iOS muestra el nombre de cada comida en una nueva línea. La llamada al método fetchMeals()
recupera datos de Salesforce y procesa cada elemento Meal__c
como elemento de datos.
Sin embargo, realmente quería agregar el sistema de clasificación por estrellas utilizado en el proyecto React Native. Para hacer esto, actualicé el objeto HStack
más interno como se muestra a continuación:
HStack { Text(dataItem.Name) Text(" ") switch dataItem.Rating__c { case 5: FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) case 4: FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15) case 3: FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15) FAText(iconName: "star", size: 15) case 2: FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15) FAText(iconName: "star", size: 15) FAText(iconName: "star", size: 15) default: FAText(iconName: "star", size: 15, style: .solid) FAText(iconName: "star", size: 15) FAText(iconName: "star", size: 15) FAText(iconName: "star", size: 15) FAText(iconName: "star", size: 15) } }
Con estos cambios implementados, la aplicación de iOS está lista para usar.
Usando Xcode, usé la opción de menú Producto y seleccioné la opción Ejecutar .
El primer uso redirigirá automáticamente a una pantalla de inicio de sesión de Salesforce, donde utilicé la misma dirección de correo electrónico y contraseña para acceder a mi organización de Desarrollador. Después de iniciar sesión, apareció la aplicación Finny's Foods, incluido el valor de calificación de cinco estrellas para cada artículo.
En cuestión de minutos, pudimos crear una aplicación para iOS utilizando Xcode y el SDK móvil de Salesforce.
En este artículo, presenté una aplicación móvil personalizada que se implementa de forma nativa desde la tienda de Apple y usa código fuente escrito en Swift. En el camino, obtuvimos una comprensión básica de cómo se estructuran las aplicaciones basadas en iOS.
A partir de 2021, he estado tratando de cumplir con la siguiente declaración de misión, que creo que se puede aplicar a cualquier profesional de TI:
“Concentre su tiempo en ofrecer características/funcionalidades que amplíen el valor de su propiedad intelectual. Aproveche los marcos, productos y servicios para todo lo demás”.
-J. Vester
El SDK móvil de Salesforce ciertamente se adhiere a mi declaración de misión personal, lo que beneficiará a cualquier equipo de funciones que requiera la funcionalidad de Salesforce como parte de las aplicaciones móviles personalizadas que se ejecutan en dispositivos iOS. Los ingenieros de software en este ámbito de desarrollo sin duda deberían considerar agregar el SDK móvil de Salesforce como una dependencia del proyecto.
Si desea ver el código fuente completo de este artículo, visite mi proyecto en GitLab:
https://gitlab.com/johnjvester/finnys-foods-ios
¡Que tengas un gran día!