Невозможно вызвать приложение метода экземпляра Swizzling AppDelegate (_:open:options:), нажав на глубокую ссылку схемы IOS

Программируем под IOS
Ответить
Anonymous
 Невозможно вызвать приложение метода экземпляра Swizzling AppDelegate (_:open:options:), нажав на глубокую ссылку схемы

Сообщение Anonymous »

Я использую абсолютно тот же подход для переключения двух методов экземпляра AppDelegate — универсальных ссылок и ссылок схемы URL. Должен отметить, что обе тестовые ссылки настроены правильно. Я попытался проверить, как этот подход работает на iOS 12 и 13, и получил такое же неожиданное поведение.

В случае, когда я пытаюсь перейти по универсальной ссылке, все работает. как и ожидалось. В случае, когда я пытаюсь сделать то же самое со ссылкой на схему 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 {
...
}

Почему это происходит и как добавить метод application(_:open:options:) на лету в экземпляр AppDelegate и получить ожидаемое поведение после нажатия на ссылку схемы URL?


Подробнее здесь: https://stackoverflow.com/questions/583 ... ation-open
Ответить

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

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

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

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

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