Xamarin

Prev Next

Adicionar Xtremepush tanto aos apps iOS quanto Android construídos com Xamarin

O Xtremepush suporta notificações push para dispositivos iOS via o Push Notification Service (APNs) da Apple e notificações push para dispositivos Android via o serviço FCM (Firebase Cloud Messaging for Android) do Google. Esta página contém instruções específicas da Xamarin, mas você precisará conectar seu app iOS e Android à plataforma separadamente.

Antes de integrar

Para completar essa integração, você precisará ter sua chave do aplicativo Xtremepush, certificados APNS para iOS e número do projeto Google e chave API FCM para Android. Esses são usados para conectar seu app à plataforma e aos serviços push da Apple e Google. Revise nossos guias sobre como se conectar à plataforma abaixo:

Formas de Xamarin

Esta página oferece um guia completo de integração com Xamarin para Android e iOS. Se você estiver usando o Xamarin.Forms, deve completar a integração para cada plataforma conforme descrito no guia do Xamarin.Forms e, em seguida, também deve seguir os passos descritos aqui.

Android

  • Para salvar o google-services.json arquivo associado ao seu projeto, siga os passos em Obter valores de configuração no guia de notificações push do Android .

  • Baixe o arquivo DLL Xtremepush Xamarin bindings dos lançamentos do Xamarin SDK.

  • No seu IDE (Visual Studio ou Xamarin Studio), adicione uma referência no seu projeto de app ao arquivo DLL:

    • Editar Referências > .Net Assembly > Navegar... > Selecione a DLL

  • No seu IDE, adicione dois pacotes adicionais ao projeto para satisfazer as dependências subjacentes do nosso SDK:

    • Google Play Services - Localização (último pacote NuGet estável atualmente 120.0.0.1)

    • GoogleGson - (último pacote NuGet estável atualmente 2.10.1.2)

    • Xamarin.Firebase.Messaging (último pacote NuGet estável atualmente 123.1.1.1)

  • Edite o AndroidManifest.xml arquivo para adicionar os seguintes elementos dentro do manifest elemento.

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />   
      <uses-permission android:name="android.permission.INTERNET" />
    	<uses-permission android:name="android.permission.WAKE_LOCK" />
     <permission android:name=".permission.C2D_MESSAGE" android:protectionLevel="signature" />
       
  • Se você estiver usando a funcionalidade de Localização ou Beacon, será necessário adicionar o seguinte ao elemento manifesto também.

    	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:exported="false"  />
    	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:exported="false" />
    	<uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
    	<uses-permission android:name="android.permission.BLUETOOTH" android:required="false" />
    	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:required="false" />
    	<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" android:exported="false"/>
    	<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:exported="false" />
  • Edite o AndroidManifest.xml arquivo para adicionar os seguintes elementos dentro do application elemento.

    <activity android:name="ie.imobile.extremepush.ui.InboxActivity" android:configChanges="orientation|screenSize" android:label="@string/title_activity_inbox" android:theme="@style/Theme.Transparent" />
    		<activity android:name="ie.imobile.extremepush.ui.OnclickPushActivity" android:exported="false" android:taskAffinity="" />
    		<service android:name="ie.imobile.extremepush.NotificationOnClickHandlerService" />
    		<activity android:name="ie.imobile.extremepush.ui.WebViewActivity" android:exported="false" />
    		<activity android:name="ie.imobile.extremepush.ui.LocationDialogActivity" android:exported="false" android:label="Locations are not available" android:theme="@android:style/Theme.Dialog" />
    		<!-- REQUIRED FOR GEO LOCATION SERVICES -->
    		<service android:name="ie.imobile.extremepush.location.GeoLocationService" />
    		<!-- REQUIRED FOR IBEACON -->
    		<service android:name="ie.imobile.extremepush.beacons.BeaconLocationService" />
    		<!-- REQUIRED FOR GCM, LOCATION AND BEACON -->
    		<receiver android:name="ie.imobile.extremepush.receivers.CoreBroadcastReceiver" android:exported="false">
    			<intent-filter>
    				<action android:name="ie.imobile.extremepush.BEACON_SERVICE_STARTED" />
    				<category android:name="." />
    			</intent-filter>
    			<intent-filter>
    				<action android:name="android.intent.action.BOOT_COMPLETED" />
    				<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
    				<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
    			</intent-filter>
    		</receiver>
    		<service android:name="ie.imobile.extremepush.beacons.XPBeaconJobService" android:permission="android.permission.BIND_JOB_SERVICE" />
    		<service android:name="ie.imobile.extremepush.util.ImageHandlerJobService" android:permission="android.permission.BIND_JOB_SERVICE" />
    		<receiver android:name="ie.imobile.extremepush.beacons.BeaconLocationReceiver" android:exported="false" />
    		<receiver android:name="ie.imobile.extremepush.location.GeoLocationBroadcastReceiver" android:exported="false" />
    		<receiver android:name="ie.imobile.extremepush.location.ProxymityAlertReceiver" android:exported="false" />
    		<receiver android:name="ie.imobile.extremepush.receivers.XP_App_Update_Receiver" android:exported="false">
    			<intent-filter>
    				<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
    				<category android:name="." />
    			</intent-filter>
    		</receiver>
    		<service android:name="ie.imobile.extremepush.google.XPFirebaseMessagingService" android:exported="false">
    			<intent-filter>
    				<action android:name="com.google.firebase.MESSAGING_EVENT" />
    			</intent-filter>
    		</service>
  • Edite o AndroidManifest.xml arquivo para garantir que haja um ícone definido dentro do application elemento. Isso é necessário para a geração correta de notificações.

    <application android:icon="@mipmap/icon" android:label="@string/app_name">
  • No arquivo raiz C# do seu projeto, puxe a biblioteca Xtremepush:

    using IE.Imobile.Extremepush;
    using IE.Imobile.Extremepush.Api.Model;
  • Você pode precisar de alguns dos seguintes pacotes no mesmo arquivo, se ainda não foram importados:

    using Android.App;
    using Android.OS;
    using Android.Runtime;
    using Android.Util;
    using Android.Views;
    using Android.Widget;
    using System;
    using System.Collections.Generic;
  • Adicione o que google-services.json você baixou ao seu projeto.

    1. Copie google-services.json para a pasta do projeto.

    2. Adicione google-services.json ao projeto do app.

    3. Clique google-services.jsoncom o botão direito.

    4. Defina a ação de build para GoogleServicesJson.

  • Substitua a função Application onCreate para inicializar o SDK Xtremepush. Defina a chave do SDK para a que é fornecida ao adicionar o app à plataforma, e o Número do Projeto do Google com o que está nos passos anteriores para configurar as notificações push do Android. Este exemplo também mostra como você pode registrar um callback para eventos de resposta à mensagem e registrar um callback quando o selo da caixa de entrada for atualizado.

    [Application]
    public class MainApp : Application, IMessageResponseListener, IInboxBadgeUpdateListener
    {
        public MainApp(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {
        }
        public void MessageResponseReceived(Message messagePayload,
                                        IDictionary<string, string> responsePayload,
                                        Java.Lang.Ref.WeakReference activityHolder)
        {
            // Handle a message response
            if (messagePayload != null)
            {
                Log.Debug("MessageResponseReceived", messagePayload.ToJson());
            }
            if (responsePayload != null)
            {
                foreach (KeyValuePair<string, string> keypair in responsePayload)
                    Log.Debug("MessageResponseReceived", keypair.Key + " - " + keypair.Value);
            }
        }
        public void InboxBadgeUpdated(int i, Java.Lang.Ref.WeakReference activityHolder)
        {
            //print out inbox badge 
            Log.Debug("Inbox Badge is : ", i + "");
        }
        public override void OnCreate()
        {
            base.OnCreate();
            // If using Xamarin.Forms please install the Plugin.CurrentActivity package
            // from NuGet and uncomment the line below
            // CrossCurrentActivity.Current.Init(this);
            String XPUSH_APP_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
            String GOOGLE_PROJECT_NUMBER = "XXXXXXXXXXXX";
            new PushConnector.Builder(XPUSH_APP_KEY, GOOGLE_PROJECT_NUMBER)
                                .SetMessageResponseListener(this)
                                .SetInboxBadgeUpdateListener(this)
                                .Create(this);
        }
    }
  • Se você quiser enviar tags ou eventos para o Xtremepush em outra parte do seu app, isso pode ser feito com as seguintes chamadas de função:

    PushConnector.MPushConnector.HitTag("TestTag");
    PushConnector.MPushConnector.HitEvent("TestEvent");

iOS

  • Baixe o arquivo DLL Xtremepush Xamarin bindings dos lançamentos do Xamarin SDK.

  • No seu IDE (Visual Studio ou Xamarin Studio), adicione uma referência no seu projeto de app ao arquivo DLL

    • Editar Referências > .Net Assembly > Navegar... > Selecione a DLL

  • Na visualização Source do Info.plist arquivo, defina os seguintes parâmetros:

    • XtremePushApplicationKey – a chave de aplicação SDK fornecida ao adicionar o app à plataforma.

    • NSBluetoothPeripheralUsageDescription – uma descrição de uso obrigatória que você precisa adicionar ao seu app, já que o SDK Xtremepush inclui CoreBluetooth (mesmo que não seja usado ativamente). Veja a descrição adicional do CoreBluetooth para mais informações.

    • Se estiver usando a funcionalidade de localização/beacon no seu app, certifique-se de que tenha entradas para NSLocationAlwaysUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription e NSLocationWhenInUseUsageDescription.

  • Edite o AppDelegate.cs arquivo e adicione as seguintes linhas dentro da FinishedLaunching() função:

    using XP;
    // Setup xtremepush
    XPush.RegisterForRemoteNotificationTypes(XPNotificationType.Alert | XPNotificationType.Badge | XPNotificationType.Sound);
    XPush.SetSandboxModeEnabled(true); //Required if doing a debug/dev build of your app
    XPush.SetLocationEnabled(true); // Required for location or beacon functionality
    XPush.RegisterMessageResponseHandler((XPMessageResponse response) =>
    {
       ///handle received message. For example:
       Console.WriteLine("Response with identifier: " + response.Message.CampaignIdentifier);
       Console.WriteLine("Response with type: " + response.Message.Type);
       Console.WriteLine("Response with action URL: " + response.Action.Url);
       ////Check out XPMessage and XPAction declarations for more avaliable fields
    });
    NSNotificationCenter.DefaultCenter.AddObserver(Constants.XPushInboxBadgeChangeNotification, InboxBadgeUpdated);
    XPush.ApplicationDidFinishLaunchingWithOptions((options != null) ? options : new NSDictionary());

  • Adicione a seguinte função ao AppDelegate.cs arquivo se quiser lidar com eventos atualizados do selo da caixa de entrada:

    public void InboxBadgeUpdated(NSNotification nu){
        Console.WriteLine("Inbox Badge Changed : " + XP.XPush.InboxBadge);
    }

  • Edite o AppDelegate.cs arquivo e adicione os seguintes callbacks ao Xtremepush SDK:

    public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
    {
        XP.XPush.ApplicationDidRegisterForRemoteNotificationsWithDeviceToken(deviceToken);
    }
    public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
    {
        XP.XPush.ApplicationDidFailToRegisterForRemoteNotificationsWithError(error);
    }

  • Se você precisar associar um Apple ID ao seu IDE, faça isso agora nas preferências do IDE:

  • Edite o Entitlements.plist arquivo para ativar notificações push.

  • Se você não está usando o Xamarin.Forms e deseja enviar tags ou eventos para o Xtremepush em outro lugar do seu app, isso pode ser feito com as seguintes chamadas de função:

    XPush.XPush.HitTag("TestTag");
    XPush.XPush.HitEvent("TestEvent");

  • Se você quiser receber notificações quando seu app estiver em primeiro plano. Isso é possível no iOS 10 e superiores chamando o seguinte método dentro do FinishedLaunching():

    XP.XPush.RegisterForegroundNotificationOptions((XPMessage arg0) =>
    {
        ///you can return different foreground options based on particular message.
        ///for example you might want to show notification in foreground only for messages from specific campaign id
        if (arg0.CampaignIdentifier == "travel") 
        {
            return XP.XPNotificationType.Alert | XP.XPNotificationType.Badge | XP.XPNotificationType.Sound;
        }
        return XPNotificationType.None;
    });

    Certifique-se de definir o ID do usuário

    Recomenda-se que, nesta fase, você use nosso método SDK para definir IDs de usuário, seguindo nosso guia dedicado para garantir que os dispositivos possam ser associados e direcionados em suas campanhas por seu próprio identificador único.

Solução de problemas

Erro de build "Não foi possível AOT do assembly ... xpios.dll"

  • Desligue as Opções de Projeto > Build > Build iOS > Ative builds incrementais

  • Reconstruir o projeto novamente (agora deve ter sucesso)

  • Deve ser possível habilitar builds incrementais novamente após esse ponto