我如何使用本机 swift 代码中的 react 本机 RCNAsyncStorage 模块

Posted

技术标签:

【中文标题】我如何使用本机 swift 代码中的 react 本机 RCNAsyncStorage 模块【英文标题】:How do i use react native RCNAsyncStorage module from native swift code 【发布时间】:2019-05-13 12:23:57 【问题描述】:

我有一个 react 本机应用程序,我在其中使用 RNCAsyncStorage npm 模块进行简单的数据持久性。然而,我的ios 版本的应用附带了一个共享扩展,而这个共享扩展需要访问我存储的数据字符串之一。

简而言之,我想使用 swift 本机代码中的 RNCAynscStorage 来获取从我的 react 本机代码中存储的数据。

在尝试实施该模块之前,我询问了 RNC,他们回答:

这是可能的,但需要一些关于原生模块的知识 工作一般。我不确定这对未来有多大影响 即将在 React Native 中进行的重构工作,但这就是你的方式 今天可以访问它:

// First, get the RNCAsyncStorage instance from the bridge
RNCAsyncStorage *asyncStorage = [bridge moduleForClass:[RNCAsyncStorage class]];

// Then call the getter:
[asyncStorage multiGet:@[@"count"]] callback:^(NSArray *response)
    NSObject *count = response[0];
    if ([count isKindOfClass:[NSError class]]) 
        // Failed to get count
        return;
    

    // Use count here
];

但是,我的扩展是用 swift 编写的,我不确定转换为 swift 后会是什么样子。

首先,我按照指南使反应桥模块可以在 swift 代码中访问,这就是我的 brinding 的样子:

我还尝试将 objecttive-C 示例转换为 seift,但正如您所见,这不起作用。 我不确定这是否是因为模块未正确公开/导入,或者仅仅是快速转换错误。但bridgeRNCAsyncStorage 均未解决。

【问题讨论】:

【参考方案1】:

据我了解,您想在扩展程序中访问 AsyncStorage(今天或共享)

我正在考虑您的扩展代码将在 swift 中。

第 1 步: 首先,您需要在扩展本身中创建桥接头,而不是在主项目中。

第 2 步: 在 Link Binary With Libraries (Under Build Phase) 中的 Share Extension Target 中声明要访问的所有库,尤其是 (libRNCAsyncStorage.a)

第 3 步: 在桥头文件(.h)中,您必须导入 RNCAsyncStorage.h

第 4 步:现在,在扩展程序中的任意位置访问 AsyncStore。

【讨论】:

嗨,谢谢,我真的可以在 7 个月前使用该建议/信息! :) 我最终将自己的键/值 json 文件写入 app.group 共享文件,并在完全不使用 RNCAsyncStorage 的情况下快速读取和写入同一个文件。但我相信这会奏效 那么哪种方法更好? 我认为这取决于需要做什么。在我的情况下,它正在传输一次性身份令牌以将扩展程序登录到远程服务。为此,我认为真正的最佳方法是使用钥匙串,但我找不到任何从反应原生添加到钥匙串的方法。我认为在 React Native 和原生 iOS 应用之间共享数据并不是一件容易的事,似乎大多数开发人员在做纯原生 iOS 应用时,只要它们变得有点复杂。我认为我没有资格说什么是最好的方法;) @Minkoo,我正在按照这里的说明进行操作。但卡在找不到“React/RCTBridgeModule.h”文件。错误来自在扩展中创建的桥接头文件。 @Erangad 桥接问题。创建 headerFile(目标 C)时,不要忘记选中目标复选框。一个当然是你的扩展和主要目标。

以上是关于我如何使用本机 swift 代码中的 react 本机 RCNAsyncStorage 模块的主要内容,如果未能解决你的问题,请参考以下文章

react-native 应用程序视图加载时,如何在本机 ıos 上调用 ViewController 类?

如何将 React Native Promise 连接到 Swift

在React本机页面之间传递数据

如何正确模拟使用本机代码的 React Native 模块?

我如何检查安装在反应本机代码中的应用程序

使用 swift 将导出的方法值作为未定义来反应本机本机模块?