I am creating notifications in a loop, relevant code is:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
appDelegate = self
serNotificationType = UIUserNotificationType.Alert.union(UIUserNotificationType.Sound).union(UIUserNotificationType.Badge)
let completeAction = UIMutableUserNotificationAction()
completeAction.identifier = "COMPLETE" // the unique identifier for this action
completeAction.title = "Clear" // title for the action button
completeAction.activationMode = .Background // UIUserNotificationActivationMode.Background - don't bring app to foreground
completeAction.authenticationRequired = false // don't require unlocking before performing action
completeAction.destructive = true // display action in red
let callInAction = UIMutableUserNotificationAction()
callInAction.identifier = "CALLIN"
callInAction.title = "Call now"
callInAction.destructive = false
callInAction.authenticationRequired = false
callInAction.activationMode = UIUserNotificationActivationMode.Background
callInAction.destructive = false
let notificationCategory = UIMutableUserNotificationCategory() // notification categories allow us to create groups of actions that we can associate with a notification
notificationCategory.identifier = "CALLINNOTIFICATION"
notificationCategory.setActions([callInAction, completeAction], forContext: .Default) //UIUserNotificationActionContext.Default (4 actions max)
notificationCategory.setActions([completeAction, callInAction], forContext: .Minimal) //UIUserNotificationActionContext.Minimal - for when space is limited (2 actions max)
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: notificationTypes, categories: NSSet(array:[notificationCategory]) as? Set<UIUserNotificationCategory>))
return true
}
Scheduling of the notifications is done in the for loop (and maybe this is the reason something is wrong with scheduling):
func scheduleLocalNotifications() {
let arrayOfEvents: [[Meeting]] = CalendarController.sharedInstance.getAllMeetings()
//remove CallIn notifications anyway
self.removeScheduledNotifications()
var limitCounter = 0 //limit is 64 local notifications
print("scheduling start: \(CallIn.Settings.notifyNumberOfMinutesBeforeEvent)")
for var x = 0; x < arrayOfEvents.count; x++ {
for var y = 0; y < arrayOfEvents[x].count; y++ {
let event = arrayOfEvents[x][y]
if(event.startTime.timeIntervalSinceDate(NSDate()) > -2000 && limitCounter <= 64){
if(notificationsAreAllowed()){
let notification = UILocalNotification()
let minutesBefore = CallIn.Settings.notifyNumberOfMinutesBeforeEvent
notification.fireDate = event.startTime.dateByAddingTimeInterval(-minutesBefore * 60) //time of launch of notification
if(minutesBefore <= 1){
notification.alertBody = "Your \(event.title) is about to start"
}else{
notification.alertBody = "You have \(event.title) in \(Int(minutesBefore)) minutes"
}
notification.alertAction = "OK"
notification.soundName = UILocalNotificationDefaultSoundName
notification.userInfo = ["title": event.title, "UUID": event.UUID, "CallIn": "CallInNotification"]
notification.category = "CALLINNOTIFICATION"
notification.applicationIconBadgeNumber = 1
UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
limitCounter += 1
}
}
}
}
The buttons Call now, and Dismiss are not showing up. What I want is this:
Ok, I found the problem and this may be useful for someone in the future:
I had
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)
was called twice in two different places in the application (because I had setting in the application, and needed to alter it from settings page). So when refactored, and called it once, it worked.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.