Этому приложению не разрешено запрашивать схему ‹app›

canOpenUrl не работает, потому что Apple не хочет, чтобы разработчики приложений запрашивали все установленные приложения, поскольку это будет нарушением конфиденциальности. Кроме того, canOpenURL всегда работает с предустановленным приложением Apple.

Есть два способа решить эту проблему при работе со сторонними приложениями.

  1. Пропустите проверку canOpenURL и вызовите напрямую open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:] , завершение завершения обработчика: ((Bool) -> Void)? = nil).
  2. Добавьте приложение, которое вы хотите перенаправить, в белый список с помощью LSApplicationQueriesSchemes.

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

Случай использования: перенаправление браузера или веб-представления, когда приложение не может знать, какое приложение может вызвать ссылку на контент.

guard let whatsappsUrl = URL(string: "whatsapp://open") else {
    return
}

UIApplication.shared.open(whatsapp, completionHandler: { (success) in 
   if (success) {    
       print("whatsapp opened: \(success)")  
   } else { print("either WhatsApp not installed or user denied WhatsApp launch request")
   }
})

Используя LSApplicationQueriesSchemes, мы можем поместить все возможные схемы приложений, которые мы хотим открыть в info.plist, и Open URL будет работать для всех этих схем.

Случай использования:создание пользовательского диалога общего доступа и т. д.

<dict>
   ... 
   <key>LSApplicationQueriesSchemes</key>
   <array>
     <string>whatsapp</string>
   </array>
</dict>