├── Supporting Files ├── InfoPlist.strings └── Info.plist ├── CastHelloVideo-ios.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── project.pbxproj ├── Podfile ├── CastHelloVideo-ios.xcworkspace ├── xcshareddata │ └── IDEWorkspaceChecks.plist └── contents.xcworkspacedata ├── CastHelloVideo-objc ├── CastHelloVideo-objc.entitlements └── Classes │ ├── ViewController.h │ ├── AppDelegate.h │ ├── main.m │ ├── AppDelegate.m │ └── ViewController.m ├── CastHelloVideo-swift ├── CastHelloVideo-swift.entitlements └── Classes │ ├── AppDelegate.swift │ └── ViewController.swift ├── .gitignore ├── Resources ├── Images.xcassets │ ├── LaunchImage.launchimage │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── LaunchScreen.storyboard └── Main.storyboard ├── CONTRIBUTING.md ├── README.md └── LICENSE /Supporting Files/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /CastHelloVideo-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '12.0' 4 | 5 | def target_pods 6 | pod 'google-cast-sdk', '< 5.0', '>=4.7.0' 7 | end 8 | 9 | target 'CastHelloVideo-objc' do 10 | target_pods 11 | end 12 | target 'CastHelloVideo-swift' do 13 | target_pods 14 | end 15 | -------------------------------------------------------------------------------- /CastHelloVideo-ios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CastHelloVideo-objc/CastHelloVideo-objc.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.networking.wifi-info 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CastHelloVideo-swift/CastHelloVideo-swift.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.networking.wifi-info 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CastHelloVideo-ios.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /CastHelloVideo-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | .DS_Store 3 | 4 | ## Build generated 5 | build/ 6 | DerivedData/ 7 | 8 | ## Various settings 9 | *.pbxuser 10 | !default.pbxuser 11 | *.mode1v3 12 | !default.mode1v3 13 | *.mode2v3 14 | !default.mode2v3 15 | *.perspectivev3 16 | !default.perspectivev3 17 | xcuserdata/ 18 | 19 | ## Other 20 | *.moved-aside 21 | *.xccheckout 22 | *.xcscmblueprint 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | 29 | # CocoaPods 30 | Pods 31 | Podfile.lock 32 | -------------------------------------------------------------------------------- /CastHelloVideo-objc/Classes/ViewController.h: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Google LLC. All Rights Reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #import 16 | 17 | @interface ViewController : UIViewController 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /CastHelloVideo-objc/Classes/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Google LLC. All Rights Reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #import 16 | 17 | @interface AppDelegate : UIResponder 18 | 19 | @property(nonatomic, strong) UIWindow *window; 20 | @property(nonatomic, assign) BOOL castControlBarsEnabled; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /CastHelloVideo-objc/Classes/main.m: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Google LLC. All Rights Reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #import 16 | 17 | #import "AppDelegate.h" 18 | 19 | int main(int argc, char* argv[]) { 20 | @autoreleasepool { 21 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Resources/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "orientation" : "portrait", 20 | "idiom" : "ipad", 21 | "extent" : "full-screen", 22 | "minimum-system-version" : "7.0", 23 | "scale" : "1x" 24 | }, 25 | { 26 | "orientation" : "landscape", 27 | "idiom" : "ipad", 28 | "extent" : "full-screen", 29 | "minimum-system-version" : "7.0", 30 | "scale" : "1x" 31 | }, 32 | { 33 | "orientation" : "portrait", 34 | "idiom" : "ipad", 35 | "extent" : "full-screen", 36 | "minimum-system-version" : "7.0", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "orientation" : "landscape", 41 | "idiom" : "ipad", 42 | "extent" : "full-screen", 43 | "minimum-system-version" : "7.0", 44 | "scale" : "2x" 45 | } 46 | ], 47 | "info" : { 48 | "version" : 1, 49 | "author" : "xcode" 50 | } 51 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to become a contributor and submit your own code 2 | 3 | ## Contributor License Agreements 4 | 5 | We'd love to accept your sample apps and patches! Before we can take them, we 6 | have to jump a couple of legal hurdles. 7 | 8 | Please fill out either the individual or corporate Contributor License Agreement 9 | (CLA). 10 | 11 | * If you are an individual writing original source code and you're sure you 12 | own the intellectual property, then you'll need to sign an [individual CLA] 13 | (https://cla.developers.google.com/about/google-individual). 14 | * If you work for a company that wants to allow you to contribute your work, 15 | then you'll need to sign a [corporate CLA] 16 | (https://cla.developers.google.com/about/google-corporate). 17 | 18 | Follow either of the two links above to access the appropriate CLA and 19 | instructions for how to sign and return it. Once we receive it, we'll be able to 20 | accept your pull requests. 21 | 22 | ## Contributing a Patch 23 | 24 | 1. Sign a Contributor License Agreement, if you have not yet done so (see 25 | details above). 26 | 1. Create your change to the repo in question. 27 | * Fork the desired repo, develop and test your code changes. 28 | * Ensure that your code is clear and comprehensible. 29 | * Ensure that your code has an appropriate set of unit tests which all pass. 30 | 1. Submit a pull request. 31 | 1. The repo owner will review your request. If it is approved, the change will 32 | be merged. If it needs additional work, the repo owner will respond with 33 | useful comments. 34 | -------------------------------------------------------------------------------- /Resources/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSBluetoothAlwaysUsageDescription 28 | ${PRODUCT_NAME} uses Bluetooth to discover nearby devices. 29 | NSBonjourServices 30 | 31 | _googlecast._tcp 32 | _C0868879._googlecast._tcp 33 | 34 | NSLocalNetworkUsageDescription 35 | ${PRODUCT_NAME} uses the local network to discover Cast-enabled devices on your WiFi network. 36 | NSMicrophoneUsageDescription 37 | ${PRODUCT_NAME} uses the microphone to discover nearby devices. 38 | UILaunchStoryboardName 39 | LaunchScreen 40 | UIMainStoryboardFile 41 | Main 42 | UIMainStoryboardFile~ipad 43 | Main 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | UISupportedInterfaceOrientations~ipad 55 | 56 | UIInterfaceOrientationPortrait 57 | UIInterfaceOrientationPortraitUpsideDown 58 | UIInterfaceOrientationLandscapeLeft 59 | UIInterfaceOrientationLandscapeRight 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CastHelloVideo-ios 2 | 3 | This Google Cast demo app shows how an iOS sender app can cast a Video. For simplicity this app is not fully compliant with the UX Checklist. 4 | 5 | **The project contains targets for both Objective-C and Swift.** 6 | 7 | [List of reference apps and tutorials](https://developers.google.com/cast/docs/downloads) 8 | 9 | ## Dependencies 10 | * CocoaPods - dependencies are managed via CocoaPods. See http://guides.cocoapods.org/using/getting-started.html for setup instructions. 11 | * Alternatively, you may download the iOS Sender API library directly at: [https://developers.google.com/cast/docs/developers#ios](https://developers.google.com/cast/docs/developers#ios "iOS Sender API library") 12 | 13 | ## Setup Instructions 14 | 1. Get a Google Cast device and get it set up for development: https://developers.google.com/cast/docs/developers#setup_for_development. 15 | 1. [Optional] Register an application on the Developers Console [http://cast.google.com/publish](http://cast.google.com/publish "Google Cast Developer Console"). 16 | You will get an App ID when you finish registering your application. This project uses a published Application ID that 17 | can be used to run the app without using your own ID but if you need to do any console debugging, you would need to 18 | have your own ID. 19 | * **If you use DRM, you will need to use your own App ID.** 20 | 1. Setup the project dependencies in Xcode using Cocoapods, installing the tool if necessary: See this [guide](http://guides.cocoapods.org/using/getting-started.html). 21 | 1. In the root folder, run `pod repo update` and then `pod install`. 22 | 1. Open the .xcworkspace file rather the the xcproject to ensure you have the pod dependencies. 23 | 1. The `AppDelegate.swift`/`AppDelegate.m` includes a published receiver App ID so the project can be built and run without a need 24 | to register an ID. 25 | * **Update this value with your own App ID to use your own receiver to debug and use DRM.** 26 | 1. The `Info.plist` lists the published receiver App ID for `NSBonjourServices` which is used to discover Cast devices. 27 | * **Update this value with your own App ID if you are using a custom receiver.** 28 | 1. For additional setup steps, see the [Xcode setup guide](https://developers.google.com/cast/docs/ios_sender_setup#xcode_setup). 29 | 30 | ## Documentation 31 | * [Google Cast iOS Sender Overview](https://developers.google.com/cast/docs/ios_sender/) 32 | * [Developer Guides](https://developers.google.com/cast/docs/developers) 33 | 34 | ## References 35 | * [iOS Sender Reference](https://developers.google.com/cast/v3/reference/ios/) 36 | * [Design Checklist](http://developers.google.com/cast/docs/design_checklist) 37 | 38 | ## How to report bugs 39 | * [Google Cast SDK Support](https://developers.google.com/cast/support) 40 | * [Sample App Issues](https://issuetracker.google.com/issues/new?component=190205&template=1901999) 41 | 42 | ## Contributions 43 | Please read and follow the steps in the [CONTRIBUTING.md](CONTRIBUTING.md). 44 | 45 | ## License 46 | See [LICENSE](LICENSE). 47 | 48 | ## Terms 49 | Your use of this sample is subject to, and by using or downloading the sample files you agree to comply with, the [Google APIs Terms of Service](https://developers.google.com/terms/) and the [Google Cast SDK Additional Developer Terms of Service](https://developers.google.com/cast/docs/terms/). 50 | -------------------------------------------------------------------------------- /CastHelloVideo-swift/Classes/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Google LLC. All Rights Reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | import GoogleCast 16 | import UIKit 17 | 18 | @UIApplicationMain 19 | class AppDelegate: UIResponder, UIApplicationDelegate, GCKLoggerDelegate { 20 | // You can add your own app id here that you get by registering with the Google Cast SDK 21 | // Developer Console https://cast.google.com/publish or use kGCKDefaultMediaReceiverApplicationID 22 | let kReceiverAppID = "C0868879" 23 | let kDebugLoggingEnabled = true 24 | 25 | var window: UIWindow? 26 | 27 | func applicationDidFinishLaunching(_: UIApplication) { 28 | // Set your receiver application ID. 29 | let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID) 30 | let options = GCKCastOptions(discoveryCriteria: criteria) 31 | options.physicalVolumeButtonsWillControlDeviceVolume = true 32 | 33 | // Following code enables Cast Connect 34 | let launchOptions = GCKLaunchOptions() 35 | launchOptions.androidReceiverCompatible = true 36 | options.launchOptions = launchOptions 37 | 38 | GCKCastContext.setSharedInstanceWith(options) 39 | GCKCastContext.sharedInstance().setLaunch(GCKCredentialsData(credentials: "{\"userId\": \"123\"}")) 40 | // Configure widget styling. 41 | // Theme using UIAppearance. 42 | UINavigationBar.appearance().barTintColor = .lightGray 43 | let colorAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black] 44 | UINavigationBar().titleTextAttributes = colorAttributes 45 | GCKUICastButton.appearance().tintColor = .gray 46 | 47 | // Theme using GCKUIStyle. 48 | let castStyle = GCKUIStyle.sharedInstance() 49 | // Set the property of the desired cast widgets. 50 | castStyle.castViews.deviceControl.buttonTextColor = .darkGray 51 | // Refresh all currently visible views with the assigned styles. 52 | castStyle.apply() 53 | 54 | // Enable default expanded controller. 55 | GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true 56 | 57 | // Enable logger. 58 | GCKLogger.sharedInstance().delegate = self 59 | 60 | // Set logger filter. 61 | let filter = GCKLoggerFilter() 62 | filter.minimumLevel = .error 63 | GCKLogger.sharedInstance().filter = filter 64 | 65 | // Wrap main view in the GCKUICastContainerViewController and display the mini controller. 66 | let appStoryboard = UIStoryboard(name: "Main", bundle: nil) 67 | let navigationController = appStoryboard.instantiateViewController(withIdentifier: "MainNavigation") 68 | let castContainerVC = GCKCastContext.sharedInstance().createCastContainerController(for: navigationController) 69 | castContainerVC.miniMediaControlsItemEnabled = true 70 | 71 | window = UIWindow(frame: UIScreen.main.bounds) 72 | window?.rootViewController = castContainerVC 73 | window?.makeKeyAndVisible() 74 | } 75 | 76 | // MARK: - GCKLoggerDelegate 77 | 78 | func logMessage(_ message: String, 79 | at _: GCKLoggerLevel, 80 | fromFunction function: String, 81 | location: String) { 82 | if kDebugLoggingEnabled { 83 | print("\(location): \(function) - \(message)") 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /CastHelloVideo-objc/Classes/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Google LLC. All Rights Reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #import "AppDelegate.h" 16 | #import 17 | 18 | // You can add your own app id here that you get by registering with the Google 19 | // Cast SDK Developer Console https://cast.google.com/publish 20 | static NSString *const kReceiverAppID = @"C0868879"; 21 | static Boolean const kDebugLoggingEnabled = YES; 22 | 23 | @interface AppDelegate () { 24 | } 25 | 26 | @end 27 | 28 | @implementation AppDelegate 29 | 30 | - (BOOL)application:(UIApplication *)application 31 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 32 | // Set your receiver application ID. 33 | GCKDiscoveryCriteria *criteria = 34 | [[GCKDiscoveryCriteria alloc] initWithApplicationID:kReceiverAppID]; 35 | GCKCastOptions *options = [[GCKCastOptions alloc] initWithDiscoveryCriteria:criteria]; 36 | options.physicalVolumeButtonsWillControlDeviceVolume = YES; 37 | 38 | // Following code enables Cast Connect 39 | GCKLaunchOptions *gckLaunchOptions = [[GCKLaunchOptions alloc] init]; 40 | gckLaunchOptions.androidReceiverCompatible = YES; 41 | options.launchOptions = gckLaunchOptions; 42 | 43 | [GCKCastContext setSharedInstanceWithOptions:options]; 44 | 45 | // Configure widget styling. 46 | // Theme using UIAppearance. 47 | [UINavigationBar appearance].barTintColor = [UIColor lightGrayColor]; 48 | NSDictionary *colorAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]}; 49 | [UINavigationBar appearance].titleTextAttributes = colorAttributes; 50 | [GCKUICastButton appearance].tintColor = [UIColor grayColor]; 51 | 52 | // Theme using GCKUIStyle. 53 | GCKUIStyle *castStyle = [GCKUIStyle sharedInstance]; 54 | // Set the property of the desired cast widgets. 55 | castStyle.castViews.deviceControl.buttonTextColor = [UIColor darkGrayColor]; 56 | // Refresh all currently visible views with the assigned styles. 57 | [castStyle applyStyle]; 58 | 59 | // Enable default expanded controller. 60 | [GCKCastContext sharedInstance].useDefaultExpandedMediaControls = YES; 61 | 62 | // Enable logger. 63 | [GCKLogger sharedInstance].delegate = self; 64 | 65 | // Set logger filter. 66 | GCKLoggerFilter *filter = [[GCKLoggerFilter alloc] init]; 67 | filter.minimumLevel = GCKLoggerLevelError; 68 | [GCKLogger sharedInstance].filter = filter; 69 | 70 | // Wrap main view in the GCKUICastContainerViewController and display the mini 71 | // controller. 72 | UIStoryboard *appStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 73 | UINavigationController *navigationController = 74 | [appStoryboard instantiateViewControllerWithIdentifier:@"MainNavigation"]; 75 | GCKUICastContainerViewController *castContainerVC = [[GCKCastContext sharedInstance] 76 | createCastContainerControllerForViewController:navigationController]; 77 | castContainerVC.miniMediaControlsItemEnabled = YES; 78 | 79 | self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 80 | self.window.rootViewController = castContainerVC; 81 | [self.window makeKeyAndVisible]; 82 | 83 | return YES; 84 | } 85 | 86 | #pragma mark - GCKLoggerDelegate 87 | 88 | - (void)logMessage:(NSString *)message 89 | atLevel:(GCKLoggerLevel)level 90 | fromFunction:(NSString *)function 91 | location:(NSString *)location { 92 | if (kDebugLoggingEnabled) { 93 | NSLog(@"%@: %@ - %@", location, function, message); 94 | } 95 | } 96 | 97 | @end 98 | -------------------------------------------------------------------------------- /Resources/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 28 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /CastHelloVideo-swift/Classes/ViewController.swift: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Google LLC. All Rights Reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | import GoogleCast 16 | import UIKit 17 | 18 | @objc(ViewController) 19 | class ViewController: UIViewController, GCKSessionManagerListener, GCKRemoteMediaClientListener, GCKRequestDelegate { 20 | @IBOutlet var castVideoButton: UIButton! 21 | @IBOutlet var castInstructionLabel: UILabel! 22 | @IBOutlet var credsToggleButton: UIButton! 23 | @IBOutlet var credsLabel: UILabel! 24 | 25 | private var castButton: GCKUICastButton! 26 | private var mediaInformation: GCKMediaInformation? 27 | private var sessionManager: GCKSessionManager! 28 | private let NULL_CREDENTIALS = "N/A" 29 | 30 | override func viewDidLoad() { 31 | super.viewDidLoad() 32 | 33 | // Initially hide the cast button until a session is started. 34 | showLoadVideoButton(showButton: false) 35 | 36 | sessionManager = GCKCastContext.sharedInstance().sessionManager 37 | sessionManager.add(self) 38 | 39 | // Add cast button. 40 | castButton = GCKUICastButton(frame: CGRect(x: 0, y: 0, width: 24, height: 24)) 41 | 42 | // Used to overwrite the theme in AppDelegate. 43 | castButton.tintColor = .darkGray 44 | 45 | // Initial default value 46 | self.credsLabel.text = NULL_CREDENTIALS 47 | setLaunchCreds() 48 | 49 | navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton) 50 | 51 | NotificationCenter.default.addObserver(self, 52 | selector: #selector(castDeviceDidChange(notification:)), 53 | name: NSNotification.Name.gckCastStateDidChange, 54 | object: GCKCastContext.sharedInstance()) 55 | } 56 | 57 | @objc func castDeviceDidChange(notification _: Notification) { 58 | if GCKCastContext.sharedInstance().castState != GCKCastState.noDevicesAvailable { 59 | // Display the instructions for how to use Google Cast on the first app use. 60 | GCKCastContext.sharedInstance().presentCastInstructionsViewControllerOnce(with: castButton) 61 | } 62 | } 63 | 64 | // MARK: Cast Actions 65 | 66 | func playVideoRemotely() { 67 | GCKCastContext.sharedInstance().presentDefaultExpandedMediaControls() 68 | 69 | // Define media metadata. 70 | let metadata = GCKMediaMetadata() 71 | metadata.setString("Big Buck Bunny (2008)", forKey: kGCKMetadataKeyTitle) 72 | metadata.setString("Big Buck Bunny tells the story of a giant rabbit with a heart bigger than " + 73 | "himself. When one sunny day three rodents rudely harass him, something " + 74 | "snaps... and the rabbit ain't no bunny anymore! In the typical cartoon " + 75 | "tradition he prepares the nasty rodents a comical revenge.", 76 | forKey: kGCKMetadataKeySubtitle) 77 | metadata.addImage(GCKImage(url: URL(string: "https://storage.googleapis.com/cpe-sample-media/transfer/big_buck_bunny/images/gtv-image.jpg")!, 78 | width: 480, 79 | height: 360)) 80 | 81 | let mediaInfoBuilder = GCKMediaInformationBuilder(contentURL: URL(string: 82 | "https://storage.googleapis.com/cpe-sample-media/transfer/big_buck_bunny/big_buck_bunny_ts_master.m3u8")!) 83 | mediaInfoBuilder.streamType = GCKMediaStreamType.none 84 | mediaInfoBuilder.contentType = "video/mp4" 85 | mediaInfoBuilder.metadata = metadata 86 | mediaInformation = mediaInfoBuilder.build() 87 | 88 | let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder() 89 | mediaLoadRequestDataBuilder.mediaInformation = mediaInformation 90 | mediaLoadRequestDataBuilder.credentials = credsLabel.text 91 | 92 | // Send a load request to the remote media client. 93 | if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia(with: mediaLoadRequestDataBuilder.build()) { 94 | request.delegate = self 95 | } 96 | } 97 | 98 | // Toggle label text and set those credentials for next session 99 | @IBAction func setCredentials(_ sender: Any) { 100 | let credentials = credsLabel.text 101 | if (credentials == NULL_CREDENTIALS) { 102 | credsLabel.text = "{\"userId\":\"id123\"}" 103 | } else { 104 | credsLabel.text = NULL_CREDENTIALS 105 | } 106 | setLaunchCreds() 107 | } 108 | 109 | @IBAction func loadVideo(sender _: AnyObject) { 110 | print("Load Video") 111 | 112 | if sessionManager.currentSession == nil { 113 | print("Cast device not connected") 114 | return 115 | } 116 | 117 | playVideoRemotely() 118 | } 119 | 120 | func showLoadVideoButton(showButton: Bool) { 121 | castVideoButton.isHidden = !showButton 122 | // Instructions should always be the opposite visibility of the video button. 123 | castInstructionLabel.isHidden = !castVideoButton.isHidden 124 | } 125 | 126 | // MARK: GCKSessionManagerListener 127 | 128 | func sessionManager(_: GCKSessionManager, 129 | didStart session: GCKSession) { 130 | print("sessionManager didStartSession: \(session)") 131 | 132 | // Add GCKRemoteMediaClientListener. 133 | session.remoteMediaClient?.add(self) 134 | 135 | showLoadVideoButton(showButton: true) 136 | } 137 | 138 | func sessionManager(_: GCKSessionManager, 139 | didResumeSession session: GCKSession) { 140 | print("sessionManager didResumeSession: \(session)") 141 | 142 | // Add GCKRemoteMediaClientListener. 143 | session.remoteMediaClient?.add(self) 144 | 145 | showLoadVideoButton(showButton: true) 146 | } 147 | 148 | func sessionManager(_: GCKSessionManager, 149 | didEnd session: GCKSession, 150 | withError error: Error?) { 151 | print("sessionManager didEndSession: \(session)") 152 | 153 | // Remove GCKRemoteMediaClientListener. 154 | session.remoteMediaClient?.remove(self) 155 | 156 | if let error = error { 157 | showError(error) 158 | } 159 | 160 | showLoadVideoButton(showButton: false) 161 | } 162 | 163 | func sessionManager(_: GCKSessionManager, 164 | didFailToStart session: GCKSession, 165 | withError error: Error) { 166 | print("sessionManager didFailToStartSessionWithError: \(session) error: \(error)") 167 | 168 | // Remove GCKRemoteMediaClientListener. 169 | session.remoteMediaClient?.remove(self) 170 | 171 | showLoadVideoButton(showButton: false) 172 | } 173 | 174 | // MARK: GCKRemoteMediaClientListener 175 | 176 | func remoteMediaClient(_: GCKRemoteMediaClient, 177 | didUpdate mediaStatus: GCKMediaStatus?) { 178 | if let mediaStatus = mediaStatus { 179 | mediaInformation = mediaStatus.mediaInformation 180 | } 181 | } 182 | 183 | // MARK: - GCKRequestDelegate 184 | 185 | func requestDidComplete(_ request: GCKRequest) { 186 | print("request \(Int(request.requestID)) completed") 187 | } 188 | 189 | func request(_ request: GCKRequest, 190 | didFailWithError error: GCKError) { 191 | print("request \(Int(request.requestID)) didFailWithError \(error)") 192 | } 193 | 194 | func request(_ request: GCKRequest, 195 | didAbortWith abortReason: GCKRequestAbortReason) { 196 | print("request \(Int(request.requestID)) didAbortWith reason \(abortReason)") 197 | } 198 | 199 | // MARK: Misc 200 | 201 | func showError(_ error: Error) { 202 | let alertController = UIAlertController(title: "Error", 203 | message: error.localizedDescription, 204 | preferredStyle: UIAlertController.Style.alert) 205 | let action = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil) 206 | alertController.addAction(action) 207 | 208 | present(alertController, animated: true, completion: nil) 209 | } 210 | 211 | func setLaunchCreds() { 212 | let creds = credsLabel.text 213 | GCKCastContext.sharedInstance().setLaunch(GCKCredentialsData(credentials: (creds == NULL_CREDENTIALS) ? nil : creds)) 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /Resources/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 54 | 63 | 71 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /CastHelloVideo-objc/Classes/ViewController.m: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Google LLC. All Rights Reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #import "ViewController.h" 16 | #import 17 | 18 | static NSString *const NULL_CREDENTIALS = @"N/A"; 19 | 20 | @interface ViewController () { 23 | } 24 | 25 | @property(nonatomic, weak) IBOutlet UIButton *castVideoButton; 26 | @property(nonatomic, weak) IBOutlet UILabel *castInstructionLabel; 27 | @property(nonatomic, weak) IBOutlet UIButton *credsToggleButton; 28 | @property(nonatomic, weak) IBOutlet UILabel *credsLabel; 29 | 30 | @property(nonatomic, strong) GCKUICastButton *castButton; 31 | @property(nonatomic, strong) GCKMediaInformation *mediaInformation; 32 | @property(nonatomic, strong) GCKSessionManager *sessionManager; 33 | 34 | @end 35 | 36 | @implementation ViewController 37 | 38 | - (void)viewDidLoad { 39 | [super viewDidLoad]; 40 | 41 | // Initially hide the cast button until a session is started. 42 | [self showLoadVideoButton:NO]; 43 | 44 | self.sessionManager = [GCKCastContext sharedInstance].sessionManager; 45 | [self.sessionManager addListener:self]; 46 | 47 | // Add cast button. 48 | self.castButton = [[GCKUICastButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)]; 49 | 50 | // Used to overwrite the theme in AppDelegate. 51 | self.castButton.tintColor = [UIColor darkGrayColor]; 52 | 53 | self.navigationItem.rightBarButtonItem = 54 | [[UIBarButtonItem alloc] initWithCustomView:self.castButton]; 55 | 56 | [[NSNotificationCenter defaultCenter] addObserver:self 57 | selector:@selector(castDeviceDidChange:) 58 | name:kGCKCastStateDidChangeNotification 59 | object:[GCKCastContext sharedInstance]]; 60 | _credsLabel.text = NULL_CREDENTIALS; 61 | [self setLaunchCreds]; 62 | } 63 | 64 | - (IBAction)setCredentials:(id)sender { 65 | NSString *creds = _credsLabel.text; 66 | if(creds == NULL_CREDENTIALS) 67 | { 68 | _credsLabel.text = @"{\"userId\":\"id123\"}"; 69 | } else { 70 | _credsLabel.text = NULL_CREDENTIALS; 71 | } 72 | [self setLaunchCreds]; 73 | } 74 | 75 | - (void) setLaunchCreds { 76 | NSString *creds = _credsLabel.text; 77 | GCKCredentialsData *credsData = [[GCKCredentialsData alloc] initWithCredentials:creds]; 78 | [[GCKCastContext sharedInstance] setLaunchCredentialsData:credsData]; 79 | } 80 | 81 | - (void)castDeviceDidChange:(NSNotification *)notification { 82 | if ([GCKCastContext sharedInstance].castState != GCKCastStateNoDevicesAvailable) { 83 | // Display the instructions for how to use Google Cast on the first app use. 84 | [[GCKCastContext sharedInstance] 85 | presentCastInstructionsViewControllerOnceWithCastButton:self.castButton]; 86 | } 87 | } 88 | 89 | #pragma mark - Cast Actions 90 | 91 | - (void)playVideoRemotely { 92 | [[GCKCastContext sharedInstance] presentDefaultExpandedMediaControls]; 93 | 94 | // Define media metadata. 95 | GCKMediaMetadata *metadata = [[GCKMediaMetadata alloc] init]; 96 | [metadata setString:@"Big Buck Bunny (2008)" forKey:kGCKMetadataKeyTitle]; 97 | [metadata setString:@"Big Buck Bunny tells the story of a giant rabbit with a " 98 | "heart bigger than himself. When one sunny day three rodents rudely harass him, " 99 | "something snaps... and the rabbit ain't no bunny anymore! In the " 100 | "typical cartoon tradition he prepares the nasty rodents a comical revenge." 101 | forKey:kGCKMetadataKeySubtitle]; 102 | [metadata addImage:[[GCKImage alloc] 103 | initWithURL: 104 | [[NSURL alloc] 105 | initWithString:@"https://commondatastorage.googleapis.com/" 106 | "cpe-sample-media/transfer/big_buck_bunny/images/gtv-image.jpg"] 107 | width:480 108 | height:360]]; 109 | 110 | // Define information about the media item. 111 | GCKMediaInformationBuilder *mediaInfoBuilder = [[GCKMediaInformationBuilder alloc] 112 | initWithContentURL:[NSURL URLWithString:@"https://commondatastorage.googleapis.com/" 113 | "cpe-sample-media/transfer/big_buck_bunny/prog/big_buck_bunny_prog.mp4"]]; 114 | mediaInfoBuilder.streamType = GCKMediaStreamTypeNone; 115 | mediaInfoBuilder.contentType = @"video/mp4"; 116 | mediaInfoBuilder.metadata = metadata; 117 | self.mediaInformation = [mediaInfoBuilder build]; 118 | 119 | GCKMediaLoadRequestDataBuilder *mediaLoadRequestDataBuilder = [[GCKMediaLoadRequestDataBuilder alloc] init]; 120 | mediaLoadRequestDataBuilder.mediaInformation = self.mediaInformation; 121 | 122 | // Send a load request to the remote media client. 123 | GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient 124 | loadMediaWithLoadRequestData:[mediaLoadRequestDataBuilder build]]; 125 | if (request != nil) { 126 | request.delegate = self; 127 | } 128 | } 129 | 130 | - (IBAction)loadVideoWithSender:(id)sender { 131 | NSLog(@"Load Video"); 132 | 133 | if (!self.sessionManager.currentSession) { 134 | NSLog(@"Cast device not connected"); 135 | return; 136 | } 137 | 138 | [self playVideoRemotely]; 139 | } 140 | 141 | - (void)showLoadVideoButton:(BOOL)yn { 142 | self.castVideoButton.hidden = !yn; 143 | // Instructions should always be the opposite visibility of the video button. 144 | self.castInstructionLabel.hidden = !self.castVideoButton.hidden; 145 | } 146 | 147 | #pragma mark - GCKSessionManagerListener 148 | 149 | - (void)sessionManager:(GCKSessionManager *)sessionManager didStartSession:(GCKSession *)session { 150 | NSLog(@"sessionManager didStartSession %@", session); 151 | 152 | // Add GCKRemoteMediaClientListener. 153 | if (session.remoteMediaClient) { 154 | [session.remoteMediaClient addListener:self]; 155 | } 156 | 157 | [self showLoadVideoButton:YES]; 158 | } 159 | 160 | - (void)sessionManager:(GCKSessionManager *)sessionManager didResumeSession:(GCKSession *)session { 161 | NSLog(@"sessionManager didResumeSession %@", session); 162 | 163 | // Add GCKRemoteMediaClientListener. 164 | if (session.remoteMediaClient) { 165 | [session.remoteMediaClient addListener:self]; 166 | } 167 | 168 | [self showLoadVideoButton:YES]; 169 | } 170 | 171 | - (void)sessionManager:(GCKSessionManager *)sessionManager 172 | didEndSession:(GCKSession *)session 173 | withError:(NSError *)error { 174 | NSLog(@"sessionManager didEndSession %@", session); 175 | 176 | // Remove GCKRemoteMediaClientListener. 177 | if (session.remoteMediaClient) { 178 | [session.remoteMediaClient removeListener:self]; 179 | } 180 | 181 | [self showLoadVideoButton:NO]; 182 | 183 | if (error) { 184 | [self showError:error]; 185 | } 186 | } 187 | 188 | - (void)sessionManager:(GCKSessionManager *)sessionManager 189 | didFailToStartSessionWithError:(NSError *)error { 190 | NSLog(@"sessionManager didFailToStartSessionWithError %@", error); 191 | 192 | [self showLoadVideoButton:NO]; 193 | } 194 | 195 | - (void)sessionManager:(GCKSessionManager *)sessionManager 196 | didFailToResumeSession:(GCKSession *)session 197 | withError:(NSError *)error { 198 | NSLog(@"sessionManager didFailToResumeSession: %@ error: %@", session, error); 199 | 200 | // Remove GCKRemoteMediaClientListener. 201 | if (session.remoteMediaClient) { 202 | [session.remoteMediaClient removeListener:self]; 203 | } 204 | 205 | [self showLoadVideoButton:NO]; 206 | } 207 | 208 | #pragma mark - GCKRemoteMediaClientListener 209 | 210 | - (void)remoteMediaClient:(GCKRemoteMediaClient *)player 211 | didUpdateMediaStatus:(GCKMediaStatus *)mediaStatus { 212 | self.mediaInformation = mediaStatus.mediaInformation; 213 | } 214 | 215 | #pragma mark - GCKRequestDelegate 216 | 217 | - (void)requestDidComplete:(GCKRequest *)request { 218 | NSLog(@"request %ld completed", request.requestID); 219 | } 220 | 221 | - (void)request:(GCKRequest *)request didFailWithError:(GCKError *)error { 222 | NSLog(@"request %ld didFailWithError %@", request.requestID, error); 223 | } 224 | 225 | - (void)request:(GCKRequest *)request didAbortWithReason:(GCKRequestAbortReason)abortReason { 226 | NSLog(@"request %ld didAbortWithReason %ld", request.requestID, (long)abortReason); 227 | } 228 | 229 | #pragma mark - misc 230 | 231 | - (void)showError:(NSError *)error { 232 | UIAlertController *alert = 233 | [UIAlertController alertControllerWithTitle:@"Error" 234 | message:error.description 235 | preferredStyle:UIAlertControllerStyleAlert]; 236 | UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" 237 | style:UIAlertActionStyleDefault 238 | handler:nil]; 239 | [alert addAction:action]; 240 | [self presentViewController:alert animated:YES completion:nil]; 241 | } 242 | 243 | @end 244 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, and 10 | distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by the copyright 13 | owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all other entities 16 | that control, are controlled by, or are under common control with that entity. 17 | For the purposes of this definition, "control" means (i) the power, direct or 18 | indirect, to cause the direction or management of such entity, whether by 19 | contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the 20 | outstanding shares, or (iii) beneficial ownership of such entity. 21 | 22 | "You" (or "Your") shall mean an individual or Legal Entity exercising 23 | permissions granted by this License. 24 | 25 | "Source" form shall mean the preferred form for making modifications, including 26 | but not limited to software source code, documentation source, and configuration 27 | files. 28 | 29 | "Object" form shall mean any form resulting from mechanical transformation or 30 | translation of a Source form, including but not limited to compiled object code, 31 | generated documentation, and conversions to other media types. 32 | 33 | "Work" shall mean the work of authorship, whether in Source or Object form, made 34 | available under the License, as indicated by a copyright notice that is included 35 | in or attached to the work (an example is provided in the Appendix below). 36 | 37 | "Derivative Works" shall mean any work, whether in Source or Object form, that 38 | is based on (or derived from) the Work and for which the editorial revisions, 39 | annotations, elaborations, or other modifications represent, as a whole, an 40 | original work of authorship. For the purposes of this License, Derivative Works 41 | shall not include works that remain separable from, or merely link (or bind by 42 | name) to the interfaces of, the Work and Derivative Works thereof. 43 | 44 | "Contribution" shall mean any work of authorship, including the original version 45 | of the Work and any modifications or additions to that Work or Derivative Works 46 | thereof, that is intentionally submitted to Licensor for inclusion in the Work 47 | by the copyright owner or by an individual or Legal Entity authorized to submit 48 | on behalf of the copyright owner. For the purposes of this definition, 49 | "submitted" means any form of electronic, verbal, or written communication sent 50 | to the Licensor or its representatives, including but not limited to 51 | communication on electronic mailing lists, source code control systems, and 52 | issue tracking systems that are managed by, or on behalf of, the Licensor for 53 | the purpose of discussing and improving the Work, but excluding communication 54 | that is conspicuously marked or otherwise designated in writing by the copyright 55 | owner as "Not a Contribution." 56 | 57 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf 58 | of whom a Contribution has been received by Licensor and subsequently 59 | incorporated within the Work. 60 | 61 | 2. Grant of Copyright License. 62 | 63 | Subject to the terms and conditions of this License, each Contributor hereby 64 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 65 | irrevocable copyright license to reproduce, prepare Derivative Works of, 66 | publicly display, publicly perform, sublicense, and distribute the Work and such 67 | Derivative Works in Source or Object form. 68 | 69 | 3. Grant of Patent License. 70 | 71 | Subject to the terms and conditions of this License, each Contributor hereby 72 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 73 | irrevocable (except as stated in this section) patent license to make, have 74 | made, use, offer to sell, sell, import, and otherwise transfer the Work, where 75 | such license applies only to those patent claims licensable by such Contributor 76 | that are necessarily infringed by their Contribution(s) alone or by combination 77 | of their Contribution(s) with the Work to which such Contribution(s) was 78 | submitted. If You institute patent litigation against any entity (including a 79 | cross-claim or counterclaim in a lawsuit) alleging that the Work or a 80 | Contribution incorporated within the Work constitutes direct or contributory 81 | patent infringement, then any patent licenses granted to You under this License 82 | for that Work shall terminate as of the date such litigation is filed. 83 | 84 | 4. Redistribution. 85 | 86 | You may reproduce and distribute copies of the Work or Derivative Works thereof 87 | in any medium, with or without modifications, and in Source or Object form, 88 | provided that You meet the following conditions: 89 | 90 | You must give any other recipients of the Work or Derivative Works a copy of 91 | this License; and 92 | You must cause any modified files to carry prominent notices stating that You 93 | changed the files; and 94 | You must retain, in the Source form of any Derivative Works that You distribute, 95 | all copyright, patent, trademark, and attribution notices from the Source form 96 | of the Work, excluding those notices that do not pertain to any part of the 97 | Derivative Works; and 98 | If the Work includes a "NOTICE" text file as part of its distribution, then any 99 | Derivative Works that You distribute must include a readable copy of the 100 | attribution notices contained within such NOTICE file, excluding those notices 101 | that do not pertain to any part of the Derivative Works, in at least one of the 102 | following places: within a NOTICE text file distributed as part of the 103 | Derivative Works; within the Source form or documentation, if provided along 104 | with the Derivative Works; or, within a display generated by the Derivative 105 | Works, if and wherever such third-party notices normally appear. The contents of 106 | the NOTICE file are for informational purposes only and do not modify the 107 | License. You may add Your own attribution notices within Derivative Works that 108 | You distribute, alongside or as an addendum to the NOTICE text from the Work, 109 | provided that such additional attribution notices cannot be construed as 110 | modifying the License. 111 | You may add Your own copyright statement to Your modifications and may provide 112 | additional or different license terms and conditions for use, reproduction, or 113 | distribution of Your modifications, or for any such Derivative Works as a whole, 114 | provided Your use, reproduction, and distribution of the Work otherwise complies 115 | with the conditions stated in this License. 116 | 117 | 5. Submission of Contributions. 118 | 119 | Unless You explicitly state otherwise, any Contribution intentionally submitted 120 | for inclusion in the Work by You to the Licensor shall be under the terms and 121 | conditions of this License, without any additional terms or conditions. 122 | Notwithstanding the above, nothing herein shall supersede or modify the terms of 123 | any separate license agreement you may have executed with Licensor regarding 124 | such Contributions. 125 | 126 | 6. Trademarks. 127 | 128 | This License does not grant permission to use the trade names, trademarks, 129 | service marks, or product names of the Licensor, except as required for 130 | reasonable and customary use in describing the origin of the Work and 131 | reproducing the content of the NOTICE file. 132 | 133 | 7. Disclaimer of Warranty. 134 | 135 | Unless required by applicable law or agreed to in writing, Licensor provides the 136 | Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, 137 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, 138 | including, without limitation, any warranties or conditions of TITLE, 139 | NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are 140 | solely responsible for determining the appropriateness of using or 141 | redistributing the Work and assume any risks associated with Your exercise of 142 | permissions under this License. 143 | 144 | 8. Limitation of Liability. 145 | 146 | In no event and under no legal theory, whether in tort (including negligence), 147 | contract, or otherwise, unless required by applicable law (such as deliberate 148 | and grossly negligent acts) or agreed to in writing, shall any Contributor be 149 | liable to You for damages, including any direct, indirect, special, incidental, 150 | or consequential damages of any character arising as a result of this License or 151 | out of the use or inability to use the Work (including but not limited to 152 | damages for loss of goodwill, work stoppage, computer failure or malfunction, or 153 | any and all other commercial damages or losses), even if such Contributor has 154 | been advised of the possibility of such damages. 155 | 156 | 9. Accepting Warranty or Additional Liability. 157 | 158 | While redistributing the Work or Derivative Works thereof, You may choose to 159 | offer, and charge a fee for, acceptance of support, warranty, indemnity, or 160 | other liability obligations and/or rights consistent with this License. However, 161 | in accepting such obligations, You may act only on Your own behalf and on Your 162 | sole responsibility, not on behalf of any other Contributor, and only if You 163 | agree to indemnify, defend, and hold each Contributor harmless for any liability 164 | incurred by, or claims asserted against, such Contributor by reason of your 165 | accepting any such warranty or additional liability. 166 | 167 | END OF TERMS AND CONDITIONS 168 | 169 | APPENDIX: How to apply the Apache License to your work 170 | 171 | To apply the Apache License to your work, attach the following boilerplate 172 | notice, with the fields enclosed by brackets "[]" replaced with your own 173 | identifying information. (Don't include the brackets!) The text should be 174 | enclosed in the appropriate comment syntax for the file format. We also 175 | recommend that a file or class name and description of purpose be included on 176 | the same "printed page" as the copyright notice for easier identification within 177 | third-party archives. 178 | 179 | Copyright [yyyy] [name of copyright owner] 180 | 181 | Licensed under the Apache License, Version 2.0 (the "License"); 182 | you may not use this file except in compliance with the License. 183 | You may obtain a copy of the License at 184 | 185 | http://www.apache.org/licenses/LICENSE-2.0 186 | 187 | Unless required by applicable law or agreed to in writing, software 188 | distributed under the License is distributed on an "AS IS" BASIS, 189 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 190 | See the License for the specific language governing permissions and 191 | limitations under the License. -------------------------------------------------------------------------------- /CastHelloVideo-ios.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 331A1D123495687A9BDB50F4 /* Pods_CastHelloVideo_objc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 401AE826BC816237290D956A /* Pods_CastHelloVideo_objc.framework */; }; 11 | 399DC0BD95302C25D77FBE32 /* Pods_CastHelloVideo_swift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8B3194CD2E2DFF5C328CB3 /* Pods_CastHelloVideo_swift.framework */; }; 12 | 98D7681E2559FD6C00357555 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5E7C77E219607060029EC49 /* Main.storyboard */; }; 13 | CC34F3D41885E326007E3FFC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC34F3D31885E326007E3FFC /* Foundation.framework */; }; 14 | CC34F3D61885E326007E3FFC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC34F3D51885E326007E3FFC /* CoreGraphics.framework */; }; 15 | CC34F3D81885E326007E3FFC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC34F3D71885E326007E3FFC /* UIKit.framework */; }; 16 | CCE5BD5019709A1100016BAB /* MediaAccessibility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCE5BD4F19709A1100016BAB /* MediaAccessibility.framework */; }; 17 | CCE5BD5219709A1700016BAB /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCE5BD5119709A1700016BAB /* CoreText.framework */; }; 18 | D5E7C77A219606EA0029EC49 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E7C776219606EA0029EC49 /* ViewController.swift */; }; 19 | D5E7C77B219606EA0029EC49 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E7C777219606EA0029EC49 /* AppDelegate.swift */; }; 20 | D5E7C787219607060029EC49 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5E7C77E219607060029EC49 /* Main.storyboard */; }; 21 | D5E7C789219607060029EC49 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5E7C77F219607060029EC49 /* LaunchScreen.storyboard */; }; 22 | D5E7C78A219607060029EC49 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5E7C77F219607060029EC49 /* LaunchScreen.storyboard */; }; 23 | D5E7C797219607060029EC49 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5E7C786219607060029EC49 /* Images.xcassets */; }; 24 | D5E7C798219607060029EC49 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5E7C786219607060029EC49 /* Images.xcassets */; }; 25 | D5E7C7A121960C8A0029EC49 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5E7C79D21960C8A0029EC49 /* ViewController.m */; }; 26 | D5E7C7A221960C8A0029EC49 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D5E7C79E21960C8A0029EC49 /* main.m */; }; 27 | D5E7C7A321960C8A0029EC49 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D5E7C79F21960C8A0029EC49 /* AppDelegate.m */; }; 28 | EAD0BBE91B59A3B1003F158E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF87401819CCA53700B7FBA3 /* SystemConfiguration.framework */; }; 29 | EAD0BBEB1B59A3B1003F158E /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCE5BD5119709A1700016BAB /* CoreText.framework */; }; 30 | EAD0BBEC1B59A3B1003F158E /* MediaAccessibility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCE5BD4F19709A1100016BAB /* MediaAccessibility.framework */; }; 31 | EAD0BBED1B59A3B1003F158E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC34F3D51885E326007E3FFC /* CoreGraphics.framework */; }; 32 | EAD0BBEE1B59A3B1003F158E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC34F3D71885E326007E3FFC /* UIKit.framework */; }; 33 | EAD0BBEF1B59A3B1003F158E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC34F3D31885E326007E3FFC /* Foundation.framework */; }; 34 | EF87401919CCA53700B7FBA3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF87401819CCA53700B7FBA3 /* SystemConfiguration.framework */; }; 35 | /* End PBXBuildFile section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 401AE826BC816237290D956A /* Pods_CastHelloVideo_objc.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CastHelloVideo_objc.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | 8CDDB13A59137C3FE06C6A90 /* Pods-CastHelloVideo-objc.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CastHelloVideo-objc.release.xcconfig"; path = "Pods/Target Support Files/Pods-CastHelloVideo-objc/Pods-CastHelloVideo-objc.release.xcconfig"; sourceTree = ""; }; 40 | 9132B46F858601CDEF33916F /* Pods-CastHelloVideo-objc.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CastHelloVideo-objc.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CastHelloVideo-objc/Pods-CastHelloVideo-objc.debug.xcconfig"; sourceTree = ""; }; 41 | 93776775CF54B09707687FE3 /* Pods-CastHelloVideo-swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CastHelloVideo-swift.release.xcconfig"; path = "Pods/Target Support Files/Pods-CastHelloVideo-swift/Pods-CastHelloVideo-swift.release.xcconfig"; sourceTree = ""; }; 42 | CC07763F1890823E00577499 /* GoogleCast.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleCast.framework; path = ../GoogleCast.framework; sourceTree = ""; }; 43 | CC34F3D01885E326007E3FFC /* CastHelloVideo-objc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "CastHelloVideo-objc.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | CC34F3D31885E326007E3FFC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 45 | CC34F3D51885E326007E3FFC /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 46 | CC34F3D71885E326007E3FFC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 47 | CC34F3F51885E326007E3FFC /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 48 | CCE5BD4F19709A1100016BAB /* MediaAccessibility.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaAccessibility.framework; path = System/Library/Frameworks/MediaAccessibility.framework; sourceTree = SDKROOT; }; 49 | CCE5BD5119709A1700016BAB /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 50 | CE8955776624C25B56DA0377 /* Pods-CastHelloVideo-swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CastHelloVideo-swift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CastHelloVideo-swift/Pods-CastHelloVideo-swift.debug.xcconfig"; sourceTree = ""; }; 51 | D5E7C764219606C20029EC49 /* InfoPlist.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = InfoPlist.strings; sourceTree = ""; }; 52 | D5E7C76E219606DD0029EC49 /* CastHelloVideo-objc.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "CastHelloVideo-objc.entitlements"; sourceTree = ""; }; 53 | D5E7C776219606EA0029EC49 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 54 | D5E7C777219606EA0029EC49 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 55 | D5E7C779219606EA0029EC49 /* CastHelloVideo-swift.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "CastHelloVideo-swift.entitlements"; sourceTree = ""; }; 56 | D5E7C77E219607060029EC49 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 57 | D5E7C77F219607060029EC49 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 58 | D5E7C786219607060029EC49 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 59 | D5E7C7992196082C0029EC49 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 60 | D5E7C79C21960C8A0029EC49 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 61 | D5E7C79D21960C8A0029EC49 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 62 | D5E7C79E21960C8A0029EC49 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 63 | D5E7C79F21960C8A0029EC49 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 64 | D5E7C7A021960C8A0029EC49 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 65 | EAD0BBF41B59A3B1003F158E /* CastHelloVideo-swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "CastHelloVideo-swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | EF87401819CCA53700B7FBA3 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 67 | FB8B3194CD2E2DFF5C328CB3 /* Pods_CastHelloVideo_swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CastHelloVideo_swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 68 | /* End PBXFileReference section */ 69 | 70 | /* Begin PBXFrameworksBuildPhase section */ 71 | CC34F3CD1885E326007E3FFC /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | EF87401919CCA53700B7FBA3 /* SystemConfiguration.framework in Frameworks */, 76 | CCE5BD5219709A1700016BAB /* CoreText.framework in Frameworks */, 77 | CCE5BD5019709A1100016BAB /* MediaAccessibility.framework in Frameworks */, 78 | CC34F3D61885E326007E3FFC /* CoreGraphics.framework in Frameworks */, 79 | CC34F3D81885E326007E3FFC /* UIKit.framework in Frameworks */, 80 | CC34F3D41885E326007E3FFC /* Foundation.framework in Frameworks */, 81 | 331A1D123495687A9BDB50F4 /* Pods_CastHelloVideo_objc.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | EAD0BBE81B59A3B1003F158E /* Frameworks */ = { 86 | isa = PBXFrameworksBuildPhase; 87 | buildActionMask = 2147483647; 88 | files = ( 89 | EAD0BBE91B59A3B1003F158E /* SystemConfiguration.framework in Frameworks */, 90 | EAD0BBEB1B59A3B1003F158E /* CoreText.framework in Frameworks */, 91 | EAD0BBEC1B59A3B1003F158E /* MediaAccessibility.framework in Frameworks */, 92 | EAD0BBED1B59A3B1003F158E /* CoreGraphics.framework in Frameworks */, 93 | EAD0BBEE1B59A3B1003F158E /* UIKit.framework in Frameworks */, 94 | EAD0BBEF1B59A3B1003F158E /* Foundation.framework in Frameworks */, 95 | 399DC0BD95302C25D77FBE32 /* Pods_CastHelloVideo_swift.framework in Frameworks */, 96 | ); 97 | runOnlyForDeploymentPostprocessing = 0; 98 | }; 99 | /* End PBXFrameworksBuildPhase section */ 100 | 101 | /* Begin PBXGroup section */ 102 | CC34F3C71885E326007E3FFC = { 103 | isa = PBXGroup; 104 | children = ( 105 | D5E7C774219606EA0029EC49 /* CastHelloVideo-swift */, 106 | D5E7C765219606DD0029EC49 /* CastHelloVideo-objc */, 107 | D5E7C77D219607060029EC49 /* Resources */, 108 | D5E7C763219606C20029EC49 /* Supporting Files */, 109 | CC34F3D21885E326007E3FFC /* Frameworks */, 110 | CC34F3D11885E326007E3FFC /* Products */, 111 | F6F888D9D04FDC14C78033B9 /* Pods */, 112 | ); 113 | sourceTree = ""; 114 | }; 115 | CC34F3D11885E326007E3FFC /* Products */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | CC34F3D01885E326007E3FFC /* CastHelloVideo-objc.app */, 119 | EAD0BBF41B59A3B1003F158E /* CastHelloVideo-swift.app */, 120 | ); 121 | name = Products; 122 | sourceTree = ""; 123 | }; 124 | CC34F3D21885E326007E3FFC /* Frameworks */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | EF87401819CCA53700B7FBA3 /* SystemConfiguration.framework */, 128 | CCE5BD5119709A1700016BAB /* CoreText.framework */, 129 | CCE5BD4F19709A1100016BAB /* MediaAccessibility.framework */, 130 | CC07763F1890823E00577499 /* GoogleCast.framework */, 131 | CC34F3D31885E326007E3FFC /* Foundation.framework */, 132 | CC34F3D51885E326007E3FFC /* CoreGraphics.framework */, 133 | CC34F3D71885E326007E3FFC /* UIKit.framework */, 134 | CC34F3F51885E326007E3FFC /* XCTest.framework */, 135 | FB8B3194CD2E2DFF5C328CB3 /* Pods_CastHelloVideo_swift.framework */, 136 | 401AE826BC816237290D956A /* Pods_CastHelloVideo_objc.framework */, 137 | ); 138 | name = Frameworks; 139 | sourceTree = ""; 140 | }; 141 | D5E7C763219606C20029EC49 /* Supporting Files */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | D5E7C7992196082C0029EC49 /* Info.plist */, 145 | D5E7C764219606C20029EC49 /* InfoPlist.strings */, 146 | ); 147 | path = "Supporting Files"; 148 | sourceTree = ""; 149 | }; 150 | D5E7C765219606DD0029EC49 /* CastHelloVideo-objc */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | D5E7C79B21960C8A0029EC49 /* Classes */, 154 | D5E7C76E219606DD0029EC49 /* CastHelloVideo-objc.entitlements */, 155 | ); 156 | path = "CastHelloVideo-objc"; 157 | sourceTree = ""; 158 | }; 159 | D5E7C774219606EA0029EC49 /* CastHelloVideo-swift */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | D5E7C775219606EA0029EC49 /* Classes */, 163 | D5E7C779219606EA0029EC49 /* CastHelloVideo-swift.entitlements */, 164 | ); 165 | path = "CastHelloVideo-swift"; 166 | sourceTree = ""; 167 | }; 168 | D5E7C775219606EA0029EC49 /* Classes */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | D5E7C777219606EA0029EC49 /* AppDelegate.swift */, 172 | D5E7C776219606EA0029EC49 /* ViewController.swift */, 173 | ); 174 | path = Classes; 175 | sourceTree = ""; 176 | }; 177 | D5E7C77D219607060029EC49 /* Resources */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | D5E7C77E219607060029EC49 /* Main.storyboard */, 181 | D5E7C77F219607060029EC49 /* LaunchScreen.storyboard */, 182 | D5E7C786219607060029EC49 /* Images.xcassets */, 183 | ); 184 | path = Resources; 185 | sourceTree = ""; 186 | }; 187 | D5E7C79B21960C8A0029EC49 /* Classes */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | D5E7C79E21960C8A0029EC49 /* main.m */, 191 | D5E7C79C21960C8A0029EC49 /* AppDelegate.h */, 192 | D5E7C79F21960C8A0029EC49 /* AppDelegate.m */, 193 | D5E7C7A021960C8A0029EC49 /* ViewController.h */, 194 | D5E7C79D21960C8A0029EC49 /* ViewController.m */, 195 | ); 196 | path = Classes; 197 | sourceTree = ""; 198 | }; 199 | F6F888D9D04FDC14C78033B9 /* Pods */ = { 200 | isa = PBXGroup; 201 | children = ( 202 | 9132B46F858601CDEF33916F /* Pods-CastHelloVideo-objc.debug.xcconfig */, 203 | 8CDDB13A59137C3FE06C6A90 /* Pods-CastHelloVideo-objc.release.xcconfig */, 204 | CE8955776624C25B56DA0377 /* Pods-CastHelloVideo-swift.debug.xcconfig */, 205 | 93776775CF54B09707687FE3 /* Pods-CastHelloVideo-swift.release.xcconfig */, 206 | ); 207 | name = Pods; 208 | sourceTree = ""; 209 | }; 210 | /* End PBXGroup section */ 211 | 212 | /* Begin PBXNativeTarget section */ 213 | CC34F3CF1885E326007E3FFC /* CastHelloVideo-objc */ = { 214 | isa = PBXNativeTarget; 215 | buildConfigurationList = CC34F4051885E327007E3FFC /* Build configuration list for PBXNativeTarget "CastHelloVideo-objc" */; 216 | buildPhases = ( 217 | 113664896F707A860498C273 /* [CP] Check Pods Manifest.lock */, 218 | CC34F3CC1885E326007E3FFC /* Sources */, 219 | CC34F3CD1885E326007E3FFC /* Frameworks */, 220 | CC34F3CE1885E326007E3FFC /* Resources */, 221 | 49674DA85E6FD26AC84DD8D9 /* [CP] Copy Pods Resources */, 222 | 34DC2D5935329A88DF3E99F0 /* [CP] Embed Pods Frameworks */, 223 | ); 224 | buildRules = ( 225 | ); 226 | dependencies = ( 227 | ); 228 | name = "CastHelloVideo-objc"; 229 | productName = "CastHelloVideo-objc"; 230 | productReference = CC34F3D01885E326007E3FFC /* CastHelloVideo-objc.app */; 231 | productType = "com.apple.product-type.application"; 232 | }; 233 | EAD0BBE61B59A3B1003F158E /* CastHelloVideo-swift */ = { 234 | isa = PBXNativeTarget; 235 | buildConfigurationList = EAD0BBF11B59A3B1003F158E /* Build configuration list for PBXNativeTarget "CastHelloVideo-swift" */; 236 | buildPhases = ( 237 | 03CC6B4D0E39E8EC99527A35 /* [CP] Check Pods Manifest.lock */, 238 | EAD0BBE71B59A3B1003F158E /* Sources */, 239 | EAD0BBE81B59A3B1003F158E /* Frameworks */, 240 | EAD0BBF01B59A3B1003F158E /* Resources */, 241 | 0A57FAECC193DD6DD524FDF5 /* [CP] Copy Pods Resources */, 242 | 8C7A260A6BF518D170246A36 /* [CP] Embed Pods Frameworks */, 243 | ); 244 | buildRules = ( 245 | ); 246 | dependencies = ( 247 | ); 248 | name = "CastHelloVideo-swift"; 249 | productName = "CastHelloVideo-swift"; 250 | productReference = EAD0BBF41B59A3B1003F158E /* CastHelloVideo-swift.app */; 251 | productType = "com.apple.product-type.application"; 252 | }; 253 | /* End PBXNativeTarget section */ 254 | 255 | /* Begin PBXProject section */ 256 | CC34F3C81885E326007E3FFC /* Project object */ = { 257 | isa = PBXProject; 258 | attributes = { 259 | CLASSPREFIX = ""; 260 | LastSwiftUpdateCheck = 0700; 261 | LastUpgradeCheck = 1300; 262 | ORGANIZATIONNAME = Google; 263 | TargetAttributes = { 264 | CC34F3CF1885E326007E3FFC = { 265 | ProvisioningStyle = Manual; 266 | SystemCapabilities = { 267 | com.apple.AccessWiFi = { 268 | enabled = 1; 269 | }; 270 | }; 271 | }; 272 | EAD0BBE61B59A3B1003F158E = { 273 | LastSwiftMigration = 1200; 274 | ProvisioningStyle = Manual; 275 | SystemCapabilities = { 276 | com.apple.AccessWiFi = { 277 | enabled = 1; 278 | }; 279 | }; 280 | }; 281 | }; 282 | }; 283 | buildConfigurationList = CC34F3CB1885E326007E3FFC /* Build configuration list for PBXProject "CastHelloVideo-ios" */; 284 | compatibilityVersion = "Xcode 3.2"; 285 | developmentRegion = en; 286 | hasScannedForEncodings = 0; 287 | knownRegions = ( 288 | en, 289 | Base, 290 | ); 291 | mainGroup = CC34F3C71885E326007E3FFC; 292 | productRefGroup = CC34F3D11885E326007E3FFC /* Products */; 293 | projectDirPath = ""; 294 | projectRoot = ""; 295 | targets = ( 296 | CC34F3CF1885E326007E3FFC /* CastHelloVideo-objc */, 297 | EAD0BBE61B59A3B1003F158E /* CastHelloVideo-swift */, 298 | ); 299 | }; 300 | /* End PBXProject section */ 301 | 302 | /* Begin PBXResourcesBuildPhase section */ 303 | CC34F3CE1885E326007E3FFC /* Resources */ = { 304 | isa = PBXResourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | D5E7C797219607060029EC49 /* Images.xcassets in Resources */, 308 | D5E7C789219607060029EC49 /* LaunchScreen.storyboard in Resources */, 309 | D5E7C787219607060029EC49 /* Main.storyboard in Resources */, 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | }; 313 | EAD0BBF01B59A3B1003F158E /* Resources */ = { 314 | isa = PBXResourcesBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | 98D7681E2559FD6C00357555 /* Main.storyboard in Resources */, 318 | D5E7C798219607060029EC49 /* Images.xcassets in Resources */, 319 | D5E7C78A219607060029EC49 /* LaunchScreen.storyboard in Resources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | /* End PBXResourcesBuildPhase section */ 324 | 325 | /* Begin PBXShellScriptBuildPhase section */ 326 | 03CC6B4D0E39E8EC99527A35 /* [CP] Check Pods Manifest.lock */ = { 327 | isa = PBXShellScriptBuildPhase; 328 | buildActionMask = 2147483647; 329 | files = ( 330 | ); 331 | inputPaths = ( 332 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 333 | "${PODS_ROOT}/Manifest.lock", 334 | ); 335 | name = "[CP] Check Pods Manifest.lock"; 336 | outputPaths = ( 337 | "$(DERIVED_FILE_DIR)/Pods-CastHelloVideo-swift-checkManifestLockResult.txt", 338 | ); 339 | runOnlyForDeploymentPostprocessing = 0; 340 | shellPath = /bin/sh; 341 | 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"; 342 | showEnvVarsInLog = 0; 343 | }; 344 | 0A57FAECC193DD6DD524FDF5 /* [CP] Copy Pods Resources */ = { 345 | isa = PBXShellScriptBuildPhase; 346 | buildActionMask = 2147483647; 347 | files = ( 348 | ); 349 | inputPaths = ( 350 | "${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-swift/Pods-CastHelloVideo-swift-resources.sh", 351 | "${PODS_ROOT}/google-cast-sdk/GoogleCastSDK-ios-4.7.0_static/GoogleCast.framework/GoogleCastCoreResources.bundle", 352 | "${PODS_ROOT}/google-cast-sdk/GoogleCastSDK-ios-4.7.0_static/GoogleCast.framework/GoogleCastUIResources.bundle", 353 | ); 354 | name = "[CP] Copy Pods Resources"; 355 | outputPaths = ( 356 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleCastCoreResources.bundle", 357 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleCastUIResources.bundle", 358 | ); 359 | runOnlyForDeploymentPostprocessing = 0; 360 | shellPath = /bin/sh; 361 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-swift/Pods-CastHelloVideo-swift-resources.sh\"\n"; 362 | showEnvVarsInLog = 0; 363 | }; 364 | 113664896F707A860498C273 /* [CP] Check Pods Manifest.lock */ = { 365 | isa = PBXShellScriptBuildPhase; 366 | buildActionMask = 2147483647; 367 | files = ( 368 | ); 369 | inputPaths = ( 370 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 371 | "${PODS_ROOT}/Manifest.lock", 372 | ); 373 | name = "[CP] Check Pods Manifest.lock"; 374 | outputPaths = ( 375 | "$(DERIVED_FILE_DIR)/Pods-CastHelloVideo-objc-checkManifestLockResult.txt", 376 | ); 377 | runOnlyForDeploymentPostprocessing = 0; 378 | shellPath = /bin/sh; 379 | 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"; 380 | showEnvVarsInLog = 0; 381 | }; 382 | 34DC2D5935329A88DF3E99F0 /* [CP] Embed Pods Frameworks */ = { 383 | isa = PBXShellScriptBuildPhase; 384 | buildActionMask = 2147483647; 385 | files = ( 386 | ); 387 | inputPaths = ( 388 | "${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-objc/Pods-CastHelloVideo-objc-frameworks.sh", 389 | "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", 390 | ); 391 | name = "[CP] Embed Pods Frameworks"; 392 | outputPaths = ( 393 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", 394 | ); 395 | runOnlyForDeploymentPostprocessing = 0; 396 | shellPath = /bin/sh; 397 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-objc/Pods-CastHelloVideo-objc-frameworks.sh\"\n"; 398 | showEnvVarsInLog = 0; 399 | }; 400 | 49674DA85E6FD26AC84DD8D9 /* [CP] Copy Pods Resources */ = { 401 | isa = PBXShellScriptBuildPhase; 402 | buildActionMask = 2147483647; 403 | files = ( 404 | ); 405 | inputPaths = ( 406 | "${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-objc/Pods-CastHelloVideo-objc-resources.sh", 407 | "${PODS_ROOT}/google-cast-sdk/GoogleCastSDK-ios-4.7.0_static/GoogleCast.framework/GoogleCastCoreResources.bundle", 408 | "${PODS_ROOT}/google-cast-sdk/GoogleCastSDK-ios-4.7.0_static/GoogleCast.framework/GoogleCastUIResources.bundle", 409 | ); 410 | name = "[CP] Copy Pods Resources"; 411 | outputPaths = ( 412 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleCastCoreResources.bundle", 413 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleCastUIResources.bundle", 414 | ); 415 | runOnlyForDeploymentPostprocessing = 0; 416 | shellPath = /bin/sh; 417 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-objc/Pods-CastHelloVideo-objc-resources.sh\"\n"; 418 | showEnvVarsInLog = 0; 419 | }; 420 | 8C7A260A6BF518D170246A36 /* [CP] Embed Pods Frameworks */ = { 421 | isa = PBXShellScriptBuildPhase; 422 | buildActionMask = 2147483647; 423 | files = ( 424 | ); 425 | inputPaths = ( 426 | "${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-swift/Pods-CastHelloVideo-swift-frameworks.sh", 427 | "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", 428 | ); 429 | name = "[CP] Embed Pods Frameworks"; 430 | outputPaths = ( 431 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", 432 | ); 433 | runOnlyForDeploymentPostprocessing = 0; 434 | shellPath = /bin/sh; 435 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CastHelloVideo-swift/Pods-CastHelloVideo-swift-frameworks.sh\"\n"; 436 | showEnvVarsInLog = 0; 437 | }; 438 | /* End PBXShellScriptBuildPhase section */ 439 | 440 | /* Begin PBXSourcesBuildPhase section */ 441 | CC34F3CC1885E326007E3FFC /* Sources */ = { 442 | isa = PBXSourcesBuildPhase; 443 | buildActionMask = 2147483647; 444 | files = ( 445 | D5E7C7A221960C8A0029EC49 /* main.m in Sources */, 446 | D5E7C7A121960C8A0029EC49 /* ViewController.m in Sources */, 447 | D5E7C7A321960C8A0029EC49 /* AppDelegate.m in Sources */, 448 | ); 449 | runOnlyForDeploymentPostprocessing = 0; 450 | }; 451 | EAD0BBE71B59A3B1003F158E /* Sources */ = { 452 | isa = PBXSourcesBuildPhase; 453 | buildActionMask = 2147483647; 454 | files = ( 455 | D5E7C77B219606EA0029EC49 /* AppDelegate.swift in Sources */, 456 | D5E7C77A219606EA0029EC49 /* ViewController.swift in Sources */, 457 | ); 458 | runOnlyForDeploymentPostprocessing = 0; 459 | }; 460 | /* End PBXSourcesBuildPhase section */ 461 | 462 | /* Begin XCBuildConfiguration section */ 463 | CC34F4031885E327007E3FFC /* Debug */ = { 464 | isa = XCBuildConfiguration; 465 | buildSettings = { 466 | ALWAYS_SEARCH_USER_PATHS = NO; 467 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 468 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 469 | CLANG_CXX_LIBRARY = "libc++"; 470 | CLANG_ENABLE_MODULES = YES; 471 | CLANG_ENABLE_OBJC_ARC = YES; 472 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 473 | CLANG_WARN_BOOL_CONVERSION = YES; 474 | CLANG_WARN_COMMA = YES; 475 | CLANG_WARN_CONSTANT_CONVERSION = YES; 476 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 477 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 478 | CLANG_WARN_EMPTY_BODY = YES; 479 | CLANG_WARN_ENUM_CONVERSION = YES; 480 | CLANG_WARN_INFINITE_RECURSION = YES; 481 | CLANG_WARN_INT_CONVERSION = YES; 482 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 483 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 484 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 485 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 486 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 487 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 488 | CLANG_WARN_STRICT_PROTOTYPES = YES; 489 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 490 | CLANG_WARN_UNREACHABLE_CODE = YES; 491 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 492 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 493 | COPY_PHASE_STRIP = NO; 494 | ENABLE_STRICT_OBJC_MSGSEND = YES; 495 | ENABLE_TESTABILITY = YES; 496 | GCC_C_LANGUAGE_STANDARD = gnu99; 497 | GCC_DYNAMIC_NO_PIC = NO; 498 | GCC_NO_COMMON_BLOCKS = YES; 499 | GCC_OPTIMIZATION_LEVEL = 0; 500 | GCC_PREPROCESSOR_DEFINITIONS = ( 501 | "DEBUG=1", 502 | "$(inherited)", 503 | ); 504 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 505 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 506 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 507 | GCC_WARN_UNDECLARED_SELECTOR = YES; 508 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 509 | GCC_WARN_UNUSED_FUNCTION = YES; 510 | GCC_WARN_UNUSED_VARIABLE = YES; 511 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 512 | ONLY_ACTIVE_ARCH = YES; 513 | SDKROOT = iphoneos; 514 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 515 | TARGETED_DEVICE_FAMILY = "1,2"; 516 | }; 517 | name = Debug; 518 | }; 519 | CC34F4041885E327007E3FFC /* Release */ = { 520 | isa = XCBuildConfiguration; 521 | buildSettings = { 522 | ALWAYS_SEARCH_USER_PATHS = NO; 523 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 524 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 525 | CLANG_CXX_LIBRARY = "libc++"; 526 | CLANG_ENABLE_MODULES = YES; 527 | CLANG_ENABLE_OBJC_ARC = YES; 528 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 529 | CLANG_WARN_BOOL_CONVERSION = YES; 530 | CLANG_WARN_COMMA = YES; 531 | CLANG_WARN_CONSTANT_CONVERSION = YES; 532 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 533 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 534 | CLANG_WARN_EMPTY_BODY = YES; 535 | CLANG_WARN_ENUM_CONVERSION = YES; 536 | CLANG_WARN_INFINITE_RECURSION = YES; 537 | CLANG_WARN_INT_CONVERSION = YES; 538 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 539 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 540 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 541 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 542 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 543 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 544 | CLANG_WARN_STRICT_PROTOTYPES = YES; 545 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 546 | CLANG_WARN_UNREACHABLE_CODE = YES; 547 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 548 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 549 | COPY_PHASE_STRIP = YES; 550 | ENABLE_NS_ASSERTIONS = NO; 551 | ENABLE_STRICT_OBJC_MSGSEND = YES; 552 | GCC_C_LANGUAGE_STANDARD = gnu99; 553 | GCC_NO_COMMON_BLOCKS = YES; 554 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 555 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 556 | GCC_WARN_UNDECLARED_SELECTOR = YES; 557 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 558 | GCC_WARN_UNUSED_FUNCTION = YES; 559 | GCC_WARN_UNUSED_VARIABLE = YES; 560 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 561 | SDKROOT = iphoneos; 562 | SWIFT_COMPILATION_MODE = wholemodule; 563 | TARGETED_DEVICE_FAMILY = "1,2"; 564 | VALIDATE_PRODUCT = YES; 565 | }; 566 | name = Release; 567 | }; 568 | CC34F4061885E327007E3FFC /* Debug */ = { 569 | isa = XCBuildConfiguration; 570 | baseConfigurationReference = 9132B46F858601CDEF33916F /* Pods-CastHelloVideo-objc.debug.xcconfig */; 571 | buildSettings = { 572 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 573 | CODE_SIGN_ENTITLEMENTS = "CastHelloVideo-objc/CastHelloVideo-objc.entitlements"; 574 | CODE_SIGN_STYLE = Manual; 575 | ENABLE_BITCODE = YES; 576 | FRAMEWORK_SEARCH_PATHS = ( 577 | "$(inherited)", 578 | ., 579 | .., 580 | "$(PROJECT_DIR)", 581 | ); 582 | GCC_NO_COMMON_BLOCKS = YES; 583 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 584 | GCC_PREFIX_HEADER = ""; 585 | HEADER_SEARCH_PATHS = "$(inherited)"; 586 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 587 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) '@executable_path/Frameworks'"; 588 | OTHER_LDFLAGS = "$(inherited)"; 589 | PRODUCT_BUNDLE_IDENTIFIER = com.google.GoogleCast.CastHelloVideos.dev; 590 | PRODUCT_NAME = "$(TARGET_NAME)"; 591 | PROVISIONING_PROFILE_SPECIFIER = "Google Cast Cast Hello Videos Dev"; 592 | WRAPPER_EXTENSION = app; 593 | }; 594 | name = Debug; 595 | }; 596 | CC34F4071885E327007E3FFC /* Release */ = { 597 | isa = XCBuildConfiguration; 598 | baseConfigurationReference = 8CDDB13A59137C3FE06C6A90 /* Pods-CastHelloVideo-objc.release.xcconfig */; 599 | buildSettings = { 600 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 601 | CODE_SIGN_ENTITLEMENTS = "CastHelloVideo-objc/CastHelloVideo-objc.entitlements"; 602 | CODE_SIGN_STYLE = Manual; 603 | ENABLE_BITCODE = YES; 604 | FRAMEWORK_SEARCH_PATHS = ( 605 | "$(inherited)", 606 | ., 607 | .., 608 | "$(PROJECT_DIR)", 609 | ); 610 | GCC_NO_COMMON_BLOCKS = YES; 611 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 612 | GCC_PREFIX_HEADER = ""; 613 | HEADER_SEARCH_PATHS = "$(inherited)"; 614 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 615 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) '@executable_path/Frameworks'"; 616 | OTHER_LDFLAGS = "$(inherited)"; 617 | PRODUCT_BUNDLE_IDENTIFIER = com.google.GoogleCast.CastHelloVideos.dev; 618 | PRODUCT_NAME = "$(TARGET_NAME)"; 619 | PROVISIONING_PROFILE_SPECIFIER = "Google Cast Cast Hello Videos Dev"; 620 | WRAPPER_EXTENSION = app; 621 | }; 622 | name = Release; 623 | }; 624 | EAD0BBF21B59A3B1003F158E /* Debug */ = { 625 | isa = XCBuildConfiguration; 626 | baseConfigurationReference = CE8955776624C25B56DA0377 /* Pods-CastHelloVideo-swift.debug.xcconfig */; 627 | buildSettings = { 628 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 629 | CODE_SIGN_ENTITLEMENTS = "CastHelloVideo-swift/CastHelloVideo-swift.entitlements"; 630 | CODE_SIGN_IDENTITY = "iPhone Developer"; 631 | CODE_SIGN_STYLE = Manual; 632 | ENABLE_BITCODE = YES; 633 | FRAMEWORK_SEARCH_PATHS = ( 634 | "$(inherited)", 635 | ., 636 | .., 637 | "$(PROJECT_DIR)", 638 | ); 639 | GCC_NO_COMMON_BLOCKS = YES; 640 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 641 | GCC_PREFIX_HEADER = ""; 642 | HEADER_SEARCH_PATHS = "$(inherited)"; 643 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 644 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 645 | OTHER_LDFLAGS = "$(inherited)"; 646 | PRODUCT_BUNDLE_IDENTIFIER = com.google.GoogleCast.CastHelloVideos.dev; 647 | PRODUCT_NAME = "$(TARGET_NAME)"; 648 | PROVISIONING_PROFILE_SPECIFIER = "Google Cast Cast Hello Videos Dev"; 649 | SWIFT_OBJC_BRIDGING_HEADER = ""; 650 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 651 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 652 | SWIFT_VERSION = 5.0; 653 | WRAPPER_EXTENSION = app; 654 | }; 655 | name = Debug; 656 | }; 657 | EAD0BBF31B59A3B1003F158E /* Release */ = { 658 | isa = XCBuildConfiguration; 659 | baseConfigurationReference = 93776775CF54B09707687FE3 /* Pods-CastHelloVideo-swift.release.xcconfig */; 660 | buildSettings = { 661 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 662 | CODE_SIGN_ENTITLEMENTS = "CastHelloVideo-swift/CastHelloVideo-swift.entitlements"; 663 | CODE_SIGN_IDENTITY = "iPhone Developer"; 664 | CODE_SIGN_STYLE = Manual; 665 | ENABLE_BITCODE = YES; 666 | FRAMEWORK_SEARCH_PATHS = ( 667 | "$(inherited)", 668 | ., 669 | .., 670 | "$(PROJECT_DIR)", 671 | ); 672 | GCC_NO_COMMON_BLOCKS = YES; 673 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 674 | GCC_PREFIX_HEADER = ""; 675 | HEADER_SEARCH_PATHS = "$(inherited)"; 676 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 677 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 678 | OTHER_LDFLAGS = "$(inherited)"; 679 | PRODUCT_BUNDLE_IDENTIFIER = com.google.GoogleCast.CastHelloVideos.dev; 680 | PRODUCT_NAME = "$(TARGET_NAME)"; 681 | PROVISIONING_PROFILE_SPECIFIER = "Google Cast Cast Hello Videos Dev"; 682 | SWIFT_OBJC_BRIDGING_HEADER = ""; 683 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 684 | SWIFT_VERSION = 5.0; 685 | WRAPPER_EXTENSION = app; 686 | }; 687 | name = Release; 688 | }; 689 | /* End XCBuildConfiguration section */ 690 | 691 | /* Begin XCConfigurationList section */ 692 | CC34F3CB1885E326007E3FFC /* Build configuration list for PBXProject "CastHelloVideo-ios" */ = { 693 | isa = XCConfigurationList; 694 | buildConfigurations = ( 695 | CC34F4031885E327007E3FFC /* Debug */, 696 | CC34F4041885E327007E3FFC /* Release */, 697 | ); 698 | defaultConfigurationIsVisible = 0; 699 | defaultConfigurationName = Release; 700 | }; 701 | CC34F4051885E327007E3FFC /* Build configuration list for PBXNativeTarget "CastHelloVideo-objc" */ = { 702 | isa = XCConfigurationList; 703 | buildConfigurations = ( 704 | CC34F4061885E327007E3FFC /* Debug */, 705 | CC34F4071885E327007E3FFC /* Release */, 706 | ); 707 | defaultConfigurationIsVisible = 0; 708 | defaultConfigurationName = Release; 709 | }; 710 | EAD0BBF11B59A3B1003F158E /* Build configuration list for PBXNativeTarget "CastHelloVideo-swift" */ = { 711 | isa = XCConfigurationList; 712 | buildConfigurations = ( 713 | EAD0BBF21B59A3B1003F158E /* Debug */, 714 | EAD0BBF31B59A3B1003F158E /* Release */, 715 | ); 716 | defaultConfigurationIsVisible = 0; 717 | defaultConfigurationName = Release; 718 | }; 719 | /* End XCConfigurationList section */ 720 | }; 721 | rootObject = CC34F3C81885E326007E3FFC /* Project object */; 722 | } 723 | --------------------------------------------------------------------------------