Broadcast extension for AppRTCMobile on iOS
This provides an environment for testing out using WebRTC from an iOS extension. It implements a ReplayKit broadcast extension for live streaming games and screensharing. The extension is only supported on iOS 11+ and is guarded by a build flag. Bug: webrtc:9335 Change-Id: Id218d6c73ef7599f5953c5a1e0e62e5d0dc4f10b Reviewed-on: https://webrtc-review.googlesource.com/80000 Commit-Queue: Anders Carlsson <andersc@webrtc.org> Reviewed-by: Patrik Höglund <phoglund@webrtc.org> Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23504}
This commit is contained in:
committed by
Commit Bot
parent
27fe43a1aa
commit
358f2e0760
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC Project Authors. All rights reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "ARDBroadcastSetupViewController.h"
|
||||
|
||||
@implementation ARDBroadcastSetupViewController {
|
||||
UITextField *_roomNameField;
|
||||
}
|
||||
|
||||
- (void)loadView {
|
||||
UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
|
||||
view.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.7];
|
||||
|
||||
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Icon-180"]];
|
||||
imageView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[view addSubview:imageView];
|
||||
|
||||
_roomNameField = [[UITextField alloc] initWithFrame:CGRectZero];
|
||||
_roomNameField.borderStyle = UITextBorderStyleRoundedRect;
|
||||
_roomNameField.font = [UIFont systemFontOfSize:14.0];
|
||||
_roomNameField.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
_roomNameField.placeholder = @"Room name";
|
||||
_roomNameField.returnKeyType = UIReturnKeyDone;
|
||||
_roomNameField.delegate = self;
|
||||
[view addSubview:_roomNameField];
|
||||
|
||||
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
doneButton.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
doneButton.titleLabel.font = [UIFont systemFontOfSize:20.0];
|
||||
[doneButton setTitle:@"Done" forState:UIControlStateNormal];
|
||||
[doneButton addTarget:self
|
||||
action:@selector(userDidFinishSetup)
|
||||
forControlEvents:UIControlEventTouchUpInside];
|
||||
[view addSubview:doneButton];
|
||||
|
||||
UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
cancelButton.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
cancelButton.titleLabel.font = [UIFont systemFontOfSize:20.0];
|
||||
[cancelButton setTitle:@"Cancel" forState:UIControlStateNormal];
|
||||
[cancelButton addTarget:self
|
||||
action:@selector(userDidCancelSetup)
|
||||
forControlEvents:UIControlEventTouchUpInside];
|
||||
[view addSubview:cancelButton];
|
||||
|
||||
UILayoutGuide *margin = view.layoutMarginsGuide;
|
||||
[imageView.widthAnchor constraintEqualToConstant:60.0].active = YES;
|
||||
[imageView.heightAnchor constraintEqualToConstant:60.0].active = YES;
|
||||
[imageView.topAnchor constraintEqualToAnchor:margin.topAnchor constant:20].active = YES;
|
||||
[imageView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor].active = YES;
|
||||
|
||||
[_roomNameField.leadingAnchor constraintEqualToAnchor:margin.leadingAnchor].active = YES;
|
||||
[_roomNameField.topAnchor constraintEqualToAnchor:imageView.bottomAnchor constant:20].active =
|
||||
YES;
|
||||
[_roomNameField.trailingAnchor constraintEqualToAnchor:margin.trailingAnchor].active = YES;
|
||||
|
||||
[doneButton.leadingAnchor constraintEqualToAnchor:margin.leadingAnchor].active = YES;
|
||||
[doneButton.bottomAnchor constraintEqualToAnchor:margin.bottomAnchor constant:-20].active = YES;
|
||||
|
||||
[cancelButton.trailingAnchor constraintEqualToAnchor:margin.trailingAnchor].active = YES;
|
||||
[cancelButton.bottomAnchor constraintEqualToAnchor:margin.bottomAnchor constant:-20].active = YES;
|
||||
|
||||
UITapGestureRecognizer *tgr =
|
||||
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTap:)];
|
||||
[view addGestureRecognizer:tgr];
|
||||
|
||||
self.view = view;
|
||||
}
|
||||
|
||||
- (IBAction)didTap:(id)sender {
|
||||
[self.view endEditing:YES];
|
||||
}
|
||||
|
||||
- (void)userDidFinishSetup {
|
||||
// URL of the resource where broadcast can be viewed that will be returned to the application
|
||||
NSURL *broadcastURL = [NSURL
|
||||
URLWithString:[NSString stringWithFormat:@"https://appr.tc/r/%@", _roomNameField.text]];
|
||||
|
||||
// Dictionary with setup information that will be provided to broadcast extension when broadcast
|
||||
// is started
|
||||
NSDictionary *setupInfo = @{@"roomName" : _roomNameField.text};
|
||||
|
||||
// Tell ReplayKit that the extension is finished setting up and can begin broadcasting
|
||||
[self.extensionContext completeRequestWithBroadcastURL:broadcastURL setupInfo:setupInfo];
|
||||
}
|
||||
|
||||
- (void)userDidCancelSetup {
|
||||
// Tell ReplayKit that the extension was cancelled by the user
|
||||
[self.extensionContext cancelRequestWithError:[NSError errorWithDomain:@"com.google.AppRTCMobile"
|
||||
code:-1
|
||||
userInfo:nil]];
|
||||
}
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
[self userDidFinishSetup];
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user