有没有办法在 swift 的框架中覆盖应用程序委托?
Is there a way to override an app delegate in a framework in swift?
我目前正在 Swift 中开发一个框架,我必须检查是否
已通过 url 方案打开应用程序。
为此,我在开发应用程序时将其添加到我的 appdelegate 文件中:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
print("went back")
return true
}
问题是无法在框架中导入 UIApplication。
有没有一种方法可以捕获该事件而无需在应用程序中执行?
谢谢!
没有通用的方法来做到这一点。例如,在这种情况下没有发布可以观察到的 iOS 默认通知。
我看到了 2 种实现方式:
1) 重定向方法调用(可能和您一样)。 VK SDK 以这种方式实现了重定向。
例如:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
{
let result = MySDK.sharedInstance().openURL(url, options: options)
reutrn result
}
优点:明确,开发人员将知道您的 SDK 处理的位置 "open url"。
缺点:您需要开发人员知道他们需要添加这行代码
2) 创建基础应用程序委托(Facebook SDK 使用此方法)。因此,您创建了实现此方法的基础 class,并强制开发人员将其用作 AppDelegate
的超级 class
class BaseAppDelegate: UIResponder, UIApplicationDelegate {
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
{
let result = MySDK.sharedInstance().openURL(url, options: options)
reutrn result
}
}
class MyAppDelegate: BaseAppDelegate {
// Implement some custom app delegate
}
优点:开发人员更容易实施。
缺点:不如以前的方法那么明确,如果此方法将被 MyAppDelegate
覆盖,则需要调用 super。
我目前正在 Swift 中开发一个框架,我必须检查是否 已通过 url 方案打开应用程序。 为此,我在开发应用程序时将其添加到我的 appdelegate 文件中:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
print("went back")
return true
}
问题是无法在框架中导入 UIApplication。 有没有一种方法可以捕获该事件而无需在应用程序中执行?
谢谢!
没有通用的方法来做到这一点。例如,在这种情况下没有发布可以观察到的 iOS 默认通知。
我看到了 2 种实现方式:
1) 重定向方法调用(可能和您一样)。 VK SDK 以这种方式实现了重定向。
例如:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
{
let result = MySDK.sharedInstance().openURL(url, options: options)
reutrn result
}
优点:明确,开发人员将知道您的 SDK 处理的位置 "open url"。
缺点:您需要开发人员知道他们需要添加这行代码
2) 创建基础应用程序委托(Facebook SDK 使用此方法)。因此,您创建了实现此方法的基础 class,并强制开发人员将其用作 AppDelegate
class BaseAppDelegate: UIResponder, UIApplicationDelegate {
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
{
let result = MySDK.sharedInstance().openURL(url, options: options)
reutrn result
}
}
class MyAppDelegate: BaseAppDelegate {
// Implement some custom app delegate
}
优点:开发人员更容易实施。
缺点:不如以前的方法那么明确,如果此方法将被 MyAppDelegate
覆盖,则需要调用 super。