我想在React Native应用程序中本地存储敏感数据.
数据仅供编写它的应用程序使用吗?
我有一个 React Native 应用程序,它在 Play 商店上架了一段时间,最近我从 Play 商店收到了这个重要通知,说明如果我不解决这个问题,我的应用程序将从 Play 商店中删除。
谁能告诉我这是什么以及如何解决它?
这是来自 Play 商店的完整消息
我们检测到您的应用在 1 个或多个 app bundle 或 APK 的清单文件中包含 requestLegacyExternalStorage 标志。
在运行 Android 11+ 的设备上使用应用的开发人员必须使用 Scoped Storage 来让用户更好地控制他们的设备存储。要在 5 月 5 日之后在 Android 11 或更高版本上发布您的应用,您必须:
- 更新您的应用程序以使用更多隐私友好的最佳实践,例如存储访问框架或媒体存储 API
- 更新您的应用以在清单文件中声明所有文件访问权限 (MANAGE_EXTERNAL_STORAGE),并从 5 月 5 日起在 Play 管理中心完成所有文件访问权限声明
- 从您的应用程序中完全删除所有文件访问权限。
对于面向 Android 11 的应用,将忽略 requestLegacyExternalStorage 标志。您必须使用所有文件访问权限才能保留广泛访问权限。
未经许可而请求访问所有文件访问权限的应用将从 Google Play 中删除,并且您将无法发布更新。
我的 package.json
{
"@react-native-async-storage/async-storage": "^1.13.4",
"@react-native-community/masked-view": "^0.1.10",
"@react-navigation/bottom-tabs": "^5.11.8",
"@react-navigation/drawer": "^5.12.3",
"@react-navigation/material-bottom-tabs": "^5.3.14",
"@react-navigation/native": "^5.9.2",
"@react-navigation/stack": "^5.14.2",
"axios": "^0.21.1",
"fuse.js": …Run Code Online (Sandbox Code Playgroud) 我AsyncStorage在React Native中保存了一些项目,我正在使用chrome调试器和iOS模拟器.
如果没有原生的反应,使用常规的Web开发localStorage,我能够看到存储的localStorage项目Chrome Debugger > Resources > Local Storage
任何想法如何查看React Native AsyncStorage存储的项目?
我注意到,我在浪费时间调试一定量的终极版,我坚持到行动AsyncStorage中反应母语感谢终极版-坚持.有时我只想擦除AsyncStorage以节省一些开发时间并尝试使用新数据.
编辑:最好的解决方案应该适用于模拟器和真实设备,iOS和Android.也许不同的平台有不同的工作方式.
谢谢
我即将开发React Native应用程序,并且完全相信使用Redux管理应用程序状态的好处,但是我想通过使用Realm进行持久存储来使应用程序的数据在离线时可用.我想知道Redux将如何与Realm一起玩?
我正在开发的应用程序将通过RESTful API提取大量的JSON数据,然后我想将这些数据保存到本地存储 - Realm似乎是一个很好的选择.然而,我不确定Realm数据库将如何存在于Redux商店中?它必须存在于商店外部吗?在基于Redux的应用程序中使用Realm在某种程度上是矛盾吗?
我已经很好地搜索了一些文章,这些文章描述了使用Realm或其他存储选项(Asyncstorage或SQLite)与Redux的大型数据集,并且可以找到很少的信息.
我正在用React Native构建一个应用程序.我想尽量减少与数据库通信的频率,因此我大量使用AsyncStorage.但是DB和AsyncStorage之间的转换存在很多错误.因此,我想通过对它运行自动化测试来确保AsyncStorage拥有我相信它所做的数据.令人惊讶的是,我还没有找到任何有关如何在线进行此操作的信息.我试图独自完成这项工作并没有成功.
使用Jest:
it("can read asyncstorage", () => {
return AsyncStorage.getItem('foo').then(foo => {
expect(foo).not.toBe("");
}); });
Run Code Online (Sandbox Code Playgroud)
此方法失败并显示错误:
TypeError: RCTAsyncStorage.multiGet is not a function
Run Code Online (Sandbox Code Playgroud)
删除返回将使其立即运行而无需等待值并不正确地通过测试.
当我尝试使用await关键字测试它时,我遇到了完全相同的错误:
it('can read asyncstorage', async () => {
this.foo = "";
await AsyncStorage.getItem('foo').then(foo => {
this.foo = foo;
});
expect(foo).not.toBe(""); });
Run Code Online (Sandbox Code Playgroud)
有关如何成功运行AsyncStorage中的值断言的任何建议?我宁愿继续使用Jest,但如果它只能通过一些备用测试库来完成,我会对此持开放态度.
应用程序启动后使用redux-persist访问保存的数据时遇到问题.
reducer使用我初始状态中定义的数据进行初始化.当前一个会话的状态加载AsyncStorage时,该组件已显示默认数据.
我知道数据已成功保存和获取.如果我将屏幕留给另一个并回到它,我可以看到数据显示正确.调试状态和道具也表明这是一个异步计时问题.
如何在商店补充水分后延迟加载redux容器.或者,我可以在商店完成加载时强制更新conatainer(及其子代)以进行更新吗?
这是我尝试过的.配置我的商店:
export default function configureStore(initialState) {
const middlewares = [thunk];
if (process.env.NODE_ENV === `development`) {
const createLogger = require(`redux-logger`);
const logger = createLogger();
middlewares.push(logger);
}
let store = compose(
applyMiddleware(...middlewares),
autoRehydrate() )(createStore)(reducers);
persistStore(store, {blacklist: ['routing'], storage: AsyncStorage}, () => {
store.dispatch(storeRehydrateComplete())
})
return store
}
Run Code Online (Sandbox Code Playgroud)
希望这会更新所有其他组件(因为redux中的所有reducer都在一个动作中被调用),我尝试创建一个在商店完成加载时触发的动作:
import { REHYDRATE_STORE } from './types'
export function storeRehydrateComplete(){
return {
type: REHYDRATE_STORE,
}
}
Run Code Online (Sandbox Code Playgroud)
它是reducer:从{./actions/types'const initialState = {storeIsReady:false}导入{REHYDRATE_STORE}
export default function reducer(state = initialState, action){
switch (action.type) …Run Code Online (Sandbox Code Playgroud) 我AsyncStorage在我的React Native应用程序中使用来存储有关用户的信息.该getItem()函数是异步的,当我想从存储系统加载数据时,我需要实现回调.
AsyncStorage.getItem("phoneNumber").then((value) => {
this.setState({"phoneNumber": value});
}).done();
Run Code Online (Sandbox Code Playgroud)
因为从存储中检索值不需要很长时间,所以我想等到操作完成后再继续执行.
是否可以以非异步方式加载数据?如果没有,是否有一种简单的方法让我等到getItem()通话完成后继续执行?
我想知道我是否必须做这样的事情来在我的react-native应用程序中使用AsyncStorage保存我的应用程序的整个商店,并在应用程序启动时检查它是否存在.
var store;
_loadInitialState = async () => {
try {
var value = await AsyncStorage.getItem(STORAGE_KEY);
if (value !== null){
store = value;
console.log('Recovered selection from disk: ' + value);
} else {
store = configureStore({});
console.log('Initialized with no selection on disk.');
}
} catch (error) {
console.log('AsyncStorage error: ' + error.message);
}
};
export default class App extends Component {
componentWillMount(){
this._loadInitialState().done()
}
render(){
return(
<Provider store={store}>
<AppContainer/>
</Provider>
)
}
}
Run Code Online (Sandbox Code Playgroud)
这不行,但我希望你明白这个想法.
我想检查某个键是否可用AsyncStorage与AsyncStorage.getItem('key_name').如果密钥不可用,则不返回null,它仍然返回以下promise对象:
Promise
_45:0
_54:null
_65:null
_81:1
Run Code Online (Sandbox Code Playgroud)
我获取数据的功能如下:
checkItemExists(){
let context = this;
try {
let value = AsyncStorage.getItem('item_key');
if (value != null){
// do something
}
else {
// do something else
}
} catch (error) {
// Error retrieving data
}
}
Run Code Online (Sandbox Code Playgroud)
如何检查AsyncStorage中是否存在密钥?
asyncstorage ×10
react-native ×10
redux ×4
javascript ×2
android ×1
asynchronous ×1
google-play ×1
jestjs ×1
react-redux ×1
reactjs ×1
realm ×1
sqlite ×1
store ×1