1.遇上react-native-webview死活不能编译成功
设置minVersion是iOS11,yarn install一把,然后死活都运行不了,这个时候需要将../node_modules/react-native-webview/apple/RNCWebView.m修改一下
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000 /* iOS 15 */
_mediaCapturePermissionGrantType = RNCWebViewPermissionGrantType_Prompt;
#endif
2.怎么写传递函数?
在@interface后面加RCTBridgeModule,在@implementation下方加RCT_EXPORT_MODULE();
公开的函数大概是:RCT_EXPORT_METHOD(afun:(RCTResponseSenderBlock)callback){}
这是异步callback;还有一种类似同步的写法RCT_EXPORT_METHOD(afun:(NSString*)aStr resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){}
简单的例子:
OC部分:xx.h
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
@interface myModule : NSObject<RCTBridgeModule>
@end
xx.m
#import "xx.h"
@implementation myModule
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(afun:(RCTResponseSenderBlock)callback)
{
if(callback)
{
NSMutableArray *resp = [NSMutableArray array];
[resp addObject:@"this is a test."];
callback(resp);
}
}
RCT_EXPORT_METHOD(bfun:(NSString *)aStr resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
int flag = rand();
if(flag>100)
{
if(resolve)
{
resolve([NSNumber numberWithBool:YES]);
}
}
else
{
reject(@"-1",@"error rise",[NSError errorWithDomain:NSCocoaErrorDomain code:-1 userInfo:nil]);
}
}
@end
在aa.tsx实现:
import { NativeModules} from 'react-native';
const myModule = NativeModules.myModule;
myModule.afun((resp) => {
console.log(resp);
});
myModule.bfun('this is a test').then(flag => {
console.log('return='+flag);
}).catch(() => {
console.log('error');
});
3.怎么写广播消息?
h文件中要继承RCTEventEmitter;在m文件中要实现至少3个固定的函数
- (NSArray<NSString *> *)supportedEvents;
- (void)startObserving;
- (void)stopObserving;
外加接收内部广播的函数- (void) listenGEvent:(NSNotification *)notification;
在其他地方调用发广播,则使用内部的notificationName,参考一下例子。
yy.h
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
@interface myMessage : RCTEventEmitter<RCTBridgeModule>
@end
yy.m
#import "yy.h"
@implementation myMessage
RCT_EXPORT_MODULE();
- (NSArray<NSString *> *)supportedEvents
{
return @[@"gEventName"];
}
- (void)startObserving
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(listenGEvent:)
name:@"gEventNotification"
object:nil];
}
- (void)stopObserving
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void) listenGEvent:(NSNotification *)notification
{
[self sendEventWithName:@"gEventName" body:notification.object];
}
@end
调用广播:
NSDictionary *info=[NSDictionary dictionaryWithObject:@"aaaa" forKey:@"test"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"gEventNotification" object:info];
bb.tsx的实现监听事件:
import { NativeModules,NativeEventEmitter } from 'react-native';
const myMessage = NativeModules.myMessage;
const myEvents = new NativeEventEmitter(myMessage);
myEvents.addListener('gEventName',(data)=>{
console.log(data);
});