Ручной способ открывать ссылки в SDK
Убедитесь, что предыдущие шаги выполнены успешно
- SDK добавлено в ваше мобильное приложение (в проекте появилась зависимость
CarrotSDK) - Ключи взяты из раздела для разработчика (не из webApi): ключи для SDK
- Инициализация выполнена успешно и приложение запустилось без ошибок
- В консоли появилась надпись “SDK init success”
Результат шага
- Ссылки из SDK можно вручную обработать и открыть внутри приложения
Словарь терминов
Небольшой словарь терминов, перед тем как мы начнем
- Universal link (еще его называют Deeplink, но это не терминология Apple):
https://example.com/section- URL scheme
example://sectionВы можете приложить ссылку к push-уведомлению или обработать её вручную в своем приложении.
Однако, не все так просто. Внутри обработчика push лежит функция:
if let clickActionUrl = URL(string: "Ваша ссылка") {
UIApplication.shared.open(clickActionUrl, options: [:])
}NSURL *clickActionUrl = [NSURL URLWithString:@"Ваша ссылка"];
if (clickActionUrl != nil) {
[[UIApplication sharedApplication] openURL:clickActionUrl options:@{} completionHandler:nil];
}Простейшая логика. Однако, по какой-то причине, функция iOS для открытия ссылок, указанная выше, не распознает универсальную ссылку приложения, если она вызывается из этого же приложения. Это отправит пользователя прямо в браузер.
Варианты решения проблемы
Есть два возможных варианта решения проблемы:
URL Scheme
Если в вашем приложении настроены URL Scheme то все уже готово. Просто приложите нужную схему к push.
URL Scheme - это более простой и надежный способ открыть нужную страницу в приложении, в отличии от Universal Link. Однако, они не выглядят как ссылка из интернета:
deeplink://testПерейдем к настройке. Выберите цель в настройках проекта Xcode и перейдите на вкладку «Информация». Внизу страницы вы найдете раздел «URL Types».

Нажав +, мы можем создать новый тип. В качестве идентификатора люди часто повторно используют пакет приложения. Для схем URL-адресов мы рекомендуем использовать название приложения (или сокращенное название), чтобы оно было как можно более кратким. В нем не должно быть никаких специальных символов. Мы будем использовать deeplink в качестве примера.
Ваше приложение готово распознать URL схему, теперь нам нужно обработать его, когда мы его получим.
Приложение фиксирует открытие следующим образом в более ранних приложениях, в которых есть только AppDelegate.
extension AppDelegate {
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
print(url)
return true
}
}- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
NSLog(@"%@", url);
return YES;
}Для новых приложений, включающих SceneDelegate, необходимо добавить обработчик еще и туда. Важно отметить, что метод AppDelegate не будет вызван, даже если вы его реализуете.
extension SceneDelegate {
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let firstUrl = URLContexts.first?.url else {
return
}
print(firstUrl.absoluteString)
}
}- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
UIOpenURLContext *firstContext = URLContexts.allObjects.firstObject;
NSURL *firstURL = firstContext.URL;
if (firstURL == nil) {
return;
}
NSLog(@"%@", firstURL.absoluteString);
}Если хотите проверить ссылку, введите ее в браузере Safari. Так же, доступен вариант для быстрой проверки на симуляторе. Вот команда для терминала:
xcrun simctl openurl booted "deeplink://test"Ручная обработка Universal link
Вернитесь к обработчику кликов на push и передайте аргумент false в параметр openLink:
CarrotNotificationService.shared.clickNotification(
notificationResponse: response,
openLink: false
)[[CarrotNotificationService shared] clickNotificationWithNotificationResponse:response
appGroudDomain:nil
openLink:NO];Затем, нужно достать ссылку из объекта response, который пришел в push. Мы заранее подготовили для этого функцию:
let link: String? = CarrotNotificationService.shared.getLink(from: response)NSString *link = [[CarrotNotificationService shared] getLinkFrom:response];Обратите внимание, что функция возвращает опционал, потому что push не всегда содержит ссылку.
Таким образом, в методе обработки кликов на push, у вас получится что-то такое:
import CarrotSDK
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let notificationService = CarrotNotificationService.shared
if notificationService.canHandle(response) {
notificationService.clickNotification(notificationResponse: response, openLink: false)
if let link = CarrotNotificationService.shared.getLink(from: response) {
print(link)
// Обработчик открытия Universal link
}
}
completionHandler()
}
}#import "CarrotSDK/CarrotSDK.h"
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler {
CarrotNotificationService *notificationService = [CarrotNotificationService shared];
if ([notificationService canHandleWithResponse:response]) {
[notificationService clickNotificationWithNotificationResponse:response
appGroudDomain:nil
openLink:NO];
NSString *link = [[CarrotNotificationService shared] getLinkFrom:response];
if (link != nil) {
NSLog(@"%@", link);
// Обработчик открытия Universal link
}
}
completionHandler();
}