错误:@“桥接模块 %@ 不符合 RCTBridgeModule”

Mur*_*ami 2 objective-c react-native react-native-ios

我是 React Native 的新手,我想使用本机模块来获取手机的电池状态。问题是我收到以下错误:@“桥接模块%@不符合 RCTBridgeModule”。我猜它与类相关,但我不熟悉 Objective-C 语法。尽管答案很简单,但我真的很感激在这个领域的任何帮助。谢谢你!

我的 BatteryStatus.h 看起来像这样:

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

@interface BatteryStatus : RCTEventEmitter <RCTBridgeModule>
@end
Run Code Online (Sandbox Code Playgroud)

我的 BatteryStatus.m 如下所示:

#import "BatteryStatus.h"

@implementation BatteryStatus
RCT_EXPORT_MODULE(BatteryStatus)

- (instancetype)init
{
  if ((self = [super init])) {

    [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];

  }
  return self;
}

RCT_EXPORT_METHOD(hide) {
}

RCT_EXPORT_METHOD(updateBatteryLevel:(RCTResponseSenderBlock)callback)
{
  callback(@[[self getBatteryStatus]]);
}

//manually get battery status by calling following method

-(NSDictionary*)getBatteryStatus
{

  float batteryLevel = [UIDevice currentDevice].batteryLevel;

  NSObject* currentLevel = nil;

  currentLevel = [NSNumber numberWithFloat:(batteryLevel * 100)];

  NSMutableDictionary* batteryData = [NSMutableDictionary dictionaryWithCapacity:2];

  [batteryData setObject:currentLevel forKey:@"level"];
  return batteryData;

}

@end
Run Code Online (Sandbox Code Playgroud)

我正在尝试在 React Native 中使用它,如下所示:

import { Text, View, NativeModules } from 'react-native';
import React, { Component } from 'react';

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
    batteryLevel: null,
    };
   }

   componentDidMount() {
     NativeModules.BatteryStatus.updateBatteryLevel((info) => {
     console.log(info.level);
     const level = Math.ceil(info.level);
     this.setState({ batteryLevel: level });
     });
   }
render() {
    return (
      <View>
        <Text>TEST</Text>
      </View>
    );
  }
}


export default App;
Run Code Online (Sandbox Code Playgroud)

Art*_*tal 5

就您而言,您不应该继承自RCTEventEmitter. 仅当您想将事件从本机模块发送到 JS 来监听模块的特定事件时,才需要这样做;在这种情况下,您需要supportedEvents在本机模块中实现该方法并指定您支持的事件的名称。由于您没有实现此方法,因此您收到此异常。

由于您没有发送任何事件,因此BatteryStatus应该从基本NSObject类继承,如下所示:

@interface BatteryStatus : NSObject <RCTBridgeModule>
@end
Run Code Online (Sandbox Code Playgroud)

我建议你查看 RN 指南来创建原生 ios 模块