UIApplication對象特點:特點1:UIApplication對象是應用程式的象徵,一個UIApplication對象就代表一個應用程式,而且是單例的。(用來封裝整個應用程式的一個對象, 比如當應用程式執行到某個時期要做什麼, 生命周期等。)獲取UIApplication對象:[UIAppl...
UIApplication對象特點:
特點1:
- UIApplication對象是應用程式的象徵,一個UIApplication對象就代表一個應用程式,而且是單例的。(用來封裝整個應用程式的一個對象, 比如當應用程式執行到某個時期要做什麼, 生命周期等。)
- 獲取UIApplication對象:[UIApplication sharedApplication]
- 一個iOS程式啟動後,創建的第一個對象就是UIApplication對象,且只有一個。
|
舉例:通過代碼獲取兩個UIApplication對象,列印地址可以看出地址是相同的。
1 - (void)viewDidLoad {
2 [super viewDidLoad];
3
4 //獲取app對象 證明瞭一個應用程式中只有一個UIApplication對象
5 UIApplication *app1 = [UIApplication sharedApplication];
6
7 UIApplication *app2 = [UIApplication sharedApplication];
8 NSLog(@"app1=%p ---- app2 = %p", app1, app2);
9
10 }
|
列印結果:
2015-12-02 13:34:58.847 01 UIApplication[4563:852645] app1=0x7fe2b3e0eaa0 ---- app2 = 0x7fe2b3e0eaa0
|
特點2:
- 每一個應用都有自己的UIApplication對象,而且是單例的。
- 如果試圖在程式中新建一個UIApplication對象,那麼將報錯提示。
|
舉例:
1 - (void)viewDidLoad {
2 [super viewDidLoad];
3
4 //通過alloc+ init 創建一個UIApplication對象,會報異常
5 UIApplication *app = [[UIApplication alloc] init];
6
7 NSLog(@"%p", app);
8 }
|
列印結果:
2015-12-02 13:39:00.270 01 UIApplication[4675:867735] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
|
特點3:
- 利用UIApplication對象,能進行一些應用級別的操作
|
(1)應用圖標顯示數字 (詳見1.1 常用屬性) |
(2)狀態欄上的等待圖標指示器 (詳見1.1 常用屬性) |
(3)利用UIApplication打開某個資源 (openURL:方法)
✓系統會自動根據協議識別使用某個app打開
1 //打開一個網頁 :
2 [app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]];
3
4 //打電話
5 [app openURL:[NSURL URLWithString:@"tel://10086"]];
6
7 //發簡訊
8 [app openURL:[NSURL URLWithString:@"sms://10086"]];
9
10 //發郵件
11 [app openURL:[NSURL URLWithString:@"mailto://[email protected]"]];
12
✓使用openURL方法也可以打開其他應用,在不同應用之間互相調用對方。
美圖秀秀, 點擊分享到"新浪微博", 打開"新浪微博"選擇賬號, 跳轉回"美圖秀秀", 開始分享
喜馬拉雅, 使用微博、QQ 賬號 登錄。都需要應用程式間跳轉。
|
(4)通過UIApplication管理狀態欄 (詳見1.2 管理狀態欄) |
1.1 — 常用屬性
UIApplication的常用屬性
1 //應用程式圖標右上角的紅色提醒數字(預設為0)
2 @property(nonatomic) NSInteger applicationIconBadgeNumber;
3
4 舉例:
5
6 - (void)viewDidLoad {
7 [super viewDidLoad];
8
9 //獲取單例對象
10 UIApplication *app = [UIApplication sharedApplication];
11
12 // 創建用戶通知設置 (iOS8 後要求設置通知的時候必須經過用戶許可)
13 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
14 UIUserNotificationSettings *settings =
15 [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge
16 categories:nil];
17 //註冊許可權
18 [app registerUserNotificationSettings:settings];
19 }
20
21 //設置數字
22 app.applicationIconBadgeNumber = 10;
23
24 }
1 //聯網指示器的可見性 (預設為 no)
2 @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
3 舉例:
4
5 - (void)viewDidLoad {
6 [super viewDidLoad];
7
8 //獲取單例對象
9 UIApplication *app = [UIApplication sharedApplication];
10
11 //設置網路指示器
12 app.networkActivityIndicatorVisible = YES;
13
14 }
1.2 — 管理狀態欄
系統提供了2種管理狀態欄的方式
1.通過UIViewController管理(iOS 7以後)(每一個UIViewController都可以擁有自己不同的狀態欄)(推薦)
1 //狀態欄的樣式
2 -(UIStatusBarStyle)preferredStatusBarStyle;
3
4 //狀態欄的可見性
5 -(BOOL)prefersStatusBarHidden;
6 // 狀態欄可見性(預設為 no) --- UIViewController管理 (推薦使用)
7 - (BOOL)prefersStatusBarHidden {
8 return NO;
9 }
10
11 //狀態欄的樣式 --- UIViewController管理 (推薦使用)
12 - (UIStatusBarStyle)preferredStatusBarStyle {
13
14 /* 狀態欄樣式 statusBarStyle
15 UIStatusBarStyleDefault 狀態欄為黑色
16 UIStatusBarStyleLightContent 狀態欄為白色
17 UIStatusBarStyleBlackTranslucent
18 UIStatusBarStyleBlackOpaque
19 */
20
21 return UIStatusBarStyleDefault;
22 }
2.通過UIApplication管理(iOS 6之前)
(1)在ios 7 以後如果要通過UIApplication管理,則首先要在Info.plist文件中增加一個配置項
- key:View controller-based status bar appearance
- value:NO
|
1 //狀態欄的樣式 --- UIApplication管理
2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
3
4 //獲取單例對象
5 UIApplication *app = [UIApplication sharedApplication];
6
7 //採用動畫的效果設置狀態欄的樣式-由黑變白(過期)
8 [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
9
10 //隱藏狀態欄
11 app.statusBarHidden = YES;
12
13 //採用動畫的方式隱藏狀態欄 (過期 ios 3.2棄用)
14 [app setStatusBarHidden:YES animated:YES];
15
16 /* withAnimation:方法 (過期)
17 UIStatusBarAnimationNone 無特效
18 UIStatusBarAnimationFade 淡出效果
19 UIStatusBarAnimationSlide 向上退出隱藏
20 */
21 [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
22 }
|
使用場合
UIApplication:狀態欄的樣式只設置一次,使用動畫效果 |
UIViewController:狀態欄是否隱藏,樣式不一樣 |
1.3 — UIApplicationDelegate
引入
- 所有的移動操作系統都有個致命的缺點:app很容易受到打擾。
- 比如一個來電或者鎖屏會導致app進入後臺甚至被終止,還有很多其它類似的情況會導致app受到干擾。
- 在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓其處理這些系統事件。
|
delegate可處理的事件如:
- 應用程式的生命周期事件(如程式啟動和關閉)
- 系統事件(如來電)
- 記憶體警告
- … …
|
簡介:
- 新建完項目以後的那個AppDelegate文件, 就是UIApplication的代理對象。
- 該代理對象main函數中已經被設置好了, 無需我們手動設置了。
|
在main函數中進行的設置:
文件位置:Supporting Files —> main.m |
1 #import <UIKit/UIKit.h>
2 #import "AppDelegate.h"
3
4 int main(int argc, char *argv[]) {
5 @autoreleasepool {
6
7 //設置啟動UIApplication對象, 和對應的代理對象AppDelegate
8 return UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));
9 }
10 }
|
註意:
AppDelegate的主要作用就是處理(監聽)應用程式本身的各種事件 |
要想成為UIApplication的代理對象, 必須遵守:UIApplicationDelegate協議 |
1.3.1 — 代理方法
AppDelegate文件預設已經遵守了UIApplicationDelegate協議,已經是UIApplicationDelegate的代理
1 // AppDelegate.h
2
3 #import <UIKit/UIKit.h>
4
5 @interface AppDelegate : UIResponder <UIApplicationDelegate>
6
7 @property (strong, nonatomic) UIWindow *window;
8
9 @end
|
處理(監聽)應用程式本身的各種事件:
1 // AppDelegate.m
2
3 #import "AppDelegate.h"
4
5 @interface AppDelegate ()
6
7 @end
8
9 @implementation AppDelegate
10
11 // app啟動完成 調用該方法 啟動之後,將不再調用此方法!
12 // 如果因為記憶體等原因,應用程式被操作系統幹掉,再次點擊圖標,會調用此方法!
13 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
14 NSLog(@"%s", __func__);
15 return YES;
16 }
17
18 // app即將退出活動狀態的時候調用 (將要失去焦點:不能和用戶交互)( 此方法在來電或來簡訊的時候被調用)
19 // 游戲應該再此方法中暫停游戲進程!此方法在游戲開發中尤為重要!
20 - (void)applicationWillResignActive:(UIApplication *)application {
21 NSLog(@"%s", __func__);
22 }
23
24 // app已經進入後臺 調用該方法 (在此方法中保存應用程式的數據和狀態)
25 // 應用程式退出到後臺,釋放共用資源,保存用戶數據,停止時鐘,保存足夠的應用程式狀態信息...
26 - (void)applicationDidEnterBackground:(UIApplication *)application {
27 NSLog(@"%s", __func__);
28 }
29
30 // app即將進入前臺的時候 調用該方法 (在此方法中還原應用程式的數據和狀態)
31 - (void)applicationWillEnterForeground:(UIApplication *)application {
32 NSLog(@"%s", __func__);
33 }
34
35 // app已經進入活動狀態, 重新啟動原來暫停的狀態 (重新獲取焦點:可以和用戶交互)
36 - (void)applicationDidBecomeActive:(UIApplication *)application {
37
38 NSLog(@"%s", __func__);
39 }
40
41 // app接收到記憶體警告 調用該方法
42 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
43 NSLog(@"%s", __func__);
44 }
45
46 // app將要被殺死 調用該方法
47 // 註意:1.用戶主動關閉 2.系統因為記憶體不夠關閉了程式
48 - (void)applicationWillTerminate:(UIApplication *)application {
49
50 NSLog(@"%s", __func__);
51 }
52 @end
如有疑問,請發送郵件至 [email protected] 聯繫我。
By:藍田(Loto)