这是一个基于 Nico Hämäläinen 优秀的 SOAppDelegate 灵感的 cocoapod。在我将 SOAppDelegate 用于一些我的项目后,我很快发现我不想要再使用 Vanilla AppDelegates 了。这个 pod 应该能简化新 iOS 项目的设置。
要运行示例项目;克隆仓库,然后首先从 Example 目录运行 pod install
。
有关此主题的详细介绍,请参阅这篇博客文章。
将您的 UIAppDelegate
实现改为 SOXAppDelegate
的子类。
#import "SOXAppDelegate.h"
@interface SOXDAppDelegate : SOXAppDelegate
@end
创建您的服务类。您可以为此目的使用普通的 NSObject
子类或 SOXService
子类。
NSObject
子类应该至少实现某种 Singleton 模式以防止你的服务的多个实例(每种 App 只有一个 UIApplicationDelegate
,所以你的服务也应该是这样的)。SOXService
实现了默认的 Singleton 模式,共享实例通过 sharedInstance
可用。
将 services
方法添加到您的 SOXAppDelegate
子类中。在这个示例中,我们假设 MyServiceClass
是您的服务的名称
#pragma mark - Services
- (NSArray *)services
{
static NSArray * _services;
static dispatch_once_t _onceTokenServices;
dispatch_once(&_onceTokenServices, ^{
_services = @[[MyServiceClass sharedInstance]];
});
return _services;
}
在服务类中实现您所需的所有 UIAppDelegate 方法。您不需要声明 UIApplicationDelegate
。当在 AppDelegate 上调用实现的方法时,您的 SOXAppDelegate
子类会调用服务实现的所有方法。
不要忘记在您委托内的所有 UIApplicationDelegate
方法中调用 super
。基类将确保实现该方法的 所有服务收到通知。
默认情况下,SOXAppDelegate 没有实现以下方法
- application:didReceiveRemoteNotification:fetchCompletionHandler
- application:performFetchWithCompletionHandler
使用这些方法时,您需要在Info.plist中额外进行设置。为了防止您在运行应用程序时(请参阅问题#2)在控制台上看到警告或提交应用程序后iTunes向您发送电子邮件(请参阅问题#3),现在通过定义已经排除了这些方法。
要使用这些方法,请使用以下定义中的任何一个(或两个都使用)
SOXAPPDELEGATE_BACKGROUNDMODE_FETCH
SOXAPPDELEGATE_BACKGROUNDMODE_REMOTENOTIFICATION
(用于- application:didReceiveRemoteNotification:fetchCompletionHandler:
)要启用其中一个后台模式,请使用cocoapods的post install hook。
post_install do |installer_representation|
installer_representation.project.targets.each do |target|
target.build_configurations.each do |config|
# enable UIBackgroundMode 'fetch'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'SOXAPPDELEGATE_BACKGROUNDMODE_FETCH=1']
# enable UIBackgroundMode 'remote-notification'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'SOXAPPDELEGATE_BACKGROUNDMODE_REMOTENOTIFICATION=1']
# enable both
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'SOXAPPDELEGATE_BACKGROUNDMODE_FETCH=1', 'SOXAPPDELEGATE_BACKGROUNDMODE_REMOTENOTIFICATION=1']
end
end
end
之后记得运行pod install
以触发post install hook。
感谢johndpope通过它的回答展示了如何在cocoapods中添加GCC编译预处理定义。
Florian Krüger, [email protected]
SOXAppDelegate遵守MIT许可证。有关更多信息,请参阅LICENSE文件。