React Native 调用iOS原生功能—直播

react

项目 中 采用React Native 开发 ,观看直播调用iOS 原生接口

RN代码

import React, { Component } from 'react';

import {

Platform,

StyleSheet,

Text,

View,

TouchableHighlight,

NativeModules,

NativeEventEmitter,

} from 'react-native';

const instructions = Platform.select({

ios: 'Press Cmd+R to reload,\n' +

'Cmd+D or shake for dev menu',

android: 'Double tap R on your keyboard to reload,\n' +

'Shake or press menu button for dev menu',

});

var nativeBridge = NativeModules.RNIOSWatchLiveExportJsToReact;

const NativeModule = new NativeEventEmitter(nativeBridge);

export default class App extends Component<{}> {

render() {

return (

<View style={styles.container}>

<Text style={styles.welcome}>

Welcome to 北京四中网校!

</Text>

<TouchableHighlight style = {styles.btn} onPress = {this._pressBackButton.bind(this)}>

<Text style={styles.btnText}>

看直播

</Text>

</TouchableHighlight>

</View>

);

}

_pressBackButton () {

const options = {

domain:"etiantian.gensee.com",

roomNumber:"78608221",

nickName:"etiantian",

watchPassword :"933767"

}

NativeModule.addListener('watchLiveOpertion',(data)=>this._watchLiveHandle(data));

NativeModules.watchLive.watchLive(options,(data)=>this._watchLiveHandle(data));

}

_watchLiveHandle(response)

{

console.log("result",response);

if (response.close) {

NativeModule.removeAllListeners('watchLiveOpertion');

console.log('结束直播观看');

}

else if (response.error) {

NativeModule.removeAllListeners('watchLiveOpertion');

console.log('观看失败:',response.error);

}else {

console.log('观看成功');

}

}

}

iOS 代码

 watchLive

#import "watchLive.h"

#import <UIKit/UIKit.h>

#import "WatchLiveViewController.h"

#import "RNIOSWatchLiveExportJsToReact.h"

@interface watchLive()

@property (nonatomic,retain)NSMutableDictionary * options;

@property (nonatomic,retain)NSMutableDictionary * response;

@property (nonatomic,span) RCTResponseSenderBlock callback;

@property (nonatomic,retain) WatchLiveViewController  * watchLiveVC;

@end

@implementation watchLive

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(watchLive:(NSDictionary *)options callback:(RCTResponseSenderBlock)callback{

  if(_watchLiveVC)

  {

    return;

  }

 

  self.options = [NSMutableDictionary dictionaryWithDictionary:options];

  self.callback = callback;

  _watchLiveVC = [[WatchLiveViewController alloc]init:self];

 

  UIViewController * root = [[[UIApplication sharedApplication].delegate window] rootViewController];

  while (root.presentedViewController != nil)

  {

    root = root.presentedViewController;

  }

  [root presentViewController:self.watchLiveVC animated:YES completion:nil];

})

-(NSDictionary *)pGetWatchLiveInfo

{

  return self.options;

}

-(void)pWatchLiveplayerSucess:(id)sender;

{

  [RNIOSWatchLiveExportJsToReact emitEventWithName:@"event-watchLive" andPayload:@{@"sucess":@"YES"}];

}

-(void)pWatchLiveClose

{

  [RNIOSWatchLiveExportJsToReact emitEventWithName:@"event-watchLive" andPayload:@{@"close":@"YES"}];

  _watchLiveVC = nil;

}

-(void)pWatchLiveError:(NSError *)err

{

   [RNIOSWatchLiveExportJsToReact emitEventWithName:@"event-watchLive" andPayload:@{@"error":@"watchfail"}];

}

WatchLiveViewController

  #import "WatchLiveViewController.h"

#import <PlayerSDK/PlayerSDK.h>

@interface WatchLiveViewController ()<GSPPlayerManagerDelegate>

@property (nonatomic,retain)GSPPlayerManager   * playerManager;

@property (nonatomic, span) GSPChatInputToolView *inputView;

@property (nonatomic, span) GSPChatView *chatView;

@property (nonatomic, span) UITapGestureRecognizer *tapGestureRecognizer;

@property (nonatomic, assign)id<watchLiveDelegate>  delegate;

@property (nonatomic, span) UIButton * closeBtn;

@end

@implementation WatchLiveViewController

-(id)init:(id<watchLiveDelegate>)delegate

{

  if(self = [super init])

  {

    _delegate = delegate;

  }

  return self;

}

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    [self watchLive];

    // Do any additional setup after loading the view.

}

-(void)watchLive

{

  if (_delegate == nil)

  {

     return;

  }

 

  NSDictionary * dic = [_delegate pGetWatchLiveInfo];

  _playerManager = [GSPPlayerManager sharedManager];

  _playerManager.delegate = self;

 

  GSPJoinParam * joinParam = [GSPJoinParam new];

 

 

  joinParam.roomNumber = [dic valueForKey:@"roomNumber"];

 

  joinParam.serviceType = GSPServiceTypeTraining;

  joinParam.nickName    = [dic valueForKey:@"nickName"];

  joinParam.watchPassword = [dic valueForKey:@"watchPassword"];

 

  GSPVideoView  * videoView = [[GSPVideoView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/2)];

  [self.view addSubview:videoView];

  _playerManager.videoView = videoView;

  videoView.contentMode = UIViewContentModeScaleAspectFit;

  [_playerManager joinWithParam:joinParam];

  if (_closeBtn == nil)

  {

    _closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    _closeBtn.frame = CGRectMake(self.view.frame.size.width- 80, 30, 60, 30);

    _closeBtn.backgroundColor = [UIColor blueColor];

    [_closeBtn setTitle:@"关闭" forState:UIControlStateNormal];;

    [_closeBtn addTarget:self action:@selector(closeHandle:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:_closeBtn];

  }

  _chatView = [[GSPChatView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height/2, self.view.bounds.size.width, self.view.bounds.size.height/2)];

  _chatView.backgroundColor = [UIColor greenColor];

  //

  [self.view addSubview:_chatView];

  _inputView = [[GSPChatInputToolView alloc]initWithViewController:self combinedChatView:_chatView combinedQaView:nil isChatMode:YES];

  [self.view addSubview:_inputView];

  //

    self.playerManager.chatView = _chatView;

  _tapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hideChatView:)];

  [_chatView addGestureRecognizer:_tapGestureRecognizer];

  //    GSPChatView * chatView = [[GSPChatView alloc]initWithFrame:CGRectMake(videoView.frame.size.height, 0, self.view.frame.size.width, self.view.frame.size.height/2)];

 

}

-(void)closeHandle:(UIButton *)btn

{

  if (_delegate)

  {

    [_delegate pWatchLiveClose];

    [self liveEnd];

  }

 

}

-(void)liveEnd{

  if ( [_playerManager leave])

  {

    [_playerManager invalidate];

  }

  [self dismissViewControllerAnimated:YES completion:nil];

}

#pragma mark - hidden chatListView

- (void)hideChatView:(UIGestureRecognizer *)recognizer {

 

  [_inputView hideUserListView];

  [self.view endEditing:YES];

}

-(void)playerManager:(GSPPlayerManager *)playerManager didReceiveSelfJoinResult:(GSPJoinResult)joinResult currentIDC:(NSString *)idcKey

{

  if (joinResult == GSPJoinResultOK) {

    if (_delegate)

    {

       [_delegate pWatchLiveplayerSucess:nil];

    }

   

  }

  else

  {

    if (_delegate)

    {

        [_delegate pWatchLiveError:nil];

        [self liveEnd];

    }

 

  }

}

RNIOSWatchLiveExportJsToReact

 #import "RNIOSWatchLiveExportJsToReact.h"

@implementation RNIOSWatchLiveExportJsToReact

RCT_EXPORT_MODULE();

- (NSArray<NSString *> *)supportedEvents

{

  //这里返回的将是你要发送的消息名的数组。

  return @[@"watchLiveOpertion"];

}

- (void)startObserving

{

  [[NSNotificationCenter defaultCenter] addObserver:self

                                           selector:@selector(emitEventInternal:)

                                               name:@"event-watchLive"

                                             object:nil];

}

- (void)stopObserving

{

  [[NSNotificationCenter defaultCenter] removeObserver:self];

}

- (void)emitEventInternal:(NSNotification *)notification

{

  NSDictionary * result = notification.userInfo;

  [self sendEventWithName:@"watchLiveOpertion"

                    body:result];

}

+ (void)emitEventWithName:(NSString *)name andPayload:(NSDictionary *)payload

{

  [[NSNotificationCenter defaultCenter] postNotificationName:@"event-watchLive"

                                                      object:self

                                                    userInfo:payload];

}

       @end

RN 函数回调只允许调用一次,所以采用事件方式进行传递

以上是 React Native 调用iOS原生功能—直播 的全部内容, 来源链接: utcz.com/z/382777.html

回到顶部