UIApplication
- 父類是UIResponder。UIResponder繼承自NSObject
- 概念:每一個應(yīng)用程序本身就是UIApplication,是單例
- 創(chuàng)建時間:一個iOS程序啟動后創(chuàng)建的第一個對象就是UIApplication對象(即應(yīng)用程序本身)
- 作用:UIApplication對象是應(yīng)用程序的象征,利用UIApplication對象,能進(jìn)行一些應(yīng)用級別的操作
UIApplication處理的系統(tǒng)事件
-
應(yīng)用程序圖片的提醒數(shù)字
- 設(shè)置應(yīng)用圖標(biāo)右上角的數(shù)字,圖標(biāo)需要手動清除,應(yīng)用程序關(guān)閉,不會自動清除.
app.applicationIconBadgeNumber = 10;
-
聯(lián)網(wǎng)狀態(tài)
- 顯示聯(lián)網(wǎng)狀態(tài),告訴用戶此應(yīng)用正在聯(lián)網(wǎng)
app.networkActivityIndicatorVisible = YES;
-
設(shè)置狀態(tài)欄
- UIApplication管理狀態(tài)欄.IOS7及之后默認(rèn)交給控制器,若要交給UIApplication管理,需在info.plist中配置,詳見UIViewController管理狀態(tài)欄
-
注冊用戶通知
// 創(chuàng)建通知 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; // 注冊用戶通知 [app registerUserNotificationSettings:settings];
-
打開資源,電話,網(wǎng)頁,發(fā)短信
- 打開一個網(wǎng)頁資源,UIApplication打開資源的好處:不用判斷用什么軟件打開,系統(tǒng)會自動根據(jù)協(xié)議頭判斷。
1. 網(wǎng)絡(luò)資源URL的組成==協(xié)議頭://主機域名/路徑 http://www.baidu.com/abc/1.png
2. 本地資源URL的組成==協(xié)議頭:///路徑 本機域名可以不寫 file:///User/apple/Desktop/1.png//十分強大的openURL:方法 [app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]]; //打電話 UIApplication *app = [UIApplication sharedApplication]; [app openURL:[NSURL URLWithString:@"tel://10086"]]; //發(fā)短信 [app openURL:[NSURL URLWithString:@"sms://10086"]]; //發(fā)郵件 [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]]; // iOS跳轉(zhuǎn)到App Store下載應(yīng)用評分 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APPID"]];
- 打開一個網(wǎng)頁資源,UIApplication打開資源的好處:不用判斷用什么軟件打開,系統(tǒng)會自動根據(jù)協(xié)議頭判斷。
默認(rèn)情況下,當(dāng)設(shè)備一段時間沒有觸控動作時,iOS會鎖住屏幕。但有一些應(yīng)用是不需要鎖屏的,比如視頻播放器。
[UIApplication sharedApplication].idleTimerDisabled = YES;
// [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
```其他使用方法詳見UIApplication 用法解析
程序啟動流程
一. 加載程序中所有類對象
二. 找到程序入口,執(zhí)行main函數(shù),然后執(zhí)行main函數(shù)中的UIApplicationMain函數(shù)
main -> UIApplicationMain
三. UIApplicationMain底層處理:
1. 創(chuàng)建UIApplication對象或其子類對象
2. 創(chuàng)建UIApplication的代理對象或其子類對象,而且給UIApplication對象的代理屬性賦值
3. 開啟主運行循環(huán),接收事件并讓程序一直運行
4. 加載info.plist,判斷有木有指定main.storyboard,如果指定就會去加載storyboard
5. 程序啟動完成后創(chuàng)建窗口UIWindow。窗口被AppDelegate用強指針指向,所以不會銷毀。
6. 加載main.storyboard并實例化控制器(在創(chuàng)建窗口之后,詳見蘋果官方文檔)
7. 讓控制器成為窗口的根控制器,并讓窗口成為主窗口并顯示,在窗口顯示前,會懶加載根控制器的view,最后展示界面
8. 界面顯示
UIApplicationMain函數(shù)
- main函數(shù)中執(zhí)行了UIApplicationMain這個函數(shù)
int main(int argc, char * argv[]) {
@autoreleasepool {
/**
* 應(yīng)用程序主函數(shù),死循環(huán)
*
* @param argc 直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
* @param argv 直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
* @param nil principalClassName:指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)。
如果為nil,則用UIApplication類作為默認(rèn)值
* @param [AppDelegate class] delegateClassName:指定應(yīng)用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議,并讓其成為程序類的代理;
delegateClassName不能傳nil,這里傳nil,意味著application沒有代理,就無法監(jiān)聽系統(tǒng)的事件,系統(tǒng)的事件都沒法監(jiān)聽,就無法創(chuàng)建并讓窗口顯示
*
* @return 程序正常退出時UIApplicationMain函數(shù)才返回
*/
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}