Compreender aplicativos nativos forceios
Objetivos de aprendizagem
Após concluir esta unidade, você estará apto a:
- Entender o fluxo geral de um aplicativo iOS nativo Salesforce.
- Entender o fluxo de eventos durante o lançamento do aplicativo.
- Saiba como
AppDelegate
eSceneDelegate
direcionam o fluxo de execução.
Acompanhar com o Trail Together
Deseja acompanhar um especialista enquanto trabalha nesta etapa? Veja este vídeo que faz parte da série Trail Together.
(Este clipe começa na marca dos 14:49 minutos, caso você queira retroceder e ver o início da etapa novamente.)
Visão geral do fluxo do aplicativo
Vamos dar uma olhada mais atenta nos aplicativos iOS nativos.
Superficialmente, um aplicativo nativo Mobile SDK se parece com um aplicativo iOS normal. Você pode ver sua arquitetura como Modelo-Visualização-Controlador (MVC):
- O modelo é o esquema de banco de dados da Salesforce Platform.
- As visualizações vêm dos arquivos de implementação e nib do seu projeto.
- O recurso do controlador vem na forma de classes iOS Cocoa Touch, classes do Salesforce Mobile SDK e classes personalizadas do seu aplicativo.
Como em todos aplicativos iOS, um aplicativo nativo Mobile SDK começa com um módulo principal típico que configura o loop de evento principal. O Xcode gera esse arquivo e a maioria dos seres humanos não tem motivo para tocar nele.
Os aplicativos do modelo Mobile SDK para iOS 13 também definem as seguintes classes que podem ser personalizadas:
- A classe
AppDelegate
trata da inicialização do Mobile SDK. - A classe
SceneDelegate
trata de eventos do ciclo de vida da cena e autenticação do usuário. Ela delega a um objeto do SDK Manager compartilhado a coordenação das tarefas de autenticação e da senha do Salesforce. Se a autenticação for bem-sucedida, o controle passa para o controlador de exibição raiz do seu aplicativo. - A classe
InitialViewController
é o contêiner da tela de login do Salesforce. - O controlador de exibição raiz é uma classe personalizada que inicia o conteúdo do seu aplicativo.
O diagrama a seguir ilustra o fluxo de inicialização para um aplicativo nativo usando o gerenciador de SDK mais abrangente, MobileSyncSDKManager
. Esse gerenciador permite a autenticação e inclui os recursos offline do Mobile SDK.
Por padrão, os aplicativos nativos do forceios usam MobileSyncSDKManager
, uma subclasse especializada do SalesforceManager
, para inicializar o Mobile SDK. Essa classe habilita a gama completa de recursos do Mobile SDK.
Fluxo de inicialização do aplicativo
Quando um cliente abre seu aplicativo, ocorre uma sequência complexa de eventos. Esses eventos incluem:
- Aplicação da configuração do aplicativo
- Inicialização do Salesforce Mobile SDK
- Validação da senha do aplicativo (opcional)
- Execução de login e autenticação do Salesforce
- Lançamento do aplicativo
Como você inicializa o Mobile SDK depende da sua linguagem de desenvolvimento.
A maior parte do código que usa o SDK Manager existe em um novo aplicativo forceios. Vamos examinar esse código.
- No Xcode, abra o arquivo AppDelegate.swift.
- Vá até o método
init
.
Aqui, você pode ver o objeto MobileSyncSDKManager
inicializando o Mobile SDK. Ele chama initializeSDK()
.
override init() { super.init() MobileSyncSDKManager.initializeSDK() }
Internamente, esse método passa o nome da classe MobileSyncSDKManager
para a classe "super" (ou pai), SalesforceManager
. Nos bastidores, o SalesforceManager
configura observadores para eventos de lançamento de aplicativos e ciclo de vida, como autenticação do usuário, falhas de código PIN e estado em primeiro plano. Exceto em casos extremos, você nunca está diretamente envolvido nesses eventos.
O SalesforceManager
também toma outras duas ações notáveis:
- Ele cria uma instância compartilhada dele próprio que persiste durante o resto do ciclo de vida do aplicativo.
- Ele se configura para que o aplicativo sempre obtenha uma instância de
MobileSyncSDKManager
para executar suas tarefas do gerenciador do SDK.
Como resultado, se seu aplicativo chamar os métodos do gerenciador do SDK, o MobileSyncSDKManager
terá a chance de personalizar o que os métodos fazem.
Essas mudanças afetam sua codificação? Sim! Seu código deve sempre chamar métodos do gerenciador do SDK nessa única instância compartilhada:
MobileSyncSDKManager.shared
Você verá um exemplo em breve. Primeiro, porém, vamos dar uma olhada mais de perto na classe AppDelegate
do novo aplicativo.
Classe AppDelegate
Depois que o Mobile SDK é inicializado, o restante do AppDelegate implementa métodos de protocolo UIApplicationDelegate que podem ser personalizados conforme necessário. Cada um desses métodos contém instruções comentadas que indicam exatamente o que deve ser feito no caso de uso pretendido. É possível, por exemplo:
- Personalizar uma nova sessão de cena. Para especificar sua própria configuração da sessão de cena, personalize o valor de retorno do método
application(_:configurationForConnecting:options:)
. - Limpar os recursos quando o cliente descarta uma sessão de cena. Use o método
application(_:didDiscardSceneSessions:)
para liberar recursos personalizados que seu aplicativo adicionou às cenas descartadas. - Registrar seu aplicativo para receber notificações por push. Siga as instruções comentadas no método
application(_:didFinishLaunchingWithOptions:)
. As notificações push do Mobile SDK no iOS exigem uma extensão para tratar da descriptografia. Por exemplo, consulteiOSNativeSwiftEncryptedNotificationsTemplate
no repositório SalesforceMobileSDK-Templates do GitHub. - Registrar o dispositivo do cliente para receber notificações por push. Se você se registrou para receber notificações por push, o método de retorno de chamada
application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
transmitirá um token de dispositivo. Para registrar esse token de dispositivo no Mobile SDK e no gerente de notificações por push do Salesforce, siga as instruções comentadas - Informar se o registro de notificações por push falhar. Às vezes, a tentativa do aplicativo de se registrar para receber notificações por push pode falhar. Nesse caso, você recebe uma mensagem de erro no método
application(_:didFailToRegisterForRemoteNotificationsWithError:)
, que pode ser tratada da forma que quiser. - Habilitar um serviço de IDP. Você está querendo usar esse aplicativo como um provedor de identidade para seus outros aplicativos do Mobile SDK? Comece seguindo as instruções comentadas no método
application(openURL:options:)
. Para implementar esse recurso integralmente, configure seus aplicativos conforme descrito no Guia de desenvolvimento do Mobile SDK.
Classe SceneDelegate
SceneDelegate
é a plataforma de lançamento do aplicativo. Ela inicia o login do Salesforce e, em seguida, passa o controle para seu conteúdo personalizado. Mas a classe faz muito mais do que isso.Em aplicativos Swift para iOS 13 e posteriores, SceneDelegate
assume o controle como o gerenciador de visualizações SwiftUI. SceneDelegate
trata dos eventos do ciclo de vida de uma cena, como
- Conectar-se ao aplicativo
- Entrar em primeiro plano ou no fundo
- Tornar-se ativo ou inativo
- Redimensionar
Você pode personalizar sua classe SceneDelegate
para adicionar seu próprio tratamento para esses eventos. Na verdade, o aplicativo de modelo facilita essa operação. Ele fornece comentários em grandes manipuladores de eventos que indicam como proceder.
No que diz respeito ao Mobile SDK, SceneDelegate
é onde seus recursos personalizados assumem o controle. O aplicativo de modelo usa SceneDelegate
para:
- Publicar a tela de login do Salesforce quando necessário: antes que um usuário faça login ou sempre que um usuário faça logout.
- Reiniciar o estado de exibição quando o usuário atual fizer logout.
- Importar arquivos de configuração para os recursos offline SmartStore e Sincronização móvel.
- Definir a exibição raiz da janela para a primeira exibição personalizada no aplicativo.
Vejamos o código-fonte para ver como o aplicativo mostra seus modos de exibição.
- No Xcode, abra o arquivo SceneDelegate.swift.
- Perto da parte superior da classe, você pode ver a definição da primeira função.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(frame: windowScene.coordinateSpace.bounds) self.window?.windowScene = windowScene AuthHelper.registerBlock(forCurrentUserChangeNotifications: { self.resetViewState { self.setupRootViewController() } }) }
Esse método é a primeira parada de todas as cenas que estão sendo inicializadas. As três primeiras linhas representam código padronizado. Elas "conectam" a cena ao aplicativo, ou seja, anexam a cena a uma janela do aplicativo para que ela possa ser exibida. A instrução final nesse método configura a classeAuthHelper
do Mobile SDK para tratar das notificações atuais de alteração do usuário. O próprio manipulador é o bloco interno dentro da chamada do métodoAuthHelper.registerBlock(_:)
. Ele chama dois métodos privados personalizados:resetViewState(_:)
esetupRootViewController()
. O métodoresetViewState(_:)
restaura seu aplicativo à sua condição de inicialização perfeita, retirando qualquer estado de exibição existente e, em seguida, restaurando a exibição raiz original. Vamos nos aprofundar emsetupRootViewController()
em breve. - Procure "func initializeAppViewState”. Nessa implementação do método, veja a penúltima linha:
self.window?.rootViewController = InitialViewController(nibName: nil, bundle: nil)
Esse código define a propriedadeself.window?.rootViewController
como um objetoInitialViewController
recém-criado. A classeInitialViewController
é definida em seu aplicativo e é meio simples e sem graça. Esse modo de exibição, que é o primeiro a aparecer, é um simples contêiner para as telas de login e autorização do Salesforce. Isso é tudo o que você precisa saber. Esse método é chamado no manipulador de eventossceneWillEnterForeground
. - Procure “func setupRootViewController”. Ele é implantado da seguinte forma:
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: AccountsListView() ) }
O método setupRootViewController()
executa algumas etapas significativas de configuração.
- Ele carrega arquivos de configuração para os recursos offline SmartStore e Sincronização móvel.
- Ele define o controlador de exibição raiz da janela para
AccountsListView
, uma visualização SwiftUI personalizada que mostra uma lista de nomes de conta da organização do usuário.
Seu controlador de exibição raiz é o ponto de partida do conteúdo do seu aplicativo. Para deixar essa escolha clara para o iOS, setupRootViewController()
cria um objeto UIHostingController
e inicializa sua propriedade rootView
para uma instância da primeira exibição do seu aplicativo. Quando isso acontece, o controle do aplicativo passa para o código personalizado. Você pode reutilizar classes de exibição e de modelo do aplicativo de modelo ou substituí-las por suas próprias soluções. De acordo com o que é discutido na próxima seção, você ainda chamará APIs do Mobile SDK para acessar recursos do Salesforce. Mas, a partir desse ponto, o fluxo, o conteúdo e a intenção do aplicativo são todos seus. Seja criativo!
Recursos