Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 990 - Responding to the Launch of Your App

Appleのドキュメントを読んで理解できるのはちょっと嬉しいですね。

Launchトランザクションで何が起こるのか理解しましょう。

Responding to the Launch of Your App | Apple Developer Documentation

UIKitを使ったアプリケーションの構造は次のようになっています。

f:id:yataiblue:20171021150605j:plain

アプリケーションを最初に立ち上げた時にシステムが用意しているUIApplicationが立ちあがります。これはシステムが制御するものでユーザーは変更することができません。UIApplicationはユーザーに制御させるためにUIApplication Delegateというプロトコールを用意しているのでそれを使って制御します。ということでUIApplication Delegateはカスタム・オブジェクトになるんです。

アプリケーションが最初に立ちあがる時にこの2つのプロトコールを使えます。

func application(_ application: UIApplication, 
    willFinishLaunchingWithOptions launchOptions: 
    [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
        // Override point for customization after app launch,
        //  but before state restoration.
    return true
}


func application(_ application: UIApplication,
       didFinishLaunchingWithOptions launchOptions: 
        [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for app customization
            // Perform final customization of your user interface.    
}

application(_:willFinishLaunchingWithOptions:) はアプリがストーリーボードからユーザーインターフェイスのオブジェクトを読み込んだ直後1度だけ呼ばれます。application(_:didFinishLaunchingWithOptions:) はアプリがコンテンツの利用するタイミングやインターフェイスをアップデイトしたりタスク開始のタイミングで呼ばれます。

これらのメソッドが実行されてUIKitに戻ってくるまでユーザーインターフェイスは表示されません。このメソッドは非同期、もしくはバックグラウンド・ディスパッチで実行させるのが原則です。

まずホームボタンでアプリのアイコンをタッチするとシステムはアプリの起動を始めるんですが。そのとき、dictionary型のオブジェクトを上記のメソッドに渡すんです。

dicutionary型のオブジェクトは単にkeysを保持しているだけで、これにより適切な起動を行えるようにするんです。例えば、アプリのバックグラウンドでロケーションをアップデイトさせるためにdicitionary型オブジェクトにlocationキーが含まれていると次のように記述することでlocationに応えることができます。

class AppDelegate: UIResponder, UIApplicationDelegate, 
               CLLocationManagerDelegate {
    
   let locationManager = CLLocationManager()
   func application(_ application: UIApplication,
              didFinishLaunchingWithOptions launchOptions:
              [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       
      // If launched because of new location data,
      //  start the visits service right away.
      if let keys = launchOptions?.keys {
         if keys.contains(.location) {
            locationManager.delegate = self
            locationManager.startMonitoringVisits()
         }
      }
       
      return true
   }
   // other methods…
}

なんとなく理解はできます。