UIApplication程序启动后创建的第一个对象
1、什么是UIApplication?
UIApplication对象是应用程序的象征。每一个应用都有自己的UIApplication对象,这个对象是系统自动帮我们创建的, 它是一个单例对象。
一个iOS程序启动后创建的第一个对象就是UIApplication对象,只能通过[UIApplication sharedApplication]获得这个单例对象,不能够手动去创建它。
2、UIApplication作用
利用UIApplication对象,能进行一些应用级别的操作。
- 可以设置应用程序图标右上角的红色提醒数字;
- 设置联网指示器的可见性可以设置应用程序的状态栏;
- 设置状态栏
- 进行应用之间的跳转。
模仿UIApplication单例。
要求:程序一启动就创建对象。创建的对象只能通过share的方式获取对象。不能够进行alloc
操作,当执行alloc
时, 程序发生崩溃,报错如下:
UIApplication *app = [[UIApplication alloc] init];
// log
2018-12-18 10:26:55.351813+0800 19-UIApplication[9936:325966] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
1.程序一启动就创建对象。当类被加载到内存的时候就会调用load
的方法,它会比main
优先调⽤用
static Persion *_instance;
+(void)load{
//想要保存创建的对象, 要⽤用成员属性,但是现在是类⽅方法, 没有办法访问成员属性. 所以搞了⼀一个static的静态变量进⾏行保存创建对象
_instance = [[self alloc] init];
}
//2.保证调用alloc时会产生异常。重写系统的是alloc方法
+(instancetype)alloc{
//当调⽤用alloc⽅方法时,先查看⼀一下_instance有没有值,如果已经有值的话,直接抛出异常.
if(_instance){
NSException *exception = [NSException exceptionWithName: @"NSInternalInconsistencyException" reason:@"There can only be one Persion instance." userInfo:nil];
//抛出异常
[exception raise];
}
///保持系统的做法.
return [super alloc];
}
//3.通过share⽅方式获取对象
+(instancetype)sharePersion{
return _instance
}
2.1、设置应用程序图标右上角的红色提醒数字
UIApplication *app = [UIApplication sharedApplication];
// set to 0 to hide. default is 0. In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to set the icon badge.
// 在 iOS8以后,应用必须先用-[UIApplication registerUserNotificationSettings:]方法注册一个通知才能设置icon badge
// UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
// 这个方法已经在iOS 10.0被废弃 "Use UserNotifications Framework's -[UNUserNotificationCenter requestAuthorizationWithOptions:completionHandler:] and -[UNUserNotificationCenter setNotificationCategories:]
// [app registerUserNotificationSettings:setting];
//
// app.applicationIconBadgeNumber = 100;
// UNUserNotificationCenter //requestAuthorizationWithOptions:completionHandler:
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"授权成功!!");
}
}];
app.applicationIconBadgeNumber = 99;
iOS10之后,使用UNUserNotificationCenter
必须包含头文件#import <UserNotifications/UserNotifications.h>
2.2、联网指示器的可见性
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
2.3、应用之间的跳转
UIApplication *app = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
//(nonnull NSDictionary<UIApplicationOpenExternalURLOptionsKey,id> *)
[app openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:^(BOOL success) {
if (success) {
NSLog(@"success!");
}
}];
2.4、管理状态栏
应用程序的状态栏,默认是交给控制器来管理的。
控制其提供了方法,可以直接重写方法,设置状态栏的样式。
/**
设置状态栏的显示样式
UIStatusBarStyleDefault 默认黑色
UIStatusBarStyleLightContent 高亮白色
*/
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
/**
设置状态栏显示和隐藏
*/
- (BOOL)prefersStatusBarHidden {
return NO;
}
通常在开发当中都是应用程序来统一管理状态栏,不然的话,会有很多个控制器,会很麻烦。
想要让应用程序管理状态栏,要在info.plist当中进行配置,
添加一个key值:View controller-based status bar appearance
,设置为NO,就是应用程序来管理了。
UIApplication *app = [UIApplication sharedApplication];
app.statusBarStyle = UIStatusBarStyleLightContent;
app.statusBarHidden = NO;
3、UIApplicationDelegate
所有的移动操作系统都有个致命的缺点:app很容易受到打扰。 比如一个来电或者锁屏会导致app进入后台甚至被终止 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产⽣一些系统事件, 这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
delegate可处理的事件包括:
- 应⽤用程序的⽣生命周期事件(如程序启动和关闭)
- 系统事件(如来电)
- 内存警告
...
/**
应用程序启动完毕时调用
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%s", __func__);
// UIApplication *app = [UIApplication sharedApplication];
// app.statusBarStyle = UIStatusBarStyleLightContent;
// app.statusBarHidden = NO;
return YES;
}
/**
应用程序即将失去焦点时调用
*/
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
应用程序已经进入后台调用
*/
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
应用程序即将进入前台
*/
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
应用程序完全获取焦点的时候调用
*/
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
应用程序即将终止时回调
*/
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
接收到系统内存警告时回调
*/
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"%s", __func__);
}