17

iPhone バージョン - 5.1 (9B176)

didFinishLaunchingWithOptions以下は、メソッドが呼び出されないローカル通知中の一連のイベントです。

  1. アプリはバックグラウンドで実行されています。
  2. ローカル通知を受け取りました - ダイアログなしの単純な通知。
  3. バッジ番号を示すアプリ アイコンをクリックします。

Apple のドキュメントに従って期待される:

提示された通知の結果として、ユーザーはアラートのアクション ボタンをタップするか、アプリケーション アイコンをタップ (またはクリック) します。アクション ボタンが (iOS を実行しているデバイスで) タップされると、システムはアプリケーションを起動し、アプリケーションはデリゲートのdidFinishLaunchingWithOptionsメソッドを呼び出します (実装されている場合)。通知ペイロード (リモート通知の場合) またはローカル通知オブジェクト (ローカル通知の場合) で渡します。

iOS を実行しているデバイスでアプリケーション アイコンがタップされた場合、アプリケーションは同じメソッドを呼び出しますが、通知に関する情報は提供しません。

実際: didFinishLaunchingWithOptions 呼び出されていません。しかしapplicationWillEnterForegroundapplicationDidBecomeActive呼び出されました。

4

1 に答える 1

23

あなたは正しいです。この動作はドキュメントと矛盾しています。ドキュメントを脇に置いて、実際の動作に焦点を当てます。問題の要点は次のように思われます: ユーザーが通知を操作してアプリがアクティブになった場合、通知へのポインターを受け取りますが、ユーザーがアプリケーション アイコンを直接タップした場合は受け取りません。

説明する。アラート スタイルの通知を提示し、ユーザーがアクション ボタンをタップした場合、またはあなたの場合のように、バナー通知を提示し、ユーザーがそれをタップした場合、次の 2 つの方法のいずれかで通知へのポインターを受け取ります。

アプリケーションが Not-Running 状態の場合:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    UILocalNotification *launchNote = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (launchNote){
        // I recieved a notification while not running

    }
}

アプリケーションが何らかの状態で実行されている場合:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
    // I recieved a notification
}

ユーザーがアラート スタイルの通知をキャンセルすることを選択した場合、その通知はなくなります。

本当に厄介な一貫性のない部分は、バナー通知を提示し、ユーザーがアイコンをタップした場合、通知センターで提示された通知への参照を取得する方法がないように見えることです. つまり、それらは[[UIApplication sharedApplication] scheduledLocalNotifications]配列に表示されません。これはおそらく、それらがもはやスケジュールされておらず、現在提示されているためです。

要するに; ドキュメントが間違っています。そして、他にも厄介な矛盾があります。この動作が問題になる場合は、Apple にバグを報告する必要があります。

于 2012-03-27T14:28:59.073 に答える