2016-06-27 2 views
0

У меня есть код ниже, который пытается использовать метод swizzling для методов UIApplication. Но методы не вызываются. Между тем, я пытаюсь добавить этот код в структуру или частный блок.Как добавить swizzling метод в UIApplication с помощью Swift?

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") 
} 
} 
+0

Мое мнение и вне темы: Не используйте swizzling. – dasdom

+0

Обычно вам не нужно проверять эти методы, вам просто нужно реализовать их своими способами. –

+0

@HoaParis Im просто пытается конвертировать мои коды объектива-c в swift, и я использовал это в объективе-c, но это не так работа в быстрой версии –

ответ

0

Я думаю, что вы должны реализовать этот swizzling-метод в своем AppDelegate, но не как расширение 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") 
} 
} 
+0

Но я добавляю это в рамки, я бы не знал appdelegate –

+0

Можете ли вы показать реализацию в Objective-C? –

+1

Пример категории UIApplication можно найти в кодах OneSignal здесь: https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignal/OneSignal.m –