iOS Safari не распознает схемы url после отмены пользователем

недавно я заметил странное поведение в Safari.

я регистрирую схему url для моего приложения и введите myapp:// в Safari. Это немедленно запускает мое приложение.

затем я возвращаюсь в Safari и вхожу myapp:// снова в Safari, на этот раз он подсказывает мне "открыть эту страницу в "myapp"?" отменить или открыть.

мое приложение запустится, если я нажму на open, и последующие попытки показывают то же самое предупреждение. Если я попытаюсь нажать "отмена" , мое приложение не будет запуск. чего ожидал.

однако, если я войду myapp:// в строке URL снова, мне предлагается "не удается открыть страницу" "Safari не может открыть страницу, потому что адрес недействителен."

это не удастся так же для всех последующих попыток, пока я не убью Safari и не перезапущу его или не открою другую вкладку.

это то же самое поведение с Youtube и Evernote. я предполагаю, что Safari кэшировал URL-адрес как недопустимый URL-адрес, когда пользователь нажимает на отмена. Есть ли официальная документация об этом поведении?

Bbserved в iOS 8.1.2 и iOS 6.1.3

5 ответов


в 9.1 проблема все еще существует. Решение для меня - просто перезапустить safari (проведите пальцем вверх, чтобы очистить его от фона).


У меня была та же проблема. После отмены, это даст эту ошибку.

Я отправил дополнительный параметр с меткой времени, поэтому Safari не будет кэшировать его. Поэтому после последнего парама я добавил Foo param с количеством миллисекунд с полуночи 1 января 1970 года. Я использую as3, но это должно быть читаемо для всех разработчиков:

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

перезапуск приложения safari или открытие новой вкладки решили эту проблему


при вызове 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];

всегда будет видеть всплывающее окно, пока вы не нажмете "хорошо"


добавление следующего кода в 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
}