【问题标题】:Open the youtube app from flutter app on iOS从 iOS 上的 Flutter 应用打开 youtube 应用
【发布时间】:2019-09-20 23:10:05
【问题描述】:

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

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

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

_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';
    }
  }
}

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

import 'dart:io' show Platform;
import 'package:url_launcher/url_launcher.dart';

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

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

有没有一种可行的方法,可以从 Flutter 中打开 YouTube 应用?

【问题讨论】:

    标签: ios flutter youtube


    【解决方案1】:

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

    _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';
        }
    }
    

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

    【讨论】:

    • canLaunch('youtube://www.youtube...') 给出错误但 launch('youtube://www.youtube...') 工作 forceSafariVC 默认情况下似乎是错误的?我在 iOS 上使用 flutter 1.7.8 & url_launcher: ^5.0.2
    • LSApplicationQueriesSchemesyoutube 解决了问题
    • 不错的分享??
    • 从 iOS 9 开始,您还需要将 info.plist 中的 LSApplicationQueriesSchemes 设置为包含 youtube 的数组:stackoverflow.com/a/31086148/6024667
    【解决方案2】:

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

    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);
        }
      }
     }
    }
    

    这里要强调的事情是避免几个 if/else si 属性 universalLinksOnly 设置为 true。

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2016-03-23
      • 2014-09-22
      • 2017-04-13
      • 2016-01-11
      • 2013-09-12
      相关资源
      最近更新 更多