在 App 工程中通过 Cocoapods 引入一个自己的 Swift 业务库 Pod1,该库中有一个 Swift 类服从一个 OC 的协议并实现了部分方法,例如:
open class AppDelegate : NSObject, UIApplicationDelegate {
open func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
return true
}
}
然后,在主工程中,继承自 AppDelegate
实现一个新类和新方法:
class CustomAppDelegate : AppDelegate {
func applicationDidBecomeActive(_ application: UIApplication) {
}
}
如果 Pod1 使用的是源码引入,一切正常;如果 Pod1 使用的是打包好的静态库 Pods1.xcframework,发现 applicationDidBecomeActive(:)
方法进不来了。原因是 respondsToSelector:@selector(applicationDidBecomeActive:)
返回 false
,也就是说,在 CustomAppDelegate
类下的方法 applicationDidBecomeActive(:)
不再是动态派发,而是静态派发了!
同样的代码,引入源码和静态库就造成这样的差异,着实很迷。
目前只能手动添加 @objc
标记解决这个编译兼容问题:
class CustomAppDelegate : AppDelegate {
@objc
func applicationDidBecomeActive(_ application: UIApplication) {
}
}
已经提了相关 issue 到苹果官方。