Você pode pensar em AsyncStorage como um armazenamento local para React Native. Isso é porque é! Conforme descrito no site do React Native: “AsyncStorage é um sistema de armazenamento de valor-chave não criptografado, assíncrono, persistente e global para o aplicativo.”
É um bocado. Mas, simplesmente, ele permite que você salve dados localmente no dispositivo do usuário. Digamos que você queira relembrar uma configuração de tema de usuário ou permitir que continuem de onde pararam depois de reiniciar o telefone ou o aplicativo, a capacidade de persistir os dados offline torna o AsyncStorage seu melhor amigo!
Por que você não deve usar AsyncStorage para dados confidenciais
Se, por outro lado, você precisa armazenar dados confidenciais-ou seja, um token JWT-AsyncStorage é o melhor amigo que sempre coloca você em apuros. Lembre-se de que os dados que você salva com AsyncStorage não são criptografados, portanto, qualquer pessoa com acesso pode lê-los, o que não é bom para dados confidenciais.
Alternativas de armazenamento de dados criptografados
Para obter informações confidenciais, precisamos de uma maneira criptografada e segura de armazenar dados localmente. Felizmente, temos opções:
Todos os três são ótimas opções de uso, mas neste artigo, vamos cobrir Expo SecureStore .
Expo é um SDK maravilhoso com várias bibliotecas fabulosas, embora você precise configurar unimódulos para usar o Expo com um aplicativo Bare React. Mas, uma vez feito isso, o mundo é sua ostra.
Criando um projeto React Native
Se quiser dar uma olhada no código final, você pode encontrá-lo em meu GitHub :
Para inicializar seu projeto, cole o seguinte no Terminal:
Isso cria um novo projeto React Native com um modelo TypeScript. Mas não acredite apenas na minha palavra, vamos construir os aplicativos e ver por si mesmo.
yarn run ios
Depois de algum tempo, você verá seu novo aplicativo em seu simulador iOS. Agora, para Android:
yarn run android
/pre>
Para usar os pacotes Expo em um projeto React Native vazio, primeiro precisamos instalar e configurar react-native-unimodules. Portanto, em seu Terminal, digite:
yarn add react-native-unimodules expo-secure-store && cd ios && pod install && cd..
O comando acima instalará as bibliotecas, navegará até a pasta iOS, instalará os CocoaPods dos seus projetos e, em seguida, navegará de volta à pasta do projeto.
Dica: adicione um script de pós-instalação ao arquivo package.json para evitar instalações manuais de pod:
"scripts": { ... "postinstall":"cd ios && pod install" },
Desenvolvimento de armazenamento local criptografado no iOS
Se você estiver adicionando unimódulos a um projeto existente e não estiver familiarizado com o desenvolvimento nativo do iOS, preste atenção extra para onde você exclui e adiciona novas linhas de código.
Clique aqui para a comparação completa das alterações.
require_relative'../node_modules/react-native/scripts/react_native_pods'
require_relative'../node_modules/@react-native-community/cli-platform-ios/native_modules' plataforma: ios,'10.0' target'secureStoreExample'do config=use_native_modules! use_react_native! (: path=> config ["reactNativePath"]) target'secureStoreExampleTests'fazer herdar!:completo # Pods para teste fim # Ativa o Flipper. # # Observe que se você tiver use_frameworks! habilitado, o Flipper não funcionará e # você deve desabilitar as próximas linhas. use_flipper! post_install do | installer | flipper_post_install (instalador) fim
fim target'secureStoreExample-tvOS'do # Pods para secureStoreExample-tvOS target'secureStoreExample-tvOSTests'do herdar!: search_paths # Pods para teste fim
fim
E mude para:
require_relative'../node_modules/react-native/scripts/react_native_pods'
require_relative'../node_modules/@react-native-community/cli-platform-ios/native_modules'
require_relative'../node_modules/react-native-unimodules/cocoapods.rb' plataforma: ios,'10.0' target'secureStoreExample'do config=use_native_modules! use_unimodules! use_react_native! (: path=> config ["reactNativePath"]) target'secureStoreExampleTests'fazer herdar!:completo # Pods para teste fim # Ativa o Flipper. # # Observe que se você tiver use_frameworks! habilitado, o Flipper não funcionará e # você deve desabilitar as próximas linhas. use_flipper! post_install do | installer | flipper_post_install (instalador) fim
fim target'secureStoreExample-tvOS'do # Pods para secureStoreExample-tvOS target'secureStoreExample-tvOSTests'do herdar!: search_paths # Pods para teste fim
fim
Agora que fizemos as alterações necessárias na pasta do iOS, precisamos instalar nosso CocoaPods novamente:
cd ios && pod install
No momento em que este artigo foi escrito, a versão mais recente da Expo SecureStore não era compatível com CocoaPods. Se você tiver esse problema, instale a versão anterior. No meu caso:
Clique aqui para a comparação completa das alterações.
android/build.gradle
Vamos atualizar o código a partir do seguinte.
//Arquivo de construção de nível superior onde você pode adicionar opções de configuração comuns a todos os subprojetos/módulos. buildscript { ext { buildToolsVersion="29.0.2" minSdkVersion=16 compileSdkVersion=29 targetSdkVersion=29 } repositórios { Google() jcenter () } dependencies { classpath ("com.android.tools.build:gradle:3.5.3") //NOTA: Não coloque as dependências do seu aplicativo aqui; eles pertencem //nos arquivos individuais do módulo build.gradle }
} allprojects { repositórios { mavenLocal () maven { //Todo o React Native (JS, fontes Obj-C, binários Android) é instalado a partir do npm url ("$ rootDir/../node_modules/react-native/android") } maven { //Android JSC é instalado a partir do npm url ("$ rootDir/../node_modules/jsc-android/dist") } Google() jcenter () maven {url'https://www.jitpack.io'} }
}
E mude para:
//Arquivo de construção de nível superior onde você pode adicionar opções de configuração comuns a todos os subprojetos/módulos. buildscript { ext { buildToolsVersion="29.0.2" minSdkVersion=21 compileSdkVersion=29 targetSdkVersion=29 } repositórios { Google() jcenter () } dependencies { classpath ("com.android.tools.build:gradle:3.5.3") //NOTA: Não coloque as dependências do aplicativo aqui; eles pertencem //nos arquivos individuais do módulo build.gradle }
} allprojects { repositórios { mavenLocal () maven { //Todo o React Native (JS, fontes Obj-C, binários Android) é instalado a partir do npm url ("$ rootDir/../node_modules/react-native/android") } maven { //Android JSC é instalado a partir do npm url ("$ rootDir/../node_modules/jsc-android/dist") } Google() jcenter () maven {url'https://www.jitpack.io'} }
}
rootProject.name='secureStoreExample'
aplique a partir de: file ("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle (configurações)
incluir': app'
Para isso:
rootProject.name='secureStoreExample'
inscreva-se em:'../node_modules/react-native-unimodules/gradle.groovy'; includeUnimodulesProjects ()
aplique a partir de: file ("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle (configurações)
incluir': app'
package com.securestoreexample; import android.app.Application;
import android.content.Context;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import java.lang.reflect.InvocationTargetException;
import java.util.List; public class MainApplication extends Application implementa ReactApplication { final privado ReactNativeHost mReactNativeHost= novo ReactNativeHost (this) { @Sobrepor public boolean getUseDeveloperSupport () { return BuildConfig.DEBUG; } @Sobrepor Protected List getPackages () { @SuppressWarnings ("UnnecessaryLocalVariable") Listar pacotes =new PackageList (this).getPackages (); //Pacotes que não podem ser vinculados automaticamente ainda podem ser adicionados manualmente aqui, por exemplo: //packages.add (new MyReactNativePackage ()); devolver pacotes; } @Sobrepor protected String getJSMainModuleName () { retornar"índice"; } };
...
Para:
package com.securestoreexample; import com.secureStoreExample.generated.BasePackageList; import android.app.Application;
import android.content.Context;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import java.lang.reflect.InvocationTargetException;
import java.util.List; import java.util.Arrays; import org.unimodules.adapters.react.ModuleRegistryAdapter;
import org.unimodules.adapters.react.ReactModuleRegistryProvider;
import org.unimodules.core.interfaces.SingletonModule;
public class MainApplication extends Application implementa ReactApplication { final privado ReactModuleRegistryProvider mModuleRegistryProvider=new ReactModuleRegistryProvider (new BasePackageList (). getPackageList (), null); final privado ReactNativeHost mReactNativeHost= novo ReactNativeHost (this) { @Sobrepor public boolean getUseDeveloperSupport () { return BuildConfig.DEBUG; } @Sobrepor Protected List getPackages () { @SuppressWarnings ("UnnecessaryLocalVariable") Listar pacotes =new PackageList (this).getPackages (); //Pacotes que ainda não podem ser vinculados automaticamente podem ser adicionados manualmente aqui, por exemplo: //packages.add (new MyReactNativePackage ()); //Adicionar unimódulos Listar unimodules=Arrays. asList ( novo ModuleRegistryAdapter (mModuleRegistryProvider) ); packages.addAll (unimodules); devolver pacotes; } @Sobrepor protected String getJSMainModuleName () { retornar"índice"; } };
...
Expo SecureStore API
SecureStore tem três métodos principais de API: definir, obter e excluir. Vamos limpar nosso arquivo App.tsx e explorá-los. Para começar, substitua o conteúdo de App.tsx por:
Isso nos dá três botões no meio da tela. Eles não fazem nada no momento, então vamos consertar isso! Assim como o AsyncStorage, o SecureStore usa pares de valores-chave e, como estamos usando o TypeScript, podemos utilizar enums:
Usamos este enum (chave) para emparelhar o valor que vamos armazenar em nosso dispositivo.
A seguir, vamos configurar um gancho useState para armazenar nossa variável de estado-valor recuperado de nosso dispositivo-mais a variável simulada que iremos armazenar.
setItemAsync usa o enum que criamos anteriormente como a chave para o valor que estamos salvando, Um token falso & # x1f36a; . Em seguida, aguarda a conclusão da função. Assim que nossa função assíncrona for concluída, salvamos a mesma variável em nosso gancho useState com setToken .
Agora, se você clicar em definir token, verá nosso token falso aparecer abaixo dos três botões.
SecureStore.getItemAsync (key);
A seguir, forneceremos ao botão “obter token” alguma funcionalidade para que possamos recuperar o valor que armazenamos em nosso dispositivo. Copie e cole em App.tsx:
Usamos uma instrução if na linha 29 para garantir que a caixa de alerta só será aberta se um valor for recuperado.
Agora, para a mágica: feche seu aplicativo ou reinicie seu dispositivo e clique em obter token. Ta-da! Seu token está de volta.
SecureStore.deleteItemAsync (chave);
Se este fosse um aplicativo do mundo real, precisaríamos ser capazes de excluir o token do usuário quando eles se desconectarem. Última parte do código, prometo .
Reconhecidamente, este será um começo lento, mas o Google está lançando dois planos de fundo virtuais incrivelmente legais para o Google Meet no Android e no iOS que permitem aos usuários não apenas alterar seus Read more…
De acordo com o estudo mais recente conduzido pela Chainalysis, usuários involuntários gastaram cerca de US$ 4,6 bilhões em criptomoedas, adquirindo-as em esquemas fraudulentos no ano passado, que resultaram na criação de mais de 1,1 Read more…
O principal mercado de NFT, OpenSea, fez alguns anúncios importantes nas últimas horas. Por meio de sua conta oficial no Twitter, a OpenSea listou várias alterações em sua estrutura de taxas e royalties, que devem Read more…