1. AppDelegate の詳細な紹介:
すべての iPhone アプリケーションには UIApplication があります。UIApplication は iPhone アプリケーションの始まりであり、UIWindow の初期化と表示を担当し、アプリケーションの最初の UIView を UIWindow フォームにロードします。UIApplication のもう 1 つのタスクは、アプリケーションのライフ サイクルの管理を支援することです。UIApplication は、UIApplicationDelegate という名前のプロキシ クラスを通じてこのタスクを実行します。UIApplication はイベントの受信を担当しますが、UIApplicationDelegate はアプリケーションがこれらのイベントにどのように応答するかを決定します。UIApplicationDelegate が処理できるイベントには、アプリケーション ライフ サイクル イベント (プログラムの起動やシャットダウンなど)、システム イベント (着信、警告など)、この記事では、アプリケーションの UIView を UIWindow にロードする方法と、UIApplicationDelegate を使用してシステム イベントを処理する方法を紹介します。
- iOS13 より前は、AppDelegate がアプリのライフサイクルと UI ライフサイクルの処理を単独で担当していました。
- iOS13 以降、AppDelegate の責任は次のとおりです。
- アプリのライフサイクルを処理します。
- 新しいシーン セッション ライフ サイクル、UI ライフ サイクルは、新しいシーン デリゲートに引き継がれます。
2. アプリケーションのライフサイクルの概要:
1. 申請ステータス:
-
実行されていません: 実行されていません。プログラムは開始されていません。
-
非アクティブ: 非アクティブ。プログラムはフォアグラウンドで実行されていますが、イベントを受信しないか、突然の電話などの他のタスクによって強制的に占有されています。プログラムがフォアグラウンドにあるときに電話は自動的に画面をロックします。通常、プログラムはイベント処理を行わずにこの状態に留まります。
-
アクティブ: アクティブ化され、プログラムがフォアグラウンドで実行され、イベントを受信します。フロントの通常モードでもあります。
-
バックグラウンド: プログラムはバックグラウンドにありますが、コードを実行できます。ほとんどのプログラムは、バックグラウンド状態に入った後、一定期間のみバックグラウンド状態に留まります。時間が経過すると、サスペンド状態になります (サスペンド) 。一部のプログラムは、特別な要求後に一時停止状態 (Suspended) にならずに、長時間バックグラウンド状態に留まることがあります。
-
一時停止: 一時停止中、プログラムはバックグラウンドでコードを実行できません。システムはバックグラウンド プログラムを自動的にこの状態に変更し、通知は発行しません。中断されても、プログラムはメモリ内に残ります。システム メモリが不十分な場合、システムはハングしたプログラムをクリアして、フォアグラウンド プログラムにより多くのメモリを提供します。
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが備わっている可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ChHg12ht-1641890651119)(/Users/yichen/Library/Application Support/typora-user) -images/image-20211224134019851 .png)]
2. AppDelegate の一部のメソッド
(1)終了予定起動:
//willFinishLaunching:程序将要完成启动。只在程序启动时执行一次。launchOptions:存存储程序启动的原因。
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
(2)dFinishLaunching :
DidFinishLaunching は、アプリがユーザーにインターフェイスを表示する前に実行される最後の状態です。もちろん、このメソッドでいくつかの基本的な初期化を完了できますが、これは軽量の初期化操作である必要があり、そうしないとプログラムの起動時間が長くなります。
//didFinishLaunching是在app显示界面给用户之前最后执行的状态,理所当然我们可以在这个方法内完成一些基本的初始化,但是应该是轻量级的初始化操作,不然会导致程序启动时间长,影响用户体验。
//例如:
//不使用StoryBoard,需要配置window
//第三方登录sdk注册,以及很多第三方sdk的初始化配置
//判断程序接下来的业务逻辑,播不播放引导图片?播不播放开屏广告?有没有登录?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//若用户直接启动,launchOptions内无数据。
//若由其他程序通过openURL:启动。
//launchOptions中UIApplicationLaunchOptionsURLKey的数据为openURL:的参数url。
//launchOptions中UIApplicationLaunchOptionsSourceApplicationKey的数据为启动本程序的源程序的bundle ID(NSString)。
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
if (url) {
[self launchOptionsWithURL:url];
}
NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
if (bundleId) {
[self launchOptionsWithBundleId:bundleId];
}
//若由远程通知启动。
//launchOptions中UIApplicationLaunchOptionsRemoteNotificationKey对应数据为启动本程序的远程通知信息useinfo(NSDictionary)。
NSDictionary *useinfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (useinfo) {
[self launchOptionsWithUseinfo:useinfo];
}
return YES;
}
(3) アクティブになりました:
Did becomeActive : プログラムはアクティブ化されました。プログラムがフォアグラウンドにあるとき、つまりプログラムが初めて起動されたとき、およびバックグラウンドからフォアグラウンドに戻ったときに呼び出されます。
プログラムが以前にバックグラウンドにあった場合は、このメソッドでデータを再フェッチし、ユーザー インターフェイスを更新できます。
//程序第一次启动,从后台到前台时调用。
- (void)applicationDidBecomeActive:(UIApplication *)application {
//程序进入前台时,记录当前时间
}
(4) WillResignActive :
WillResignActive : プログラムはまもなく非アクティブになります。このプログラムは、着信があったとき、電話がロックされているときなど、フォアグラウンドにあるときに呼び出されます。プログラムが他のタスクに強制的に占有された場合にこのメソッドが呼び出されます(割り込みメソッドとも呼ばれます)。
- (void)applicationWillResignActive:(UIApplication *)application{
//程序准备进入后台通知相关VC 记录当前时间
}
(5)DidEnterBackground:
機能は次のとおりです。
- 共有リソースを解放する
- ユーザーデータの保存(ハードディスクへの書き込み)
- ボイドタイマー
- 次回復元するために十分なプログラム状態を保存します
//程序已经进入后台时调用
- (void)applicationDidEnterBackground:(UIApplication *)application {
//
}
**(6)WillEnterForeground **:
WillEnterForeground : プログラムはフォアグラウンドに入ります。プログラムがバックグラウンドからフォアグラウンドに入るときに呼び出されます。WillEnterForegroundは主に、 WillResignActiveで行われた操作を元に戻すために使用されます。
//程序将要进入前台。程序从后台进入前台时调用。
-(void)applicationWillEnterForeground:(UIApplication *)application {
}
(7)終了予定:
WillTerminate : プログラムは終了します。プログラムが終了する前に呼び出されます。
//目的就是为了保留一些重要的数据,方便下次启动后的恢复,达到一种让用户感觉该程序永远运行在后台从来没被终止过的感觉
- (void)applicationWillTerminate:(UIApplication *)application{
}
3. インタラクションの期間と順序
プログラムの開始:
- willFinishLaunchingWithOptions : プログラムの開始時に 1 回だけ呼び出されます。
- DidFinishLaunchingWithOptions : プログラムの起動が完了し、インターフェイスが表示されます。プログラム起動時に一度だけ実行されます。
- Did becomeActive : プログラムがフォアグラウンドにあるとき、つまりプログラムが初めて起動されたとき、およびバックグラウンドからフォアグラウンドに戻ったときに呼び出されます。
フロントデスクが背景に入ります。
- WillResignActive : プログラムはまもなく非アクティブになります。このプログラムは、着信があったとき、電話がロックされているときなど、フォアグラウンドにあるときに呼び出されます。このメソッドは、プログラムが他のタスクに強制的に占有された場合に呼び出されるため、プログラム割り込み呼び出しメソッドとも呼ばれます。
- DidEnterBackground : プログラムはバックグラウンドに入りました。プログラムがフォアグラウンドからバックグラウンドに入るときに呼び出されます。
背景からフロントデスクに入ります:
- WillEnterForeground : プログラムはフォアグラウンドに入ります。プログラムがバックグラウンドからフォアグラウンドに入るときに呼び出されます。
- Did becomeActive : バックグラウンドからフォアグラウンドに戻るときに呼び出されます。
プログラムを終了します。
- WillTerminate : プログラムは終了します。プログラムが終了する前に呼び出されます。