Repository: ThomasWDev/ReplayKit
Branch: main
Commit: d59ce0c38757
Files: 23
Total size: 89.8 KB
Directory structure:
gitextract_bff1kkl2/
├── .gitignore
├── Broadcast/
│ ├── Broadcast-Bridging-Header.h
│ ├── Info.plist
│ ├── SampleHandler.swift
│ ├── SampleHandlerUtil.h
│ └── SampleHandlerUtil.m
├── Podfile
├── ScreenSharing/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AccentColor.colorset/
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── JoinChannelViewController.swift
│ ├── SceneDelegate.swift
│ ├── ScreenSharingViewController.swift
│ └── View/
│ ├── VideoView.swift
│ └── VideoView.xib
├── ScreenSharing.xcodeproj/
│ └── project.pbxproj
├── ScreenSharingTests/
│ └── ScreenSharingTests.swift
└── ScreenSharingUITests/
├── ScreenSharingUITests.swift
└── ScreenSharingUITestsLaunchTests.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
xcshareddata
## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint
*.xcuserstate
*.DS_Store
*.xcworkspacedata
*.xcscheme
xcschememanagement.plist
*.xcbkptlist
## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
*._*
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
/Pods
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
# Accio dependency management
Dependencies/
.accio/
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
# *-Info.plist
!*-Info.sample.plist
================================================
FILE: Broadcast/Broadcast-Bridging-Header.h
================================================
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "SampleHandlerUtil.h"
#import <AgoraReplayKitExtension/AgoraReplayKitExt.h>
================================================
FILE: Broadcast/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.broadcast-services-upload</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).SampleHandler</string>
<key>RPBroadcastProcessMode</key>
<string>RPBroadcastProcessModeSampleBuffer</string>
</dict>
</dict>
</plist>
================================================
FILE: Broadcast/SampleHandler.swift
================================================
//
// SampleHandler.swift
// Broadcast
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import ReplayKit
class SampleHandler: RPBroadcastSampleHandler {
override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
AgoraReplayKitExt.shareInstance().start(self)
}
override func broadcastPaused() {
AgoraReplayKitExt.shareInstance().pause()
}
override func broadcastResumed() {
AgoraReplayKitExt.shareInstance().resume()
}
override func broadcastFinished() {
AgoraReplayKitExt.shareInstance().stop()
}
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
AgoraReplayKitExt.shareInstance().push(sampleBuffer, with: sampleBufferType)
}
}
extension SampleHandler: AgoraReplayKitExtDelegate {
func broadcastFinished(_ broadcast: AgoraReplayKitExt, reason: AgoraReplayKitExtReason) {
debugPrint("broadcastFinished:\(reason.rawValue)")
switch reason {
case .connectFail:
let error = NSError(domain: "ConnectFail", code: 0, userInfo: nil)
finishBroadcastWithError(error)
break
case .disconnect:
let error = NSError(domain: "Disconnect", code: 0, userInfo: nil)
finishBroadcastWithError(error)
break
case .initiativeStop:
// Pass nil in objc method to avoid showing alert view
SampleHandlerUtil.finishBroadcast(withNilError: self)
break
default: break
}
}
}
================================================
FILE: Broadcast/SampleHandlerUtil.h
================================================
//
// SampleHandlerUtil.h
// Broadcast
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
#import <Foundation/Foundation.h>
#import <ReplayKit/ReplayKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface SampleHandlerUtil : NSObject
+ (void)finishBroadcastWithNilError:(nullable RPBroadcastSampleHandler *)sampleHandler;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Broadcast/SampleHandlerUtil.m
================================================
//
// SampleHandlerUtil.m
// Broadcast
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
#import "SampleHandlerUtil.h"
@implementation SampleHandlerUtil
+ (void)finishBroadcastWithNilError:(nullable RPBroadcastSampleHandler *)sampleHandler {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
[sampleHandler finishBroadcastWithError:nil];
#pragma clang diagnostic pop
}
@end
================================================
FILE: Podfile
================================================
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'Broadcast' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for Broadcast
pod 'AgoraRtcEngine_iOS'
end
target 'ScreenSharing' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for ScreenSharing
pod 'AGEVideoLayout'
pod 'AgoraRtcEngine_iOS'
pod 'AgoraMediaPlayer_iOS'
target 'ScreenSharingTests' do
inherit! :search_paths
# Pods for testing
end
target 'ScreenSharingUITests' do
# Pods for testing
end
end
================================================
FILE: ScreenSharing/AppDelegate.swift
================================================
//
// AppDelegate.swift
// ScreenSharing
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}
================================================
FILE: ScreenSharing/Assets.xcassets/AccentColor.colorset/Contents.json
================================================
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: ScreenSharing/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: ScreenSharing/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: ScreenSharing/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: ScreenSharing/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="QhH-33-aj3">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
<scene sceneID="RnI-f9-ZYq">
<objects>
<navigationController id="QhH-33-aj3" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="8wP-Bs-8O0">
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="k6h-da-M4D"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="ahJ-O2-XSx" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-838" y="102"/>
</scene>
<!--Join Channel View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="JoinChannelViewController" customModule="ScreenSharing" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="video.badge.plus.fill" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="jXh-ZS-qli">
<rect key="frame" x="86.5" y="190" width="240" height="128"/>
<color key="tintColor" systemColor="systemPinkColor"/>
<constraints>
<constraint firstAttribute="width" constant="238.5" id="Inx-i7-nzD"/>
<constraint firstAttribute="height" constant="130" id="fzk-5O-fpg"/>
</constraints>
</imageView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tZQ-ds-b6C">
<rect key="frame" x="139" y="475" width="136" height="47"/>
<color key="backgroundColor" systemColor="tintColor"/>
<constraints>
<constraint firstAttribute="height" constant="47" id="9Hr-nD-AIi"/>
<constraint firstAttribute="width" constant="136" id="iNF-VF-pAp"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="20"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="Join"/>
<connections>
<segue destination="zFi-EW-Abj" kind="show" id="GVi-9R-KGO"/>
</connections>
</button>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Enter Channel Name" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="xjJ-JC-FTh">
<rect key="frame" x="40" y="388" width="334" height="40"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="Oaf-9h-cIV"/>
</constraints>
<color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" type="system" pointSize="20"/>
<textInputTraits key="textInputTraits"/>
</textField>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Channel Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="djS-5a-MAR">
<rect key="frame" x="40" y="354" width="135" height="24"/>
<constraints>
<constraint firstAttribute="width" constant="135" id="0ca-kl-hGT"/>
<constraint firstAttribute="height" constant="24" id="iXT-h3-hDd"/>
</constraints>
<fontDescription key="fontDescription" name="TrebuchetMS-Bold" family="Trebuchet MS" pointSize="20"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="xjJ-JC-FTh" secondAttribute="trailing" constant="40" id="4KK-cK-gE6"/>
<constraint firstItem="jXh-ZS-qli" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="Nqn-f2-CnW"/>
<constraint firstItem="xjJ-JC-FTh" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" constant="40" id="bly-3Q-gv4"/>
<constraint firstItem="tZQ-ds-b6C" firstAttribute="top" secondItem="xjJ-JC-FTh" secondAttribute="bottom" constant="47" id="ctT-JV-OZe"/>
<constraint firstItem="jXh-ZS-qli" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" constant="100" id="h6F-Po-fn1"/>
<constraint firstItem="xjJ-JC-FTh" firstAttribute="top" secondItem="djS-5a-MAR" secondAttribute="bottom" constant="10" id="h7Y-fk-EgH"/>
<constraint firstItem="xjJ-JC-FTh" firstAttribute="top" secondItem="jXh-ZS-qli" secondAttribute="bottom" constant="70" id="yQO-fl-gnM"/>
<constraint firstItem="tZQ-ds-b6C" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="yXn-ZR-spq"/>
<constraint firstItem="djS-5a-MAR" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" constant="40" id="zbW-UZ-MAf"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="NLJ-ey-Wss"/>
<connections>
<outlet property="channelTextField" destination="xjJ-JC-FTh" id="N42-kD-Wga"/>
<outlet property="joinButton" destination="tZQ-ds-b6C" id="3yf-64-SdD"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-78.260869565217391" y="102.45535714285714"/>
</scene>
<!--Screen Share Main-->
<scene sceneID="1uG-rC-toC">
<objects>
<viewController title="Join Channel Audio" id="zFi-EW-Abj" userLabel="Screen Share Main" customClass="ScreenSharingViewController" customModule="ScreenSharing" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="NOz-co-GQz">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fof-4v-QK2">
<rect key="frame" x="0.0" y="413" width="414" height="70"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Screen on sharing, you can use another device join the same channel to interactions" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hEv-1W-d2v">
<rect key="frame" x="30" y="0.0" width="354" height="39.5"/>
<fontDescription key="fontDescription" name="MarkerFelt-Thin" family="Marker Felt" pointSize="18"/>
<color key="textColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="hEv-1W-d2v" secondAttribute="trailing" constant="30" id="0DG-Bw-y5W"/>
<constraint firstAttribute="height" constant="70" id="F3y-Tn-hOQ"/>
<constraint firstItem="hEv-1W-d2v" firstAttribute="leading" secondItem="fof-4v-QK2" secondAttribute="leading" constant="30" id="JwZ-dc-4Mi"/>
<constraint firstItem="hEv-1W-d2v" firstAttribute="top" secondItem="fof-4v-QK2" secondAttribute="top" id="b2Y-uS-ZfD"/>
</constraints>
</view>
</subviews>
<viewLayoutGuide key="safeArea" id="yow-nN-W5e"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="yow-nN-W5e" firstAttribute="trailing" secondItem="fof-4v-QK2" secondAttribute="trailing" id="9Q0-NR-kNS"/>
<constraint firstItem="fof-4v-QK2" firstAttribute="centerX" secondItem="NOz-co-GQz" secondAttribute="centerX" id="Ac5-Yl-fqX"/>
<constraint firstItem="fof-4v-QK2" firstAttribute="centerY" secondItem="NOz-co-GQz" secondAttribute="centerY" id="njc-U2-zDf"/>
<constraint firstItem="fof-4v-QK2" firstAttribute="leading" secondItem="yow-nN-W5e" secondAttribute="leading" id="vWY-H4-Bu1"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="3Lg-z8-m6Y"/>
<connections>
<outlet property="infoContainerView" destination="fof-4v-QK2" id="c1W-Fp-q7p"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Y4K-5N-Y9u" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="744.92753623188412" y="101.78571428571428"/>
</scene>
</scenes>
<resources>
<image name="video.badge.plus.fill" catalog="system" width="128" height="88"/>
<systemColor name="systemPinkColor">
<color red="1" green="0.17647058823529413" blue="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="tintColor">
<color red="0.0" green="0.47843137254901963" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>
================================================
FILE: ScreenSharing/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>remote-notification</string>
</array>
</dict>
</plist>
================================================
FILE: ScreenSharing/JoinChannelViewController.swift
================================================
//
// ViewController.swift
// ScreenSharing
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import UIKit
class JoinChannelViewController: UIViewController {
@IBOutlet weak var channelTextField: UITextField!
@IBOutlet weak var joinButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let screenSharingVC = segue.destination as? ScreenSharingViewController {
channelTextField.resignFirstResponder()
screenSharingVC.configs = ["channelName": channelTextField.text ?? ""]
}
}
private func setupUI() {
overrideUserInterfaceStyle = .light
joinButton.layer.masksToBounds = true
joinButton.layer.cornerRadius = 10
channelTextField.layer.masksToBounds = true
channelTextField.layer.cornerRadius = 10
channelTextField.layer.borderColor = UIColor.darkGray.cgColor
channelTextField.layer.borderWidth = 1.0
channelTextField.text = "ThomasWoodfin"
channelTextField.isEnabled = false
}
}
================================================
FILE: ScreenSharing/SceneDelegate.swift
================================================
//
// SceneDelegate.swift
// ScreenSharing
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let _ = (scene as? UIWindowScene) else { return }
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}
================================================
FILE: ScreenSharing/ScreenSharingViewController.swift
================================================
//
// ScreenSharingViewController.swift
// ScreenSharing
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import UIKit
import ReplayKit
import AGEVideoLayout
import AgoraRtcKit
import AGEVideoLayout
class ScreenSharingViewController: UIViewController {
@IBOutlet weak var infoContainerView: UIView!
private var localVideoView = Bundle.loadView(fromNib: "VideoView", withType: VideoView.self)
private var remoteVideoView = Bundle.loadView(fromNib: "VideoView", withType: VideoView.self)
private var isJoined: Bool = false
private var isScreenSharing: Bool = false
private var agoraKit: AgoraRtcEngineKit!
private var screenCaptureParams: AgoraScreenCaptureParameters2?
public var configs: [String : Any] = [:]
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
guard let channelName = configs["channelName"] as? String else {
return
}
let config = AgoraRtcEngineConfig()
config.appId = "530490d0e19b4c5994c0b42e7c68ce19"
config.areaCode = AgoraAreaCode.GLOB.rawValue
let logConfig = AgoraLogConfig()
logConfig.level = .info
config.logConfig = logConfig
agoraKit = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
agoraKit.setChannelProfile(.liveBroadcasting)
agoraKit.setClientRole(.broadcaster)
agoraKit.enableVideo()
agoraKit.setVideoEncoderConfiguration(AgoraVideoEncoderConfiguration(size: CGSize(width: 1280, height: 720),
frameRate: AgoraVideoFrameRate.fps30,
bitrate: AgoraVideoBitrateStandard,
orientationMode: AgoraVideoOutputOrientationMode.adaptative))
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.uid = 0
videoCanvas.view = localVideoView.videoView
videoCanvas.renderMode = .hidden
agoraKit.setupLocalVideo(videoCanvas)
// Set audio route to speaker
agoraKit.setDefaultAudioRouteToSpeakerphone(true)
agoraKit.setAudioProfile(.default, scenario: .gameStreaming)
let option = AgoraRtcChannelMediaOptions()
let result = agoraKit.joinChannel(byToken: "006530490d0e19b4c5994c0b42e7c68ce19IADPdWaJfPthGf5EfSoS9qlpGEekabitjQPwzXtGAsNxrWQucoQAAAAAEAB9OJJ5s52MYgEAAQCznYxi", channelId: channelName, info: nil, uid: 0, options: option)
if result != 0 {
self.showAlert(title: "Error", message: "joinChannel call failed: \(result), please check your params.")
}
}
override func willMove(toParent parent: UIViewController?) {
if parent == nil {
if isJoined {
agoraKit.leaveChannel { (stats) -> Void in
debugPrint("Left channel, duration: \(stats.duration)")
}
}
}
}
func setupUI() {
localVideoView.setPlaceholder(text: "Local Host")
remoteVideoView.setPlaceholder(text: "Remote Host")
let screenBounds = UIScreen.main.bounds
let width = screenBounds.width / 4.0
remoteVideoView.frame = CGRect(x: 0, y: 0, width: screenBounds.width, height: screenBounds.height)
localVideoView.frame = CGRect(x: screenBounds.width - width - 10, y: 90, width: width, height: width * 4 / 2)
self.view.addSubview(remoteVideoView)
self.view.addSubview(localVideoView)
self.view.bringSubviewToFront(infoContainerView)
updateButtonTitle()
}
func showAlert( title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
self.present(alert, animated: true)
}
@IBAction func startShareBtnClick(_ sender: Any) {
if isScreenSharing {
agoraKit.stopScreenCapture()
} else {
if screenCaptureParams == nil {
let screenParams = AgoraScreenCaptureParameters2()
screenParams.captureAudio = true
screenParams.captureVideo = true
let videoParams = AgoraScreenVideoParameters()
videoParams.dimensions = CGSize(width: 0, height: 0)
videoParams.frameRate = 30
screenParams.videoParams = videoParams;
screenCaptureParams = screenParams
}
agoraKit.startScreenCapture(screenCaptureParams!)
let pickerView = RPSystemBroadcastPickerView(frame: CGRect(x: 0, y:0, width: 50, height: 50))
if let url = Bundle.main.url(forResource: "Broadcast", withExtension: "appex", subdirectory: "PlugIns") {
if let bundle = Bundle(url: url) {
pickerView.preferredExtension = bundle.bundleIdentifier
pickerView.showsMicrophoneButton = false
// Auto click RPSystemBroadcastPickerView
for view in pickerView.subviews {
let startButton = view as! UIButton
startButton.sendActions(for: .allTouchEvents)
}
}
}
}
}
func startScreenCapture() {
isScreenSharing = true
localVideoView.isHidden = true
remoteVideoView.isHidden = true
infoContainerView.isHidden = false
updateButtonTitle()
}
func stopScreenCapture() {
screenCaptureParams = nil
isScreenSharing = false
localVideoView.isHidden = false
remoteVideoView.isHidden = false
infoContainerView.isHidden = true
agoraKit.setVideoSource(AgoraRtcDefaultCamera())
updateButtonTitle()
}
func updateButtonTitle() {
let title = (screenCaptureParams != nil) ? "⏹ Screen Sharing" : "▶ Screen Sharing"
let rightBarButton = UIBarButtonItem(title: title, style: .plain, target: self, action: #selector(startShareBtnClick))
self.navigationItem.rightBarButtonItem = rightBarButton
}
}
/// agora rtc engine delegate events @available(iOS 12.0, *)
extension ScreenSharingViewController: AgoraRtcEngineDelegate {
func rtcEngine(_ engine: AgoraRtcEngineKit, didOccurWarning warningCode: AgoraWarningCode) {
}
func rtcEngine(_ engine: AgoraRtcEngineKit, didOccurError errorCode: AgoraErrorCode) {
}
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinChannel channel: String, withUid uid: UInt, elapsed: Int) {
isJoined = true
}
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.uid = uid
// the view to be binded
videoCanvas.view = remoteVideoView.videoView
videoCanvas.renderMode = .fill
agoraKit.setupRemoteVideo(videoCanvas)
}
func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.uid = uid
// the view to be binded
videoCanvas.view = nil
videoCanvas.renderMode = .hidden
agoraKit.setupRemoteVideo(videoCanvas)
}
func rtcEngine(_ engine: AgoraRtcEngineKit, localVideoStateChange state: AgoraLocalVideoStreamState, error: AgoraLocalVideoStreamError) {
switch error {
case .extensionCaptureStarted:
startScreenCapture()
break
case .extensionCaptureStoped:
stopScreenCapture()
break
case .extensionCaptureDisconnected:
stopScreenCapture()
break
default: break
}
}
}
================================================
FILE: ScreenSharing/View/VideoView.swift
================================================
//
// VideoView.swift
// ScreenSharing
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import UIKit
extension Bundle {
static func loadView<T>(fromNib name: String, withType type: T.Type) -> T {
if let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T {
return view
}
fatalError("Could not load view with type " + String(describing: type))
}
}
class VideoView: UIView {
@IBOutlet weak var videoView:UIView!
@IBOutlet weak var placeholderLabel:UILabel!
func setPlaceholder(text:String) {
placeholderLabel.text = text
}
override func awakeFromNib() {
super.awakeFromNib()
}
}
================================================
FILE: ScreenSharing/View/VideoView.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB" customClass="VideoView" customModule="ScreenSharing" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jNO-yh-cWz" userLabel="Placeholder">
<rect key="frame" x="207" y="453" width="0.0" height="0.0"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" name="videoPlaceholder"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="z6G-aL-Ut4">
<rect key="frame" x="0.0" y="44" width="414" height="852"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
</subviews>
<viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
<color key="backgroundColor" name="videoBackground"/>
<constraints>
<constraint firstItem="z6G-aL-Ut4" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="D5P-vU-kKb"/>
<constraint firstItem="z6G-aL-Ut4" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="R1u-w9-cbP"/>
<constraint firstAttribute="bottom" secondItem="z6G-aL-Ut4" secondAttribute="bottom" id="TDk-eq-3Bf"/>
<constraint firstItem="jNO-yh-cWz" firstAttribute="centerY" secondItem="vUN-kp-3ea" secondAttribute="centerY" id="qPg-FY-TVT"/>
<constraint firstItem="jNO-yh-cWz" firstAttribute="centerX" secondItem="vUN-kp-3ea" secondAttribute="centerX" id="tnR-4i-aTA"/>
<constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="z6G-aL-Ut4" secondAttribute="trailing" id="vMm-b5-ZoF"/>
</constraints>
<connections>
<outlet property="placeholderLabel" destination="jNO-yh-cWz" id="FTU-Vl-aoH"/>
<outlet property="videoView" destination="z6G-aL-Ut4" id="Jfc-RP-ol4"/>
</connections>
<point key="canvasLocation" x="260.86956521739131" y="207.58928571428569"/>
</view>
</objects>
<resources>
<namedColor name="videoBackground">
<color red="0.92100000381469727" green="0.92100000381469727" blue="0.92100000381469727" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<namedColor name="videoPlaceholder">
<color red="0.47600001096725464" green="0.47600001096725464" blue="0.47600001096725464" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
</resources>
</document>
================================================
FILE: ScreenSharing.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
150C9E013168C53AC1AE6285 /* Pods_ScreenSharingTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82A94621B239387F1C9C902E /* Pods_ScreenSharingTests.framework */; };
4B78928846FB801C8A9DDCD9 /* Pods_ScreenSharing_ScreenSharingUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E94D2CB5EA1D853253684D2 /* Pods_ScreenSharing_ScreenSharingUITests.framework */; };
7E126BB09B9EF6EFFC4FF418 /* Pods_Broadcast.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81C4240A462AADFCC0B35156 /* Pods_Broadcast.framework */; };
A83BE620283B3C4500CE7021 /* ScreenSharingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83BE61F283B3C4500CE7021 /* ScreenSharingViewController.swift */; };
A83BE624283B3CCB00CE7021 /* VideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83BE622283B3CCB00CE7021 /* VideoView.swift */; };
A83BE625283B3CCB00CE7021 /* VideoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A83BE623283B3CCB00CE7021 /* VideoView.xib */; };
A85D7B71283A85A70053860F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85D7B70283A85A70053860F /* AppDelegate.swift */; };
A85D7B73283A85A70053860F /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85D7B72283A85A70053860F /* SceneDelegate.swift */; };
A85D7B75283A85A70053860F /* JoinChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85D7B74283A85A70053860F /* JoinChannelViewController.swift */; };
A85D7B78283A85A70053860F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A85D7B76283A85A70053860F /* Main.storyboard */; };
A85D7B7A283A85A90053860F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A85D7B79283A85A90053860F /* Assets.xcassets */; };
A85D7B7D283A85A90053860F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A85D7B7B283A85A90053860F /* LaunchScreen.storyboard */; };
A85D7B88283A85A90053860F /* ScreenSharingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85D7B87283A85A90053860F /* ScreenSharingTests.swift */; };
A85D7B92283A85A90053860F /* ScreenSharingUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85D7B91283A85A90053860F /* ScreenSharingUITests.swift */; };
A85D7B94283A85A90053860F /* ScreenSharingUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85D7B93283A85A90053860F /* ScreenSharingUITestsLaunchTests.swift */; };
A85D7BA7283A872C0053860F /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A85D7BA6283A872C0053860F /* ReplayKit.framework */; };
A85D7BAA283A872C0053860F /* SampleHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85D7BA9283A872C0053860F /* SampleHandler.swift */; };
A85D7BBD283A872C0053860F /* Broadcast.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A85D7BA4283A872C0053860F /* Broadcast.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
A85D7BC8283A8DB60053860F /* SampleHandlerUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = A85D7BC6283A8DB50053860F /* SampleHandlerUtil.m */; };
E9AD9A20438981893C51E843 /* Pods_ScreenSharing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE201948A917D346966787E3 /* Pods_ScreenSharing.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
A85D7B84283A85A90053860F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A85D7B65283A85A70053860F /* Project object */;
proxyType = 1;
remoteGlobalIDString = A85D7B6C283A85A70053860F;
remoteInfo = ScreenSharing;
};
A85D7B8E283A85A90053860F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A85D7B65283A85A70053860F /* Project object */;
proxyType = 1;
remoteGlobalIDString = A85D7B6C283A85A70053860F;
remoteInfo = ScreenSharing;
};
A85D7BBB283A872C0053860F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A85D7B65283A85A70053860F /* Project object */;
proxyType = 1;
remoteGlobalIDString = A85D7BA3283A872C0053860F;
remoteInfo = Broadcast;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
A85D7BC4283A872C0053860F /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
A85D7BBD283A872C0053860F /* Broadcast.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
51174865659D68CEEB7018E3 /* Pods-Broadcast.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Broadcast.debug.xcconfig"; path = "Target Support Files/Pods-Broadcast/Pods-Broadcast.debug.xcconfig"; sourceTree = "<group>"; };
67504BE9304AB8FD65C47FF1 /* Pods-ScreenSharing.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScreenSharing.debug.xcconfig"; path = "Target Support Files/Pods-ScreenSharing/Pods-ScreenSharing.debug.xcconfig"; sourceTree = "<group>"; };
6860C2B1B27DF91D7F2AB4E0 /* Pods-ScreenSharingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScreenSharingTests.release.xcconfig"; path = "Target Support Files/Pods-ScreenSharingTests/Pods-ScreenSharingTests.release.xcconfig"; sourceTree = "<group>"; };
6C8E1905D6384D46D2A753D0 /* Pods-Broadcast.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Broadcast.release.xcconfig"; path = "Target Support Files/Pods-Broadcast/Pods-Broadcast.release.xcconfig"; sourceTree = "<group>"; };
7B7819BD6A9CD1211A18659E /* Pods-ScreenSharing-ScreenSharingUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScreenSharing-ScreenSharingUITests.release.xcconfig"; path = "Target Support Files/Pods-ScreenSharing-ScreenSharingUITests/Pods-ScreenSharing-ScreenSharingUITests.release.xcconfig"; sourceTree = "<group>"; };
81C4240A462AADFCC0B35156 /* Pods_Broadcast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Broadcast.framework; sourceTree = BUILT_PRODUCTS_DIR; };
82A94621B239387F1C9C902E /* Pods_ScreenSharingTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ScreenSharingTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
85CA7F7C4EE26F7549362424 /* Pods-ScreenSharing.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScreenSharing.release.xcconfig"; path = "Target Support Files/Pods-ScreenSharing/Pods-ScreenSharing.release.xcconfig"; sourceTree = "<group>"; };
8E94D2CB5EA1D853253684D2 /* Pods_ScreenSharing_ScreenSharingUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ScreenSharing_ScreenSharingUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
A83BE61F283B3C4500CE7021 /* ScreenSharingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenSharingViewController.swift; sourceTree = "<group>"; };
A83BE622283B3CCB00CE7021 /* VideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoView.swift; sourceTree = "<group>"; };
A83BE623283B3CCB00CE7021 /* VideoView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VideoView.xib; sourceTree = "<group>"; };
A85D7B6D283A85A70053860F /* ScreenSharing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScreenSharing.app; sourceTree = BUILT_PRODUCTS_DIR; };
A85D7B70283A85A70053860F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
A85D7B72283A85A70053860F /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
A85D7B74283A85A70053860F /* JoinChannelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinChannelViewController.swift; sourceTree = "<group>"; };
A85D7B77283A85A70053860F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
A85D7B79283A85A90053860F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
A85D7B7C283A85A90053860F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
A85D7B7E283A85A90053860F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A85D7B83283A85A90053860F /* ScreenSharingTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScreenSharingTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
A85D7B87283A85A90053860F /* ScreenSharingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenSharingTests.swift; sourceTree = "<group>"; };
A85D7B8D283A85A90053860F /* ScreenSharingUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScreenSharingUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
A85D7B91283A85A90053860F /* ScreenSharingUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenSharingUITests.swift; sourceTree = "<group>"; };
A85D7B93283A85A90053860F /* ScreenSharingUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenSharingUITestsLaunchTests.swift; sourceTree = "<group>"; };
A85D7BA4283A872C0053860F /* Broadcast.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Broadcast.appex; sourceTree = BUILT_PRODUCTS_DIR; };
A85D7BA6283A872C0053860F /* ReplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReplayKit.framework; path = System/Library/Frameworks/ReplayKit.framework; sourceTree = SDKROOT; };
A85D7BA9283A872C0053860F /* SampleHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleHandler.swift; sourceTree = "<group>"; };
A85D7BAB283A872C0053860F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A85D7BB2283A872C0053860F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
A85D7BC5283A8DB50053860F /* Broadcast-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Broadcast-Bridging-Header.h"; sourceTree = "<group>"; };
A85D7BC6283A8DB50053860F /* SampleHandlerUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SampleHandlerUtil.m; sourceTree = "<group>"; };
A85D7BC7283A8DB50053860F /* SampleHandlerUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleHandlerUtil.h; sourceTree = "<group>"; };
AC92BB00DDA1BE984B2FDA52 /* Pods-ScreenSharingTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScreenSharingTests.debug.xcconfig"; path = "Target Support Files/Pods-ScreenSharingTests/Pods-ScreenSharingTests.debug.xcconfig"; sourceTree = "<group>"; };
CE201948A917D346966787E3 /* Pods_ScreenSharing.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ScreenSharing.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DA987504A54F394A4D7385E1 /* Pods-ScreenSharing-ScreenSharingUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScreenSharing-ScreenSharingUITests.debug.xcconfig"; path = "Target Support Files/Pods-ScreenSharing-ScreenSharingUITests/Pods-ScreenSharing-ScreenSharingUITests.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
A85D7B6A283A85A70053860F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E9AD9A20438981893C51E843 /* Pods_ScreenSharing.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7B80283A85A90053860F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
150C9E013168C53AC1AE6285 /* Pods_ScreenSharingTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7B8A283A85A90053860F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4B78928846FB801C8A9DDCD9 /* Pods_ScreenSharing_ScreenSharingUITests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7BA1283A872C0053860F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
A85D7BA7283A872C0053860F /* ReplayKit.framework in Frameworks */,
7E126BB09B9EF6EFFC4FF418 /* Pods_Broadcast.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
99A3D396B3470A55D04C32B9 /* Pods */ = {
isa = PBXGroup;
children = (
51174865659D68CEEB7018E3 /* Pods-Broadcast.debug.xcconfig */,
6C8E1905D6384D46D2A753D0 /* Pods-Broadcast.release.xcconfig */,
67504BE9304AB8FD65C47FF1 /* Pods-ScreenSharing.debug.xcconfig */,
85CA7F7C4EE26F7549362424 /* Pods-ScreenSharing.release.xcconfig */,
DA987504A54F394A4D7385E1 /* Pods-ScreenSharing-ScreenSharingUITests.debug.xcconfig */,
7B7819BD6A9CD1211A18659E /* Pods-ScreenSharing-ScreenSharingUITests.release.xcconfig */,
AC92BB00DDA1BE984B2FDA52 /* Pods-ScreenSharingTests.debug.xcconfig */,
6860C2B1B27DF91D7F2AB4E0 /* Pods-ScreenSharingTests.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
A83BE621283B3CB900CE7021 /* View */ = {
isa = PBXGroup;
children = (
A83BE622283B3CCB00CE7021 /* VideoView.swift */,
A83BE623283B3CCB00CE7021 /* VideoView.xib */,
);
path = View;
sourceTree = "<group>";
};
A85D7B64283A85A70053860F = {
isa = PBXGroup;
children = (
A85D7B6F283A85A70053860F /* ScreenSharing */,
A85D7B86283A85A90053860F /* ScreenSharingTests */,
A85D7B90283A85A90053860F /* ScreenSharingUITests */,
A85D7BA8283A872C0053860F /* Broadcast */,
A85D7BA5283A872C0053860F /* Frameworks */,
A85D7B6E283A85A70053860F /* Products */,
99A3D396B3470A55D04C32B9 /* Pods */,
);
sourceTree = "<group>";
};
A85D7B6E283A85A70053860F /* Products */ = {
isa = PBXGroup;
children = (
A85D7B6D283A85A70053860F /* ScreenSharing.app */,
A85D7B83283A85A90053860F /* ScreenSharingTests.xctest */,
A85D7B8D283A85A90053860F /* ScreenSharingUITests.xctest */,
A85D7BA4283A872C0053860F /* Broadcast.appex */,
);
name = Products;
sourceTree = "<group>";
};
A85D7B6F283A85A70053860F /* ScreenSharing */ = {
isa = PBXGroup;
children = (
A83BE621283B3CB900CE7021 /* View */,
A85D7B70283A85A70053860F /* AppDelegate.swift */,
A85D7B72283A85A70053860F /* SceneDelegate.swift */,
A85D7B74283A85A70053860F /* JoinChannelViewController.swift */,
A83BE61F283B3C4500CE7021 /* ScreenSharingViewController.swift */,
A85D7B76283A85A70053860F /* Main.storyboard */,
A85D7B79283A85A90053860F /* Assets.xcassets */,
A85D7B7B283A85A90053860F /* LaunchScreen.storyboard */,
A85D7B7E283A85A90053860F /* Info.plist */,
);
path = ScreenSharing;
sourceTree = "<group>";
};
A85D7B86283A85A90053860F /* ScreenSharingTests */ = {
isa = PBXGroup;
children = (
A85D7B87283A85A90053860F /* ScreenSharingTests.swift */,
);
path = ScreenSharingTests;
sourceTree = "<group>";
};
A85D7B90283A85A90053860F /* ScreenSharingUITests */ = {
isa = PBXGroup;
children = (
A85D7B91283A85A90053860F /* ScreenSharingUITests.swift */,
A85D7B93283A85A90053860F /* ScreenSharingUITestsLaunchTests.swift */,
);
path = ScreenSharingUITests;
sourceTree = "<group>";
};
A85D7BA5283A872C0053860F /* Frameworks */ = {
isa = PBXGroup;
children = (
A85D7BA6283A872C0053860F /* ReplayKit.framework */,
A85D7BB2283A872C0053860F /* UIKit.framework */,
81C4240A462AADFCC0B35156 /* Pods_Broadcast.framework */,
CE201948A917D346966787E3 /* Pods_ScreenSharing.framework */,
8E94D2CB5EA1D853253684D2 /* Pods_ScreenSharing_ScreenSharingUITests.framework */,
82A94621B239387F1C9C902E /* Pods_ScreenSharingTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
A85D7BA8283A872C0053860F /* Broadcast */ = {
isa = PBXGroup;
children = (
A85D7BC7283A8DB50053860F /* SampleHandlerUtil.h */,
A85D7BC6283A8DB50053860F /* SampleHandlerUtil.m */,
A85D7BA9283A872C0053860F /* SampleHandler.swift */,
A85D7BC5283A8DB50053860F /* Broadcast-Bridging-Header.h */,
A85D7BAB283A872C0053860F /* Info.plist */,
);
path = Broadcast;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
A85D7B6C283A85A70053860F /* ScreenSharing */ = {
isa = PBXNativeTarget;
buildConfigurationList = A85D7B97283A85A90053860F /* Build configuration list for PBXNativeTarget "ScreenSharing" */;
buildPhases = (
B2AF917EF1AC32987CF1A804 /* [CP] Check Pods Manifest.lock */,
A85D7B69283A85A70053860F /* Sources */,
A85D7B6A283A85A70053860F /* Frameworks */,
A85D7B6B283A85A70053860F /* Resources */,
A85D7BC4283A872C0053860F /* Embed App Extensions */,
0014FB08756F107174FBAC0A /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
A85D7BBC283A872C0053860F /* PBXTargetDependency */,
);
name = ScreenSharing;
productName = ScreenSharing;
productReference = A85D7B6D283A85A70053860F /* ScreenSharing.app */;
productType = "com.apple.product-type.application";
};
A85D7B82283A85A90053860F /* ScreenSharingTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = A85D7B9A283A85A90053860F /* Build configuration list for PBXNativeTarget "ScreenSharingTests" */;
buildPhases = (
8C77C13B9DFCDA82C85B3FE1 /* [CP] Check Pods Manifest.lock */,
A85D7B7F283A85A90053860F /* Sources */,
A85D7B80283A85A90053860F /* Frameworks */,
A85D7B81283A85A90053860F /* Resources */,
);
buildRules = (
);
dependencies = (
A85D7B85283A85A90053860F /* PBXTargetDependency */,
);
name = ScreenSharingTests;
productName = ScreenSharingTests;
productReference = A85D7B83283A85A90053860F /* ScreenSharingTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
A85D7B8C283A85A90053860F /* ScreenSharingUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = A85D7B9D283A85A90053860F /* Build configuration list for PBXNativeTarget "ScreenSharingUITests" */;
buildPhases = (
7BFB8C8DF418CE5FC492490B /* [CP] Check Pods Manifest.lock */,
A85D7B89283A85A90053860F /* Sources */,
A85D7B8A283A85A90053860F /* Frameworks */,
A85D7B8B283A85A90053860F /* Resources */,
A9BA3C0E5E5AA85A4398A951 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
A85D7B8F283A85A90053860F /* PBXTargetDependency */,
);
name = ScreenSharingUITests;
productName = ScreenSharingUITests;
productReference = A85D7B8D283A85A90053860F /* ScreenSharingUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
A85D7BA3283A872C0053860F /* Broadcast */ = {
isa = PBXNativeTarget;
buildConfigurationList = A85D7BC1283A872C0053860F /* Build configuration list for PBXNativeTarget "Broadcast" */;
buildPhases = (
E76C7D0CF26C6CA8BE4D602C /* [CP] Check Pods Manifest.lock */,
A85D7BA0283A872C0053860F /* Sources */,
A85D7BA1283A872C0053860F /* Frameworks */,
A85D7BA2283A872C0053860F /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Broadcast;
productName = Broadcast;
productReference = A85D7BA4283A872C0053860F /* Broadcast.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
A85D7B65283A85A70053860F /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1330;
LastUpgradeCheck = 1330;
TargetAttributes = {
A85D7B6C283A85A70053860F = {
CreatedOnToolsVersion = 13.3;
};
A85D7B82283A85A90053860F = {
CreatedOnToolsVersion = 13.3;
TestTargetID = A85D7B6C283A85A70053860F;
};
A85D7B8C283A85A90053860F = {
CreatedOnToolsVersion = 13.3;
TestTargetID = A85D7B6C283A85A70053860F;
};
A85D7BA3283A872C0053860F = {
CreatedOnToolsVersion = 13.3;
LastSwiftMigration = 1330;
};
};
};
buildConfigurationList = A85D7B68283A85A70053860F /* Build configuration list for PBXProject "ScreenSharing" */;
compatibilityVersion = "Xcode 13.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = A85D7B64283A85A70053860F;
productRefGroup = A85D7B6E283A85A70053860F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
A85D7B6C283A85A70053860F /* ScreenSharing */,
A85D7B82283A85A90053860F /* ScreenSharingTests */,
A85D7B8C283A85A90053860F /* ScreenSharingUITests */,
A85D7BA3283A872C0053860F /* Broadcast */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
A85D7B6B283A85A70053860F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A83BE625283B3CCB00CE7021 /* VideoView.xib in Resources */,
A85D7B7D283A85A90053860F /* LaunchScreen.storyboard in Resources */,
A85D7B7A283A85A90053860F /* Assets.xcassets in Resources */,
A85D7B78283A85A70053860F /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7B81283A85A90053860F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7B8B283A85A90053860F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7BA2283A872C0053860F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
0014FB08756F107174FBAC0A /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ScreenSharing/Pods-ScreenSharing-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ScreenSharing/Pods-ScreenSharing-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ScreenSharing/Pods-ScreenSharing-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
7BFB8C8DF418CE5FC492490B /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-ScreenSharing-ScreenSharingUITests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
8C77C13B9DFCDA82C85B3FE1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-ScreenSharingTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
A9BA3C0E5E5AA85A4398A951 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ScreenSharing-ScreenSharingUITests/Pods-ScreenSharing-ScreenSharingUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ScreenSharing-ScreenSharingUITests/Pods-ScreenSharing-ScreenSharingUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ScreenSharing-ScreenSharingUITests/Pods-ScreenSharing-ScreenSharingUITests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
B2AF917EF1AC32987CF1A804 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-ScreenSharing-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
E76C7D0CF26C6CA8BE4D602C /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Broadcast-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
A85D7B69283A85A70053860F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A85D7B75283A85A70053860F /* JoinChannelViewController.swift in Sources */,
A83BE624283B3CCB00CE7021 /* VideoView.swift in Sources */,
A83BE620283B3C4500CE7021 /* ScreenSharingViewController.swift in Sources */,
A85D7B71283A85A70053860F /* AppDelegate.swift in Sources */,
A85D7B73283A85A70053860F /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7B7F283A85A90053860F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A85D7B88283A85A90053860F /* ScreenSharingTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7B89283A85A90053860F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A85D7B92283A85A90053860F /* ScreenSharingUITests.swift in Sources */,
A85D7B94283A85A90053860F /* ScreenSharingUITestsLaunchTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A85D7BA0283A872C0053860F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A85D7BC8283A8DB60053860F /* SampleHandlerUtil.m in Sources */,
A85D7BAA283A872C0053860F /* SampleHandler.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
A85D7B85283A85A90053860F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = A85D7B6C283A85A70053860F /* ScreenSharing */;
targetProxy = A85D7B84283A85A90053860F /* PBXContainerItemProxy */;
};
A85D7B8F283A85A90053860F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = A85D7B6C283A85A70053860F /* ScreenSharing */;
targetProxy = A85D7B8E283A85A90053860F /* PBXContainerItemProxy */;
};
A85D7BBC283A872C0053860F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = A85D7BA3283A872C0053860F /* Broadcast */;
targetProxy = A85D7BBB283A872C0053860F /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
A85D7B76283A85A70053860F /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
A85D7B77283A85A70053860F /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
A85D7B7B283A85A90053860F /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
A85D7B7C283A85A90053860F /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
A85D7B95283A85A90053860F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.4;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
A85D7B96283A85A90053860F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.4;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
A85D7B98283A85A90053860F /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 67504BE9304AB8FD65C47FF1 /* Pods-ScreenSharing.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ScreenSharing/Info.plist;
INFOPLIST_KEY_NSCameraUsageDescription = "The app is required camera permission to display.";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "The app is required Microphone permission to display.";
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharing;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
A85D7B99283A85A90053860F /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 85CA7F7C4EE26F7549362424 /* Pods-ScreenSharing.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ScreenSharing/Info.plist;
INFOPLIST_KEY_NSCameraUsageDescription = "The app is required camera permission to display.";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "The app is required Microphone permission to display.";
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharing;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
A85D7B9B283A85A90053860F /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = AC92BB00DDA1BE984B2FDA52 /* Pods-ScreenSharingTests.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.4;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharingTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScreenSharing.app/ScreenSharing";
};
name = Debug;
};
A85D7B9C283A85A90053860F /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 6860C2B1B27DF91D7F2AB4E0 /* Pods-ScreenSharingTests.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.4;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharingTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScreenSharing.app/ScreenSharing";
};
name = Release;
};
A85D7B9E283A85A90053860F /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = DA987504A54F394A4D7385E1 /* Pods-ScreenSharing-ScreenSharingUITests.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharingUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = ScreenSharing;
};
name = Debug;
};
A85D7B9F283A85A90053860F /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7B7819BD6A9CD1211A18659E /* Pods-ScreenSharing-ScreenSharingUITests.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharingUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = ScreenSharing;
};
name = Release;
};
A85D7BC2283A872C0053860F /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 51174865659D68CEEB7018E3 /* Pods-Broadcast.debug.xcconfig */;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Broadcast/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Broadcast;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharing.Broadcast;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "Broadcast/Broadcast-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
A85D7BC3283A872C0053860F /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 6C8E1905D6384D46D2A753D0 /* Pods-Broadcast.release.xcconfig */;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = MTXUJ7K3EY;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Broadcast/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Broadcast;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tbl.ScreenSharing.Broadcast;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "Broadcast/Broadcast-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
A85D7B68283A85A70053860F /* Build configuration list for PBXProject "ScreenSharing" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A85D7B95283A85A90053860F /* Debug */,
A85D7B96283A85A90053860F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
A85D7B97283A85A90053860F /* Build configuration list for PBXNativeTarget "ScreenSharing" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A85D7B98283A85A90053860F /* Debug */,
A85D7B99283A85A90053860F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
A85D7B9A283A85A90053860F /* Build configuration list for PBXNativeTarget "ScreenSharingTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A85D7B9B283A85A90053860F /* Debug */,
A85D7B9C283A85A90053860F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
A85D7B9D283A85A90053860F /* Build configuration list for PBXNativeTarget "ScreenSharingUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A85D7B9E283A85A90053860F /* Debug */,
A85D7B9F283A85A90053860F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
A85D7BC1283A872C0053860F /* Build configuration list for PBXNativeTarget "Broadcast" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A85D7BC2283A872C0053860F /* Debug */,
A85D7BC3283A872C0053860F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = A85D7B65283A85A70053860F /* Project object */;
}
================================================
FILE: ScreenSharingTests/ScreenSharingTests.swift
================================================
//
// ScreenSharingTests.swift
// ScreenSharingTests
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import XCTest
@testable import ScreenSharing
class ScreenSharingTests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testExample() throws {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
// Any test you write for XCTest can be annotated as throws and async.
// Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
// Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
}
func testPerformanceExample() throws {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
================================================
FILE: ScreenSharingUITests/ScreenSharingUITests.swift
================================================
//
// ScreenSharingUITests.swift
// ScreenSharingUITests
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import XCTest
class ScreenSharingUITests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testExample() throws {
// UI tests must launch the application that they test.
let app = XCUIApplication()
app.launch()
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testLaunchPerformance() throws {
if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
// This measures how long it takes to launch your application.
measure(metrics: [XCTApplicationLaunchMetric()]) {
XCUIApplication().launch()
}
}
}
}
================================================
FILE: ScreenSharingUITests/ScreenSharingUITestsLaunchTests.swift
================================================
//
// ScreenSharingUITestsLaunchTests.swift
// ScreenSharingUITests
//
// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.
//
import XCTest
class ScreenSharingUITestsLaunchTests: XCTestCase {
override class var runsForEachTargetApplicationUIConfiguration: Bool {
true
}
override func setUpWithError() throws {
continueAfterFailure = false
}
func testLaunch() throws {
let app = XCUIApplication()
app.launch()
// Insert steps here to perform after app launch but before taking a screenshot,
// such as logging into a test account or navigating somewhere in the app
let attachment = XCTAttachment(screenshot: app.screenshot())
attachment.name = "Launch Screen"
attachment.lifetime = .keepAlways
add(attachment)
}
}
gitextract_bff1kkl2/
├── .gitignore
├── Broadcast/
│ ├── Broadcast-Bridging-Header.h
│ ├── Info.plist
│ ├── SampleHandler.swift
│ ├── SampleHandlerUtil.h
│ └── SampleHandlerUtil.m
├── Podfile
├── ScreenSharing/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AccentColor.colorset/
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── JoinChannelViewController.swift
│ ├── SceneDelegate.swift
│ ├── ScreenSharingViewController.swift
│ └── View/
│ ├── VideoView.swift
│ └── VideoView.xib
├── ScreenSharing.xcodeproj/
│ └── project.pbxproj
├── ScreenSharingTests/
│ └── ScreenSharingTests.swift
└── ScreenSharingUITests/
├── ScreenSharingUITests.swift
└── ScreenSharingUITestsLaunchTests.swift
Condensed preview — 23 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (101K chars).
[
{
"path": ".gitignore",
"chars": 2046,
"preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
},
{
"path": "Broadcast/Broadcast-Bridging-Header.h",
"chars": 188,
"preview": "//\n// Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n#import \"SampleH"
},
{
"path": "Broadcast/Info.plist",
"chars": 509,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Broadcast/SampleHandler.swift",
"chars": 1743,
"preview": "//\n// SampleHandler.swift\n// Broadcast\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.\n//\n\nimpor"
},
{
"path": "Broadcast/SampleHandlerUtil.h",
"chars": 363,
"preview": "//\n// SampleHandlerUtil.h\n// Broadcast\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.\n//\n\n#impo"
},
{
"path": "Broadcast/SampleHandlerUtil.m",
"chars": 430,
"preview": "//\n// SampleHandlerUtil.m\n// Broadcast\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.\n//\n\n#impo"
},
{
"path": "Podfile",
"chars": 643,
"preview": "# Uncomment the next line to define a global platform for your project\n# platform :ios, '9.0'\n\ntarget 'Broadcast' do\n #"
},
{
"path": "ScreenSharing/AppDelegate.swift",
"chars": 1379,
"preview": "//\n// AppDelegate.swift\n// ScreenSharing\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.\n//\n\nimp"
},
{
"path": "ScreenSharing/Assets.xcassets/AccentColor.colorset/Contents.json",
"chars": 123,
"preview": "{\n \"colors\" : [\n {\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }"
},
{
"path": "ScreenSharing/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1509,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"scale\" : \"2x\",\n \"size\" : \"20x20\"\n },\n {\n \"idiom\""
},
{
"path": "ScreenSharing/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "ScreenSharing/Base.lproj/LaunchScreen.storyboard",
"chars": 1665,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ScreenSharing/Base.lproj/Main.storyboard",
"chars": 13940,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "ScreenSharing/Info.plist",
"chars": 817,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ScreenSharing/JoinChannelViewController.swift",
"chars": 1197,
"preview": "//\n// ViewController.swift\n// ScreenSharing\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.\n//\n\n"
},
{
"path": "ScreenSharing/SceneDelegate.swift",
"chars": 2322,
"preview": "//\n// SceneDelegate.swift\n// ScreenSharing\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.\n//\n\ni"
},
{
"path": "ScreenSharing/ScreenSharingViewController.swift",
"chars": 7955,
"preview": "//\n// ScreenSharingViewController.swift\n// ScreenSharing\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/"
},
{
"path": "ScreenSharing/View/VideoView.swift",
"chars": 728,
"preview": "//\n// VideoView.swift\n// ScreenSharing\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2022.\n//\n\nimpor"
},
{
"path": "ScreenSharing/View/VideoView.xib",
"chars": 4176,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
},
{
"path": "ScreenSharing.xcodeproj/project.pbxproj",
"chars": 46679,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "ScreenSharingTests/ScreenSharingTests.swift",
"chars": 1265,
"preview": "//\n// ScreenSharingTests.swift\n// ScreenSharingTests\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/22/2"
},
{
"path": "ScreenSharingUITests/ScreenSharingUITests.swift",
"chars": 1411,
"preview": "//\n// ScreenSharingUITests.swift\n// ScreenSharingUITests\n//\n// Created by Thomas Woodfin twoodfin@berkeley.edu on 05/"
},
{
"path": "ScreenSharingUITests/ScreenSharingUITestsLaunchTests.swift",
"chars": 841,
"preview": "//\n// ScreenSharingUITestsLaunchTests.swift\n// ScreenSharingUITests\n//\n// Created by Thomas Woodfin twoodfin@berkeley"
}
]
About this extraction
This page contains the full source code of the ThomasWDev/ReplayKit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 23 files (89.8 KB), approximately 26.5k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.