UIAPPlication

本文介绍了iOS中的`UIApplication`对象作用及其使用方法,包括设置应用提醒数字、联网状态、状态栏样式等,并详细讲解了如何模仿`UIApplication`创建单例对象,以及`UIApplicationDelegate`代理的应用场景和主要方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

## 什么是UIAPPlication

- `UIApplication`对象是应用程序的象征.

- 每个应用都有自己的`UIApplication`对象,这个对象是系统自动帮我们创建的, 它是一个单例对象.

- 个iOS程序启动后创建的第一个对象就是`UIApplication`对象- 我们只能通过[UIApplication sharedApplication]获得这个单例对象,不能够主动去创建它.

---

## UIApplication的作用

- 利用`UIApplication`对象,能进行一些应用级别的操作

- 可以设置应用程序图标右上角的红色提醒数字

- 设置联网指示器的可见性

- 可以设置应用陈旭的状态栏

- 进行应用之间的跳转

----

## UIApplication功能的实现

- 1.设置应用的提醒数字

```objc

- (void)viewDidLoad {

[super viewDidLoad];

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// 在设置之前, 要注册一个通知,从ios8之后,都要先注册一个通知对象.才能够接收到提醒.

UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

// 注册通知对象

[ap registerUserNotificationSettings:notice];

// 设置提醒数字

ap.applicationIconBadgeNumber = 10;

}

```

- 2.设置联网状态

```objc

- (void)viewDidLoad {

[super viewDidLoad];

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// 在设置之前, 要注册一个通知,从ios8之后,都要先注册一个通知对象.才能够接收到提醒.

UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

// 注册通知对象

[ap registerUserNotificationSettings:notice];

// 设置提醒数字

ap.applicationIconBadgeNumber = 10;

// 设置联网状态

ap.networkActivityIndicatorVisible = YES;

}

```

- 3.设置状态栏

- 应用程序的状态栏,默认是交给控制器来管理的

- 控制器提供的办法,可以直接重写这个方法

- 在控制器当中设置状态栏样式

```objc

-(UIStatusBarStyle)preferredStatusBarStyle

{

return UIStatusBarStyleLightContent;

}

```

- 4.隐藏状态栏

- 通过控制器的方式

```objc

-(BOOL)prefersStatusBarHidden

{

return NO;

}

```

- 5.应用程序管理状态栏

- 通常在开发当中都是应用程序来管理状态栏,来做统一管理。不然的话,会有很多个控制器,非常麻烦

- 想要让应用程序来管理状态栏,要在info.plist当中进行配置

- 添加一个key值:是最后一个,`View controller-based status bar appearance` ,设置为NO,就是应用程序来管理状态栏了

```objc

- (void)viewDidLoad {

[super viewDidLoad];

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// 设置状态栏的样式

ap.statusBarStyle = UIStatusBarStyleLightContent;

// 设置状态栏隐藏

ap.statusBarHidden = YES;

}

```

- 6.跳转网页

```objc

- (IBAction)ali {

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// URL:协议头

// 域名 应用程序通过协议头的类型,去打开相应的软件.

// NSURL *url =[NSURL URLWithString:@"http://www.baidu.com"];

// [ap openURL:url];

// 打电话

[ap openURL:[NSURL URLWithString:@"tel://10086"]];

// 发短信

// [ap openURL:[NSURL URLWithString:@"sms://10086"]];

}

```

## 模仿UIApplication创建一个单例

### 要求

- 程序一启动就创建创建对象.

- 创建的对象只能通过share的方式获取对象.

- 不能够进行alloc 操作,当执行alloc时, 程序发生崩溃

### 程序一启动就创建对象

- 当类被加载到内存的时候就会调用`load`的方法,它会比`main`优先调用

- 想要保存创建的对象,要用成员属性,但是现在是类方法, 没有办法访问成员属性. 所以搞了一个static的静态变量来保存

```objc

static Persion *_instance;

+(void)load{// 创建对象 _instance = [[self alloc] init]; }

``` ### 保证调用alloc时会产生异常

- 重写系统的alloc方法

```objc

+(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];

}

```

### 通过share方式获取对象

- 创建一个`sharePerson`的类方法

```objc

+(instancetype)sharePersion

{ return _instance

}

```

---

## UIApplication代理

- 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终结。还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件, 这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。

- UIApplication会在程序启动时创建一个遵守`UIApplicationDelegate`的代理.这个就是我们程序一创建时的`APPDelegate`类.`APPDelegate`类遵守了`UIApplicationDelegate`协议。

- 在这个类中定义了很多监听系统事件的方法.同时也定义了一些应用程序的生命周期方法。

### delegate可处理的事件包括

- 应用程序的生命周期事件(如程序启动和关闭)

- 系统事件(如来电)

- 内存警告- ...

### 主要方法

```objc

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

// 应用程序的生命周期方法

// 应用程序启动完成的时候调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

return YES;

}

// 当我们应用程序即将失去焦点的时候调用(不能进行人机交互)

- (void)applicationWillResignActive:(UIApplication *)application {

// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

}

// 当我们应用程序完全进入后台的时候调用

- (void)applicationDidEnterBackground:(UIApplication *)application {

// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

}

// 当我们应用程序即将进入前台的时候调用

- (void)applicationWillEnterForeground:(UIApplication *)application {

// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.

}

// 当我们应用程序完全获取焦点的时候调用。只有当一个应用程序完全获取到焦点,才能与用户交互.

- (void)applicationDidBecomeActive:(UIApplication *)application {

// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

}

// 当我们应用程序即将关闭的时候调用

- (void)applicationWillTerminate:(UIApplication *)application {

// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

}

@end

```

内容概要:本文详细介绍了900W或1Kw,20V-90V 10A双管正激可调电源充电机的研发过程和技术细节。首先阐述了项目背景,强调了充电机在电动汽车和可再生能源领域的重要地位。接着深入探讨了硬件设计方面,包括PCB设计、磁性器件的选择及其对高功率因数的影响。随后介绍了软件实现,特别是程序代码中关键的保护功能如过流保护的具体实现方法。此外,文中还提到了充电机所具备的各种保护机制,如短路保护、欠压保护、电池反接保护、过流保护和过温度保护,确保设备的安全性和可靠性。通讯功能方面,支持RS232隔离通讯,采用自定义协议实现远程监控和控制。最后讨论了散热设计的重要性,以及为满足量产需求所做的准备工作,包括提供详细的PCB图、程序代码、BOM清单、磁性器件和散热片规格书等源文件。 适合人群:从事电力电子产品研发的技术人员,尤其是关注电动汽车充电解决方案的专业人士。 使用场景及目标:适用于需要高效、可靠充电解决方案的企业和个人开发者,旨在帮助他们快速理解和应用双管正激充电机的设计理念和技术要点,从而加速产品开发进程。 其他说明:本文不仅涵盖了理论知识,还包括具体的工程实践案例,对于想要深入了解充电机内部构造和工作原理的人来说是非常有价值的参考资料。
### 关于 `UIApplication` 的用法及其在 iOS 18 中的变化 #### 背景介绍 自 iOS 系统发布以来,`UIApplication` 类一直是开发者用于管理应用生命周期的核心工具之一。它提供了访问全局对象的方法以及处理事件循环的功能。随着 iOS 不断更新迭代,苹果公司也在逐步调整该类的行为和接口设计。 #### iOS 18 中的关键变化 尽管官方文档未明确指出 `UIApplication` 在 iOS 18 中的具体改动,但从开发者的实践经验来看,以下几点值得注意: 1. **隐私与安全增强** 苹果公司在 iOS 18 继续加强了对用户数据保护的要求。对于通过 `sharedApplication` 获取实例并调用某些方法的情况,可能需要额外声明权限或遵循新的沙盒机制[^4]。这意味着任何涉及敏感操作(如网络请求、设备状态查询)的代码都需要重新评估合规性。 2. **弃用 API 替代方案** 随着时间推移,部分旧版 API 已经被标记为废弃。例如,在较早版本中提到过的 `wantsFullScreenLayout` 属性已被替代[^3]。虽然这并非直接影响 `UIApplication` 自身,但它反映了整个框架向现代化方向演进的趋势——鼓励开发者采用更灵活的设计模式来实现相同目标而不依赖特定属性配置。 3. **多窗口支持改进** 尽管全面意义上的 iPadOS 多任务特性是在后续版本才正式推出,但在 iOS 18 上已经可以看到一些铺垫工作。具体表现为当应用程序处于分屏或多任务环境下时,如何正确响应尺寸变更通知变得尤为重要。此时可以利用 `UIApplicationDelegate` 协议中的回调函数配合 `UIWindowSceneDelegate` 来适配不同场景下的行为逻辑。 4. **后台执行限制收紧** 对于那些试图绕过系统规定延长后台运行时间的应用程序来说,iOS 18 加大了监管力度。如果发现违规现象,则可能导致 AppStore 提交失败或者遭到下架处罚[^5]。因此建议仅限必要情况下申请适当类型的 Background Task 并严格控制其持续周期。 以下是展示如何获取单例对象并与之交互的一个简单例子: ```swift if let window = UIApplication.shared.windows.first { print("Main Window Frame:", window.frame) } ``` 此片段展示了怎样安全地访问当前活动窗口的信息而无需担心潜在崩溃风险。 --- ### 总结 综上所述,虽然表面上看似乎没有针对 `UIApplication` 做出特别显著的大规模重构动作;但实际上围绕安全性考量所做的种种微调却足以影响日常编码实践。务必密切关注最新指南说明以免无意间触犯政策底线造成不必要的麻烦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值