如何从框架中调整 AppDelegate 的 didReceiveRemoteNotification
how to swizzle didReceiveRemoteNotification of AppDelegate from framework
我正在为 iOS 应用程序(一个 pod)开发一个框架。我想调酒
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
使用我的框架中定义的方法。这是我的代码:
class MyClass {
@objc
func myCustomizedMethod(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// my code
}
private func swizzleDidReceiveRemoteNotification() {
guard let appDelegateClass = object_getClass(UIApplication.shared.delegate) else { return }
let originalSelector = #selector((appDelegateClass as! UIApplicationDelegate).application(_:didReceiveRemoteNotification:fetchCompletionHandler:))
let swizzledSelector = #selector(MyClass.self.myCustomizedMethod(_:didReceiveRemoteNotification:fetchCompletionHandler:))
guard let originalMethod = class_getInstanceMethod(appDelegateClass, originalSelector) else { return }
guard let swizzledMethod = class_getInstanceMethod(MyClass.self, swizzledSelector) else { return }
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
但是当我 运行 我的代码时,originalMethod 似乎有 nil 值,所以
class_getInstanceMethod(appDelegateClass, originalSelector)
returns 无。我做错了什么? (请考虑我无法访问 AppDelegate,因为正如我所说,我正在开发一个框架)
该方法是可选的。如果它不存在,那么您必须添加它而不是交换实现。
这是对我有用的代码:
class MyClass {
@objc
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// my code
}
private func swizzleDidReceiveRemoteNotification() {
let appDelegate = UIApplication.shared.delegate
let appDelegateClass = object_getClass(appDelegate)
let originalSelector = #selector(UIApplicationDelegate.application(_:didReceiveRemoteNotification:fetchCompletionHandler:))
let swizzledSelector = #selector(MyClass.self.application(_:didReceiveRemoteNotification:fetchCompletionHandler:))
guard let swizzledMethod = class_getInstanceMethod(MyClass.self, swizzledSelector) else {
return
}
if let originalMethod = class_getInstanceMethod(appDelegateClass, originalSelector) {
// exchange implementation
method_exchangeImplementations(originalMethod, swizzledMethod)
} else {
// add implementation
class_addMethod(appDelegateClass, swizzledSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
}
}
}
我正在为 iOS 应用程序(一个 pod)开发一个框架。我想调酒
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
使用我的框架中定义的方法。这是我的代码:
class MyClass {
@objc
func myCustomizedMethod(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// my code
}
private func swizzleDidReceiveRemoteNotification() {
guard let appDelegateClass = object_getClass(UIApplication.shared.delegate) else { return }
let originalSelector = #selector((appDelegateClass as! UIApplicationDelegate).application(_:didReceiveRemoteNotification:fetchCompletionHandler:))
let swizzledSelector = #selector(MyClass.self.myCustomizedMethod(_:didReceiveRemoteNotification:fetchCompletionHandler:))
guard let originalMethod = class_getInstanceMethod(appDelegateClass, originalSelector) else { return }
guard let swizzledMethod = class_getInstanceMethod(MyClass.self, swizzledSelector) else { return }
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
但是当我 运行 我的代码时,originalMethod 似乎有 nil 值,所以
class_getInstanceMethod(appDelegateClass, originalSelector)
returns 无。我做错了什么? (请考虑我无法访问 AppDelegate,因为正如我所说,我正在开发一个框架)
该方法是可选的。如果它不存在,那么您必须添加它而不是交换实现。
这是对我有用的代码:
class MyClass {
@objc
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// my code
}
private func swizzleDidReceiveRemoteNotification() {
let appDelegate = UIApplication.shared.delegate
let appDelegateClass = object_getClass(appDelegate)
let originalSelector = #selector(UIApplicationDelegate.application(_:didReceiveRemoteNotification:fetchCompletionHandler:))
let swizzledSelector = #selector(MyClass.self.application(_:didReceiveRemoteNotification:fetchCompletionHandler:))
guard let swizzledMethod = class_getInstanceMethod(MyClass.self, swizzledSelector) else {
return
}
if let originalMethod = class_getInstanceMethod(appDelegateClass, originalSelector) {
// exchange implementation
method_exchangeImplementations(originalMethod, swizzledMethod)
} else {
// add implementation
class_addMethod(appDelegateClass, swizzledSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
}
}
}