【发布时间】:2020-08-27 02:29:05
【问题描述】:
我在 iOS swift 中创建了一个项目,并在 swift 中创建了几个屏幕,现在我想使用这个屏幕来响应原生,所以我需要访问 swift NSUserDefault 来响应本地持久会话所以我如何使用它请帮助我。
谢谢。
【问题讨论】:
标签: ios swift react-native
我在 iOS swift 中创建了一个项目,并在 swift 中创建了几个屏幕,现在我想使用这个屏幕来响应原生,所以我需要访问 swift NSUserDefault 来响应本地持久会话所以我如何使用它请帮助我。
谢谢。
【问题讨论】:
标签: ios swift react-native
最简单的方法是在 XCode 项目中添加下一个文件,在 objc 中创建一个小的原生模块(因为 ReactNative SDK 是 objc 代码):
RNUserDefaults.h:
#import <React/RCTBridgeModule.h>
@interface RNUserDefaults : NSObject <RCTBridgeModule>
@end
RNUserDefaults.m:
#import "RNUserDefaults.h"
@implementation RNUserDefaults
RCT_EXPORT_MODULE(UserDefaults)
RCT_EXPORT_METHOD(set:(NSString*)key value:(id)value) {
[NSUserDefaults.standardUserDefaults setObject:value forKey:key];
}
RCT_EXPORT_METHOD(get:(NSString*)key callback:(RCTResponseSenderBlock)callback) {
id value = [NSUserDefaults.standardUserDefaults objectForKey:key];
callback(@[value]);
}
@end
在 Swift 中实现本机模块要困难得多,因为您还应该将 .h 和 .m 文件添加到重新映射 (RCT_EXTERN_REMAP_MODULE) 到带有外部声明 (RCT_EXTERN_METHOD) 的 swift。
使用方法:
import {
...
NativeModules,
} from 'react-native';
...
NativeModules.UserDefaults.set('userId', 1234);
NativeModules.UserDefaults.get('userId', value => {
alert(value); // Shows 1234
});
【讨论】:
您可以像这样将数据存储在持久存储中。
这里是示例 sn-p。
AsyncStorage.setItem('loggedIn', true);
在你的 app.js 中你可以在构造函数中检查这个标志
AsyncStorage.getItem('loggedIn').then((value) => {
if (value) {
//user logged in logic goes here
} else {
// user logged out. You need to login him again
}
});
【讨论】:
AsyncStorage.getItem这个东西