204 lines
6.9 KiB
Objective-C
204 lines
6.9 KiB
Objective-C
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import "RCTBridgeDelegate.h"
|
|
#import "RCTBridgeModule.h"
|
|
#import "RCTDefines.h"
|
|
#import "RCTFrameUpdate.h"
|
|
#import "RCTInvalidating.h"
|
|
#import "RCTJavaScriptExecutor.h"
|
|
|
|
@class RCTBridge;
|
|
@class RCTEventDispatcher;
|
|
|
|
/**
|
|
* This notification triggers a reload of all bridges currently running.
|
|
*/
|
|
RCT_EXTERN NSString *const RCTReloadNotification;
|
|
|
|
/**
|
|
* This notification fires when the bridge starts loading the JS bundle.
|
|
*/
|
|
RCT_EXTERN NSString *const RCTJavaScriptWillStartLoadingNotification;
|
|
|
|
/**
|
|
* This notification fires when the bridge has finished loading the JS bundle.
|
|
*/
|
|
RCT_EXTERN NSString *const RCTJavaScriptDidLoadNotification;
|
|
|
|
/**
|
|
* This notification fires when the bridge failed to load the JS bundle. The
|
|
* `error` key can be used to determine the error that occured.
|
|
*/
|
|
RCT_EXTERN NSString *const RCTJavaScriptDidFailToLoadNotification;
|
|
|
|
/**
|
|
* This notification fires each time a native module is instantiated. The
|
|
* `module` key will contain a reference to the newly-created module instance.
|
|
* Note that this notification may be fired before the module is available via
|
|
* the `[bridge moduleForClass:]` method.
|
|
*/
|
|
RCT_EXTERN NSString *const RCTDidInitializeModuleNotification;
|
|
|
|
/**
|
|
* This block can be used to instantiate modules that require additional
|
|
* init parameters, or additional configuration prior to being used.
|
|
* The bridge will call this block to instatiate the modules, and will
|
|
* be responsible for invalidating/releasing them when the bridge is destroyed.
|
|
* For this reason, the block should always return new module instances, and
|
|
* module instances should not be shared between bridges.
|
|
*/
|
|
typedef NSArray<id<RCTBridgeModule>> *(^RCTBridgeModuleProviderBlock)(void);
|
|
|
|
/**
|
|
* This function returns the module name for a given class.
|
|
*/
|
|
RCT_EXTERN NSString *RCTBridgeModuleNameForClass(Class bridgeModuleClass);
|
|
|
|
/**
|
|
* This function checks if a class has been registered
|
|
*/
|
|
RCT_EXTERN BOOL RCTBridgeModuleClassIsRegistered(Class);
|
|
|
|
/**
|
|
* Async batched bridge used to communicate with the JavaScript application.
|
|
*/
|
|
@interface RCTBridge : NSObject <RCTInvalidating>
|
|
|
|
/**
|
|
* Creates a new bridge with a custom RCTBridgeDelegate.
|
|
*
|
|
* All the interaction with the JavaScript context should be done using the bridge
|
|
* instance of the RCTBridgeModules. Modules will be automatically instantiated
|
|
* using the default contructor, but you can optionally pass in an array of
|
|
* pre-initialized module instances if they require additional init parameters
|
|
* or configuration.
|
|
*/
|
|
- (instancetype)initWithDelegate:(id<RCTBridgeDelegate>)delegate
|
|
launchOptions:(NSDictionary *)launchOptions NS_DESIGNATED_INITIALIZER;
|
|
|
|
/**
|
|
* DEPRECATED: Use initWithDelegate:launchOptions: instead
|
|
*
|
|
* The designated initializer. This creates a new bridge on top of the specified
|
|
* executor. The bridge should then be used for all subsequent communication
|
|
* with the JavaScript code running in the executor. Modules will be automatically
|
|
* instantiated using the default contructor, but you can optionally pass in an
|
|
* array of pre-initialized module instances if they require additional init
|
|
* parameters or configuration.
|
|
*/
|
|
- (instancetype)initWithBundleURL:(NSURL *)bundleURL
|
|
moduleProvider:(RCTBridgeModuleProviderBlock)block
|
|
launchOptions:(NSDictionary *)launchOptions NS_DESIGNATED_INITIALIZER;
|
|
|
|
/**
|
|
* This method is used to call functions in the JavaScript application context.
|
|
* It is primarily intended for use by modules that require two-way communication
|
|
* with the JavaScript code. Safe to call from any thread.
|
|
*/
|
|
- (void)enqueueJSCall:(NSString *)moduleDotMethod args:(NSArray *)args;
|
|
|
|
/**
|
|
* Retrieve a bridge module instance by name or class. Note that modules are
|
|
* lazily instantiated, so calling these methods for the first time with a given
|
|
* module name/class may cause the class to be sychronously instantiated,
|
|
* blocking both the calling thread and main thread for a short time.
|
|
*/
|
|
- (id)moduleForName:(NSString *)moduleName;
|
|
- (id)moduleForClass:(Class)moduleClass;
|
|
|
|
/**
|
|
* All registered bridge module classes.
|
|
*/
|
|
@property (nonatomic, copy, readonly) NSArray<Class> *moduleClasses;
|
|
|
|
/**
|
|
* URL of the script that was loaded into the bridge.
|
|
*/
|
|
@property (nonatomic, strong, readonly) NSURL *bundleURL;
|
|
|
|
/**
|
|
* The class of the executor currently being used. Changes to this value will
|
|
* take effect after the bridge is reloaded.
|
|
*/
|
|
@property (nonatomic, strong) Class executorClass;
|
|
|
|
/**
|
|
* The delegate provided during the bridge initialization
|
|
*/
|
|
@property (nonatomic, weak, readonly) id<RCTBridgeDelegate> delegate;
|
|
|
|
/**
|
|
* The event dispatcher is a wrapper around -enqueueJSCall:args: that provides a
|
|
* higher-level interface for sending UI events such as touches and text input.
|
|
*
|
|
* NOTE: RCTEventDispatcher is now a bridge module, this is implemented as a
|
|
* category but remains declared in the bridge to avoid breaking changes
|
|
*
|
|
* To be moved.
|
|
*/
|
|
@property (nonatomic, readonly) RCTEventDispatcher *eventDispatcher;
|
|
|
|
/**
|
|
* The launch options that were used to initialize the bridge.
|
|
*/
|
|
@property (nonatomic, copy, readonly) NSDictionary *launchOptions;
|
|
|
|
/**
|
|
* Use this to check if the bridge is currently loading.
|
|
*/
|
|
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
|
|
|
|
/**
|
|
* Use this to check if the bridge has been invalidated.
|
|
*/
|
|
@property (nonatomic, readonly, getter=isValid) BOOL valid;
|
|
|
|
/**
|
|
* Reload the bundle and reset executor & modules. Safe to call from any thread.
|
|
*/
|
|
- (void)reload;
|
|
|
|
/**
|
|
* Says whether bridge has started recieving calls from javascript.
|
|
*/
|
|
- (BOOL)isBatchActive;
|
|
|
|
@end
|
|
|
|
/**
|
|
* These features are deprecated and should not be used.
|
|
*/
|
|
@interface RCTBridge (Deprecated)
|
|
|
|
/**
|
|
* This notification used to fire after all native modules has been initialized,
|
|
* but now that native modules are instantiated lazily on demand, its original
|
|
* purpose is meaningless.
|
|
*
|
|
* If you need to access a module, you can do so as soon as the bridge has been
|
|
* initialized, by calling `[bridge moduleForClass:]`. If you need to know when
|
|
* an individual module has been instantiated, add an observer for the
|
|
* `RCTDidInitializeModuleNotification` instead.
|
|
*/
|
|
RCT_EXTERN NSString *const RCTDidCreateNativeModules
|
|
__deprecated_msg("Use RCTDidInitializeModuleNotification to observe init of individual modules");
|
|
|
|
/**
|
|
* Accessing the modules property causes all modules to be eagerly initialized,
|
|
* which stalls the main thread. Use moduleClasses to enumerate through modules
|
|
* without causing them to be instantiated.
|
|
*/
|
|
@property (nonatomic, copy, readonly) NSDictionary *modules
|
|
__deprecated_msg("Use moduleClasses and/or moduleForName: instead");
|
|
|
|
@end
|