web-dev-qa-db-ja.com

XCode:didFinishLaunchingWithOptionsのlaunchOptionsが常にnilであるのはなぜですか?

通知をクリックしてアプリを起動したときに、アプリに特定の処理を実行させたい。アプリがすでにバックグラウンドで実行されているときにこれらの特定のことを実行したいのですが、通知をクリックしてアプリを最初から(バックグラウンドで実行されていない)起動した場合も同様です。

通知をクリックしてアプリをバックグラウンドから起動すると、次の方法で通知が届きます。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

=>問題なし!

通知をクリックしてアプリを最初から起動する場合、次の方法で通知を受け取りたいと思います。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

     UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

}

しかし、launchOptionsは常にnilです!!アプリアイコンをクリックしてアプリを最初から起動した場合(通常)だけでなく、通知をクリックしてアプリを最初から起動した場合(通常ではない)もゼロです。

誰かがこの問題を解決する方法を知っていますか?

ありがとう!!!

編集1

通知の作成方法は次のとおりです(ジョーの質問):

  NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:
[NSArray arrayWithObjects:notifText,latitudeString,longitudeString,nil]
forKeys:[NSArray arrayWithObjects:@"notifText",@"latitude",@"longitude", nil]];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.alertBody =msg;
    localNotif.alertAction = @"Ok";
    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;
    localNotif.userInfo = userInfo;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
    [localNotif release];

編集2(私の質問に答えてください!:))

これが私のアプリをデバッグするために使用した手順ですが...この手順は間違っています!!

  1. [スキームの編集]メニューの[MyApp.appが起動するのを待つ]オプションを使用してデバッガーを設定しました
  2. XCodeを使用してアプリを初めて起動しました(最初から起動します)XCodeに「MyAppが起動するのを待っています」と表示されます=>アプリアイコンをクリックしてアプリを起動しました
  3. アプリが起動します=>ホームボタンをクリックしました=>通知が表示されます
  4. XCodeの停止ボタンをクリックしてアプリを閉じましたXCodeで再起動しました=> XCodeは再び「MyAppの起動を待っています」というメッセージを表示します=>ステータスバーの通知をクリックしてアプリを起動しました
  5. => launchOptionsはnilです!

launchOptionsがnilに等しいのは、XCodeを使用して(この場合は「MyAppの起動を待機しています」オプションを使用して)アプリを再起動すると、ステータスバーに表示されていても通知が削除されるためです。

通知をクリックしてアプリを最初から再起動した後、launchOptionsのコンテンツをデバッグチェックできるようにするには、Tammo Freeseの回答に記載されているように、このコンテンツをUIAlertに表示するしか方法がないようです。したがって、この特定のケースでデバッグするには、以下を使用します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
    return YES;
}

助けてくれてありがとう!!!!

14
Regis_AG

共有したコードにエラーが見つかりませんでした。通常、これはシミュレータとデバイスの両方で機能するはずです。これが私のために働いた例です:最初に新しいシングルビューiPhoneアプリ(ARCとストーリーボードがオン)を生成します。次に、AppDelegateの2つのメソッドを次のように変更します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    localNotif.fireDate = [NSDate dateWithTimeInterval:10.0 sinceDate:[NSDate date]];
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.alertBody = @"Just some text";
    localNotif.alertAction = @"OK";
    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;
    localNotif.userInfo = @{@"test": @YES};

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
}

次に、このアプリを起動し、ホームボタンを押してから、アプリを停止します。ホームボタンを押してから10秒後に表示されるローカル通知をタップすると、次のようなメッセージが表示されます。これは、ローカル通知が-application:didFinishLaunchingWithOptions:に渡されたことを示しています。

screenshot of the iPhone Simulator showing an alert view that displays a local notification

私のアドバイスは次のとおりです。まず、上記で投稿した例を使用して、セットアップに問題がないことを確認してから、コードで何が異なっているかを確認します。

編集

これは、質問の編集2に当てはまります。アプリが起動するのを待っているときにローカル通知も機能するようです(デバイスではなくシミュレーターで)。これを試して:

  1. 上記のサンプルアプリをインストールし、「MyApp.appが起動するのを待つ」を無効にして起動します。
  2. ホームボタンをクリックし、Xcodeまたはタスクバーを介してアプリを停止します。
  3. 「MyApp.appが起動するのを待つ」を有効にします。
  4. 通知センターで通知をタップすると、アラートビューに表示されます。
19
Tammo Freese

私の結論と提案は、それが誰にでも役立つかどうか、以下を参照してください

アプリをテストするための新しいビルドを作成するたびに、最新のアプリによって生成された通知を使用して通知クリックアクションをテストする必要があります。古いビルドによって生成された古い通知を使用してクリックアクションのテストを続けると、予期しない動作が発生します(つまり、アプリを起動できますが、didFinishLaunchingWithOptionsで有効な情報が返されません:)

1
iDevAmit

これがあなたが探しているものであるかどうかはわかりませんが、 'return YES;'がありませんか?これを使用して通知から新しいビューへのセグエを実行し、正常に機能するため

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigation = (UINavigationController *) self.window.rootViewController;

    [navigation.visibleViewController performSegueWithIdentifier:@"Ident" sender:nil];

    return YES;
}
1
agierens

許してください、私はAppleのプッシュ通知サービスに関してはまだ新しいですが、私は彼らのドキュメントを読んだので、問題を引き起こしているローカル通知の作成に何かがあるかもしれないと思います。

リスト2-1に示すように、Appleの例を使用してローカル通知をどのように作成しているかを再確認します ここ その可能性を排除するためです。ローカル通知の作成に使用されるコードの一部はこのスレッドに表示されないため、ローカル通知のインスタンス化が実際に正しいかどうかを評価することは困難です。発火日が間違っている、または通知のその他の何かが正しく設定されていないなど、単純な結果になる可能性があります。

0
Anil Natha