iOS Safari在用户取消后无法识别URL Scheme

27

我最近注意到Safari的一些奇怪行为。

我为我的应用程序注册了一个url方案,并在Safari中输入myapp://。这将立即启动我的应用程序。

然后我回到Safari,再次输入myapp://,这时会提示我"在“myapp”中打开此页面?"取消或者打开。

如果我点击打开,我的应用程序将启动且随后的尝试都会显示同样的提示。 如果我尝试点击取消,我的应用程序将不会启动,这是预期的行为。

然而,如果我再次在URL栏中输入myapp://,我会收到提示:"无法打开页面" "Safari无法打开该页面,因为地址无效。"

所有的后续尝试都将以相同的方式失败,直到我停止Safari并重新启动它,或者打开另一个选项卡。

这个问题在Youtube和Evernote上也存在。 我的猜测是Safari在用户点击取消时将URL缓存为无效的URL。 官方文档中是否有关于这种行为的说明?

iOS 8.1.2和iOS 6.1.3中都观察到了这种行为。


有关此事有任何更新吗?我似乎找不到任何合适的方法来重新启用我的应用程序URL scheme。我不得不重置设备设置才能使其再次正常工作 :-( - momo
我曾经遇到过同样的问题,请确保在info.plist文件中你应该写的是"appurl"而不是"appurll://"。 - Amitg2k12
6个回答

13

在9.1版本中该问题仍然存在。对我而言,解决方法只是重新启动Safari浏览器(上划清除后台运行)。


重新启动Safari对我没有用。如果用户按取消键,问题会在重新启动后再次出现。你重新启动后问题解决了吗? - Chirag Bhutani
这是一个一贯存在的 bug。我的意思是,如果您重新启动 Safari,提示将会出现。但是,如果用户一直按取消按钮,那么它当然会再次失败。 - Jinghan Wang
2
我注意到了另一件事情。如果我在我的服务器上托管一个简单的HTML页面,并在其中放置一个重定向到URL方案的按钮,那么即使我按下取消,它也能正常工作,但是如果我在网页中使用JavaScript,那么在按下取消后就会出现问题。对此有什么想法吗? - Chirag Bhutani
仍然发生在iOS 12.0上。 - Jonny
仍然发生在iOS 15.5上。 :-( - Giel Berkers

4

我曾经遇到过类似的问题。取消后,会提示出错信息。

我的解决方法是添加一个附带时间戳的额外参数,这样 Safari 就不会缓存它了。所以在最后一个参数后面,我添加了一个名为 "foo" 的参数,并使用自 1970 年 1 月 1 日午夜以来的毫秒数作为值。虽然我使用的是 as3,但所有开发人员都应该能看懂:

var foo:Number = new Date().time; //The number of milliseconds since midnight January 1, 1970
var urlRequest:URLRequest = new URLRequest(url+"&foo="+foo);

不错的想法。也许我会尝试一下。 - tzl
1
OAuth2的“state”参数也可以用于此目的,因为它通常应该构建一个唯一值,可以帮助防止伪造攻击。 - Mark Larter

2
重新启动Safari应用程序,或打开一个新标签页可以解决这个问题。

0
在AppDelegate中添加以下代码解决了我的问题,希望它也能对你有用。
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    let notification = Notification(name: Notification.Name(rawValue: "AppNotificationLaunchString"), object: nil, userInfo: [UIApplicationLaunchOptionsKey.url:url])
    NotificationCenter.default.post(notification)
    return true
}

0

当您调用URL时,请添加一个唯一值,例如时间戳到您的URL调用中

double currentt = [[NSDate new] timeIntervalSince1970];
NSTimeInterval differ= [[NSDate dateWithTimeIntervalSince1970:currentt] timeIntervalSinceDate:[NSDate dateWithTimeIntervalSince1970:1296748524]];
NSLog(@"differ: %f", differ);
NSString *url =[NSString stringWithFormat: @"https://thisisawebsite&timestamp=%f", differ];

将会一直看到弹出窗口,直到您点击“确定”。


0

我的观察是似乎与Safari选项卡相关的设置有关。如果您打开一个新选项卡,URL方案将起作用。

取消禁用URL方案并将设置保存到选项卡中。如果您滑动关闭Safari甚至重新启动手机,Safari将恢复选项卡,但仍无法处理该方案。但是,如果您打开一个新选项卡,则URL方案将起作用。

我认为,为了保持一致的行为,您需要在使用URL方案之前以某种方式打开一个新选项卡。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接