gpt4 book ai didi

javascript - 当应用程序处于后台时尝试使用 AsyncStorage 写入获取的数据库数据时出现 iOS 错误

转载 作者:行者123 更新时间:2023-11-30 15:07:40 31 4
gpt4 key购买 nike

这是上下文:

当我打开我的应用程序时,我正在查询我的 firebase 数据库。这些查询是异步的,我在等待 firebase 给我答案,然后我在 redux 中返回值。我正在使用 redux-persist所以当 redux 得到 firebase 的响应时,redux-persist 将数据写入我的手机。

这就是问题所在:

问题是,如果用户离开应用程序然后重新打开它,如果 firebase 在应用程序处于后台时返回响应,redux-persist 将尝试使用 AsynStorage 写入。 iOS 不允许这样做,所以我的应用程序将因这 2 个错误而崩溃

 Error storing data for key: "profile"

'Failed to symbolicate warning, "%s":', 'Possible Unhandled Promise
Rejection (id: 0):
Failed to write manifest file.Error Domain=NSCocoaErrorDomain
Code=513 "You don’t have permission to save
the file “manifest.json” in the folder “RCTAsyncLocalStorage_V1”."
UserInfo=
{NSFilePath=/var/mobile/Containers/Data/Application/
C892F501-5057-4FE4-A622-2037C32D1373/Documents/
RCTAsyncLocalStorage_V1/manifest.json,
NSUserStringVariant=Folder, NSUnderlyingError=0x17025b810 {Error
Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}'

我尝试了什么:

我测试了两种解决方案:

第一次尝试 我尝试根据应用程序状态暂停 redux-persist 的持久化。

Store.js

export const persistor = persistStore(store, { storage: AsyncStorage }, () => {
console.log('restored');
});

然后在我的 Home 组件中

componentDidMount() {
if (Platform.OS === 'ios') {
AppState.addEventListener('change', this.handleAppStateChange);
}

handleAppStateChange = (appState) => {
if (appState !== 'active') {
persistor.pause();
} else {
persistor.resume()
}
};

componentWillUnmount() {
if (Platform.OS === 'ios') {
AppState.removeEventListener('change', this.handleAppStateChange);
}
}

结果 与以前相同的错误,当我尝试控制台记录持久性的当前状态时,他被暂停并按时恢复。

第二次尝试 我尝试在 persitStore() 中使用 CustomAsyncStorage 而不是 AsyncStore,我从 AsyncStorage.js 获取所有代码,然后在每个方法上添加对当前应用程序的验证如果应用程序状态不活跃,说明返回方法的人。

结果 没有运气 redux-persist 和 redux 停止工作。

我的其他想法

  • 当应用程序在后台通过时取消对 firebase 的每次调用 -> 无法完成,不存在该方法

  • 在我调用 Firebase 并在 redux 中调度值的每个方法中,检查应用程序的当前状态并仅在应用程序处于事件状态时才返回它 -> 这意味着我应该检查每个调用,因此会重复很多次。

React-native 版本:0.39.2

Redux-persist 版本:4.4.2

我对这个案例有任何想法或任何帮助,你认为我应该怎么做才能解决这个问题?哪个是最好的

谢谢。

最佳答案

检查您的 iOS 应用的授权中是否启用了数据保护。它可能配置为 NSFileProtectionComplete

像这样启用数据保护时,所有文件都默认加密。这包括支持 React Native 的 AsyncStorage 的存储。当应用程序位于前台时,这不是问题,但是,在应用程序后台运行或锁定设备后不久,iOS 将丢弃您的解密 key 。

如果您的应用在解密 key 已卸载后尝试写入文件(例如通过 AsyncStorage),则文件操作将失败并准确显示您看到的(无用的)消息:

Error Domain=NSCocoaErrorDomain Code=513 “您没有保存文件的权限...

一个简单的解决方法是将您的默认数据保护级别更改为 NSFileProtectionCompleteUntilFirstUserAuthentication。有关详细信息,请参阅本指南中的“加密和数据保护”:https://www.apple.com/business/docs/iOS_Security_Guide.pdf

关于javascript - 当应用程序处于后台时尝试使用 AsyncStorage 写入获取的数据库数据时出现 iOS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45507876/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com