認(rèn)識(shí)UIApplication
- UIApplication是應(yīng)用程序的象征
- 每一個(gè)應(yīng)用都有自己的UIApplication對(duì)象,而且是單例的
- 通過[UIApplication shareApplication]可以獲取單例對(duì)象
- 一個(gè)程序啟動(dòng)后創(chuàng)建的第一個(gè)對(duì)象就是UIApplication對(duì)象
- 利用UIApplication對(duì)象,可以進(jìn)行一些應(yīng)用級(jí)別操作
UIApplication的常用屬性
- 設(shè)置App圖標(biāo)右上角提醒數(shù)字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
iOS 10前的使用方式
UIApplication *app = [UIApplication sharedApplication];
//App圖標(biāo)右上角數(shù)字
app.applicationIconBadgeNumber = 12;
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
//需要注冊(cè)通知對(duì)象
[app registerUserNotificationSettings:setting];
iOS 10后的使用方式
UIApplication *app = [UIApplication sharedApplication];
//App圖標(biāo)右上角數(shù)字
app.applicationIconBadgeNumber = 12;
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
- 聯(lián)網(wǎng)指示器的可見性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible __TVOS_PROHIBITED; // showing network spinning gear in status bar. default is NO
app.networkActivityIndicatorVisible = YES;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
app.networkActivityIndicatorVisible = NO;
});
- 設(shè)置狀態(tài)欄
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
iOS 9以后使用prefersStatusBarHidden方法隱藏狀態(tài)欄
- (BOOL)prefersStatusBarHidden{
return YES;
}
- openURL調(diào)用打電話,發(fā)短信,發(fā)郵件,打開網(wǎng)頁等功能
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://123456"] options:0 completionHandler:^(BOOL success) {
}];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"] options:0 completionHandler:^(BOOL success) {
}];
UIApplication的代理方法AppDelegate
//App啟動(dòng)完畢的時(shí)候調(diào)用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"App啟動(dòng)完畢的時(shí)候調(diào)用");
return YES;
}
//當(dāng)App失去焦點(diǎn)的時(shí)候調(diào)用
- (void)applicationWillResignActive:(UIApplication *)application {
//當(dāng)應(yīng)用程序即將從活動(dòng)狀態(tài)轉(zhuǎn)移到非活動(dòng)狀態(tài)時(shí)發(fā)送。這可能發(fā)生在某些類型的臨時(shí)中斷(如來電或SMS消息)或用戶退出應(yīng)用程序并開始過渡到后臺(tái)狀態(tài)時(shí)。
//使用此方法暫停正在進(jìn)行的任務(wù),禁用計(jì)時(shí)器,并使圖形呈現(xiàn)回調(diào)失效。游戲應(yīng)該使用這種方法暫停游戲。
NSLog(@"App失去焦點(diǎn)");
}
//App進(jìn)入后臺(tái)
- (void)applicationDidEnterBackground:(UIApplication *)application {
//使用此方法釋放共享資源、保存用戶數(shù)據(jù)、使計(jì)時(shí)器失效,并存儲(chǔ)足夠的應(yīng)用程序狀態(tài)信息,以便在以后終止應(yīng)用程序時(shí)將其恢復(fù)到當(dāng)前狀態(tài)
NSLog(@"App已經(jīng)進(jìn)入后臺(tái)");
}
//App將要從后臺(tái)進(jìn)入前臺(tái)的時(shí)候調(diào)用
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"App將要后臺(tái)進(jìn)入前臺(tái)的時(shí)候調(diào)用");
}
//當(dāng)App完全獲取到焦點(diǎn)的時(shí)候調(diào)用,只有當(dāng)App完全獲取到焦點(diǎn),才能與用戶交互
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"App完全獲取到焦點(diǎn)");
}
//當(dāng)應(yīng)用程序即將終止時(shí)調(diào)用。如果適當(dāng)?shù)谋4鏀?shù)據(jù)
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"應(yīng)用程序即將終止時(shí)調(diào)用");
}
//App接收到內(nèi)存警告的時(shí)候調(diào)用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
NSLog(@"App內(nèi)存警告");
}
main()函數(shù)的UIApplicationMain函數(shù)底層實(shí)現(xiàn)
int main(int argc, char * argv[]) {
@autoreleasepool {
//第三個(gè)參數(shù):UIApplication的類名或子類的名稱, nil == @"UIApplication"
//第四個(gè)參數(shù):UIApplication代理的代理名稱,NSStringFromClass([AppDelegate class] == @"AppDelegate"
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain函數(shù)實(shí)現(xiàn)
- 根據(jù)第三個(gè)參數(shù)principalClassName傳遞的類名創(chuàng)建UIApplication對(duì)象
- 根據(jù)第四個(gè)參數(shù)delegateClassName創(chuàng)建AppDelegate代理對(duì)象,給UIAplication設(shè)置代理
- 開啟run loop主事件循環(huán),開始監(jiān)聽處理事件
- 加載Info.plist文件,判斷是否指定main,如果指定了就會(huì)去加載.