Create a React Native custom module (with Swift)
Here is a quick and dirty example of how one can expose a custom module to React Native using Swift.
Product-Bridging-Header.h
– Bridge header file
[code language=”C”]
#import "RCTBridgeModule.h"
[/code]
MySwiftThingy.m
– Register Swift code with the React Native Bridge
[code language=”C”]
#import "RCTBridgeModule.h"
@interface RCT_EXTERN_MODULE(MySwiftThingy, NSObject)
RCT_EXTERN_METHOD(callbackMethod:(RCTResponseSenderBlock)callback)
RCT_EXTERN_METHOD(simpleMethod:(NSString *)message)
@end
[/code]
MySwiftThingy.swift
– Custom Swift component
[code language=”Scala”]
import Foundation
@objc(MySwiftThingy)
class MySwiftThingy: NSObject {
@objc func callbackMethod(callback: RCTResponseSenderBlock) -> Void {
let resultsDict = [
"success" : true
];
callback([NSNull() ,resultsDict])
}
@objc func simpleMethod(message: String!) {
print("\(message)")
}
}
[/code]
Call it from JavaScript:
[code language=”JavaScript”]
const { MySwiftThingy } = require(‘NativeModules’);
MySwiftThingy.simpleMethod(‘hi’);
MySwiftThingy.callbackMethod((err,r) => console.log(r));
[/code]
Thanks for this.
Any chance you know how to set the constructor ( init() ) in Swift?
I am getting the following error after launching the app:
fatal error: use of unimplemented initializer ‘init()’
Thanks.
How do you call the callback from another class outside of the MySwiftThingy.swift file? I want to be able to create an instance of one of my custom classes and whenever I want to, thats probably not possible… meaning the callback is only available to call when first initiated by javascript.. I want to be able to call javascript when first initiated by swift and have been trying for about 3 days now and have not succeeded. Im having trouble storing the callbacks and also sending the event because the bridge ends up not getting set. I even created this question for help: http://stackoverflow.com/questions/43246051/send-event-to-js-from-swift-or-objective-c