3.1 UIApplication->1.0 UIAppl

作者: 蓝田_Loto | 来源:发表于2016-08-15 00:23 被阅读60次

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


    本文相关目录:
    3.1 UIApplication->1.0 UIApplication对象
    3.1 UIApplication->2.0 程序启动原理

    0、UIApplication对象

    UIApplication对象特点:

    特点1:
    - UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序,而且是
    单例的。(用来封装整个应用程序的一个对象, 比如当应用程序执行到某个时期要做什么, 生命周期等。)
    
    - 获取UIApplication对象:[UIApplication sharedApplication]
    
    - 一个iOS程序启动后,创建的第一个对象就是UIApplication对象,且只有一个。
    

    举例:通过代码获取两个UIApplication对象,打印地址可以看出地址是相同的。

    - (void)viewDidLoad {
      [super viewDidLoad];
    
      //获取app对象 证明了一个应用程序中只有一个UIApplication对象
      UIApplication *app1 = [UIApplication sharedApplication];
    
      UIApplication *app2 = [UIApplication sharedApplication];
      NSLog(@"app1=%p ---- app2 = %p", app1, app2);
    
    }
    

    打印结果:

    UIApplication[4563:852645] app1=0x7fe2b3e0eaa0 ---- app2 = 0x7fe2b3e0eaa0
    
    特点2:
    - 每一个应用都有自己的UIApplication对象,而且是单例的。
    
    - 如果试图在程序中新建一个UIApplication对象,那么将报错提示。
    

    举例:

    - (void)viewDidLoad {
      [super viewDidLoad];
    
      //通过alloc+ init 创建一个UIApplication对象,会报异常
      UIApplication *app = [[UIApplication alloc] init];
    
      NSLog(@"%p", app);
    }
    

    打印结果:

    UIApplication[4675:867735] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
    
    
    特点3:利用UIApplication对象,能进行一些应用级别的操作

    (1)应用图标显示数字 (详见1、常用属性)

    (2)状态栏上的等待图标指示器 (详见1、常用属性)

    (3)利用UIApplication打开某个资源 (openURL:方法)

    • 方法1:系统会自动根据协议识别使用某个app打开
    //打开一个网页 :
    [app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]];
    
    //打电话
    [app openURL:[NSURL URLWithString:@"tel://10086"]];
    
    //发短信
    [app openURL:[NSURL URLWithString:@"sms://10086"]];
    
    //发邮件
    [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];
    
    • 方法2:使用openURL方法也可以打开其他应用,在不同应用之间互相调用对方。
    - 美图秀秀, 点击分享到"新浪微博", 打开"新浪微博"选择账号, 跳转回"美图秀秀", 开始分享
    
    - 喜马拉雅, 使用微博、QQ 账号 登录。都需要应用程序间跳转。
    

    (4)通过UIApplication管理状态栏 (详见2、管理状态栏)


    1、UIApplication的常用属性

    常用属性1:应用程序图标右上角的红色提醒数字

    // 应用程序图标右上角的红色提醒数字(默认为0)
    @property(nonatomic) NSInteger applicationIconBadgeNumber;
    

    举例:

    - (void)viewDidLoad {
      [super viewDidLoad];
    
     //获取单例对象
      UIApplication *app = [UIApplication sharedApplication];
    
      // 创建用户通知设置 (iOS8 后要求设置通知的时候必须经过用户许可)
      if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
        UIUserNotificationSettings *settings =
            [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge
                                              categories:nil];
         //注册权限
        [app registerUserNotificationSettings:settings];
      }
    
      //设置数字
      app.applicationIconBadgeNumber = 10;
    
    }
    

    常用属性2:联网指示器

    // 联网指示器的可见性 (默认为 no)
    @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
    

    举例:

    - (void)viewDidLoad {
      [super viewDidLoad];
    
        //获取单例对象
        UIApplication *app = [UIApplication sharedApplication];
    
        //设置网络指示器
        app.networkActivityIndicatorVisible = YES;
    
    }
    

    2、管理状态栏(系统提供了2种管理状态栏的方式)

    (1)通过UIViewController管理(iOS 7以后)(每一个UIViewController都可以拥有自己不同的状态栏)(推荐)
    //状态栏的样式
    -(UIStatusBarStyle)preferredStatusBarStyle;
    
    //状态栏的可见性(默认为No)
    -(BOOL)prefersStatusBarHidden;
    
    // 状态栏可见性(默认为No) --- UIViewController管理 (推荐使用)
    - (BOOL)prefersStatusBarHidden {
      return NO;
    }
    
    //状态栏的样式 --- UIViewController管理 (推荐使用)
    - (UIStatusBarStyle)preferredStatusBarStyle {
    
      /* 状态栏样式 statusBarStyle
       UIStatusBarStyleDefault            状态栏为黑色
       UIStatusBarStyleLightContent       状态栏为白色
       UIStatusBarStyleBlackTranslucent
       UIStatusBarStyleBlackOpaque
       */
    
      return UIStatusBarStyleDefault;
    }
    
    
    (2)通过UIApplication管理(iOS 6之前)

    在ios 7 以后如果要通过UIApplication管理,则首先要在Info.plist文件中增加一个配置项

    key:View controller-based status bar appearance
    
    value:NO
    
    通过UIApplication管理

    部分代码示例:

    //状态栏的样式 --- UIApplication管理
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
      //获取单例对象
      UIApplication *app = [UIApplication sharedApplication];
    
      //采用动画的效果设置状态栏的样式-由黑变白(过期)
      [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
    
      //隐藏状态栏
      app.statusBarHidden = YES;
    
      //采用动画的方式隐藏状态栏 (过期 ios 3.2弃用)
      [app setStatusBarHidden:YES animated:YES];
    
      /* withAnimation:方法  (过期)
       UIStatusBarAnimationNone   无特效
       UIStatusBarAnimationFade   淡出效果
       UIStatusBarAnimationSlide  向上退出隐藏
       */
      [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    }
    
    

    3、UIApplicationDelegate

    (1)UIApplicationDelegate的引入
    - 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。
    
    - 比如一个来电或者锁屏会导致app进入后台甚至被终止,还有很多其它类似的情况会导致app受到干扰。
    
    - 在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让其
    处理这些系统事件。
    
    (2)UIApplicationDelegate可处理的事件如:
    - 应用程序的生命周期事件(如程序启动和关闭)
    - 系统事件(如来电)
    - 内存警告
    … … … … … …
    
    (3)UIApplicationDelegate简介:
    - 新建完项目以后的那个AppDelegate文件, 就是UIApplication的代理对象。
    
    - 该代理对象main函数中已经被设置好了, 无需我们手动设置了。
    
    (4)UIApplicationDelegate在main函数中进行的设置:

    文件位置 (Supporting Files —> main.m)

    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    
    int main(int argc, char *argv[]) {
      @autoreleasepool {
    
        //设置启动UIApplication对象, 和对应的代理对象AppDelegate
        return UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));
      }
    }
    

    注意:

    - AppDelegate的主要作用就是处理(监听)应用程序本身的各种事件
    
    - 要想成为UIApplication的代理对象, 必须遵守:UIApplicationDelegate协议
    
    (5)UIApplicationDelegate图解:

    UIApplicationDelegate图解.png

    (6)AppDelegate.h 文件

    AppDelegate文件默认已经遵守了UIApplicationDelegate协议,已经是UIApplicationDelegate的代理

    //  AppDelegate.h
    
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    
    (7)AppDelegate.m 文件

    处理(监听)应用程序本身的各种事件:

    //  AppDelegate.m
    
    #import "AppDelegate.h"
    
    @interface AppDelegate ()
    @end
    
    @implementation AppDelegate
    
    // app启动完成 调用该方法  启动之后,将不再调用此方法!
    // 如果因为内存等原因,应用程序被操作系统干掉,再次点击图标,会调用此方法!
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      NSLog(@"%s", __func__);
      return YES;
    }
    
    // app即将退出活动状态的时候调用 (将要失去焦点:不能和用户交互)( 此方法在来电或来短信的时候被调用)
    // 游戏应该再此方法中暂停游戏进程!此方法在游戏开发中尤为重要!
    - (void)applicationWillResignActive:(UIApplication *)application {
      NSLog(@"%s", __func__);
    }
    
    // app已经进入后台 调用该方法 (在此方法中保存应用程序的数据和状态)
    // 应用程序退出到后台,释放共享资源,保存用户数据,停止时钟,保存足够的应用程序状态信息...
    - (void)applicationDidEnterBackground:(UIApplication *)application {
      NSLog(@"%s", __func__);
    }
    
    // app即将进入前台的时候 调用该方法 (在此方法中还原应用程序的数据和状态)
    - (void)applicationWillEnterForeground:(UIApplication *)application {
      NSLog(@"%s", __func__);
    }
    
    // app已经进入活动状态, 重新启动原来暂停的状态 (重新获取焦点:可以和用户交互)
    - (void)applicationDidBecomeActive:(UIApplication *)application {
      NSLog(@"%s", __func__);
    }
    
    // app接收到内存警告 调用该方法
    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
      NSLog(@"%s", __func__);
    }
    
    // app将要被杀死 调用该方法
    // 注意:1.用户主动关闭 2.系统因为内存不够关闭了程序
    - (void)applicationWillTerminate:(UIApplication *)application {
      NSLog(@"%s", __func__);
    }
    @end
    



    作者:蓝田(Loto)
    出处: 简书

    如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
    如有疑问,请通过以下方式交流:
    评论区回复微信(加好友请注明“简书+称呼”)发送邮件shorfng@126.com



    本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    相关文章

      网友评论

        本文标题:3.1 UIApplication->1.0 UIAppl

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