为我的自定义 UIApplicationDelegate 绕过 UABaseAppDelegateSurrogate

Posted

技术标签:

【中文标题】为我的自定义 UIApplicationDelegate 绕过 UABaseAppDelegateSurrogate【英文标题】:Bypass UABaseAppDelegateSurrogate for my custom UIApplicationDelegate 【发布时间】:2013-09-30 15:36:37 【问题描述】:

在我的 ios 应用程序中,我想使用 [[UIApplication sharedApplication] delegate] 检索对我的应用程序委托的引用,但是这将返回类 UABaseAppDelegateSurrogate 的实例,而不是我的自定义 UIApplicationDelegate 类。

我知道这个代理以某种方式用于接收通知,但我需要这个吗?我的应用程序委托实现了接收通知的所有必要方法,我想绕过这个代理类,以便我可以在我的自定义应用程序委托上调用方法。我不知道什么时候开始发生这种情况,但我曾经从 [[UIApplication sharedApplication] delegate] 获取我的自定义应用委托。

【问题讨论】:

【参考方案1】:

我认为它是来自您的框架的应用程序委托。看一下 main.m 文件,UIApplicationMain 是怎么调用的? 3d 参数是应用程序类,第 4 个是应用程序委托类。但是,如果您将其更改为您的自定义委托类,您可能会失去框架的功能。所以你需要更深入地研究UABaseAppDelegateSurrogate——也许你可以继承它?还是彻底摆脱它?

【讨论】:

在 main.m 中我正在传递我的自定义应用程序委托类,并且一直如此。 Urban Airship 框架以某种方式劫持了应用程序委托以使用其代理,但这只是最近才开始发生的。我可以从代理的属性中获取原始应用程序委托,但在了解原因之前我不想满足于这个解决方案 如果框架设置了自己的 appDelegate 它需要处理一些事情。然而这是一个糟糕的模式——每个对象都可以通过 NSNotificationCenter 订阅 UIApplication 通知。您可以做同样的技巧 - 在框架初始化后将 UIApplication 的委托设置为您自己的并将 UABaseAppDelegateSurrogate 作为您的 appDelegate 中的属性,只需将您的通知转发给它。但我认为您不必绕过框架的委托或挂钩。总结 - 框架使用它的 appDelegate 工作,如果你的代码使用框架,你的代码应该尊重它。【参考方案2】:

来自 Urban Airship 文档:

Urban Airship 库将自动与您的应用程序集成,因此您无需实现任何与推送相关的 UIApplicationDelegate 协议方法或向库传递通知。该库可以通过将自己设置为应用程序委托、拦截消息并将它们转发给您的原始应用程序委托来做到这一点。如果您想禁用此行为并在您自己的委托中实现委托回调,您可以在 AirshipConfig.plist 文件或传递给 [UAirship takeOff:(UAConfig *)config];

【讨论】:

以上是关于为我的自定义 UIApplicationDelegate 绕过 UABaseAppDelegateSurrogate的主要内容,如果未能解决你的问题,请参考以下文章

如何在通知内容扩展中为我的自定义视图应用自定义字体/颜色和半透明背景?

如何仅为我的自定义 vue 组件包含外部 css 文件?

有没有办法为我的自定义 Keycloak 电子邮件主题添加样式?

编写一个最小的自定义运算符:std :: sort需要std :: __ lg为我的类型定义

为啥我的自定义 ClientHttpRequestInterceptor 响应为空

为啥 jest 不能为我正在测试的自定义 React 钩子提供 useTranslation 钩子?