从 iOS 上的 flutter 应用程序打开 youtube 应用程序

fra*_*pps 6 youtube ios flutter

当按下按钮时,我基本上想从我的应用程序中打开一个特定的 YouTube 视频。如果 youtube 应用程序安装在用户的设备上,则视频应在 youtube 应用程序中打开(而不是在浏览器或单独的网络视图中)。

url_launcher为此使用了该软件包,它在 android 上运行良好。然而,在 iOS 上,即使安装了 youtube 应用程序也不会打开,而是打开一个单独的网络窗口,其中相应的 youtube 网址显示为网页。

我想,我可以像这样覆盖这种行为:

_launchURL() async {
  if (Platform.isIOS) {
    if (await canLaunch('youtube://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw')) {
      await launch('youtube://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw');
    } else {
      if (await canLaunch('https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw')) {
        await launch('https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw');
      } else {
        throw 'Could not launch https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw';
      }
    }
  } else {
    const url = 'https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它没有用。如果您想知道,我使用以下导入:

import 'dart:io' show Platform;
import 'package:url_launcher/url_launcher.dart';
Run Code Online (Sandbox Code Playgroud)

我很确定youtube://URL-Scheme 有效(启动 YouTube 应用程序),因为我在第三方应用程序(Launch Center Pro 和 Pythonista)上对其进行了测试。

我无法测试的最后一件事是,Platform.isIOS在我的 iPhone 上是否真的如此。

有没有一种可行的方法可以从颤动中打开 YouTube 应用程序?

fra*_*pps 10

我修好了它。我必须设置forceSafariVC: false,因为默认情况下它是 true,这会导致 url 在应用程序内的一种 webview 中打开。

_launchURL() async {
  if (Platform.isIOS) {
    if (await canLaunch('youtube://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw')) {
      await launch('youtube://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw', forceSafariVC: false);
    } else {
      if (await canLaunch('https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw')) {
        await launch('https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw');
      } else {
        throw 'Could not launch https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw';
      }
    }
  } else {
    const url = 'https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
}
Run Code Online (Sandbox Code Playgroud)

这实际上记录在url_launcher文档中,但有些隐藏......

  • <key>LSApplicationQueriesSchemes</key> <array> <string>youtube</string> </array> 解决了问题 (2认同)

Car*_*iel 6

您不必拥有所有if/else子句。要考虑的最重要的事情是设备是否有 YouTube 应用程序,无论操作系统如何(并且请记住将您的函数定义为 Future 因为 async):

Future<void> _launchYoutubeVideo(String _youtubeUrl) async {
if (_youtubeUrl != null && _youtubeUrl.isNotEmpty) {
  if (await canLaunch(_youtubeUrl)) {
    final bool _nativeAppLaunchSucceeded = await launch(
      _youtubeUrl,
      forceSafariVC: false,
      universalLinksOnly: true,
    );
    if (!_nativeAppLaunchSucceeded) {
      await launch(_youtubeUrl, forceSafariVC: true);
    }
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

这里要强调的是,为了避免多次if/else si 将属性universalLinksOnly设置为 true。