gpt4 book ai didi

ios - Swift 桥接头不导出 React Native 类型

转载 作者:行者123 更新时间:2023-11-28 07:31:51 25 4
gpt4 key购买 nike

我正在尝试使用 Swift 为 React Native 应用程序创建原生 (iOS) 模块。我想在返回 promise 的模块上公开一个方法,使用 RCTPromiseResolveBlock 类型的函数和 RCTPromiseRejectBlock , 两者都在 React Native 的 RCTBridgeModule.h 中声明 header 。但是,对于这两种类型,我的构建失败并显示消息“使用未声明的类型...”。

我已经为另一个目的创建了一个桥接头(自动使用 Xcode),所以我相信导入 React/RCTBridgeModule.h是我需要提供上述类型的所有内容。大概是我配置有误,因为这并不能解决问题。我已经尝试建立一个新项目,一切都按预期进行,但我似乎找不到会导致我的项目构建失败的差异。

一些相关的配置细节:

  • 名为 <ProjectName>-Bridging-Header.h 的桥接头并存储在我的源目录中。我四处移动它以确认 Xcode 正在找到它(当它不在正确的位置时,构建会以不同的方式失败)。
  • 桥接头的内容很简单:#import <React/RCTBridgeModule.h>
  • 在我的项目build设置中:
    • <ProjectName>-Bridging-Header.h被配置为“Objective-C Bridging Header”
    • “安装 Objective-C 兼容性 header ”设置为"is"
    • “预编译桥接头”设置为"is"
  • 当我输入缺失类型的别名时,项目会按预期构建和运行
  • 我安装了一些第三方 Swift 库(一个使用 react-native link,一个使用 Git 子模块)
  • 我已经尝试清理构建文件夹,重新安装 node_modules并删除 Xcode 派生数据,但均无效。

我的项目配置有误还是我错过了一些重要的事情?

最佳答案

本教程很好地解释了如何使用 Swift 设置 native 模块。它将所有内容分解为多个步骤,并且很容易遵循。

https://teabreak.e-spres-oh.com/swift-in-react-native-the-ultimate-guide-part-1-modules-9bb8d054db03

  1. 设置
  2. 如何将 Swift 类暴露给 JS
  3. 如何公开静态 Swift 数据
  4. 如何公开 Swift 方法
  5. 如何使用回调公开方法
  6. 如何将方法公开为 Promise
  7. 如何公开事件发射器
  8. 如何提取 React Native 模块

显然,您要执行的是第 6 步。

这是一个代码示例。它与上面链接中所做的非常相似。您的桥接头应如下所示:

// <ProjectName>-Bridging-Header.h

#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"

你应该有名为 ModuleName.mModuleName.swift 的文件。

// ModuleName.m
#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"
@interface RCT_EXTERN_MODULE(ModuleName, NSObject)
// this is how we expose the promise to the javascript side.
RCT_EXTERN_METHOD(functionWithPromise: (RCTPromiseResolveBlock)resolve rejecter: (RCTPromiseRejectBlock)reject)
@end

// ModuleName.swift

@objc(ModuleName)
class ModuleName: NSObject {
@objc
func constantsToExport() -> [AnyHashable : Any]! {
return ["projectName": "ModuleName"]
}

@objc
static func requiresMainQueueSetup() -> Bool {
return true
}

@objc
func functionWithPromise(
_ resolve: RCTPromiseResolveBlock,
rejecter reject: RCTPromiseRejectBlock
) -> Void {
if (//something bad happens) {
let error = NSError(domain: "", code: 200, userInfo: nil)
reject("ERROR_FOUND", "failure", error)
} else {
resolve("success")
}
}
}

然后在 Javascript 端你可以像这样访问它:

import { NativeModules } from 'react-native'

NativeModules.Counter.functionWithPromise()
.then(res => console.log(res))
.catch(e => console.log(e.message, e.code))

关于ios - Swift 桥接头不导出 React Native 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54464001/

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