14

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

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

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

=> 問題ありません。

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

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

     UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

}

しかし、launchOptions は常に nil です !! アプリ アイコンをクリックして最初からアプリを起動した場合 (通常) は 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;
}

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

4

4 に答える 4

19

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

- (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:ます。

ローカル通知を表示するアラート ビューを示す iPhone シミュレーターのスクリーンショット

私のアドバイスは次のとおりです。まず、上に投稿した例を取得して、セットアップで問題が発生していないことを確認してから、コードで何を行っているかを確認してください。

編集

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

  1. 上記のサンプル アプリをインストールし、[MyApp.app の起動を待つ] を無効にして起動します。
  2. ホーム ボタンをクリックし、Xcode またはタスク バーからアプリを停止します。
  3. 「MyApp.app の起動を待つ」を有効にします。
  4. 通知センターで通知をタップすると、アラート ビューに表示されます。
于 2012-11-25T17:16:02.687 に答える
1

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

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

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

    return YES;
}
于 2012-11-25T08:43:28.313 に答える
1

それが誰かを助けることができるかどうかの私の結論と提案は、以下を参照してください

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

于 2014-10-14T17:43:54.047 に答える
0

Apple のプッシュ通知サービスに関しては、私はまだ初心者ですが、ドキュメントを読んだところ、ローカル通知の作成に問題が発生している可能性があると推測されます。

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

于 2012-11-19T16:21:30.387 に答える