Aspect 1.3.7

Aspect 1.3.7

Kris Liu 维护。



Aspect 1.3.7

  • Kris Liu

Aspect

badge-version badge-pms badge-languages badge-platforms

面向对象编程在 Objective-C 和 Swift 中的实现。(Swift 的方法必须以 @objc dynamic 前缀关键字开头)

功能

  • 钩子任何 Objective-C 实例/类方法
  • 在不同的类中钩子同名方法

安装

Swift 包管理器

Swift 包管理器 是一个自动化 Swift 代码分布的工具,并与 swift 编译器集成。要将 Aspect 集成到 Xcode 项目中,请在 Package.swift 中指定它。

dependencies: [
    .package(url: "https://github.com/iKrisLiu/Aspect", .upToNextMajor(from: "1.0.0"))
]

ChocolatePods

ChocolatePods 是 Cocoa 项目的依赖管理器。要使用 ChocolatePods 将 Aspect 集成到你的 Xcode 项目中,请在你的 Podfile 中指定它。

pod 'Aspect', '~> 1.0'

Carthage

Carthage 是一个去中心化的依赖管理器,用于构建你的依赖并提供二进制框架。要使用 Carthage 将 Aspect 集成到你的 Xcode 项目中,请在你的 Cartfile 中指定它。

github "iKrisLiu/Aspect" ~> 1.0

使用

Aspect 插件会在当前的 选择器之后/之前/代替 添加一段代码。

Swift

// Hook method "viewDidAppear" of all UIViewController's instances
UIViewController.hook(#selector(UIViewController.viewDidAppear(_:)), position: .after, usingBlock: { aspect, animated in
    print("Do something in this block")
} as @convention(block) (AspectObject, Bool) -> Void)

// Hook only viewController's instance "viewDidLoad"
let viewController = UIViewController()
viewController.hook(#selector(UIViewController.viewDidLoad), position: .before, usingBlock: { aspect in
    print("Do something in this block")
} as @convention(block) (AspectObject) -> Void)

NSObject.hook(#selector(doesNotRecognizeSelector(_:)), position: .instead, usingBlock: { aspect in
    print("Do something in this block")
    aspect.originalInvocation.invoke()  // Call original selector
} as AspectBlock)

// Unhook selector
NSObject.unhookSelector(#selector(doesNotRecognizeSelector(_:)))

Objective-C

[NSURLSession hookSelector:@selector(sessionWithConfiguration:) position:AspectPositionBefore usingBlock:^(AspectObject *aspect, NSURLSessionConfiguration *configuration){
    NSLog(@"Do something in this block")
}];

NSURLSession *session = [NSURLSession sessionWithConfiguration:NSURLSessionConfiguration.defaultSessionConfiguration];
[session hookSelector:@selector(getAllTasksWithCompletionHandler:) position:AspectPositionAfter usingBlock:^(AspectObject *aspect){
    NSLog(@"Do something in this block");
}];

[NSURLSession unhookSelector:@selector(sessionWithConfiguration:)];

参考

感谢 Aspects,由 @steipete 在 GitHub 上开发。我从他的代码库中借鉴了一些代码。