跳到主要内容
版本:0.77

Turbo 原生模块:iOS

现在是时候编写一些 iOS 平台代码,以确保 localStorage 在应用程序关闭后依然存在。

准备你的 Xcode 项目

我们需要使用 Xcode 准备你的 iOS 项目。完成这 6 个步骤 后,你将拥有实现了生成的 NativeLocalStorageSpec 接口的 RCTNativeLocalStorage

  1. 打开 CocoaPods 生成的 Xcode Workspace:
cd ios
open TurboModuleExample.xcworkspace
打开 Xcode Workspace
  1. 右键点击 app 并选择 New Group,将新组命名为 NativeLocalStorage
右键点击 app 并选择 New Group
  1. NativeLocalStorage 组中,创建 NewFile from Template
使用 Cocoa Touch Class 模板创建新文件
  1. 使用 Cocoa Touch Class
使用 Cocoa Touch Class 模板
  1. 将 Cocoa Touch Class 命名为 RCTNativeLocalStorage,语言选择 Objective-C
创建 Objective-C RCTNativeLocalStorage 类
  1. 重命名 RCTNativeLocalStorage.mRCTNativeLocalStorage.mm,使其成为 Objective-C++ 文件。
转换为 Objective-C++ 文件

使用 NSUserDefaults 实现 localStorage

首先更新 RCTNativeLocalStorage.h

NativeLocalStorage/RCTNativeLocalStorage.h
//  RCTNativeLocalStorage.h
// TurboModuleExample

#import <Foundation/Foundation.h>
#import <NativeLocalStorageSpec/NativeLocalStorageSpec.h>

NS_ASSUME_NONNULL_BEGIN

@interface RCTNativeLocalStorage : NSObject
@interface RCTNativeLocalStorage : NSObject <NativeLocalStorageSpec>

@end

然后更新我们的实现以使用 NSUserDefaults 和自定义的 suite name

NativeLocalStorage/RCTNativeLocalStorage.mm
//  RCTNativeLocalStorage.m
// TurboModuleExample

#import "RCTNativeLocalStorage.h"

static NSString *const RCTNativeLocalStorageKey = @"local-storage";

@interface RCTNativeLocalStorage()
@property (strong, nonatomic) NSUserDefaults *localStorage;
@end

@implementation RCTNativeLocalStorage

RCT_EXPORT_MODULE(NativeLocalStorage)

- (id) init {
if (self = [super init]) {
_localStorage = [[NSUserDefaults alloc] initWithSuiteName:RCTNativeLocalStorageKey];
}
return self;
}

- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
return std::make_shared<facebook::react::NativeLocalStorageSpecJSI>(params);
}

- (NSString * _Nullable)getItem:(NSString *)key {
return [self.localStorage stringForKey:key];
}

- (void)setItem:(NSString *)value
key:(NSString *)key {
[self.localStorage setObject:value forKey:key];
}

- (void)removeItem:(NSString *)key {
[self.localStorage removeObjectForKey:key];
}

- (void)clear {
NSDictionary *keys = [self.localStorage dictionaryRepresentation];
for (NSString *key in keys) {
[self removeItem:key];
}
}

@end

需要注意的重要事项:

  • RCT_EXPORT_MODULE 使用我们将在 JavaScript 环境中访问它的标识符 NativeLocalStorage 来导出和注册模块。详见 文档
  • 你可以使用 Xcode 跳转到 Codegen @protocol NativeLocalStorageSpec。你也可以使用 Xcode 为你生成存根(stubs)。

在模拟器上构建并运行你的代码

npm run ios