Notification management in Xamarin.iOS
In iOS 12, the operating system can deep link from Notification Center and the Settings app to an app's notification management screen. This screen should allow users to opt in and out of the various types of notifications the app sends.
Notification management screen
In the sample app, ManageNotificationsViewController
defines a user
interface that allows users to independently enable and disable red
notifications and green notifications. It is a standard
UIViewController
containing a
UISwitch
for
each notification type. Toggling the switch for either type of
notification saves, in user defaults, the user's preference for that
type of notification:
partial void HandleRedNotificationsSwitchValueChange(UISwitch sender)
{
NSUserDefaults.StandardUserDefaults.SetBool(sender.On, RedNotificationsEnabledKey);
}
Note
The notification management screen also checks whether or not the user has completely disabled notifications for the app. If so, it hides the toggles for the individual notification types. To do this, the notification management screen:
- Calls
UNUserNotificationCenter.Current.GetNotificationSettingsAsync
and examines theAuthorizationStatus
property. - Hides the toggles for the individual notification types if notifications have been completely disabled for the app.
- Re-checks whether notifications have been disabled each time the application moves to the foreground, since the user can enable/disable notifications in iOS Settings at any time.
The sample app's ViewController
class, which sends the notifications,
check's the user's preference before sending a local notification to
ensure that the notification is of a type the user actually wants to
receive:
partial void HandleTapRedNotificationButton(UIButton sender)
{
bool redEnabled = NSUserDefaults.StandardUserDefaults.BoolForKey(ManageNotificationsViewController.RedNotificationsEnabledKey);
if (redEnabled)
{
// ...
Deep link
iOS deep links to an app's notification management screen from Notification Center and the app's notification settings in the Settings app. To facilitate this, an app must:
- Indicate that a notification management screen is available by passing
UNAuthorizationOptions.ProvidesAppNotificationSettings
to the app's notification authorization request. - Implement the
OpenSettings
method fromIUNUserNotificationCenterDelegate
.
Authorization request
To indicate to the operating system that a notification management screen
is available, an app should pass the
UNAuthorizationOptions.ProvidesAppNotificationSettings
option (along
with any other notification delivery options it needs) to the
RequestAuthorization
method on the UNUserNotificationCenter
.
For example, in the sample app's AppDelegate
:
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
// Request authorization to send notifications
UNUserNotificationCenter center = UNUserNotificationCenter.Current;
var options = UNAuthorizationOptions.ProvidesAppNotificationSettings | UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound | UNAuthorizationOptions.Provisional;
center.RequestAuthorization(options, (bool success, NSError error) =>
{
// ...
OpenSettings method
The OpenSettings
method, called by the system to deep link to an app's
notification management screen, should navigate the user directly to that
screen.
In the sample app, this method performs the segue to the
ManageNotificationsViewController
if necessary:
[Export("userNotificationCenter:openSettingsForNotification:")]
public void OpenSettings(UNUserNotificationCenter center, UNNotification notification)
{
var navigationController = Window.RootViewController as UINavigationController;
if (navigationController != null)
{
var currentViewController = navigationController.VisibleViewController;
if (currentViewController is ViewController)
{
currentViewController.PerformSegue(ManageNotificationsViewController.ShowManageNotificationsSegue, this);
}
}
}