iOS12+ 的屏幕共享及遇到的某些坑
最近在弄屏幕共享事宜,看了很多文章了解了从iOS9一直到iOS12 苹果在直播录像方面做的改变。
如果你对直播实现的演变感兴趣请点击此处:传送门
现在说一下iOS12 用Replaykit2 获取屏幕流的过程:
屏幕流获取
1:在项目中添加Targets
Targets
2:添加Broadcast Upload Extension--->Next
添加Broadcast Upload Extension
3:在你想要实现屏幕共享的界面添加调取方法
#import "ViewController.h"
#import <ReplayKit/ReplayKit.h>
#define TAG_SHARESCREEN 10086
@interface ViewController ()
@property (nonatomic, strong) RPSystemBroadcastPickerView*broadPickerView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_broadPickerView = [[RPSystemBroadcastPickerView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
_broadPickerView.preferredExtension = @"此处填写你创建的Broadcast Upload Extension 的Bundle id(不是SetupUI的那个)";
[self.view addSubview:_broadPickerView];
}
@end
运行点击屏幕上的按钮便调取出来了开始录屏的界面
根据需求:可能不想要系统自带的按钮,可以做以下优化:
#import "ViewController.h"
#import <ReplayKit/ReplayKit.h>
#define TAG_SHARESCREEN 10086
@interface ViewController ()
@property (nonatomic, strong) RPSystemBroadcastPickerView*broadPickerView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_broadPickerView = [[RPSystemBroadcastPickerView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
_broadPickerView.preferredExtension = @"此处填写你创建的Broadcast Upload Extension 的Bundle id(不是SetupUI的那个)";
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 300, 40)];
[button setTitle:@"点我就好了" forState:UIControlStateNormal];
[button addTarget:self action:@selector(clickedOnStartRecordButton:) forControlEvents:UIControlEventTouchUpInside];
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
button.tag = TAG_SHARESCREEN;
[self.view addSubview:button];
}
- (void)clickedOnStartRecordButton:(UIButton *)sender
{
if (sender.tag == TAG_SHARESCREEN)
{
for (UIView *view in _broadPickerView.subviews)
{
if ([view isKindOfClass:[UIButton class]])
{
//调起录像方法,UIControlEventTouchUpInside的方法看其他文章用的是UIControlEventTouchDown,
//我使用时用UIControlEventTouchUpInside用好使,看个人情况决定
[(UIButton*)view sendActionsForControlEvents:UIControlEventTouchUpInside];
}
}
}
}
@end
使用RPSystemBroadcastPickerView调取系统录制页面时,如果手机系统为:可能会导致调取,本人了iOS12.1之前版本的功能使用,请诸位自行整理解决办法。(此乃苹果系统的坑、无法解决----如有大佬有解决方法,请您不吝赐教~小狼拜谢ing)
调试:
1、先运行项目(test_fore)到手机上
运行项目
此时操作录屏等操作,只能断点到test_fore里的代码
2、检测test_fore_sharing中的数据:运行test_fore_sharing 选择上述的项目
test_fore_sharing
选择与哪个项目匹配
此时可断点到 test_fore_sharing 下的所有代码
3、检测test_fore_sharingSetupUI:运行test_fore_sharingSetupUI
检测test_fore_sharingSetupUI
此时可断点到 test_fore_sharingSetupUI 下的所有代码
同步数据
把test_fore_sharing获取的屏幕流推送给test_fore(主App),test_fore(主App)推送屏幕流给RTC
可参考文章:
网易云信_Socket
华为云_App Groups
腾讯融云_CFNotificationCenter
暂时使用的是Socket方法,等实现完善后会发布完善的方法
类库的使用方法
1、使用了Socket和Codec两个文件夹中的代码,把两个文件夹拖入自己的主App中。
2、SampleHandler中使用时,需要关联主App加载的代码,方法如下:
SampleHandler调用App中的类方法
如果您有好的方法请不要吝惜,留言告诉我吧~
\color{red}{UIControlEventTouchUpInside}遇到的问题:我遇到的iOS12.4.4使用此方法是调用不起来的,又尝试了UIControlEventTouchDown可以成功,可是方法分界的版本号就成了问题、又跟杭研融合通信iOS哥哥沟通了一下、推荐使用UIControlEventAllTouchEvents调起