web-dev-qa-db-ja.com

UILocalNotificationをキャンセル

UILocalNotificationに問題があります。

私は自分の方法で通知をスケジュールしています。

- (void) sendNewNoteLocalReminder:(NSDate *)date  alrt:(NSString *)title
{
    // some code ...
    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 

    if (localNotif == nil)  
        return;

    localNotif.fireDate = itemDate; 
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.alertAction = NSLocalizedString(@"View Details", nil); 
    localNotif.alertBody = title;
    localNotif.soundName = UILocalNotificationDefaultSoundName; 
    localNotif.applicationIconBadgeNumber = 0;

    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:stringID forKey:@"id"]; 
    localNotif.userInfo = infoDict; 

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

正常に動作し、通知を正しく受信しています。問題は、通知をキャンセルすべきときです。この方法を使用しています。

- (void) deleteNewNoteLocalReminder:(NSString*) reminderID noteIDe:(NSInteger)noteIDE
{
    [[UIApplication sharedApplication] cancelLocalNotification:(UILocalNotification *)notification ????  
}

ここで何をすべきかわかりませんが、私の質問は次のとおりです。

削除するUILocalNotificationオブジェクトを確認するにはどうすればよいですか?
すべての通知を一覧表示する方法はありますか?

私が持っている唯一のものは、削除するリマインダーのIDです。
UILocalNotificationオブジェクトを「Note」オブジェクトに保存し、その方法で取得することを考えていましたが、SQLiteデータベースに保存するときにオブジェクトをシリアル化するなど...よりスマートな方法はありますか?

47
f0rz

スイフト5:

UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: arrayContainingIdentifiers)
1

私の解決策は、UILocalNotificationserInfo辞書を使用することです。実際、私が行うことは、各通知に対して一意のIDを生成することです(もちろん、この[〜#〜] id [〜#〜]は後で取得できます)、特定の[〜#〜] id [〜#〜]に関連付けられた通知をキャンセルする場合は、配列を使用して利用可能なすべての通知をスキャンします。

[[UIApplication sharedApplication] scheduledLocalNotifications]

そして、私は[〜#〜] id [〜#〜]を調査することで通知を一致させようとします。例えば。:


NSString *myIDToCancel = @"some_id_to_cancel";
UILocalNotification *notificationToCancel=nil;
for(UILocalNotification *aNotif in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
  if([[aNotif.userInfo objectForKey:@"ID"] isEqualToString:myIDToCancel]) {
     notificationToCancel=aNotif;
     break;
  }
}
if(notificationToCancel) [[UIApplication sharedApplication] cancelLocalNotification:notificationToCancel];

この方法がアーカイブ/アーカイブ解除方法よりも優れているかどうかはわかりませんが、機能し、保存するデータをIDのみに制限します。

編集:行方不明のブレーキがありました

93
viggio24

scheduledLocalNotifications からすべてのスケジュール済み通知のリストを取得するか、すべてをキャンセルできます。

  [[UIApplication sharedApplication] cancelAllLocalNotifications];
57
progrmr

私の解決策は、NSKeyedArchiverでスケジュールしたUILocalNotificationオブジェクトをアーカイブし、それをどこかに保存することです(plistが望ましい)。そして、通知をキャンセルしたい場合は、plistで正しいデータを検索し、NSKeyedUnarchiverを使用してアーカイブを解除します。コードはとても簡単です:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notice];

そして

UILocalNotification *notice = [NSKeyedUnarchiver unarchiveObjectWithData:data];
13
hiepnd

私の解決策は、UILocalNotificationを作成するときにNSMutableDictionaryを1つ作成し、その通知をキーの値としてIDとして保存し、このNSMutableDictionayNSUserDefaults

したがって、その時点で特定のローカル通知をキャンセルする場合は、[dictionary valueforkey @"KEY"]ここで、特定のローカル通知を取得して渡すために、キーとしてIDを渡します

 [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
6
Mahek

Swiftでは、最初に次の方法で通知userInfoに辞書を追加します。

let dict:NSDictionary = ["ID" : "someString"]
notification.userInfo = dict as! [String : String]

次に、既存の通知の配列を取得し(2)、探しているものが見つかるまで各通知を繰り返します(3)。見つかったら、キャンセルします(4)。

// 1. Pass in the string you want to cancel
func cancelLocalNotification(uniqueId: String){

    // 2. Create an array of notifications, ensuring to use `if let` so it fails gracefully
    if let notifyArray = UIApplication.sharedApplication().scheduledLocalNotifications {

        // 3. For each notification in the array ...
        for notif in notifyArray as [UILocalNotification] {
            // ... try to cast the notification to the dictionary object
            if let info = notif.userInfo as? [String: String] {

                // 4. If the dictionary object ID is equal to the string you passed in ...
                if info["ID"] == uniqueId {
                    // ... cancel the current notification
                    UIApplication.sharedApplication().cancelLocalNotification(notif)
                }
            }
        }
    }
}
3
bwash70

Swiftバージョン:

UIApplication.sharedApplication().cancelAllLocalNotifications()
2
fatihyildizhan

Userinfoを使用して特定の「ローカル通知」をキャンセルするSwiftバージョン:

func cancelLocalNotification(UNIQUE_ID: String){

        var notifyCancel = UILocalNotification()
        var notifyArray = UIApplication.sharedApplication().scheduledLocalNotifications

        for notifyCancel in notifyArray as! [UILocalNotification]{

            let info: [String: String] = notifyCancel.userInfo as! [String: String]

            if info[uniqueId] == uniqueId{

                UIApplication.sharedApplication().cancelLocalNotification(notifyCancel)
            }else{

                println("No Local Notification Found!")
            }
        }
    }
1
Sohil R. Memon

良い答えをしてくれた@ viggio24に感謝します。これはSwiftバージョンです

var notifyCancel = UILocalNotification()
var notifyArray=UIApplication.sharedApplication().scheduledLocalNotifications
var i = 0
while(i<notifyArray.count){
    if let notify = notifyArray[i] as? UILocalNotification{
        if let info = notify.userInfo as? Dictionary<String,String> {
            if let s = info["name"] {
                if(name==s){//name is the the one you want cancel
                    notifyCancel = notify
                    break
                }
            }
        }
    }
i++
}
0
王怡飞