10

問題:

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

iOS7では呼び出されないことがあります。通知をどのようにスケジュールするかは問題ではありません。

alarm.fireDate = [[NSDate date] dateByAddingTimeInterval:0.1];
[app scheduleLocalNotification:alarm];

また:

[app presentLocalNotificationNow:alarm];

私の考え: これは、通知アラート アニメーションが終了する前にユーザーがスライドした場合に発生します。そして、彼がスライドする前にわずか 0.5 秒待つと、通知が起動され、アプリは期待どおりに進みます。問題はおそらく、通知を受け取る前にアプリケーションがフォアグラウンドに入ることです。

誰かこれに会った?バグですか?解決策はありますか?ありがとうございました!

4

2 に答える 2

8

Apple は、ドキュメント ( Local and Remote Notification Programming Guide ) で、アプリの状態とユーザーが実行するアクション (エンリコが述べたように) に応じて、さまざまなメソッドが呼び出されることを明示的に述べています。

概要:

  • ユーザーが iOS 8 通知のカスタム アクション ボタンをタップします。 この場合、iOS は application:handleActionWithIdentifier:forRemoteNotification:completionHandler: または application:handleActionWithIdentifier:forLocalNotification:completionHandler: のいずれかを呼び出します。どちらの方法でも、ユーザーがタップしたボタンを特定できるように、アクションの識別子を取得します。また、アクションを処理するために必要な情報を取得できるように、リモートまたはローカルの通知オブジェクトも取得します。
  • ユーザーがアラートのデフォルト ボタンをタップするか、アプリ アイコンをタップ (またはクリック) します。... システムがアプリを起動し、アプリがデリゲートの application:didFinishLaunchingWithOptions: メソッドを呼び出し、通知ペイロード (リモート通知の場合) またはローカル通知オブジェクト (ローカル通知の場合) を渡します。...
  • アプリがフォアグラウンドで実行されているときに通知が配信されます。アプリは UIApplicationDelegate メソッド application:didReceiveLocalNotification: または application:didReceiveRemoteNotification:fetchCompletionHandler: を呼び出します。

したがって、didReceiveLocalNotification は、アプリが既に実行中で、フォアグラウンドにある場合にのみ発生します。が実行されていない 2 番目のシナリオにも対処する必要があります。この場合、Apple には次のコード例があります。

目的 C:

- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotif) {
        NSString *itemName = [localNotif.userInfo objectForKey:ToDoItemKey];
        [viewController displayItem:itemName];  // custom method
        app.applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber-1;
    }
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
    return YES;
}

Swift(私が提供した近似値):

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if let localNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
            if let itemName = localNotification.userInfo?[ToDoItemKey] as? String {
                handleNotification(localNotification)
                application.applicationIconBadgeNumber = localNotification.applicationIconBadgeNumber - 1
            }
    }
    .
    .
    .
}
于 2015-01-19T08:11:35.160 に答える