Manoj Yadav
Manoj Yadav

Reputation: 172

My custom native module is not present inside NativeModules object

So, i wanted to create a native module which will detect, if the app is running on emulator/simulator or an actual device.

Everything works fine on android, but i'm facing issue on iOS.

I have create a AbcModule.h and a AbcModule.m file

#import <React/RCTBridgeModule.h>
@interface AbcModule : NSObject <RCTBridgeModule>
@end

This is AbcModule.h

#import "AbcModule.h"

@implementation AbcModule

RCT_EXPORT_MODULE(GetDetails);

- (BOOL) xyzFunctn {
    #if TARGET_IPHONE_SIMULATOR
        return YES;
    #else
        return NO;
    #endif
}

RCT_EXPORT_METHOD(xyzFunctn: (RCTPromiseResolveBlock)resolve rejecter: (RCTPromiseRejectBlock)reject) {
    resolve self.xyzFunctn;
}

@end

This is AbcModule.m

Here i have followed the react native documentation for implementing the Native Modules.

But i'm consistently facing this error which says "TypeError null is not an object, evaluating GetDetails.xyzFunctn"

I have went through several solutions and articles but nothing seems to be working here.

Need help guys!

Upvotes: 1

Views: 1483

Answers (3)

zdravko zdravkin
zdravko zdravkin

Reputation: 2386

in your .m file, let's say GetDetails is a class of NSObject .swift you need:

@interface RCT_EXTERN_MODULE(WidgetManager, NSObject)
// method to export
RCT_EXTERN_METHOD(isAuthenticated: (BOOL *)isAuthenticated)
@end

in your GetDetails.swift:

@objc(GetDetails)
class GetDetails: NSObject {

@objc(isAuthenticated:)
  func isAuthenticated(_ isAuthenticated: Bool) {
}
}

Upvotes: 0

Manoj Yadav
Manoj Yadav

Reputation: 172

Okay, if there is someone who is facing this issue and feels like their code should work but it isn't and any solution online not working for you as well.

Try this: When you create your .h and .m file for header and objective-c or swift file, make sure you do it in Xcode and not from VSCode.

VSCode eventually doesn't adds you .h file in the required resources folder, i have wasted my 2 weeks trying to find out solution for it, but lastly, that was it, yes this is it.

Upvotes: 1

Ol Sen
Ol Sen

Reputation: 3368

from the docs

If you do not specify a name, the JavaScript module name will match the Objective-C class name, with any "RCT" or "RK" prefixes removed.

so just do not specify any name,

@implementation AbcModule

// To export a module named AbcModule
RCT_EXPORT_MODULE();

@end

in your case it should then be accessible from within JS with AbcModule

But the documentation is not clear if the Objective-C Class declaration needs to be written with prefixed "RCT" or "RK".. but because both prefixes seem to be valid, you should be able to just use AbcModule without prefix.

In other words, if you want to use GetDetails from within JS you need to name your interface and implementation accordingly

@implementation RCTGetDetails
RCT_EXPORT_MODULE(GetDetails);
// or
// RCT_EXPORT_MODULE();
@end

Upvotes: 2

Related Questions