React-native 桥接与 Swift 单例自定义类

     2023-03-15     140

关键词:

【中文标题】React-native 桥接与 Swift 单例自定义类【英文标题】:React-native bridging with Swift singleton custom class 【发布时间】:2019-04-02 10:36:49 【问题描述】:

今天,我尝试在我的 Javascript 代码中使用实现单例模式的自定义 Swift 类。我已经创建了本机模块,但今天我遇到了这个错误:“致命错误:对类使用未实现的初始化程序'init()'

我猜是因为单例模式,但我无法理解我的错误......

这是我的代码:

AnalyticsTracker.swift

import Foundation
import Tracker


@objc(AnalyticsTracker)
class AnalyticsTracker: NSObject 


  static let shared = AnalyticsTracker(tracker: ATInternet.sharedInstance.defaultTracker)

  // MARK: -

  let tracker: Tracker

  // Initialization

  private init(tracker: Tracker) 
    self.tracker = tracker
  

  @objc
  func viewScreen(screen: String) 
    self.tracker.screens.add(screen).sendView()
  

  @objc
  func sendTouch(clickName: String, chapter1: String, chapter2: String, chapter3: String, level2: Int) 
    let gesture = self.tracker.gestures.add(clickName, chapter1: chapter1, chapter2: chapter2, chapter3:chapter3)
    gesture.level2 = level2
    gesture.sendTouch()
  

以及将我的课程导出到我的 react-native 应用程序的模块:

AnalyticsTracker.m

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(AnalyticsTracker, NSObject)

RCT_EXTERN_METHOD(
                  sendTouch:
                  (NSString*)clickName
                  (NSString*)chapter1
                  (NSString*)chapter2
                  (NSString*)chapter3
                  (int)level2
)

@end

删除导出模块后错误消失。我真的不明白这个错误是什么意思......

如果有人有想法,将不胜感激:)

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

问题在于 React Native 桥接机制。 AFAIK 它不支持自定义初始化。作为一种解决方法,您可以创建一个辅助类,在其导出的方法中使用 AnalyticsTracker.shared:

// RNAnalyticsTracker.swift

import Foundation

@objc(RNAnalyticsTracker)
class RNAnalyticsTracker: NSObject 

  @objc
  func viewScreen(screen: String) 
    AnalyticsTracker.shared.viewScreen(screen: screen)
  

  @objc
  func sendTouch(clickName: String, chapter1: String, chapter2: String, chapter3: String, level2: Int) 
    AnalyticsTracker.shared.sendTouch(clickName: clickName, chapter1: chapter1, chapter2: chapter2, chapter3: chapter3, level2: level2)
  

来源参考:https://gist.github.com/harveyconnor/7b0e778effaae302f512485c18881569

【讨论】:

谢谢...这似乎是唯一的出路...您能否告诉我如何将 Callback 从 Swift 传递给 reactNative ?我的 Swift 代码位于单独的 cocoapods 私有框架中,因此 swift 内部的函数不能将 RCTResponseSenderBlock 作为参数...这是现在唯一缺少的难题...谢谢您的帮助 @MihirMehta 您可以使用相同的技术来实现。只需使用@objc 方法创建一个帮助类,将RCTResponseSenderBlock 作为参数。并将调用重定向到您的库类。 谢谢 RCTResponseSenderBlock 不能作为参数添加,因为 Cocoapods SDK 是我正在构建的纯 Swift 库【参考方案2】:

您正在继承 NSObject,因此您必须提供公共 init 构造函数,它将初始化您的 tracker 属性。

【讨论】:

@MihirMehta,你说得对。对不起,误导性的答案我会添加另一个,希望对你有用。

如何将 React-Native 代码与 Swift 或 Kotlin 联系起来?我应该用每种语言做啥?

】如何将React-Native代码与Swift或Kotlin联系起来?我应该用每种语言做啥?【英文标题】:HowisitpossibletolinkReact-NativecodewithSwiftorKotlin?WhatshouldIdoineachlanguage?如何将React-Native代码与Swift或Kotlin联系起来?我应该用每种语言做什么?【发... 查看详情

Xcode在重建模型时提示将swift与objective c桥接

】Xcode在重建模型时提示将swift与objectivec桥接【英文标题】:Xcodepromptingtobridgeswiftwithobjectivecwhenrebuildingmodel【发布时间】:2016-10-0906:13:20【问题描述】:我对我的核心数据模型进行了更改。我选择了编辑器>创建NSManagedObjectContex... 查看详情

swift与oc混编

...编的总结现在的swift开发多数会用到混编。swift和oc是通过桥接文件来实现的。无论是在oc创建的项目中还中创建swift文件,还是在swift文件中创建oc文件,第一次都会自动提示建立桥接文件。名字为:xxx-Bridging-Header.h,并且自动添加... 查看详情

使用 PromiseKit 从 Objective C 到 Swift 的桥接

】使用PromiseKit从ObjectiveC到Swift的桥接【英文标题】:BridgingfromObjectiveCtoSwiftwithPromiseKit【发布时间】:2015-07-0516:39:44【问题描述】:将PromiseKit2.0与Swift1.2结合使用,我正在尝试使用在Swift的ObjectiveC中创建的PMKPromise。目标C代码:@i... 查看详情

Xcode/React-native:未定义符号:_swift_getFunctionReplacement

】Xcode/React-native:未定义符号:_swift_getFunctionReplacement【英文标题】:Xcode/React-native:Undefinedsymbol:_swift_getFunctionReplacement【发布时间】:2021-02-0617:32:57【问题描述】:我有一个react-native项目,在我安装了一些与mapbox相关的pod后,我... 查看详情

Swift 到 C 的桥接:字符串到 UnsafePointer<Int8>?是否自动桥接?

】Swift到C的桥接:字符串到UnsafePointer<Int8>?是否自动桥接?【英文标题】:SwifttoCbridging:StringtoUnsafePointer<Int8>?isnotautomaticallybridged?Swift到C的桥接:字符串到UnsafePointer<Int8>?是不是自动桥接?【发布时间】:2019-02-091... 查看详情

在 react-native swift 中使用环境变量

】在react-nativeswift中使用环境变量【英文标题】:Usingenvironmentvariableinreact-nativeswift【发布时间】:2020-05-0923:48:30【问题描述】:我正在开发React-Native应用程序,并希望配置可以与iOS应用程序和Android共享的环境变量。文档要求我... 查看详情

如何在目标 c-swift 桥接项目中使用 intentdefinition 文件?

】如何在目标c-swift桥接项目中使用intentdefinition文件?【英文标题】:howtouseanintentdefinitionfileinobjectivec-swiftbridgedproject?【发布时间】:2018-09-0409:36:08【问题描述】:我有一个在目标c中开发的应用程序。现在我想使用swift将该应用... 查看详情

ios中oc与swift互相桥接混编(注意项目中有多个targets的情况)

参考技术ASwift项目中桥接OC文件相对来说比较简单,一般在第一次创建OC文件的时候Xcode会弹出创建桥接头文件的提示直接点击CreateBridgingHeader系统就自动为我们创建好了桥接头文件,并且自动将头文件路径配置好了,所以这种方... 查看详情

React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)

】React-Native的Native端能否向React请求信息?(桥接/本机模块)【英文标题】:CanReact-Native\'sNativesiderequestinformationfromReact?(Bridging/NativeModules)【发布时间】:2016-05-2317:27:24【问题描述】:TLDR:有什么方法可以使用回调或从响应我的... 查看详情

为啥 Swift Dictionary 不可桥接?

】为啥SwiftDictionary不可桥接?【英文标题】:WhyisSwiftDictionarynotbridgeable?为什么SwiftDictionary不可桥接?【发布时间】:2015-06-0110:54:59【问题描述】:Dictionary是一种桥接类型,为什么我可以从Swift字典切换到NSDictionary而不是相反?... 查看详情

Swift 中蓝牙单例类的视图控制器中的观察者

】Swift中蓝牙单例类的视图控制器中的观察者【英文标题】:ObserversinviewcontrollersfromBluetoothsingletonclassinSwift【发布时间】:2020-08-1810:48:01【问题描述】:我创建了一个单例类来与多个视图控制器交互。如何从单例类通知蓝牙状态... 查看详情

swift创建桥接文件,swift使用mjrefresh刷新插件

...插件是MJRefresh。查了一下,在Swift中使用OC的插件要通过桥接文件,然后又百度一下怎么创建桥接文件,发现很多都是老司机写的,不是很详细,所以特意总结一下。 一、创建一个Head.h文件       二... 查看详情

swift3.0添加桥接文件

  注意是在project下不是target!!!纠结了好久表示......  查看详情

无法从 Swift 访问桥接的 NSArray

】无法从Swift访问桥接的NSArray【英文标题】:CannotaccessabridgedNSArrayfromSwift【发布时间】:2016-01-1710:05:08【问题描述】:为什么我不能使用Swift的Objective-CNSArray?根据文档:WorkingwithCocoaDataTypesSwift应该将NSArray&lt;Type*&gt;*桥接... 查看详情

swift单例(代码片段)

查看详情

swift支持某个页面横竖屏切换与强制横屏

...支持的方向,这里支持一个方向swift移除了NSInvocation,只能桥接,需要创建桥接文件,注意桥接文件路径实现的是强制转landscapeLeft方向,与appDelegate中支持的方向一致,这样是否打开系统竖排方向锁定不影响强转方向附上Demo 查看详情

尝试在 Swift 项目中使用 Objective C 可可豆荚,桥接文件编译为 Swift 代码

】尝试在Swift项目中使用ObjectiveC可可豆荚,桥接文件编译为Swift代码【英文标题】:TryingtouseObjectiveCcocoapodinSwiftproject,bridgingfilecompiledasSwiftcode【发布时间】:2016-10-1022:07:01【问题描述】:我正在尝试在基于Swift的iOS项目中使用基... 查看详情