美文网首页iOS 开发每天分享优质文章
UIApplication程序启动后创建的第一个对象

UIApplication程序启动后创建的第一个对象

作者: 丹丹十个胆小鬼 | 来源:发表于2018-12-18 13:34 被阅读22次

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__);
}

相关文章

网友评论

    本文标题:UIApplication程序启动后创建的第一个对象

    本文链接:https://www.haomeiwen.com/subject/uyjkkqtx.html