From 707875f880adce3fec348cc72884ade9e9c18a2d Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Wed, 1 Feb 2023 15:40:24 +1100 Subject: [PATCH 1/8] Use default media receiver application id. --- .../flutter_cast_framework/cast/DefaultCastOptionsProvider.kt | 4 ++-- .../flutter_cast_framework_example/CastOptionsProvider.kt | 4 ++-- example/ios/Runner/AppDelegate.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/cast/DefaultCastOptionsProvider.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/cast/DefaultCastOptionsProvider.kt index aad02ec..05469e2 100644 --- a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/cast/DefaultCastOptionsProvider.kt +++ b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/cast/DefaultCastOptionsProvider.kt @@ -4,7 +4,7 @@ import android.content.Context import com.google.android.gms.cast.framework.CastOptions import com.google.android.gms.cast.framework.OptionsProvider import com.google.android.gms.cast.framework.SessionProvider - +import com.google.android.gms.cast.CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID /** * This is here to be used as an example @@ -14,7 +14,7 @@ class DefaultCastOptionsProvider : OptionsProvider { override fun getCastOptions(context: Context): CastOptions { return CastOptions.Builder() - .setReceiverApplicationId("4F8B3483") + .setReceiverApplicationId(DEFAULT_MEDIA_RECEIVER_APPLICATION_ID) .build() } diff --git a/example/android/app/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework_example/CastOptionsProvider.kt b/example/android/app/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework_example/CastOptionsProvider.kt index 11ec2a1..2fe7e81 100644 --- a/example/android/app/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework_example/CastOptionsProvider.kt +++ b/example/android/app/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework_example/CastOptionsProvider.kt @@ -4,12 +4,12 @@ import android.content.Context import com.google.android.gms.cast.framework.CastOptions import com.google.android.gms.cast.framework.OptionsProvider import com.google.android.gms.cast.framework.SessionProvider - +import com.google.android.gms.cast.CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID class CastOptionsProvider : OptionsProvider { override fun getCastOptions(context: Context): CastOptions { return CastOptions.Builder() - .setReceiverApplicationId("D6760CCD") + .setReceiverApplicationId(DEFAULT_MEDIA_RECEIVER_APPLICATION_ID) .build() } diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift index 260bd5b..4ce2c80 100644 --- a/example/ios/Runner/AppDelegate.swift +++ b/example/ios/Runner/AppDelegate.swift @@ -4,7 +4,7 @@ import GoogleCast @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate, GCKLoggerDelegate { - let kReceiverAppID = "D6760CCD" + let kReceiverAppID = kGCKDefaultMediaReceiverApplicationID let kDebugLoggingEnabled = true override func application( From cffdbb92764fb52f95d229bb56beff7ed762abdd Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Wed, 1 Feb 2023 15:43:09 +1100 Subject: [PATCH 2/8] Use version `4.7.1` of `google-cast-sdk` framework for iOS. --- example/ios/Podfile | 2 +- ios/flutter_cast_framework.podspec | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index 1e8c3c9..2c068c4 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/flutter_cast_framework.podspec b/ios/flutter_cast_framework.podspec index 28efb89..b3fcd81 100644 --- a/ios/flutter_cast_framework.podspec +++ b/ios/flutter_cast_framework.podspec @@ -17,9 +17,9 @@ A new flutter plugin project. s.static_framework = true s.dependency 'Flutter' - s.dependency 'google-cast-sdk-no-bluetooth', '~> 4.4.4' + s.dependency 'google-cast-sdk-dynamic-xcframework-no-bluetooth' - s.ios.deployment_target = '10.0' + s.ios.deployment_target = '12.0' # This is to enable build on simulator s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } From 47a0f8b04d16421668d14316cdbf500df3b86192 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Wed, 1 Feb 2023 15:52:27 +1100 Subject: [PATCH 3/8] Resolve optional `GCKMediaTrack`. --- ios/Classes/HostMediaLoadRequestDataHelper.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Classes/HostMediaLoadRequestDataHelper.swift b/ios/Classes/HostMediaLoadRequestDataHelper.swift index f009292..c6af6d8 100644 --- a/ios/Classes/HostMediaLoadRequestDataHelper.swift +++ b/ios/Classes/HostMediaLoadRequestDataHelper.swift @@ -186,14 +186,14 @@ func getMediaTracks(mediaTracks: [MediaTrack]?) -> [GCKMediaTrack]? { var result = [GCKMediaTrack]() mediaTracks?.forEach({ (t: MediaTrack) in - let track = getMediaTrack(mediaTrack: t) + guard let track = getMediaTrack(mediaTrack: t) else { return } result.append(track) }) return result } -func getMediaTrack(mediaTrack: MediaTrack) -> GCKMediaTrack{ +func getMediaTrack(mediaTrack: MediaTrack) -> GCKMediaTrack? { let trackId = mediaTrack.id as! Int let trackType = getTrackType(trackType: mediaTrack.trackType) let trackSubtype = getTrackSubtype(trackSubtype: mediaTrack.trackSubtype) From 0555591a84a82f793e6c1ed697971718c979f932 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Wed, 1 Feb 2023 15:53:54 +1100 Subject: [PATCH 4/8] Reinstall pods. --- example/ios/Podfile.lock | 24 ++--- example/ios/Runner.xcodeproj/project.pbxproj | 94 +++++++++----------- 2 files changed, 47 insertions(+), 71 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 56648ce..adb6cc1 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2,16 +2,8 @@ PODS: - Flutter (1.0.0) - flutter_cast_framework (0.0.1): - Flutter - - google-cast-sdk-no-bluetooth (~> 4.4.4) - - google-cast-sdk-no-bluetooth (4.4.8): - - google-cast-sdk-no-bluetooth/Core (= 4.4.8) - - GTMSessionFetcher/Core (~> 1.0) - - Protobuf (~> 3.12) - - google-cast-sdk-no-bluetooth/Core (4.4.8): - - GTMSessionFetcher/Core (~> 1.0) - - Protobuf (~> 3.12) - - GTMSessionFetcher/Core (1.7.0) - - Protobuf (3.19.0) + - google-cast-sdk-dynamic-xcframework-no-bluetooth + - google-cast-sdk-dynamic-xcframework-no-bluetooth (4.7.1) DEPENDENCIES: - Flutter (from `Flutter`) @@ -19,9 +11,7 @@ DEPENDENCIES: SPEC REPOS: trunk: - - google-cast-sdk-no-bluetooth - - GTMSessionFetcher - - Protobuf + - google-cast-sdk-dynamic-xcframework-no-bluetooth EXTERNAL SOURCES: Flutter: @@ -31,11 +21,9 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - flutter_cast_framework: 1a7183ed51a5af57cbec987d0c422086b4ac2c52 - google-cast-sdk-no-bluetooth: d5a60530c72b0907fb302d835952b6cb0ba5f128 - GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91 - Protobuf: e9b99dd5da72f665ec503b19191f245a22188b4d + flutter_cast_framework: 67e74e23e47c1e44234c1ed8167cfb2077620f8d + google-cast-sdk-dynamic-xcframework-no-bluetooth: 1fa9e267df3fd6f8a1c6e3345142ca5286297968 -PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c +PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 COCOAPODS: 1.11.3 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index a72fe91..4b061fc 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -153,8 +153,7 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - D442A0785939ED7C311A5340 /* [CP] Embed Pods Frameworks */, - F8453FE49677B54947F70C12 /* [CP] Copy Pods Resources */, + 3846A275F5BB3E7363DBA2BE /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -171,7 +170,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -215,8 +214,27 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 3846A275F5BB3E7363DBA2BE /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/google-cast-sdk-dynamic-xcframework-no-bluetooth/GoogleCast.framework/GoogleCast", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleCast.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -231,6 +249,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -265,46 +284,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - D442A0785939ED7C311A5340 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", - "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - F8453FE49677B54947F70C12 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", - "${PODS_ROOT}/google-cast-sdk-no-bluetooth/GoogleCastSDK-ios-4.4.8_static/GoogleCast.framework/GoogleCastCoreResources.bundle", - "${PODS_ROOT}/google-cast-sdk-no-bluetooth/GoogleCastSDK-ios-4.4.8_static/GoogleCast.framework/GoogleCastUIResources.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleCastCoreResources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleCastUIResources.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -380,7 +359,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -402,8 +381,11 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -463,7 +445,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -512,7 +494,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -536,8 +518,11 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -567,8 +552,11 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", From 100671905aba48c11cf16913a7b7279e0da970ed Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Wed, 1 Feb 2023 16:12:43 +1100 Subject: [PATCH 5/8] Upgrade `com.google.android.gms:play-services-cast-framework`. --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index e472f08..4d65b95 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -44,7 +44,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - api "com.google.android.gms:play-services-cast-framework:19.0.0" + api "com.google.android.gms:play-services-cast-framework:21.2.0" // Lifecycle implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" From e46df000879cc595f9f8fcc77413d5cecc7732d3 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Wed, 1 Feb 2023 16:13:00 +1100 Subject: [PATCH 6/8] Revert "Upgrade `com.google.android.gms:play-services-cast-framework`." This reverts commit 100671905aba48c11cf16913a7b7279e0da970ed. --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 4d65b95..e472f08 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -44,7 +44,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - api "com.google.android.gms:play-services-cast-framework:21.2.0" + api "com.google.android.gms:play-services-cast-framework:19.0.0" // Lifecycle implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" From fa6b2f2e084d0a71632c2238d5efec756e194246 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Thu, 2 Feb 2023 13:21:54 +1100 Subject: [PATCH 7/8] Cleanup `arm64` excluded architectures since using google-cast `xcframework` --- ios/flutter_cast_framework.podspec | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ios/flutter_cast_framework.podspec b/ios/flutter_cast_framework.podspec index b3fcd81..bcfe98b 100644 --- a/ios/flutter_cast_framework.podspec +++ b/ios/flutter_cast_framework.podspec @@ -20,8 +20,4 @@ A new flutter plugin project. s.dependency 'google-cast-sdk-dynamic-xcframework-no-bluetooth' s.ios.deployment_target = '12.0' - - # This is to enable build on simulator - s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } - s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } end From 986d63a47183eebbdde8c698ace6481185fb86d7 Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Thu, 2 Feb 2023 14:40:51 +1100 Subject: [PATCH 8/8] Include `NSBonjourServices` & `NSLocalNetworkUsageDescription`. --- example/ios/Runner/Info.plist | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index 71372ad..f5df24f 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -22,6 +22,13 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + NSBonjourServices + + _googlecast._tcp + _CC1AD845._googlecast._tcp + + NSLocalNetworkUsageDescription + ${PRODUCT_NAME} uses the local network to discover Cast-enabled devices on your WiFi network. UILaunchStoryboardName LaunchScreen UIMainStoryboardFile