自从我在项目中添加
ReactJS
库以来,我的 react-native-google-cast
代码遇到了问题。 CastButton
,它运行良好并可以检测我周围的设备。 "Mixed Content: The page at 'https://www.gstatic.com/cast/sdk/default_receiver/1.0/app.html?skin=https://www.gstatic.com/eureka/player/0000/skins/cast/skin.css&google_cast_bg=true' was loaded over HTTPS, but requested an insecure video 'XXXX'. This content should also be served over HTTPS."
。 android/app/build/intermediates/instant_app_manifest/debug/AndroidManifest.xml:4
包含 android:targetSandboxVersion="2"
,但我无法覆盖它,因为每次重建都会从某个地方(?)重新加载它。 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iptvapp"
android:targetSandboxVersion="1"
android:usesCleartextTraffic="true">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.reactnative.googlecast.GoogleCastOptionsProvider" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
如果要投射HTTP视频,则需要通过HTTP加载cast_receiver_framework,以避免混合内容。 Google 的投射接收器使用无方案 URL,例如:
<script src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
// www.gstatic.com 表示将按照当前页面加载方案加载。您的应用程序应通过 HTTP 加载,然后所有库也将通过 HTTP 运行。
或者,您可以使用 upgrade-insecure-requests CSP 指令并放置:
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
进入
<head>
部分。在这种情况下,浏览器会“神奇地”将所有 HTTP 请求替换为 HTTPS 请求。此变体比 HTTP 更安全,但播放的视频应该可以通过 HTTPS 访问。
已经很晚了。但以防万一有人来到这里寻找解决方案:
参数“android:usesCleartextTraffic="true"”应该添加到应用程序节点中,而不是添加到清单节点中。我的意思是:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iptvapp"
android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:usesCleartextTraffic="true"
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.reactnative.googlecast.GoogleCastOptionsProvider" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>