iOS UIApplication openURL очень медленно

Я видел похожий вопрос: OpenUrl замораживает приложение более чем на 10 секунд но это не относится к моему конкретному варианту использования изменения состояния установки второго приложения, и ни одно из перечисленных там решений не устранило мою проблему, поэтому я открываю этот вопрос.

Краткое резюме упрощенной ситуации:

У нас есть два приложения, назовем их appA и appB. В appA у нас есть кнопка, которая позволяет либо открыть магазин приложений для загрузки appB, если appB не установлено, либо открыть appB, если оно установлено. Каждый раз, когда appA открывается/возобновляется, он проверяет, установлено ли приложение B, выполняя [[UIApplication sharedApplication] canOpenURL: <<appB's URL scheme>>], если результат верен, кнопка appA говорит «Открыть AppB», в противном случае она говорит «Получить AppB».

Когда кнопка приложения A нажата, оно снова выполняет проверку canOpenURL: и либо открывает App Store для приложения B, либо открывает приложение B по внешней ссылке. Довольно простые вещи. Буквально код такой:

if ( [[UIApplication sharedApplication] canOpenURL:appBDeepLink] ) {

   [[UIApplication sharedApplication] openURL: appBDeepLink];

} else {

   [[UIApplication sharedApplication] openURL: appBAppStoreLink];

}

Все это работает, как и ожидалось, однако, если вы измените состояние установки appB и вернетесь к appA, вызов openURL зависнет на 5-10 секунд при следующем нажатии, прежде чем, наконец, откроется URL-адрес.

Например, вот 2 сценария, вызывающих зависание:

Сценарий 1. Установка appB

  1. У пользователя не установлено приложение appB

  2. Пользователь открывает appA

  3. Пользователь нажимает «Получить AppB»

  4. Пользователь попадает в App Store и устанавливает appB

  5. Пользователь повторно открывает appA (выводит его на передний план, он никогда не закрывался)

  6. appA видит, что appB теперь установлено, и меняет его кнопку на «Открыть AppB».

  7. Пользователь нажимает «Открыть AppB»

<сильный>8. Приложение зависает на 5–10 секунд

  1. приложение А открывает приложение Б

Сценарий 2: удаление appB

  1. У пользователя установлено appB

  2. Пользователь открывает appA

  3. Пользователь нажимает «Открыть AppB»

  4. приложение B открыто

  5. Пользователь закрывает приложение B

  6. Пользователь удаляет appB

  7. Пользователь повторно открывает appA (выводит его на передний план, он никогда не закрывался)

  8. appA видит, что приложение B теперь удалено, и меняет его кнопку на «Получить AppB».

  9. Пользователь нажимает «Получить AppB»

<сильный>10. Приложение зависает на 5–10 секунд

  1. appA открывает App Store

Похоже, что данный экземпляр UIApplication не обновляет свой внутренний список приложений, которые можно открыть через openURL, до тех пор, пока приложение не будет завершено / повторно открыто, или снова не будет вызван openURL, а вызов openURL вызывает зависание по мере его повторного запуска. настраивает свой внутренний список приложений, которые можно открыть (здесь я полностью размышляю, я не знаю, как это работает внутри). Несмотря на это, зависание существует, и я безуспешно пробовал множество способов обойти его, в том числе:

  • использование GCD для отправки в основной поток

  • использование GCD для отправки в фоновый поток

  • выполнение вызова openURL после короткой задержки в 0,1 секунды

  • использование detachNewThreadSelector:toTarget:withObject NSThread для выполнения вызова в другом потоке

Кажется, ничего не работает, задержка всегда есть, пока я не закрою приложение B и не открою его снова. При поиске в Интернете есть несколько сообщений Stackoverflow, в которых отмечается это поведение, начиная с iOS 7, но их решения (которые я пробовал выше), похоже, направлены на общую задержку вызова openURL из мест, где вы не должны быть ( в application:didFinishLaunchingWithOptions:, например), и я не смог найти ничего конкретно об открытии URL-адреса после установки/удаления приложения.

Я могу воспроизвести это в 100% случаев на iOS 8.4.

Кто-нибудь еще столкнулся с этим? Есть ли решение?


person Adam Eisfeld    schedule 07.08.2015    source источник
comment
У меня точно такая же проблема! но я пока не нашел решения... удачи тебе   -  person John the Traveler    schedule 20.12.2015
comment
Проблема все еще существует на iOS10. Но я не буду открывать радар на bugreport.apple.com, так как им на это вообще наплевать.   -  person erkanyildiz    schedule 11.05.2017


Ответы (1)


У меня была такая же проблема с использованием устаревшего метода openURL в версиях, в которых он устарел. Вместо этого вы должны использовать open(_:options:completionHandler:). (Извините за быстрый синтаксис)

См.: https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl https://developer.apple.com/documentation/uikit/uiapplication/1648685-open

person vbrittes    schedule 02.10.2018