Condividi tramite


Gestione delle notifiche in Xamarin.iOS

In iOS 12 il sistema operativo può collegarsi in modo diretto dal Centro notifiche e dall'app Impostazioni alla schermata di gestione delle notifiche di un'app. Questa schermata dovrebbe consentire agli utenti di acconsentire esplicitamente ai vari tipi di notifiche inviate dall'app.

Schermata di gestione delle notifiche

Nell'app di esempio definisce ManageNotificationsViewController un'interfaccia utente che consente agli utenti di abilitare e disabilitare in modo indipendente le notifiche rosse e le notifiche verdi. Si tratta di uno standard UIViewController contenente un oggetto UISwitch per ogni tipo di notifica. Attivare o disattivare l'opzione per uno dei tipi di salvataggio delle notifiche, per impostazione predefinita dell'utente, la preferenza dell'utente per quel tipo di notifica:

partial void HandleRedNotificationsSwitchValueChange(UISwitch sender)
{
    NSUserDefaults.StandardUserDefaults.SetBool(sender.On, RedNotificationsEnabledKey);
}

Nota

La schermata di gestione delle notifiche controlla anche se l'utente ha completamente disabilitato le notifiche per l'app. In tal caso, nasconde gli interruttori per i singoli tipi di notifica. A tale scopo, la schermata di gestione delle notifiche:

  • Chiama UNUserNotificationCenter.Current.GetNotificationSettingsAsync ed esamina la AuthorizationStatus proprietà .
  • Nasconde gli interruttori per i singoli tipi di notifica se le notifiche sono state completamente disabilitate per l'app.
  • Verifica nuovamente se le notifiche sono state disabilitate ogni volta che l'applicazione passa in primo piano, perché l'utente può abilitare/disabilitare le notifiche in iOS Impostazioni in qualsiasi momento.

La classe dell'app di ViewController esempio, che invia le notifiche, controlla la preferenza dell'utente prima di inviare una notifica locale per assicurarsi che la notifica sia di un tipo che l'utente vuole effettivamente ricevere:

partial void HandleTapRedNotificationButton(UIButton sender)
{
    bool redEnabled = NSUserDefaults.StandardUserDefaults.BoolForKey(ManageNotificationsViewController.RedNotificationsEnabledKey);
    if (redEnabled)
    {
        // ...

Collegamenti diretti iOS alla schermata di gestione delle notifiche di un'app dal Centro notifiche e alle impostazioni di notifica dell'app nell'app Impostazioni. Per facilitare questa operazione, un'app deve:

  • Indicare che una schermata di gestione delle notifiche è disponibile passando UNAuthorizationOptions.ProvidesAppNotificationSettings alla richiesta di autorizzazione di notifica dell'app.
  • Implementare il OpenSettings metodo da IUNUserNotificationCenterDelegate.

Richiesta di autorizzazione

Per indicare al sistema operativo che è disponibile una schermata di gestione delle notifiche, un'app deve passare l'opzione UNAuthorizationOptions.ProvidesAppNotificationSettings (insieme alle altre opzioni di recapito delle notifiche necessarie) al RequestAuthorization metodo in UNUserNotificationCenter.

Ad esempio, nell'app di AppDelegateesempio:

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) =>
    {
        // ...

Metodo Open Impostazioni

Il OpenSettings metodo, chiamato dal sistema per collegarsi in modo diretto alla schermata di gestione delle notifiche di un'app, deve passare direttamente all'utente a tale schermata.

Nell'app di esempio, questo metodo esegue la procedura seguente alla ManageNotificationsViewController se necessario:

[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);
        }

    }
}