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 ================================================ FILE: Broadcast/Info.plist ================================================ NSExtension NSExtensionPointIdentifier com.apple.broadcast-services-upload NSExtensionPrincipalClass $(PRODUCT_MODULE_NAME).SampleHandler RPBroadcastProcessMode RPBroadcastProcessModeSampleBuffer ================================================ 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 #import 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) { // 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 ================================================ ================================================ FILE: ScreenSharing/Base.lproj/Main.storyboard ================================================ ================================================ FILE: ScreenSharing/Info.plist ================================================ UIApplicationSceneManifest UIApplicationSupportsMultipleScenes UISceneConfigurations UIWindowSceneSessionRoleApplication UISceneConfigurationName Default Configuration UISceneDelegateClassName $(PRODUCT_MODULE_NAME).SceneDelegate UISceneStoryboardFile Main UIBackgroundModes audio remote-notification ================================================ 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(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 ================================================ ================================================ 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 = ""; }; 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 = ""; }; 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 = ""; }; 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 = ""; }; 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 = ""; }; 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 = ""; }; 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 = ""; }; A83BE622283B3CCB00CE7021 /* VideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoView.swift; sourceTree = ""; }; A83BE623283B3CCB00CE7021 /* VideoView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VideoView.xib; sourceTree = ""; }; 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 = ""; }; A85D7B72283A85A70053860F /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; A85D7B74283A85A70053860F /* JoinChannelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinChannelViewController.swift; sourceTree = ""; }; A85D7B77283A85A70053860F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; A85D7B79283A85A90053860F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; A85D7B7C283A85A90053860F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; A85D7B7E283A85A90053860F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 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 = ""; }; 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 = ""; }; A85D7B93283A85A90053860F /* ScreenSharingUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenSharingUITestsLaunchTests.swift; sourceTree = ""; }; 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 = ""; }; A85D7BAB283A872C0053860F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 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 = ""; }; A85D7BC6283A8DB50053860F /* SampleHandlerUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SampleHandlerUtil.m; sourceTree = ""; }; A85D7BC7283A8DB50053860F /* SampleHandlerUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleHandlerUtil.h; sourceTree = ""; }; 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 = ""; }; 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 = ""; }; /* 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 = ""; }; A83BE621283B3CB900CE7021 /* View */ = { isa = PBXGroup; children = ( A83BE622283B3CCB00CE7021 /* VideoView.swift */, A83BE623283B3CCB00CE7021 /* VideoView.xib */, ); path = View; sourceTree = ""; }; A85D7B64283A85A70053860F = { isa = PBXGroup; children = ( A85D7B6F283A85A70053860F /* ScreenSharing */, A85D7B86283A85A90053860F /* ScreenSharingTests */, A85D7B90283A85A90053860F /* ScreenSharingUITests */, A85D7BA8283A872C0053860F /* Broadcast */, A85D7BA5283A872C0053860F /* Frameworks */, A85D7B6E283A85A70053860F /* Products */, 99A3D396B3470A55D04C32B9 /* Pods */, ); sourceTree = ""; }; A85D7B6E283A85A70053860F /* Products */ = { isa = PBXGroup; children = ( A85D7B6D283A85A70053860F /* ScreenSharing.app */, A85D7B83283A85A90053860F /* ScreenSharingTests.xctest */, A85D7B8D283A85A90053860F /* ScreenSharingUITests.xctest */, A85D7BA4283A872C0053860F /* Broadcast.appex */, ); name = Products; sourceTree = ""; }; 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 = ""; }; A85D7B86283A85A90053860F /* ScreenSharingTests */ = { isa = PBXGroup; children = ( A85D7B87283A85A90053860F /* ScreenSharingTests.swift */, ); path = ScreenSharingTests; sourceTree = ""; }; A85D7B90283A85A90053860F /* ScreenSharingUITests */ = { isa = PBXGroup; children = ( A85D7B91283A85A90053860F /* ScreenSharingUITests.swift */, A85D7B93283A85A90053860F /* ScreenSharingUITestsLaunchTests.swift */, ); path = ScreenSharingUITests; sourceTree = ""; }; 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 = ""; }; 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 = ""; }; /* 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 = ""; }; A85D7B7B283A85A90053860F /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( A85D7B7C283A85A90053860F /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; /* 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) } }