Глубокие ссылки с AppDelegate и SceneDelegateIOS

Программируем под IOS
Ответить
Anonymous
 Глубокие ссылки с AppDelegate и SceneDelegate

Сообщение Anonymous »

Я пытаюсь реализовать глубокие ссылки для перехода к сообщениям в приложении. Это был старый проект, поэтому мне пришлось добавить класс SceneDelegate. Реализация глубокой ссылки работает только тогда, когда приложение активно или находится в фоновом режиме. Если приложение не загружено, глубокая ссылка не будет работать. Я видел много сообщений и руководств по этому вопросу и не понял, почему у кого-нибудь были подобные проблемы?
В классе AppDelegate я добавил реализацию для обработки ссылок для следующих функций:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {}

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {}

В SceneDelegate я реализую обработку ссылок в следующих функциях:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}

func scene(_ scene: UIScene, openURLContexts URLContexts: Set) {}

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {}

реализация этих функций выглядит следующим образом:
let navigator = Navigator()
navigator.getDesination(for: url)

func getDesination(for url: URL){
let destination = Destination(for: url)
let ivc = InstantiateViewController()
switch destination {
case .post(let postID):
ivc.openPostVC(id: postID, showComment: true, commentID: nil)
case .user(let userID):
ivc.openProfileVC(userID: userID)
default:
break
}
}

enum Destination {
case post(Int)

case user(Int)

case feed(String)

case store

case safari

init(for url: URL){
if(url.pathComponents[1] == "p"){
self = .post(Int(url.pathComponents[2])!)
} else if(url.pathComponents[1] == "user") {
self = .user(Int(url.pathComponents[2])!)
} else if(url.pathComponents[1] == "store") {
self = .store
} else if(url.pathComponents[1] == "s") {
self = .feed(url.pathComponents[2])
} else {
self = .safari
}
}
}

func openProfileVC(userID: Int){
let service = UserPool.shared.request(for: userID)

let storyboard = UIStoryboard(name: "Profile", bundle: nil)
let profileVC = storyboard.instantiateViewController(withIdentifier: "ProfileView") as! ProfileViewController
profileVC.userService = service
profileVC.shouldNavigateToHome = true
profileVC.shouldNavigateToHomeAction = {
self.loadMainStoryboard()
}

let navigationVC = UINavigationController(rootViewController: profileVC)
navigationVC.view.backgroundColor = .white

if #available(iOS 13.0, *) {
guard let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate else {return}
sceneDelegate.window?.rootViewController = navigationVC
sceneDelegate.window?.makeKeyAndVisible()
} else {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
appDelegate.window?.rootViewController = navigationVC
appDelegate.window?.makeKeyAndVisible()
}
}

Файл веб-сайтов app-site-association выглядит следующим образом, и в Xcode добавлен связанный домен:{"applinks":{"apps":[],"details":[{"appID":"{my ID}","paths":["*"]}]},"webcredentials":{"apps":["{my ID}"]}}


Подробнее здесь: https://stackoverflow.com/questions/674 ... nedelegate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»