0

我在下面有一个代码,试图将 swizzling 方法用于 UIApplication 方法。但是这些方法没有被调用。同时,我正在尝试将此代码添加到框架或私有 pod 中。

extension UIApplication {
public override class func initialize() {
    struct Static {
        static var token: dispatch_once_t = 0
    }

    struct SwizzlingSelector {
        let original:Selector
        let swizzled:Selector
    }

    // make sure this isn't a subclass
    if self !== UIApplication.self {
        return
    }

    dispatch_once(&Static.token) {
        let selectors = [
            SwizzlingSelector(
                original: Selector("application:didFinishLaunchingWithOptions:"),
                swizzled: Selector("custome_application:didFinishLaunchingWithOptions:")
            ),
            SwizzlingSelector(
                original: Selector("applicationDidEnterBackground:"),
                swizzled: Selector("custom_applicationDidEnterBackground:")
            )
        ]

        for selector in selectors {
            let originalMethod = class_getInstanceMethod(self, selector.original)
            let swizzledMethod = class_getInstanceMethod(self, selector.swizzled)

            let didAddMethod = class_addMethod(self, selector.original, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

            if didAddMethod {
                class_replaceMethod(self, selector.swizzled, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
            } else {
                method_exchangeImplementations(originalMethod, swizzledMethod);
            }
        }
    }
}

// MARK: - Method Swizzling
public func custome_application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
    print("is here")
    return true
}

func custom_applicationDidEnterBackground(application: UIApplication) {
    print("is herer")
}
}
4

1 回答 1

0

我认为你应该在你的 AppDelegate 中实现这个 swizzling 方法,而不是作为 UIApplication 的扩展。因为你调配了 AppDelegate 的方法,而不是 UIApplication 的方法。

extension YourAppDelegate {
public override class func initialize() {
    struct Static {
        static var token: dispatch_once_t = 0
    }

    struct SwizzlingSelector {
        let original:Selector
        let swizzled:Selector
    }

    // make sure this isn't a subclass
    if self !== YourAppDelegate.self {
        return
    }

    dispatch_once(&Static.token) {
        let selectors = [
            SwizzlingSelector(
                original: Selector("application:didFinishLaunchingWithOptions:"),
                swizzled: Selector("custome_application:didFinishLaunchingWithOptions:")
            ),
            SwizzlingSelector(
                original: Selector("applicationDidEnterBackground:"),
                swizzled: Selector("custom_applicationDidEnterBackground:")
            )
        ]

        for selector in selectors {
            let originalMethod = class_getInstanceMethod(self, selector.original)
            let swizzledMethod = class_getInstanceMethod(self, selector.swizzled)

            let didAddMethod = class_addMethod(self, selector.original, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

            if didAddMethod {
                class_replaceMethod(self, selector.swizzled, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
            } else {
                method_exchangeImplementations(originalMethod, swizzledMethod);
            }
        }
    }
}

// MARK: - Method Swizzling
public func custome_application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
    print("is here")
    return true
}

func custom_applicationDidEnterBackground(application: UIApplication) {
    print("is herer")
}
}
于 2016-06-27T09:49:42.737 回答