Titânio

Prev Next

Use o SDK Xtremepush para integrar seus apps Titanium com a plataforma

Com o módulo Xtremepush para Titanium, você pode adicionar Xtremepush rapidamente tanto aos apps iOS quanto Android.

Certifique-se de que seus aplicativos móveis estejam adicionados ao Xtremepush, seguindo os guias para Android e iOS.

Adicione os arquivos Xtremepush Titanium

Baixe o módulo Titanium na página de lançamentos do Titanium SDK .

Copie a pasta de módulos do download para o diretório mostrado abaixo para seu respectivo sistema e permita que ele se mescle.

~/Library/Application Support/Titanium
C:\ProgramData\Titanium
~/.titanium

Modificar o tiapp.xml

Importe o módulo Xtremepush para o seu projeto abrindo os tiapp.xml do seu projeto no TitaniumStudio. Você pode adicionar o módulo pela interface do editor do TiApp clicando no botão verde de adicionar ao lado da lista de módulos,

950

e selecionar Xtremepush na lista suspensa

600

você verá o Xtremepush na lista de módulos se você o adicionou com sucesso.

431

Você também pode adicionar o módulo editando tiapp.xml via editor XML bruto.

Nota: Para aplicativos Android, devido à dependência do Xtremepush dos play-services, você também precisará adicionar o módulo ti.playservices , da mesma forma que adicionou o módulo Xtremepush descrito acima.

iOS

<modules>
...
<module platform="android">com.xtremepush.xtremepush</module>
<module platform="iphone">com.xtremepush.xtremepush</module>
</modules>

Você deve seguir os passos em Adicionar descrição para CoreBluetooth no guia Integrar o SDK iOS , para adicionar a descrição necessária do CoreBluetooth .

Se você também estiver ativando notificações push, precisará configurar seus certificados push da Apple e adicionar os métodos de gerenciamento de notificações descritos no guia de notificações push do iOS .

Se você estiver adicionando serviços de localização, precisará adicionar as descrições de uso seguindo o guia de permissões de localização do iOS . Se você estiver usando beacons, também precisará adicionar a mensagem de uso de bluetooth descrita na seção de beacons do mesmo guia.

Além disso, você precisará adicionar a flag bluetooth no register.json seu nó iOS:

ios: {
    locationsEnabled: true,
    beaconsEnabled: true,
},

Android

Siga os passos do guia para notificações push do Android para obter os valores de configuração e google-services.json o arquivo.

No Android nativo, ou em outro framework que use a ferramenta de build do Gradle, você pode adicionar um plugin que migra automaticamente valores do arquivo google-services.json para os recursos do app. O titânio exige que os valores de configuração sejam definidos manualmente a partir do arquivo de configuração.

No seu projeto, edite o arquivo platform/android/res/values/values.xml, criando-o se ele ainda não existir:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <! -- Present in all applications -->
    <string name="google_app_id" translatable="false">1:312123...:android:...</string>

    <! -- Present in applications with the appropriate services configured 
    <string name="gcm_defaultSenderId" translatable="false">312123...</string>
    <string name="default_web_client_id" translatable="false">312123...-860....apps.googleusercontent.com</string>
    <string name="google_api_key" translatable="false">AIza..</string>
    <string name="project_id" translatable="false">my_project...</string>
    ...

</resources>

Os valores das chaves no XML podem ser encontrados no google-services.json arquivo nestes locais:

Chave XML

Localização em

google-services.json

google_app_id

{YOUR_CLIENT}/client_info/mobilesdk_app_id

gcm_defaultSenderId

project_info/project_number

default_web_client_id

{YOUR_CLIENT}/oauth_client/client_id (client_type == 3)

ga_trackingId

{YOUR_CLIENT}/services/analytics-service/analytics_property/tracking_id

firebase_database_url

project_info/firebase_url

google_api_key

{YOUR_CLIENT}/api_key/current_key

google_crash_reporting_api_key

{YOUR_CLIENT}/api_key/current_key

project_id

project_info/project_id

Agora você adiciona o módulo Xtremepush e ti.playservices ao seu app:

491

Edite o tiapp.xml arquivo para adicionar o seguinte à seção do Android:

<android xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
        <manifest>
            <uses-sdk android:targetSdkVersion="26"/>
            <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
            <!-- REQUIRED for XtremePush -->
            <uses-permission android:name="android.permission.INTERNET"/>
            <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
            <!-- Keeps the processor from sleeping when a message is received. -->
            <uses-permission android:name="android.permission.WAKE_LOCK"/>
            <!-- REQUIRED PERMISSIONS for GCM (Push Notifications) -->
            <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
            <!-- GCM requires a Google account. -->
            <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
            <!-- This app has permission to register with GCM and receive message -->
            <permission android:name=".permission.C2D_MESSAGE" android:protectionLevel="signature"/>
            <uses-permission android:name=".permission.C2D_MESSAGE"/>
            <!-- The two elements above ensure that only this application can receive the messages and registration result -->
            <!-- OPTIONAL XtremePush settings-->
            <!-- REQUIRED FOR GEO-LOCATION-->
            <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
            <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
            <!-- REQUIRED FOR IBEACON -->
            <uses-permission android:name="android.permission.BLUETOOTH"/>
            <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
            <!-- REQUIRED IF you support iBeacon and your app must support devices that don't support BLE -->
            <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
            <application>
                <activity android:configChanges="orientation|screenSize"
                    android:label="@string/title_activity_inbox"
                    android:name="ie.imobile.extremepush.ui.InboxActivity" android:theme="@style/Theme.Transparent"/>
                <activity android:exported="false"
                    android:name="ie.imobile.extremepush.ui.OnclickPushActivity" android:taskAffinity=""/>
                <service android:name="ie.imobile.extremepush.NotificationOnClickHandlerService"/>
                <activity android:exported="false" android:name="ie.imobile.extremepush.ui.WebViewActivity"/>
                <activity android:exported="false"
                    android:label="Locations are not available"
                    android:name="ie.imobile.extremepush.ui.LocationDialogActivity" android:theme="@android:style/Theme.Dialog"/>
                <!-- REQUIRED FOR GEO LOCATION SERVICES -->
                <service android:name="ie.imobile.extremepush.location.GeoLocationService"/>
                <!-- REQUIRED FOR IBEACON -->
                <service android:enabled="true" android:exported="false" android:isolatedProcess="false" android:label="beacon" android:name="org.altbeacon.beacon.service.BeaconService"/>
              <service android:enabled="true" android:exported="false" android:name="org.altbeacon.beacon.BeaconIntentProcessor"/>
                <service android:name="ie.imobile.extremepush.beacons.BeaconLocationService"/>
                <!-- REQUIRED FOR GCM, LOCATION AND BEACON -->
                <receiver android:name="ie.imobile.extremepush.receivers.CoreBroadcastReceiver">
                    <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:exported="true" android:name="ie.imobile.extremepush.beacons.BeaconLocationReceiver"/>
                <receiver android:exported="true" android:name="ie.imobile.extremepush.location.GeoLocationBroadcastReceiver"/>
                <receiver android:exported="true" android:name="ie.imobile.extremepush.location.ProxymityAlertReceiver"/>
                <receiver android:name="ie.imobile.extremepush.receivers.XP_App_Update_Receiver">
                    <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">
                    <intent-filter>
                        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
                    </intent-filter>
                </service>
                <service android:name="com.google.firebase.components.ComponentDiscoveryService">
                  <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
                </service>
            </application>
        </manifest>
    </android>

Habilitar na aplicação de ligas

Se você está usando Alloy, então adicionaria o seguinte ao seu alloy.js arquivo:

// Initialise XtremePush
Ti.Network.registerApp;
Alloy.Globals.xtremepush = require("com.xtremepush.xtremepush");
Alloy.Globals.xtremepush.registerApp(
   {
      appKey: "YOUR_APP_KEY",
      debugLogsEnabled: true,
      impressionsBatchingEnabled: true,
      impressionsStoreLimit: 999,
      inappMessagingEnabled: true,
      inboxBadgeCallback: inboxBadgeCallbackFunction,
      inboxEnabled: true,
      messageResponseCallback: messageResponseCallbackFunction,
      deeplinkCallback: onDeeplinkReceived,
      tagsBatchingEnabled: true,
      tagsStoreLimit: 888,
      startSessionEnabled: true,
      sessionsStoreLimit: 777,
      attributionsEnabled: true,
      foregroundNotificationsEnabled: true,    
      ios: {
         //if using location
         locationsEnabled: true,
         //if sandbox
         sandboxModeEnabled: true
      },
      android: {
         gcmProjectNumber: "YOUR_GCM_PROJECT_NUMBER",
         //if using geo
         geoEnabled: false,
         //if using beacon
         beaconsEnabled: true
      }
   });

Você pode ver no registro acima que há três funções de retorno de chamada (messageResponseCallback, InboxBadgeCallback, deeplinkCallback). Exemplos de como usar esses dispositivos são mostrados mais adiante.

No seu arquivo index.js JavaScript do controle, você precisa registrar o app nos servidores Xtremepush:

Ti.Network.registerForPushNotifications;

Devido ao tratamento do Titanium com Windows e TabGroups como atividades no Android, há várias opções adicionais que podem ser definidas no seu index.js arquivo. Neste exemplo, $.index está o principal Grupo de Tabulação do aplicativo e $.b1-14 há botões de exemplo que mostram algumas das opções disponíveis no módulo.

Ti.Network.registerForPushNotifications;

var handlePush = function(exampleDataForProcessing) {
	// Handle received push data
	alert(exampleDataForProcessing);
};

var handlePushList = function(data) {
	// Handle received push data
	var pushArray = data.notifications;
	for (var i=0; i < pushArray.length; i++)
	{
		Ti.API.debug(pushArray[i]);
		handlePush(pushArray[i].alert);
	}
};

$.button0.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the trigger event button");
    Alloy.Globals.xtremepush.hitEvent("InAppCampaign");
});

$.button1.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the hit tag button");
    Alloy.Globals.xtremepush.hitEvent("tagTest");
});

$.button2.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the hit impression button");
    Alloy.Globals.xtremepush.hitImpression("ExampleImpression");
});

$.button3.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the release all button");
    Alloy.Globals.xtremepush.sendTags();
    Alloy.Globals.xtremepush.sendImpressions();
});

batching = false;
$.button4.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the toggle batching button");
	batching = !batching;
	Ti.API.debug(batching);
    Alloy.Globals.xtremepush.setTagsBatchingEnabled(batching);
    Alloy.Globals.xtremepush.setImpressionsBatchingEnabled(batching);
});

$.button5.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the getPushList button");
    Alloy.Globals.xtremepush.getPushNotifications({
    	success: handlePushList,
    	offset: 0,
    	limit: 1,
    	read: 0
    });
});

$.button6.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the markRead button");
	Alloy.Globals.xtremepush.markPushAsRead($.pushid.value);
});

$.button7.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the openInbox button");
    Alloy.Globals.xtremepush.openInbox();
});

$.button8.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the Report Message Clicked button with lastPushId = " + lastPushId);
    Alloy.Globals.xtremepush.reportMessageClicked(lastPushId);
});

$.button9.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the Report Message Clicked button with lastPushId = " + lastPushId +" and action 'test'");
	var obj = {id: lastPushId, action: "test"};
    Alloy.Globals.xtremepush.reportMessageClicked(obj);
});

$.button10.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the Report Message Dismissed button with lastPushId = "+lastPushId);
    Alloy.Globals.xtremepush.reportMessageDismissed(lastPushId);
});

$.button11.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the Show Notification button");
    Alloy.Globals.xtremepush.showNotification(lastPushId);
});

$.button12.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the set External Id button");
    Alloy.Globals.xtremepush.setExternalId($.pushid.value);
});

$.button13.addEventListener('click', function(e) {
	Titanium.API.debug("You clicked the set Hit Event With Value button");
	
	var stringOrHash = {0: "number0", 1: "number1"};
	//var stringOrHash = "numbers";
	var obj = {title: "tagString", value: stringOrHash};
    Alloy.Globals.xtremepush.hitEventWithValue(obj);
});

// Declare XtremePush in alloy.js as shown here:
// Alloy.Globals.xtremepush = require("com.xtremepush.xtremepush");

var OS_ANDROID = Ti.Platform.getOsname() === "android";
if (OS_ANDROID) {
	var onRotation = function(e){
		var rotation = false;
		switch(e.orientation) {
	    case Ti.UI.LANDSCAPE_RIGHT:
	        Ti.API.info("LANDSCAPE_RIGHT");
	        rotation = true;
	        break;
	    case Ti.UI.LANDSCAPE_LEFT:
	        Ti.API.info("LANDSCAPE_LEFT");
	        rotation = true;
	        break;
	    case Ti.UI.UPSIDE_PORTRAIT:
	        Ti.API.info("UPSIDE_PORTRAIT");
	        rotation = true;
	        break;
	    case Ti.UI.PORTRAIT:
	        Ti.API.info("PORTRAIT");
	        rotation = true;
	        break;
	    default:
	        Ti.API.info("Unknown!!");
	    }
	    if(rotation)
	    	Alloy.Globals.xtremepush.onRotation();
	};
	
	$.index.orientationModes = [ 
	    Titanium.UI.PORTRAIT, 
	    Titanium.UI.UPSIDE_PORTRAIT,
	    Titanium.UI.LANDSCAPE_LEFT,
	    Titanium.UI.LANDSCAPE_RIGHT
	];
	
	Ti.Gesture.addEventListener('orientationchange', onRotation);
}

$.index.open();

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.

Definindo o ícone de notificação no Android

Existe uma chave que pode ser definida em register.json chamada setIcon. Se ativado, o programa tentará encontrar e usar iconfilenamewithoutextension.png no platform/android/res/drawable diretório e também buscará uma entrada de cor com o mesmo nome em qualquer um dos arquivos XML do platform/android/res/values diretório para usar como cor de fundo atrás do ícone.

setIcon: "iconFileNameWithoutExtension",

O Android incentiva você a criar um ícone que esteja de acordo com as diretrizes de design deles. Mais informações podem ser encontradas no guia de ícones de notificação do Android.

Funções de callback Xtremepush

messageResponseCallback, deeplinkCallback, e inboxBadgeCallback são funções JavaScript definidas em um arquivo JavaScript do seu projeto. Após criar, você precisa defini-los na registerXtremePush função:

messageResponseCallback: messageResponseCallbackFunction,

inboxBadgeCallback: inboxBadgeCallbackFunction,

deeplinkCallback: onDeeplinkReceived,

mensagemRespostaChamada de Retorno

var messageResponseCallbackFunction = function(xp) {   
   if(xp.response.type === "present"){
   		alert("receive");
   } else if (xp.response.type === "click"){
   		alert("click");
   } else if (xp.response.type === "dismiss"){
   		alert("dismiss");
   }  
};

A response.type variável mostrada acima pode ser de valores específicos:

  • presente - quando uma notificação push é recebida e o aplicativo está em primeiro plano

  • clique - quando uma mensagem é clicada

  • Dispensar - quando uma mensagem é descartada

Abaixo está um exemplo completo de tratamento personalizado de notificações, que:

  • mostra um diálogo personalizado quando uma mensagem push é recebida em primeiro plano,

  • abre uma página de artigo quando uma mensagem é clicada,

  • Salva as informações quando um dos botões da mensagem é clicado.

(Cada mensagem enviada nas campanhas associadas ao exemplo inclui um payload personalizado para articleId)

var messageResponseCallbackFunction = function(xp) {   
	Ti.API.info(''+JSON.stringify(xp));
    if (xp.response.type === "present") {
        openArticle(xp.message.articleId);

        //when the user clicks on a message 
    } else if (xp.response.type === "click") {
        //default click action
        if (!xp.response.hasOwnProperty('action')) {
            openArticle(xp.message.articleId);

            //action for specific button click
        } else {
            if (xp.response.action === "like") {
                likeArticle(xp.message.articleId);
            } else if (xp.response.action === "share") {
                shareArticle(xp.message.articleId);
            }
        }
        //show alert if dismiss button click
    } else if (xp.response.type === "dismiss") {
        alert("message dismiss");
    } 
};

inboxBadgeCallback

Isso é chamado quando o número do distintivo é atualizado. O número do distintivo é verificado quando:

  • Nova mensagem push chega

  • A inscrição é iniciada

  • A janela da caixa de entrada está fechada

var inboxBadgeCallbackFunction = function(xp) {
   //do something with message
   alert('Inbox badge update with number: ' + JSON.stringify(xp)); 
};

deeplinkCallback

Isso é chamado quando uma mensagem com a ação de clique Ir para o deeplink é clicada.

var onDeeplinkReceived = function(xp) {
    alert('onDeeplinkReceived called in alloy.js with data:'+JSON.stringify(xp));
};

Tratamento de notificações em primeiro plano

É importante definir o comportamento correto para a situação quando uma notificação push é recebida em primeiro plano. Você não quer interromper o fluxo de trabalho do usuário, mas ainda assim entregar informações importantes ao usuário.

O comportamento padrão tanto no iOS quanto no Android é mostrar notificações no estilo do sistema operacional. Mas isso pode ser mudado, adicionando o payload com chave foreground e valor false à sua campanha.

607

Agora, quando o pedido é recebido, caso o aplicativo esteja em primeiro plano, a notificação não será exibida.

Se você quiser mudar o comportamento padrão para não mostrar notificações quando o app estiver aberto, na função de registro você pode usar o seguinte:

foregroundNotificationsEnabled: false

Recuperando seu ID Xtremepush

Agora que seu aplicativo está configurado para análise móvel e envio de notificações push, o recurso básico final do Xtremepush é recuperar seu ID Xtremepush. Isso pode ser feito chamando o deviceInfo método:

Alloy.Globals.xtremepush.deviceInfo

Esse método retorna o ID do seu dispositivo como obtido do servidor Xtremepush. Se seu dispositivo não recebeu um ID, então ele não foi registrado com sucesso e há um problema com sua integração. Se, por exemplo, você quiser rapidamente exportar o ID do dispositivo para a área de depuração no TitaniumStudio, usaria assim:

Ti.API.debug("deviceInfo" + Alloy.Globals.xtremepush.deviceInfo);

Se você conseguir recuperar o ID, ele pode ser usado para identificar seu dispositivo na plataforma e enviar uma notificação push apenas para esse dispositivo.

Gerenciamento de usuários

Defina o usuário principal na plataforma:

Alloy.Globals.xtremepush.setUser("");

Defina o usuário temporário na plataforma:

Alloy.Globals.xtremepush.setTempUser("");