Как я могу использовать универсальные ссылки, когда я вызываю openURL внутри своего собственного приложения?

Мое приложение использует на разных экранах:

[[UIApplication sharedApplication] openURL:url];

для открытия URL-адресов, полученных от моего веб-сервиса. Иногда эти URL-адреса не имеют отношения к моему проекту, поэтому открывать их в Safari можно. Другие, эти URL-адреса принадлежат мне, например, сведения о продукте. Их может открыть мое приложение, используя универсальные ссылки и перейдя на соответствующий экран, но этого не происходит.

Читая документы Apple, я увидел это:

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

https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

Такое поведение смущает меня. Как я могу использовать openURL, чтобы попытаться сначала обработать этот URL-адрес внутри моего приложения, вместо того, чтобы переходить непосредственно в Safari?

Я нашел быстрый/грязный обходной путь. Удалите openURL и используйте его каждый раз, когда мое приложение использует openURL:

NSUserActivity* userActivity = [[NSUserActivity alloc] initWithActivityType:NSUserActivityTypeBrowsingWeb];
userActivity.webpageURL = url;
[[UIApplication sharedApplication].delegate application:[UIApplication sharedApplication] continueUserActivity:userActivity restorationHandler:nil];

Обратите внимание, что мой appdelegate application:continueUserActivity:restorationHandler: будет перенаправлять на openURL любой URL-адрес, который не имеет определенного экрана в моем приложении, поэтому он работает отлично, но я считаю, что это ужасное решение.


person Ricardo    schedule 19.10.2017    source источник
comment
Можете ли вы объяснить более подробно? Вам нужно обработать некоторые URL-адреса и открыть их в своем приложении, а также пропустить некоторые ссылки и открыть их в сафари?   -  person Serhii Londar    schedule 19.10.2017


Ответы (2)


Ваше решение кажется разумным. Почему это ужасно?

Вероятно, вы можете реализовать более красивое решение, например, автономный класс LinkHandler. Класс может определить, может ли ссылка быть обработана вашим приложением (чем оно будет использовать обработку приложения). В противном случае класс передаст эту ссылку в обработку iOS с помощью [UIApplication openURL:].

Многие приложения делают это, представьте, как приложения Google+ или Facebook для iOS будут обрабатывать ссылки, размещенные в этих социальных сетях.

person Oleksiy Ivanov    schedule 20.10.2017
comment
Спасибо за ответ. Знаете ли вы конкретные примеры, когда что-то подобное используется? Спасибо. - person Ricardo; 02.11.2017
comment
Одно важное замечание: NSUserActivity/NSUserActivityTypeBrowsingWeb обрабатывает только URL-адреса http и https. Если вы нажмете ссылку, например mailto:..., приложение вылетит, поэтому в этом случае перенаправьте на openURL, и проблема будет устранена. - person Ricardo; 11.12.2017

Вот быстрая версия 4.2 собственного решения Рикардо.

let userActivity =  NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb)
userActivity.webpageURL = url;
UIApplication.shared.delegate?.application?(UIApplication.shared, continue: userActivity, restorationHandler: { _ in })
person Jack Oborin    schedule 02.04.2020