我如何访问 iOS 项目的 NSUserDefault 以做出原生反应?

Posted

技术标签:

【中文标题】我如何访问 iOS 项目的 NSUserDefault 以做出原生反应?【英文标题】:How i can access NSUserDefault of iOS project in to react native? 【发布时间】:2020-08-27 02:29:05 【问题描述】:

我在 ios swift 中创建了一个项目,并在 swift 中创建了几个屏幕,现在我想使用这个屏幕来响应原生,所以我需要访问 swift NSUserDefault 来响应本地持久会话所以我如何使用它请帮助我。

谢谢。

【问题讨论】:

【参考方案1】:

最简单的方法是在 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
);

【讨论】:

【参考方案2】:

您可以像这样将数据存储在持久存储中。

这里是示例 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
        
     );

【讨论】:

我已经在 iOS swift 中使用 NSUserDefault 设置了项目,但我想在 React Native 中访问这个保存的 NSUserDefault 值。 试试AsyncStorage.getItem这个东西 它给了我 Null

以上是关于我如何访问 iOS 项目的 NSUserDefault 以做出原生反应?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:NSUserDefaults 是不是与 iCloud 同步?

将 NSUrl 转换为 PHAsset iOS 8

如何从 watchOS App 中的 iOS 文件夹访问课程

将remotebuild与cordova ios一起使用时如何修复丢失的写访问错误?

如何在 Swift 2 中使用 TableView 项目访问视图控制器?

在 iOS 中访问其他项目 Firestore 数据