Maria Maria - 4 months ago 39
Swift Question

iOS and local Notifications

Is there way to send local notification to the app from the app?

I need to send notification my app users every morning. So, can I add some code to the app, so after user launch that, every morning he or she will get badge/notification?

Answer

You can add local notifications to your iOS app by doing the following:

Step One

Register for local notifications in your App Delegate:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Register the app for local notifcations.

    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]];
    }

    // Setup the local notification check.
    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    // Check if a notifcation has been received.

    if (notification) {

        dispatch_async(dispatch_get_main_queue(), ^{

            // Run the notifcation.
            // Call your own custom method from here.
            // Use [notification.userInfo valueForKey:@"notification_id"] to get the associated notification id (You will need to assign an ID, when creating the notification).
        });
    }

    // Ensure the notifcation badge number is hidden.
    application.applicationIconBadgeNumber = 0;

    return YES;
}

Step Two

Use the following method to create the local notification:

-(void)saveNotification:(NSString *)description :(NSString *)notificationID :(BOOL)locationCheck {

    // Create the notification info dictionary
    // and set the notification ID string.
    NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
    [userInfo setObject:notificationID forKey:@"notification_id"];

    // Setup the local notification.
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];

    // Set the notification ID and type data.
    localNotification.userInfo = userInfo;

    // Set the notification description.
    localNotification.alertBody = [NSString stringWithFormat:@"%@", description];

    // Set the sound alert MP3 file.
    localNotification.soundName = [NSString stringWithFormat:@"Notification_sound_file.mp3"];

    // Set the date for the notification or set the
    // location depending on the notification type.

    if (locationCheck == NO) {

        // Fire date of your choice.
        NSDate *yourFireDate;

        // Set the reminder date.
        double interval = [yourFireDate timeIntervalSinceNow];
        localNotification.fireDate = [[NSDate date] dateByAddingTimeInterval:interval];
        localNotification.timeZone = [NSTimeZone systemTimeZone];

        // Set the notifcation repeat interval.
        localNotification.repeatInterval = 0; // No repeat.
        //localNotification.repeatInterval = NSCalendarUnitHour; // Every hour.
        //localNotification.repeatInterval = NSCalendarUnitDay; // Every day.
        //localNotification.repeatInterval = NSCalendarUnitWeekOfYear; // Once a week.
        //localNotification.repeatInterval = NSCalendarUnitMonth; // Once a month.
        //localNotification.repeatInterval = NSCalendarUnitYear; // Once a year.
    }

    else if (locationCheck == YES) {

        // Set the locaton to the selected address co-ordinates.
        CLLocationCoordinate2D coordinates = CLLocationCoordinate2DMake(latitude, longitude);
        CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:coordinates radius:100 identifier:[NSString stringWithFormat:@"region_%@", notificationID]];

        // Set the notification to be presented
        // when the user arrives at the location.
        [region setNotifyOnEntry:YES];
        [region setNotifyOnExit:NO];

        // Set the notification location data.
        [localNotification setRegion:region];
        [localNotification setRegionTriggersOnce:NO];
    }

    // Save the local notification.
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

You will need to create your own unique id, in order to use this method. The id is important, because it will help you to distinguish between notifications (should you need to perform a specific action depending on the notification).

You can call the above method like so:

[self saveNotification:@"test notification hello world" :@"unique id" :NO];

Don't forget to replace latitude and longitude with your descried co-ordianted (if you need location based local notifications).

Step Three

If the app is currently open (in the foreground or via multitasking), you will need to implement another method in your app delegate, in order to handle notifications:

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

    // Check if a notifcation has been received.

    if (application.applicationState == UIApplicationStateInactive) {

        // You app in running in the background but will be active,
        // should the user tap the iOS notification banner.

        // Call your own custom method from here.
        // Use [notification.userInfo valueForKey:@"notification_id"] to get the associated notification id (You will need to assign an ID, when creating the notification).
    }

    else if (application.applicationState == UIApplicationStateActive) {

        // The app is open in the foreground
        // you will need to display an alert or banner
        // in your app to alert the user.

        // Call your own custom method from here.
        // Use [notification.userInfo valueForKey:@"notification_id"] to get the associated notification id (You will need to assign an ID, when creating the notification).
    }

    // Ensure the notifcation badge number is hidden.
    application.applicationIconBadgeNumber = 0;
}

A few other points to keep in mind

  • You can only set a maximum of 64 local notifications. (Notifications which repeat are counted as one local notification). https://developer.apple.com/library/ios/documentation/iPhone/Reference/UILocalNotification_Class/
  • A local notification cannot have a fireDate and location region. If you want the same notification to appear at a given time and location, you will have to create 2 separate local notifications with the same description (one with a date and the other with the location).

You can use the following methods to delete all local notifications (or a specific one):

-(void)deleteAllNotifications {

    // Delete all the local notifications.
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

-(void)deleteSpecificNotification:(NSString *)inputID {

    // Get the notification(s) data.
    NSArray *notificationData = [[UIApplication sharedApplication] scheduledLocalNotifications];

    // Loop through all the local notifcations and delete
    // all the notifications that match the input id string.

    for (int loop = 0; loop < [notificationData count]; loop++) {

        // Get the notification object.
        UILocalNotification *localNotification = [notificationData objectAtIndex:loop];

        // If the notification id matches the input id then delete it.

        if ([[localNotification.userInfo objectForKey:@"notification_id"] isEqualToString:inputID]) {
            [[UIApplication sharedApplication] cancelLocalNotification: localNotification];
        }
    }
}