Condividi tramite


Aggiungere notifiche push all'app Xamarin.iOS

Informazioni generali

In questa esercitazione si aggiungono notifiche push al progetto di avvio rapido di Xamarin.iOS in modo che venga inviata una notifica push al dispositivo ogni volta che viene inserito un record.

Se non si usa il progetto server di avvio rapido scaricato, sarà necessario il pacchetto di estensione per le notifiche push. Per altre informazioni, vedere Usare l'SDK del server back-end .NET per app per dispositivi mobili di Azure.

Prerequisiti

  • Completare l'esercitazione introduttiva su Xamarin.iOS .
  • Un dispositivo iOS fisico. Le notifiche push non sono supportate dal simulatore iOS.

Registrare l'app per le notifiche push nel portale per sviluppatori di Apple

Configurare l'app per dispositivi mobili per inviare notifiche push

  1. Sul tuo Mac, avvia Keychain Access. Nella barra di navigazione a sinistra, sotto Categoria, aprire I miei certificati. Trovare il certificato SSL scaricato nella sezione precedente e quindi divulgarne il contenuto. Selezionare solo il certificato (non selezionare la chiave privata). Quindi esportarlo.
  2. Nel portale di Azure selezionare Esplora tutti i Servizi App>. Selezionare quindi il back-end delle app per dispositivi mobili.
  3. In Impostazioni, selezionare Push del Servizio App. Selezionare quindi il nome dell'hub di notifica.
  4. Passare a Apple Push Notification Services>Carica certificato. Caricare il file con estensione .p12, selezionando la modalità corretta (a seconda che il certificato client SSL ottenuto in precedenza sia di produzione o sandbox). Salvare eventuali modifiche.

Il servizio è ora configurato per l'uso delle notifiche push in iOS.

Aggiornare il progetto server per inviare notifiche push

In questa sezione si aggiorna il codice nel progetto back-end di App per dispositivi mobili esistente per inviare una notifica push ogni volta che viene aggiunto un nuovo elemento. Questo processo è alimentato dalla funzionalità del modello di Hub di notifica di Azure, che consente push multipiattaforma. I vari client vengono registrati per le notifiche push usando modelli e un singolo push universale può arrivare a tutte le piattaforme client.

Scegliere una delle procedure seguenti che corrispondano al tipo di progetto back-end, back-end .NET o Node.js back-end.

Progetto .NET back-end

  1. In Visual Studio fare clic con il pulsante destro del mouse sul progetto server. Selezionare quindi Gestisci pacchetti NuGet. Cercare Microsoft.Azure.NotificationHubse quindi selezionare Installa. Questo processo installa la libreria di Hub di notifica per l'invio di notifiche dal back-end.

  2. Nel progetto server aprire i controller >TodoItemController.cs. Quindi, aggiungere le seguenti istruzioni using:

    using System.Collections.Generic;
    using Microsoft.Azure.NotificationHubs;
    using Microsoft.Azure.Mobile.Server.Config;
    
  3. Nel metodo PostTodoItem aggiungere il codice seguente dopo la chiamata a InsertAsync:

    // Get the settings for the server project.
    HttpConfiguration config = this.Configuration;
    MobileAppSettingsDictionary settings =
        this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
    // Get the Notification Hubs credentials for the mobile app.
    string notificationHubName = settings.NotificationHubName;
    string notificationHubConnection = settings
        .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
    // Create a new Notification Hub client.
    NotificationHubClient hub = NotificationHubClient
    .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
    // Send the message so that all template registrations that contain "messageParam"
    // receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations.
    Dictionary<string,string> templateParams = new Dictionary<string,string>();
    templateParams["messageParam"] = item.Text + " was added to the list.";
    
    try
    {
        // Send the push notification and log the results.
        var result = await hub.SendTemplateNotificationAsync(templateParams);
    
        // Write the success result to the logs.
        config.Services.GetTraceWriter().Info(result.State.ToString());
    }
    catch (System.Exception ex)
    {
        // Write the failure result to the logs.
        config.Services.GetTraceWriter()
            .Error(ex.Message, null, "Push.SendAsync Error");
    }
    

    Questo processo invia una notifica basata su modello che contiene item.Text quando viene inserito un nuovo elemento.

  4. Ripubblica il progetto del server.

Progetto back-end Node.js

  1. Configurare il progetto backend.

  2. Sostituire il codice esistente in todoitem.js con il codice seguente:

    var azureMobileApps = require('azure-mobile-apps'),
    promises = require('azure-mobile-apps/src/utilities/promises'),
    logger = require('azure-mobile-apps/src/logger');
    
    var table = azureMobileApps.table();
    
    table.insert(function (context) {
    // For more information about the Notification Hubs JavaScript SDK,
    // see https://aka.ms/nodejshubs.
    logger.info('Running TodoItem.insert');
    
    // Define the template payload.
    var payload = '{"messageParam": "' + context.item.text + '" }';  
    
    // Execute the insert. The insert returns the results as a promise.
    // Do the push as a post-execute action within the promise flow.
    return context.execute()
        .then(function (results) {
            // Only do the push if configured.
            if (context.push) {
                // Send a template notification.
                context.push.send(null, payload, function (error) {
                    if (error) {
                        logger.error('Error while sending push notification: ', error);
                    } else {
                        logger.info('Push notification sent successfully!');
                    }
                });
            }
            // Don't forget to return the results from the context.execute().
            return results;
        })
        .catch(function (error) {
            logger.error('Error while running context.execute: ', error);
        });
    });
    
    module.exports = table;  
    

    Questo processo invia una notifica di modello contenente item.text quando viene inserito un nuovo elemento.

  3. Quando modifichi il file sul computer locale, ripubblica il progetto del server.

Configurare il progetto Xamarin.iOS

Configurare il progetto iOS in Xamarin Studio

  1. In Xamarin.Studio aprire Info.plist e aggiornare l'identificatore del bundle con l'ID bundle creato in precedenza con il nuovo ID app.

  2. Scorrere verso il basso fino a Modalità di sfondo. Selezionare la casella Abilita modalità in background e la casella Notifiche remote .

  3. Fare doppio clic sul progetto nel pannello della soluzione per aprire Opzioni progetto.

  4. Nella sezione Compilazione, scegli Firma bundle iOS e seleziona l'identità e il profilo di provisioning corrispondenti che hai appena configurato per questo progetto.

    In questo modo il progetto usa il nuovo profilo per la firma del codice. Per la documentazione ufficiale sul provisioning dei dispositivi Xamarin, vedere Provisioning di dispositivi Xamarin.

Configurare il progetto iOS in Visual Studio

  1. In Visual Studio fare clic con il pulsante destro del mouse sul progetto e quindi scegliere Proprietà.

  2. Nelle pagine delle proprietà fare clic sulla scheda Applicazione iOS e aggiornare l'identificatore con l'ID creato in precedenza.

  3. Nella scheda Firma bundle iOS, selezionare l'identità corrispondente e il profilo di provisioning appena configurati per questo progetto.

    In questo modo il progetto usa il nuovo profilo per la firma del codice. Per la documentazione ufficiale sul provisioning dei dispositivi Xamarin, vedere Provisioning di dispositivi Xamarin.

  4. Fare doppio clic su Info.plist per aprirlo e quindi abilitare RemoteNotifications in Modalità in background.

Aggiungi notifiche push all'app

  1. In QSTodoService aggiungere la proprietà seguente in modo che AppDelegate possa acquisire il client mobile:

    public MobileServiceClient GetClient {
        get
        {
            return client;
        }
        private set
        {
            client = value;
        }
    }
    
  2. Aggiungere l'istruzione seguente using all'inizio del file AppDelegate.cs .

    using Microsoft.WindowsAzure.MobileServices;
    using Newtonsoft.Json.Linq;
    
  3. In AppDelegate eseguire l'override dell'evento FinishedLaunching :

     public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
     {
         // registers for push for iOS8
         var settings = UIUserNotificationSettings.GetSettingsForTypes(
             UIUserNotificationType.Alert
             | UIUserNotificationType.Badge
             | UIUserNotificationType.Sound,
             new NSSet());
    
         UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
         UIApplication.SharedApplication.RegisterForRemoteNotifications();
    
         return true;
     }
    
  4. Nello stesso file eseguire l'override dell'evento RegisteredForRemoteNotifications . Con questo codice, ci si registra per una semplice notifica di template che verrà inviata su tutte le piattaforme supportate dal server.

    Per altre informazioni sui modelli con Hub di notifica, vedere Modelli.

    public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
    {
        MobileServiceClient client = QSTodoService.DefaultService.GetClient;
    
        const string templateBodyAPNS = "{\"aps\":{\"alert\":\"$(messageParam)\"}}";
    
        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
        {
            {"body", templateBodyAPNS}
        };
    
        // Register for push with your mobile app
        var push = client.GetPush();
        push.RegisterAsync(deviceToken, templates);
    }
    
  5. Eseguire quindi l'override dell'evento DidReceivedRemoteNotification :

     public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
     {
         NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary;
    
         string alert = string.Empty;
         if (aps.ContainsKey(new NSString("alert")))
             alert = (aps [new NSString("alert")] as NSString).ToString();
    
         //show alert
         if (!string.IsNullOrEmpty(alert))
         {
             UIAlertView avAlert = new UIAlertView("Notification", alert, null, "OK", null);
             avAlert.Show();
         }
     }
    

L'app è ora aggiornata per supportare le notifiche push.

Testare le notifiche push nell'app

  1. Premere il pulsante Esegui per compilare il progetto e avviare l'app in un dispositivo con supporto per iOS, quindi fare clic su OK per accettare le notifiche push.

    Annotazioni

    È necessario accettare in modo esplicito le notifiche push dall'app. Questa richiesta viene eseguita solo la prima volta che l'app viene eseguita.

  2. Nell'app, digita un'attività e poi fai clic sull'icona del segno più (+).

  3. Verificare che venga ricevuta una notifica, quindi fare clic su OK per ignorare la notifica.

  4. Ripetere il passaggio 2 e chiudere immediatamente l'app, quindi verificare che venga visualizzata una notifica.

Questa esercitazione è stata completata correttamente.