iOS Safari 在用户取消后无法识别 url 方案

iOS Safari does not recognize url schemes after user cancels

我最近注意到 Safari 中的异常行为。

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

然后我回到Safari,再次输入myapp://进入Safari, 这次提示我 "Open this page in "myapp"?" Cancel or Open.

如果我点击打开,我的应用程序将启动,并且后续尝试显示相同的警报。如果我尝试点击取消,我的应用程序将不会启动。这是预期的。

但是,如果我再次在 URL 栏中输入 myapp://,系统会提示我 "Cannot Open Page" "Safari cannot open the page because the address is invalid."

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

这与 Youtube 和 Evernote 的行为相同。我的猜测是,当用户点击取消时,Safari 将 URL 缓存为无效的 URL。是否有关于此行为的官方文档?

在 iOS 8.1.2 和 iOS 6.1.3

中提供

在 9.1 中问题仍然存在。我的解决方案是重新启动 safari(向上滑动以从后台清除它)。

重新启动 Safari 应用程序或打开新标签页解决了这个问题

我遇到了同样的问题。一旦取消,就会报错。

我所做的是发送一个带有时间戳的额外参数,因此 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);

当您调用您的 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];

将始终看到弹出窗口,直到您单击 "Okay"

在 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
}