web-dev-qa-db-ja.com

ボタンを押すだけでlocalNotificationをすばやくキャンセルする方法

ボタンをクリックするだけで、ロケーションベースのUILocalNotificationをスケジュールします。しかし、同じボタンをもう一度クリックしてlocalNotificationをキャンセルしようとしても、通知はキャンセルされません。 UIApplication.sharedApplication().cancelLocalNotification(localNotification)を使用して、スケジュールされた場所に基づくローカル通知をキャンセルしています。何が悪いのですか?これが私の実装です

@IBAction func setNotification(sender: UIButton!) {
    if sender.tag == 999 {
        sender.setImage(UIImage(named: "NotificationFilled")!, forState: .Normal)
        sender.tag = 0
        regionMonitor() //function where notification get scheduled

    } else {
        sender.setImage(UIImage(named: "Notification")!, forState: .Normal)
        sender.tag = 999 }

スケジュールされた通知がキャンセルされるように、elseブロックに何を入力すればよいですか。すべての通知をクリアすることはできません。これがdidEnterRegionブロックコードで、ローカル通知をトリガーします

func locationManager(manager: CLLocationManager!, didEnterRegion region: CLRegion!) {
    localNotification.regionTriggersOnce = true
    localNotification.alertBody = "Stack Overflow is great"
    UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
    NSLog("Entering region")
}
17
sumesh

これがあなたのコンテキストで受け入れられる場合は、すべての通知を削除しようとすることができます。このような:

for notification in UIApplication.sharedApplication().scheduledLocalNotifications as! [UILocalNotification] { 
  UIApplication.sharedApplication().cancelLocalNotification(notification)
}

またはローガンが述べたように:

UIApplication.sharedApplication().cancelAllLocalNotifications()

またはSwift 4についてGerard Grundyが述べたように:

UNUserNotificationCenter.current().removeAllPendingNotificat‌​ionRequests()
47
Renan Kosicki

IOS 10以降のソリューションSwift 3.1

let center = UNUserNotificationCenter.current()
center.removeAllDeliveredNotifications() // To remove all delivered notifications
center.removeAllPendingNotificationRequests()
4

識別子を使用して通知をキャンセルできます。

let center = UNUserNotificationCenter.current()
center.removeDeliveredNotifications(withIdentifiers: [String])
center.removePendingNotificationRequests(withIdentifiers: [String])
2
glemoulant

ローカル通知のuserinfoにキーの一意の値を保存し、そのキーの値を使用してlocalnotificationを取得することにより、キーをキャンセルできます。これを試してください(Objective Cの場合):

NSArray *notifArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
for (int i=0; i<[notifArray count]; i++)
{
    UILocalNotification* notif = [notifArray objectAtIndex:i];
    NSDictionary *userInfoDict = notif.userInfo;
    NSString *uniqueKeyVal=[NSString stringWithFormat:@"%@",[userInfoDict valueForKey:@"UniqueKey"]];
    if ([uniqueKeyVal isEqualToString:keyValToDelete])
    {
        [[UIApplication sharedApplication] cancelLocalNotification:notif];
        break;
    }
}
1
Chengappa C D

Swift 3.0およびiOS 10の場合:

UNUserNotificationCenter.current().removeAllDeliveredNotifications()
1