지역 알림을 기반으로 iPhone 알람 앱을 개발 중입니다.
알람을 삭제하면 관련 로컬 알림이 취소됩니다. 그러나 로컬 알림 배열에서 취소 할 개체를 정확히 어떻게 결정할 수 있습니까?
[[UIApplication sharedApplication] cancelLocalNotification:notification]
방법을 알고 있지만 취소하려면 어떻게이 ‘알림’을받을 수 있습니까?
답변
로컬 알림의 사용자 정보에 키의 고유 한 값을 저장할 수 있습니다. 모든 로컬 알림을 가져오고 배열을 반복하고 특정 알림을 삭제합니다.
다음과 같이 코드,
OBJ-C :
UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
{
UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
NSDictionary *userInfoCurrent = oneEvent.userInfo;
NSString *uid=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:@"uid"]];
if ([uid isEqualToString:uidtodelete])
{
//Cancelling local notification
[app cancelLocalNotification:oneEvent];
break;
}
}
빠른:
var app:UIApplication = UIApplication.sharedApplication()
for oneEvent in app.scheduledLocalNotifications {
var notification = oneEvent as UILocalNotification
let userInfoCurrent = notification.userInfo! as [String:AnyObject]
let uid = userInfoCurrent["uid"]! as String
if uid == uidtodelete {
//Cancelling local notification
app.cancelLocalNotification(notification)
break;
}
}
UserNotification :
UserNotification (iOS 10 이상) 을 사용하는 경우 다음 단계를 따르세요.
-
UserNotification 콘텐츠를 만들 때 고유 식별자를 추가하십시오.
-
removePendingNotificationRequests (withIdentifiers :)를 사용하여 보류중인 특정 알림을 제거합니다.
-
removeDeliveredNotifications (withIdentifiers :)를 사용하여 배달 된 특정 알림을 제거합니다.
자세한 내용은 UNUserNotificationCenter
답변
기타 옵션 :
우선, 로컬 알림을 생성 할 때 나중에 사용할 수 있도록 사용자 기본값에 저장할 수 있습니다. 로컬 알림 개체는 사용자 기본값에 직접 저장할 수 없습니다.이 개체는 먼저 NSData 개체로 변환 한 다음 NSData
저장 될 수 있습니다. User defaults
. 다음은 그에 대한 코드입니다.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:localNotif];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:[NSString stringWithFormat:@"%d",indexPath.row]];
로컬 알림을 저장하고 예약 한 후 나중에 이전에 만든 알림을 취소해야하는 요구 사항이 발생할 수 있으므로 사용자 기본값에서 검색 할 수 있습니다.
NSData *data= [[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"%d",UniqueKey]];
UILocalNotification *localNotif = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"Remove localnotification are %@", localNotif);
[[UIApplication sharedApplication] cancelLocalNotification:localNotif];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:[NSString stringWithFormat:@"%d",UniqueKey]];
도움이 되었기를 바랍니다
답변
여기 내가하는 일이 있습니다.
알림을 만들 때 다음을 수행하십시오.
// Create the notification
UILocalNotification *notification = [[UILocalNotification alloc] init] ;
notification.fireDate = alertDate;
notification.timeZone = [NSTimeZone localTimeZone] ;
notification.alertAction = NSLocalizedString(@"Start", @"Start");
notification.alertBody = **notificationTitle**;
notification.repeatInterval= NSMinuteCalendarUnit;
notification.soundName=UILocalNotificationDefaultSoundName;
notification.applicationIconBadgeNumber = 1;
[[UIApplication sharedApplication] scheduleLocalNotification:notification] ;
그것을 삭제하려고 할 때 다음을 수행하십시오.
NSArray *arrayOfLocalNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications] ;
for (UILocalNotification *localNotification in arrayOfLocalNotifications) {
if ([localNotification.alertBody isEqualToString:savedTitle]) {
NSLog(@"the notification this is canceld is %@", localNotification.alertBody);
[[UIApplication sharedApplication] cancelLocalNotification:localNotification] ; // delete the notification from the system
}
}
이 솔루션은 여러 알림에 대해 작동해야하며 어레이, 사전 또는 사용자 기본값을 관리하지 않습니다. 시스템 알림 데이터베이스에 이미 저장 한 데이터를 사용하는 것입니다.
이것이 미래의 디자이너와 개발자에게 도움이되기를 바랍니다.
행복한 코딩 녀석들! :디
답변
신속한 예약 및 removeNotification :
static func scheduleNotification(notificationTitle:String, objectId:String) {
var localNotification = UILocalNotification()
localNotification.fireDate = NSDate(timeIntervalSinceNow: 24*60*60)
localNotification.alertBody = notificationTitle
localNotification.timeZone = NSTimeZone.defaultTimeZone()
localNotification.applicationIconBadgeNumber = 1
//play a sound
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.alertAction = "View"
var infoDict : Dictionary<String,String!> = ["objectId" : objectId]
localNotification.userInfo = infoDict;
UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
}
static func removeNotification(objectId:String) {
var app:UIApplication = UIApplication.sharedApplication()
for event in app.scheduledLocalNotifications {
var notification = event as! UILocalNotification
var userInfo:Dictionary<String,String!> = notification.userInfo as! Dictionary<String,String!>
var infoDict : Dictionary = notification.userInfo as! Dictionary<String,String!>
var notifcationObjectId : String = infoDict["objectId"]!
if notifcationObjectId == objectId {
app.cancelLocalNotification(notification)
}
}
}
답변
iMOBDEV의 솔루션 은 특정 알림을 제거하는 데 완벽하게 작동하지만 (예 : 알람 삭제 후) 이미 실행되어 알림 센터에있는 알림을 선택적으로 제거해야 할 때 특히 유용합니다.
가능한 시나리오는 다음과 같습니다. 알람 알림이 발생하지만 사용자가 해당 알림을 탭하지 않고 앱을 열고 해당 알람을 다시 예약합니다. 특정 항목 / 알람에 대해 알림 센터에 하나의 알림 만있을 수 있도록하려면 좋은 방법입니다. 또한 앱이 열릴 때마다 모든 알림을 지울 필요가 없습니다.
- 로컬 알림을 생성하면, 사용
NSKeyedArchiver
으로 저장Data
에서UserDefaults
. 알림의 userInfo 사전에 저장하는 것과 동일한 키를 만들 수 있습니다. Core Data 개체와 연결되어있는 경우 고유 한 objectID 속성을 사용할 수 있습니다. - 으로 검색하십시오
NSKeyedUnarchiver
. 이제 cancelLocalNotification 메서드를 사용하여 삭제할 수 있습니다. UserDefaults
그에 따라 키를 업데이트하십시오 .
다음은 해당 솔루션의 Swift 3.1 버전입니다 (iOS 10 미만 대상 용).
저장
// localNotification is the UILocalNotification you've just set up
UIApplication.shared.scheduleLocalNotification(localNotification)
let notificationData = NSKeyedArchiver.archivedData(withRootObject: localNotification)
UserDefaults.standard.set(notificationData, forKey: "someKeyChosenByYou")
검색 및 삭제
let userDefaults = UserDefaults.standard
if let existingNotificationData = userDefaults.object(forKey: "someKeyChosenByYou") as? Data,
let existingNotification = NSKeyedUnarchiver.unarchiveObject(with: existingNotificationData) as? UILocalNotification {
// Cancel notification if scheduled, delete it from notification center if already delivered
UIApplication.shared.cancelLocalNotification(existingNotification)
// Clean up
userDefaults.removeObject(forKey: "someKeyChosenByYou")
}
답변
필요한 경우 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!")
}
}
}
답변
Swift 4 솔루션 :
UNUserNotificationCenter.current().getPendingNotificationRequests { (requests) in
for request in requests {
if request.identifier == "identifier" {
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["identifier"])
}
}
}