В случае, когда я пытаюсь перейти по универсальной ссылке, все работает. как и ожидалось. В случае, когда я пытаюсь сделать то же самое со ссылкой на схему URL-адреса, я вижу, что успешно измененное приложение метода (_:open:options:) не запускается системой.
Если я инициализирую два пустых метода application(_:open:options:) и application(_:continue:restorationHandler:) в AppDelegate, а затем вызвать метод_exchangeImplementations из моего кода ниже, я получил успешно измененную реализацию application(_:open:options:) и application(_:continue:restorationHandler:) методы. Когда я пытаюсь сделать клик по универсальной ссылке или по ссылке схемы URL, в обоих случаях я получаю ожидаемое поведение - система запускает мои прокачанные методы.
Когда я не инициализирую пустые методы application(_:open:options:) и application(_:continue:restorationHandler:) в классе AppDelegate, как вы можете видеть из моего кода ниже, я вызываю метод class_addMethod для добавления реализации на лету к экземпляру AppDelegate. В этом случае я вижу, что оба метода: application(_:open:options:) и application(_:continue:restorationHandler:) успешно добавлены в экземпляр AppDelegate, но когда я пытаюсь чтобы выполнить щелчок по ссылке схемы URL-адреса - система не запустила мое приложение метода swizzled (_:open:options:) и наоборот с приложением метода (_:continue:restorationHandler:) - щелчок по универсальной ссылке запустил мой метод swizzle.
Код: Выделить всё
// MARK: Swizzle AppDelegate universal links method.
private func swizzleContinueRestorationHandler() {
guard let swizzleMethod = class_getInstanceMethod(Swizzler.self, #selector(self.application(_:continue:restorationHandler:))) else { return }
let delegateClass: AnyClass! = object_getClass(UIApplication.shared.delegate)
let applicationSelector = #selector(UIApplicationDelegate.application(_:continue:restorationHandler:))
if let originalMethod = class_getInstanceMethod(delegateClass, applicationSelector) {
method_exchangeImplementations(originalMethod, swizzleMethod)
} else {
class_addMethod(delegateClass, applicationSelector, method_getImplementation(swizzleMethod), method_getTypeEncoding(swizzleMethod))
}
}
// MARK: Swizzle AppDelegate URL schemes method.
private func swizzleOpenOptions() {
guard let swizzleMethod = class_getInstanceMethod(Swizzler.self, #selector(self.application(_:open:options:))) else { return }
let delegateClass: AnyClass! = object_getClass(UIApplication.shared.delegate)
let applicationSelector = #selector(UIApplicationDelegate.application(_:open:options:))
if let originalMethod = class_getInstanceMethod(delegateClass, applicationSelector) {
method_exchangeImplementations(originalMethod, swizzleMethod)
} else {
class_addMethod(delegateClass, applicationSelector, method_getImplementation(swizzleMethod), method_getTypeEncoding(swizzleMethod))
}
}
// MARK: Swizzled AppDelegate universal links method.
@objc func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
...
}
// MARK: Swizzled AppDelegate URL schemes method.
@objc func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
...
}
Подробнее здесь: https://stackoverflow.com/questions/583 ... ation-open
Мобильная версия