音视频开发屏幕共享程序员

iOS12+ 的屏幕共享及遇到的某些坑

2020-06-02  本文已影响0人  斌小狼

最近在弄屏幕共享事宜,看了很多文章了解了从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

\color{red}{Tips:}使用RPSystemBroadcastPickerView调取系统录制页面时,如果手机系统为:\color{red}{iOS12 前两个版本、}可能会导致调取\color{red}{不成功},本人\color{red}{屏蔽}了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}{Tips:}关于调起方法\color{red}{UIControlEventTouchUpInside}遇到的问题:我遇到的iOS12.4.4使用此方法是调用不起来的,又尝试了UIControlEventTouchDown可以成功,可是方法分界的版本号就成了问题、又跟杭研融合通信iOS哥哥沟通了一下、推荐使用UIControlEventAllTouchEvents调起

上一篇下一篇

猜你喜欢

热点阅读