天天看點

iOS開發-UIApplication和App啟動狀态

UIApplication簡單從字面上了解就是應用程式,開發的時候有的時候會根據需要調用其中的方法,看起來不起眼,實際在iOS開發UIApplication提供了iOS程式運作期間的控制和協作工作。每一個應用程式在運作期必須有且僅有一個UIApplication(或則其子類)的一個執行個體,就是設計模式中常說的單例模式,通過sharedApplication擷取單例對象,不需要另外的init一個UIApplication。

經常程式可能編譯的時候沒錯,運作的時候報錯,通常都是停留在main.m中,這是程式的入口點,也從這裡建立了UIApplication單例執行個體。

1

2

3

4

5

<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>char</code> <code>* argv[]) {</code>

<code>    </code><code>@autoreleasepool</code> <code>{</code>

<code>        </code><code>return</code> <code>UIApplicationMain(argc, argv, </code><code>nil</code><code>, </code><code>NSStringFromClass</code><code>([AppDelegate </code><code>class</code><code>]));</code>

<code>    </code><code>}</code>

<code>}</code>

UIIApplication一般主要用于處理使用者事件,處理的時候會建立一個隊列,将所有使用者事件都放入隊列,逐一處理,在處理的時候,它會發送目前事件 到一個合适的處理事件的目标控件。同時UIApplication執行個體還維護一個在本應用中打開的window清單(UIWindow執行個體),這樣UIApplication可以擷取應用中的任何一個UIView對象。UIApplication執行個體會被賦予一個代理對象,以處理應用程式的生命周期事件(比如程式啟動和關閉),系統事件(比如電話、短信)等等。具體看下具體應用,

故事闆中建立一個按鈕,之後的畫擷取點選事件,加入以下兩行代碼:

<code>UIApplication *application=[UIApplication sharedApplication];</code>

<code> </code><code>//設定圖示上的更新數字</code>

<code> </code><code>application.applicationIconBadgeNumber=25;</code>

在iOS8.0之前會看到App上面有紅色的數字顯示,前幾個月微信頭像整人事件,不少人被坑了,強迫自己幾天沒看微信,看到小紅點就想點,控制台會提示以下資訊:Attempting to badge the application icon but haven't received permission from the user to badge the application

具體解決辦法很簡單,就是擷取以下機器的版本号,然後根據需要通知使用者選擇設定(個人覺得更人性化,手機上要是滿屏的小紅點,想想就。。);

6

7

8

9

<code>float</code> <code>versionNumber=[[[UIDevice currentDevice] systemVersion] floatValue];</code>

<code>if</code> <code>(versionNumber &gt;= 8.0) {</code>

<code>    </code><code>NSLog</code><code>(@</code><code>"%@"</code><code>,[</code><code>NSString</code> <code>stringWithFormat:@</code><code>"目前的系統為%f"</code><code>,versionNumber]);</code>

<code>    </code><code>//通知設定</code>

<code>    </code><code>UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:</code><code>nil</code><code>];</code>

<code>    </code><code>//接收使用者的選擇</code>

<code>    </code><code>[[UIApplication sharedApplication] registerUserNotificationSettings:settings];</code>

 UIApplication可以做一些其他的事情,比如其中的openURL就比較實用:

<code>//電話</code>

<code>[application openURL:[</code><code>NSURL</code> <code>URLWithString:@</code><code>"tel://10010"</code><code>]];</code>

<code>//短信</code>

<code>[application openURL:[</code><code>NSURL</code> <code>URLWithString:@</code><code>"sms://10010"</code><code>]];</code>

<code>//郵件</code>

<code>[application openURL:[</code><code>NSURL</code> <code>URLWithString:@</code><code>"mailto://[email protected]"</code><code>]];</code>

<code>//URL</code>

<code>[application openURL:[</code><code>NSURL</code> <code>URLWithString:@</code><code>"http://www.cnblogs.com/xiaofeixiang/"</code><code>]];</code>

UIApllicationDelegate協定中定義的方法有有一部分是和應用程式的狀态是相關的,建立的項目預設的都有AppDelegate.h和AppDelegate.m檔案,可以先參考以下預設生成的AppDelegate.m代碼:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

<code>//</code>

<code>//  AppDelegate.m</code>

<code>//  UIApplicationDemo</code>

<code>//  Created by keso on 15/2/5.</code>

<code>//  Copyright (c) 2015年 keso. All rights reserved.</code>

<code>#import "AppDelegate.h"</code>

<code>@interface</code> <code>AppDelegate ()</code>

<code>@end</code>

<code>@implementation</code> <code>AppDelegate</code>

<code>- (</code><code>BOOL</code><code>)application:(UIApplication *)application didFinishLaunchingWithOptions:(</code><code>NSDictionary</code> <code>*)launchOptions {</code>

<code>    </code><code>// Override point for customization after application launch.</code>

<code>    </code><code>NSLog</code><code>(@</code><code>"application-程式完成加載"</code><code>);</code>

<code>    </code><code>return</code> <code>YES</code><code>;</code>

<code>- (</code><code>void</code><code>)applicationWillResignActive:(UIApplication *)application {</code>

<code>    </code><code>// 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.</code>

<code>    </code><code>// 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.</code>

<code>    </code><code>NSLog</code><code>(@</code><code>"applicationWillResignActive-登出激活"</code><code>);</code>

<code>- (</code><code>void</code><code>)applicationDidEnterBackground:(UIApplication *)application {</code>

<code>    </code><code>// 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.</code>

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

<code>    </code><code>NSLog</code><code>(@</code><code>"applicationDidEnterBackground-進入背景"</code><code>);</code>

<code>- (</code><code>void</code><code>)applicationWillEnterForeground:(UIApplication *)application {</code>

<code>    </code><code>// 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.</code>

<code>      </code><code>NSLog</code><code>(@</code><code>"applicationWillEnterForeground-進入前台"</code><code>);</code>

<code>- (</code><code>void</code><code>)applicationDidBecomeActive:(UIApplication *)application {</code>

<code>    </code><code>// 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.</code>

<code>    </code><code>NSLog</code><code>(@</code><code>"applicationDidBecomeActive-成為激活狀态"</code><code>);</code>

<code>- (</code><code>void</code><code>)applicationWillTerminate:(UIApplication *)application {</code>

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

<code>      </code><code>NSLog</code><code>(@</code><code>"applicationWillTerminate-程式終止狀态"</code><code>);</code>

最開始main函數中其實是将AppDelegate執行個體化交給UIApplication去代理執行其中的方法,如果你喜歡這個AppDelegate檔案,完成有必須要根據需要建立一個自己的類檔案,隻要聲明UIApplicationDelegate即可。關于上面的狀态我們可以先看一張蘋果官網的圖:

iOS開發-UIApplication和App啟動狀态

其中方法蘋果預設有解釋,不過大概寫下個人的了解:

 application:didFinishLaunchingWithOptions:—應用展示給使用者之前完成最終的初始化工作

applicationWillResignActive:-從激活狀态進入休眠狀态,突然的電話,短信可以使目前程式進入背景,不可互動

applicationDidEnterBackground-應用程式進入背景,可以儲存和傳輸資料

applicationWillEnterForeground-可以在這裡恢複資料,即将進入前台,還不是激活狀态

applicationDidBecomeActive-進入前台擷取擷取焦點,可以互動

applicationWillTerminate-應用程式銷毀的時候調用,如果挂起不調用

寫到這裡可以具體看一下App的啟動過程:

1.main函數

2.UIApplicationMain 建立UIApplication對象,建立UIApplication的delegate對象(監聽應用程式狀态)

3.根據Info.plist獲得最主要storyboard的檔案名,加載最主要的storyboard,建立UIWindow(如果沒有故事闆,程式啟動完畢時調用代理的application:didFinishLaunchingWithOptions:方法,在application:didFinishLaunchingWithOptions:中建立UIWindow ),建立和設定UIWindow的rootViewController, 顯示視窗;

本文轉自Fly_Elephant部落格園部落格,原文連結:http://www.cnblogs.com/xiaofeixiang/p/4276169.html,如需轉載請自行聯系原作者

繼續閱讀