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

fruv7luv  于 2023-01-27  发布在  Flutter
关注(0)|答案(4)|浏览(228)

我基本上是想在按下按钮时从我的应用程序中打开一个特定的youtube视频,如果youtube应用程序安装在用户的设备上,那么视频应该在youtube应用程序中打开(而不是在浏览器或单独的webview中)。
为此我使用了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方案工作(启动YouTube应用程序),因为我在第三方应用程序(发射中心专业版和Pythonista)上测试了它。
最后一件事我无法测试,是如果Platform.isIOS是真的在我的iPhone。
有没有一种有效的方法,打开YouTube应用程序从Flutter?

koaltpgm

koaltpgm1#

我修正了这个问题,我必须设置forceSafariVC: false,因为默认情况下它是真的,这会导致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';
    }
}

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

k97glaaz

k97glaaz2#

你不需要使用所有的 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);
    }
  }
 }
}

这里要突出显示的是避免将属性 universalLinksOnly 设置为true的几个if/else

uidvcgyl

uidvcgyl3#

我已经解决了这个问题。你可以试试下面的代码:

import 'package:flutter/material.dart';  
    import 'package:url_launcher/url_launcher.dart';  

    void main() => runApp(const HomePage());  

    class HomePage extends StatelessWidget {  
      const HomePage({Key? key}) : super(key: key);  
      @override  
      Widget build(BuildContext context) {  
        return const MaterialApp(  
          debugShowCheckedModeBanner: false,  
          home: MyApp(),  
        );  
      }  
    }  

    class MyApp extends StatefulWidget {  
      const MyApp({Key? key}) : super(key: key);  
      @override  
      _MyAppState createState() => _MyAppState();
    }  

    class _MyAppState extends State<MyApp> {  
      Future<void>? _launched;  
      @override  
      Widget build(BuildContext context) {  
        const String toLaunch = 'https://www.youtube.com/watch?v=WcZ8lTRTNM0';  
        return Scaffold(  
          appBar: AppBar(title: const Text('Flutter Demo')),  
          body: Center(  
            child: ElevatedButton(  
              onPressed: () => setState(() {  
                _launched = _launchInBrowser(toLaunch);  
              }),  
              child: const Text('Launch in browser'),  
            ),  
          ), );  
      }  
      Future<void> _launchInBrowser(String url) async {  
        if (!await launch(  
          url,  
          forceSafariVC: true,  
          forceWebView: false,  
          headers: <String, String>{'my_header_key': 'my_header_value'},  
        )) {  
          throw 'Could not launch $url';  
        }  
      }  
    }
iklwldmw

iklwldmw4#

使用相同 Package :https://pub.dev/packages/url_launcher
这是最新的工作示例。上面的大多数答案都已过时或使用过时的软件包。默认模式是LaunchMode.platformDefault。更改为LaunchMode.externalApplication将打开youtube应用程序。希望这对您有所帮助

Future<dynamic> openUrl(String url, callback) async {
  try {
    if (await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication)) {
      callback(true);
    } else {
      toastMessage('#1: Could not launch $url');
      callback(false);
    }
  } catch (e) {
    toastMessage('#2: Could not launch $url');
    callback(false);
  }
}

相关问题