我基本上想在按下按钮时从我的应用中打开特定的youtube视频。如果youtube应用已安装在用户的设备上,则视频应在youtube应用中打开(而不是在浏览器或单独的Web视图中)。
我为此使用了url_launcher
软件包,它在android上运行良好。但是,在iOS上,即使已安装youtube应用程序,也不会打开它,而是会打开一个单独的Web窗口,其中相应的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';
}
}
}
但是没有用。以防万一,我使用以下导入:
import 'dart:io' show Platform;
import 'package:url_launcher/url_launcher.dart';
我敢肯定,youtube://
URL方案可以正常工作(启动YouTube应用),因为我已经在第三方应用(Launch Center Pro和Pythonista)上对其进行了测试。
我最后无法测试的是Platform.isIOS
在我的iPhone上是否真实。
有没有一种方法可以使YouTube App摆脱困境?
答案 0 :(得分:0)
我修复了它。我必须设置forceSafariVC: false
,因为默认情况下它为true,这会导致在应用程序内部的某种Web视图中打开该网址。
_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
文档中,但有些隐藏...
答案 1 :(得分:0)
您不必具有所有 if / else 子句。要考虑的最重要的事情是,无论设备是否具有youtube应用程序,S.O(,并且请记住,由于异步操作,您都将乐趣定义为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 。