您可以使用适用于iOS和Android的Campaign SDK来促进将移动应用程序集成到Adobe Campaign平台。
Android和iOS支持的版本,以及Campaign v8的Campaign SDK兼容版本,如 兼容性矩阵.
作为Campaign管理员,您可以从 Experience CloudSoftware Distribution. 有关详细信息,请联系 Adobe客户关怀.
您还可以通过在数据收集UI中配置Adobe Experience Platform Mobile SDK扩展来使用Adobe Campaign。 请参阅开发人员文档,以了解更多信息.
要将Campaign SDK集成到移动应用程序中,功能管理员必须向开发人员提供以下信息:
集成密钥:以启用Adobe Campaign平台来识别移动应用程序。
此集成密钥是在Adobe Campaign控制台(位于 Information 专用于移动应用程序的服务选项卡。 请参阅 Campaign Classicv7文档.
跟踪URL:与Adobe Campaign跟踪服务器的地址匹配。
营销URL:以启用订阅的收集。
在Android中:
Neolane.getInstance().setIntegrationKey("your Adobe mobile app integration key");
Neolane.getInstance().setMarketingHost("https://yourMarketingHost:yourMarketingPort/");
Neolane.getInstance().setTrackingHost("https://yourTrackingHost:yourTrackingPort/");
在iOS:
Neolane_SDK *nl = [Neolane_SDK getInstance];
[nl setMarketingHost:strMktHost];
[nl setTrackingHost:strTckHost];
[nl setIntegrationKey:strIntegrationKey];
Android SDK是使用JAVA编写的Jar库。 它允许Android开发人员与Adobe Campaign集成:注册新设备、将设备与用户链接、跟踪行为等。
在此部分中,了解如何在实施Android应用程序中使用Android SDK Google Firebase Cloud Messaging(FCM).
对于Campaign v8,使用Campaign Android SDK v1.1.1。
要在Android上使用推送通知,您必须拥有FCM帐户,配置Android应用程序以接收通知,并将应用程序关联到FCM帐户。 在 Google文档.
请参阅 Google文档 将Firebase添加到您的Android项目。
了解如何在 Google文档.
请不要忘记下载google-services.json并将其添加到您的项目中。
的 apiKey
必须与 projectKey
在链接到此Android应用程序的Adobe Campaign移动设备应用程序中设置。
初始化SDK
在使用Android SDK之前,您需要对其进行初始化。 SDK初始化可以在 onCreate
的函数。
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// initialize Campaign SDK
SharedPreferences settings = getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
Neolane.getInstance().setIntegrationKey(settings.getString(YourApplicationActivity.APPUUID_NAME, YourApplicationActivity.DFT_APPUUID));
Neolane.getInstance().setMarketingHost(settings.getString(YourApplicationActivity.SOAPRT_NAME, YourApplicationActivity.DFT_SOAPRT));
Neolane.getInstance().setTrackingHost(settings.getString(YourApplicationActivity.TRACKRT_NAME, YourApplicationActivity.DFT_TRACKRT));
...
}
的 IntegrationKey
必须与链接到此Android应用程序的Adobe Campaign移动应用程序中设置的“IntegrationKey”匹配。
将移动设备注册到Adobe Campaign服务器
注册功能允许您:
您必须在应用程序初始化或用户操作时,将设备注册到Adobe Campaign。 使用 registerDevice
方法。
public void onClick(View v)
{
SharedPreferences settings = this.context.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
EditText mailEdit = (EditText) this.context.findViewById(R.id.editText1);
final String FCMRegistrationId = FirebaseInstanceId.getInstance().getToken();
if (FCMRegistrationId != null)
NeoTripActivity.registerOnNeolane(this.context, FCMRegistrationId, mailEdit.getText().toString());
}
YourApplicationActivity.java
public static void registerOnNeolane(final Context ctx, String registrationId, String userKey)
{
NeolaneAsyncRunner neolaneAs = new NeolaneAsyncRunner(Neolane.getInstance());
// Additional Subscription Parameters
Map<String,Object> additionnalParam = new HashMap<String, Object>();
additionnalParam.clear();
SharedPreferences settings = ctx.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
if (settings.getBoolean(YourApplicationActivity.SUBPARAMEN1_NAME, false))
{
additionnalParam.put(settings.getString(YourApplicationActivity.SUBPARAMNAME1_NAME, "") , settings.getString(YourApplicationActivity.SUBPARAMVALUE1_NAME, ""));
}
if (settings.getBoolean(YourApplicationActivity.SUBPARAMEN2_NAME, false))
{
additionnalParam.put(settings.getString(YourApplicationActivity.SUBPARAMNAME2_NAME, "") , settings.getString(YourApplicationActivity.SUBPARAMVALUE2_NAME, ""));
}
if ( additionnalParam.isEmpty() )
{
additionnalParam = null;
}
// Campaign Registration
neolaneAs.registerDevice(registrationId, userKey, additionnalParam, ctx, new RequestListener() {
public void onComplete(String e, Object obj)
{
Intent upd = new Intent();
upd.setAction(BROADCAST_NEWREGISTER_ACTION);
ctx.sendBroadcast(upd);
}
public void onNeolaneException(NeolaneException e, Object obj)
{
sendErrorMsg(e.getErrorString());
}
public void onIOException(IOException e, Object obj)
{
sendErrorMsg(e.getMessage());
}
public void sendErrorMsg(String err)
{
SharedPreferences.Editor edit = ctx.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE).edit();
edit.putBoolean(YourApplicationActivity.REGISTRATION_ERROR_NEOLANE_KEYNAME, true);
edit.commit();
Intent toast = new Intent();
toast.setAction(BROADCAST_TOAST_DISPLAY_TEXT);
toast.putExtra("text", "An error happened, please register again (" + err + ")");
ctx.sendBroadcast(toast);
}
});
}
当用户的移动设备令牌发生更改时通知Campaign
我们建议您使用 registerDevice
函数 onTokenRefresh
函数,以通知Adobe Campaign用户移动设备令牌发生更改。
例如:
YourApplicationFirebaseInstanceIDService.java
package com.android.YourApplication;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
import static android.content.SharedPreferences.*;
public class YourApplicationFirebaseInstanceIDService extends FirebaseInstanceIdService
{
@Override
public void onTokenRefresh()
{
SharedPreferences settings = getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
if (!settings.getBoolean(YourApplicationActivity.USE_GCM, false))
{
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
String userKey = settings.getString(YourApplicationActivity.USERKEY_NAME, "");
Editor edit = settings.edit();
edit.putString(YourApplicationActivity.FCM_REGISTRATIONID_NAME, refreshedToken);
edit.commit();
YourApplicationActivity.registerOnNeolane(this, refreshedToken, userKey);
}
}
}
配置Firebase Messaging Service
扩展 FirebaseMessagingService
在 onMessageReceived
回调以接收消息。 我们建议您将 notifyReceive
函数 onMessageReceived
调用callback以在移动设备上启用通知接收跟踪。 在Adobe Campaign,这个名字是 打印 通知:应在请求操作系统显示通知之前调用此函数。
YourApplicationMessagingService.java
package com.android.YourApplication;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class YourApplicationFirebaseMessagingService extends FirebaseMessagingService
{
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage message)
{
Log.d(TAG, "Receive message from: " + message.getFrom());
Map<String,String> payloadData = message.getData();
final Bundle extras = new Bundle();
final Iterator<Entry<String, String>> iter = payloadData.entrySet().iterator();
while(iter.hasNext())
{
final Entry<String, String> entry =iter.next();
extras.putString(entry.getKey(), entry.getValue());
}
SharedPreferences settings = this.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
String mesg = payloadData.get("_msg");
String title = payloadData.get("title");
String url = payloadData.get("url");
String messageId = payloadData.get("_mId");
String deliveryId = payloadData.get("_dId");
YourApplicationActivity.handleNotification(this, mesg, title, url, messageId, deliveryId, extras);
}
}
public static void handleNotification(Context context, String message, String title, String url, String messageId, String deliveryId, Bundle extras)
{
if( message == null ) message = "No Content";
if( title == null ) title = "No title";
if( url == null ) url = "http://www.tripadvisor.fr";
int iconId = R.drawable.notif_neotrip;
// notify Adobe Campaign that a notification just arrived
SharedPreferences settings = context.getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
public void onNeolaneException(NeolaneException arg0, Object arg1) {}
public void onIOException(IOException arg0, Object arg1) {}
public void onComplete(String arg0, Object arg1){}
});
if (yourApplication.isActivityVisible())
{
Log.i("INFO", "The application has the focus" );
...
}
else
{
// notification creation
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification;
// Activity to start
Intent notifIntent = new Intent(context.getApplicationContext(), NotificationActivity.class);
notifIntent.putExtra("notificationText", message);
notifIntent.putExtra(NotificationActivity.NOTIFICATION_URL_KEYNAME, url);
notifIntent.putExtra("_dId", deliveryId);
notifIntent.putExtra("_mId", messageId);
notifIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent contentIntent = PendingIntent.getActivity(context, 1, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notification = new Notification.Builder(context)
.setContentTitle(title)
.setContentText(message)
.setSmallIcon(iconId)
.setContentIntent(contentIntent)
.build();
// launch the notification
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(1234, notification);
}
}
跟踪数据消息的打开情况
对于数据消息,您可以使用 notifyOpening
函数。 当用户单击通知时,将创建通知活动(在 onMessageReceived
函数调用)
public class NotificationActivity extends Activity {
public void onCreate(Bundle savedBundle) {
[...]
Bundle extra = getIntent().getExtras();
if (extra != null) {
// reinit the Campaign sdk
SharedPreferences settings = getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
// Get the messageId and the deliveryId to perform tracking
String deliveryId = extra.getString("_dId");
String messageId = extra.getString("_mId");
if (deliveryId != null && messageId != null)
{
try {
Neolane.getInstance().notifyOpening(messageId, Integer.valueOf(deliveryId));
} catch (NeolaneException e) {
// ...
} catch (IOException e) {
// ...
}
}
}
}
}
跟踪通知消息的打开数和点击数
对于通知消息,需要使用 notifyOpening
函数,如下所示:
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
SharedPreferences settings = getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
// initialize Campaign SDK
Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
...
...
...
// Manage opening/receive tracking of message notification
Intent intent = getIntent();
Bundle data = intent.getExtras();
String messageId = null, deliveryId = null;
if( data != null ) {
if (data.containsKey("_mId")) messageId = data.get("_mId").toString();
if (data.containsKey("_dId")) deliveryId = data.get("_dId").toString();
if ( messageId != null && deliveryId != null) {
Log.i(TAG, "Notify opening from backgroun click_action");
NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
nas.notifyOpening(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
public void onNeolaneException(NeolaneException arg0, Object arg1) {
toastMessage( "error", getString(R.string.open_track_sdk_error) + arg0.getErrorCode());
}
public void onIOException(IOException arg0, Object arg1) {
toastMessage( "error", getString(R.string.open_track_io_error) + arg0.getLocalizedMessage());
}
public void onComplete(String arg0, Object arg1) {
toastMessage( "error", getString(R.string.open_track_ok));
}
});
nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
public void onNeolaneException(NeolaneException arg0, Object arg1) {
toastMessage( "error", getString(R.string.rec_track_sdk_error) + arg0.getErrorCode());
}
public void onIOException(IOException arg0, Object arg1) {
toastMessage( "error", getString(R.string.rec_track_io_error) + arg0.getLocalizedMessage());
}
public void onComplete(String arg0, Object arg1) {
toastMessage( "error", getString(R.string.rec_track_ok));
}
});
}
}
}
如果用户使用 click_action
选项。
接收数据消息的跟踪
对于数据消息,将在 onMessageReceived
调用级别。 需要调用“notifyReceive”函数。
YourApplicationMessagingService.java
package com.android.YourApplication;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class YourApplicationFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage message)
{
Log.d(TAG, "Receive message from: " + message.getFrom());
Map<String,String> payloadData = message.getData();
final Bundle extras = new Bundle();
final Iterator<Entry<String, String>> iter = payloadData.entrySet().iterator();
while(iter.hasNext())
{
final Entry<String, String> entry =iter.next();
extras.putString(entry.getKey(), entry.getValue());
}
SharedPreferences settings = this.getSharedPreferences(YourApplicationActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
String mesg = payloadData.get("_msg");
String title = payloadData.get("title");
String url = payloadData.get("url");
String messageId = payloadData.get("_mId");
String deliveryId = payloadData.get("_dId");
YourApplicationActivity.handleNotification(this, mesg, title, url, messageId, deliveryId, extras);
}
}
public static void handleNotification(Context context, String message, String title, String url, String messageId, String deliveryId, Bundle extras){
.....
.....
// notify Campaign that a notification just arrived
SharedPreferences settings = context.getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
public void onNeolaneException(NeolaneException arg0, Object arg1) {}
public void onIOException(IOException arg0, Object arg1) {}
public void onComplete(String arg0, Object arg1){}
});
}
接收通知消息的跟踪
对于通知消息,跟踪接收必须配置在两个级别:
onMessageReceived
(应用程序不在后台):在上一节中已完成实施onCreate
启动活动(或目标活动(如果 click_action
函数。) (应用程序不在后台)。它需要在打开/点击跟踪的同一时间完成。
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
SharedPreferences settings = getSharedPreferences(NeoTripActivity.APPLICATION_PREF_NAME, Context.MODE_PRIVATE);
// initialize Campaign SDK
Neolane.getInstance().setIntegrationKey(settings.getString(NeoTripActivity.APPUUID_NAME, NeoTripActivity.DFT_APPUUID));
Neolane.getInstance().setMarketingHost(settings.getString(NeoTripActivity.SOAPRT_NAME, NeoTripActivity.DFT_SOAPRT));
Neolane.getInstance().setTrackingHost(settings.getString(NeoTripActivity.TRACKRT_NAME, NeoTripActivity.DFT_TRACKRT));
...
...
...
// Manage opening/receive tracking of message notification
Intent intent = getIntent();
Bundle data = intent.getExtras();
String messageId = null, deliveryId = null;
if( data != null ) {
if (data.containsKey("_mId")) messageId = data.get("_mId").toString();
if (data.containsKey("_dId")) deliveryId = data.get("_dId").toString();
if ( messageId != null && deliveryId != null) {
Log.i(TAG, "Notify opening from backgroun click_action");
NeolaneAsyncRunner nas = new NeolaneAsyncRunner(Neolane.getInstance());
nas.notifyOpening(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
public void onNeolaneException(NeolaneException arg0, Object arg1) {
toastMessage( "error", getString(R.string.open_track_sdk_error) + arg0.getErrorCode());
}
public void onIOException(IOException arg0, Object arg1) {
toastMessage( "error", getString(R.string.open_track_io_error) + arg0.getLocalizedMessage());
}
public void onComplete(String arg0, Object arg1) {
toastMessage( "error", getString(R.string.open_track_ok));
}
});
nas.notifyReceive(messageId, deliveryId, new NeolaneAsyncRunner.RequestListener() {
public void onNeolaneException(NeolaneException arg0, Object arg1) {
toastMessage( "error", getString(R.string.rec_track_sdk_error) + arg0.getErrorCode());
}
public void onIOException(IOException arg0, Object arg1) {
toastMessage( "error", getString(R.string.rec_track_io_error) + arg0.getLocalizedMessage());
}
public void onComplete(String arg0, Object arg1) {
toastMessage( "error", getString(R.string.rec_track_ok));
}
});
}
}
}
将移动设备注册到Adobe Campaign服务器
注册功能允许您:
// Callback called on successful registration to the APNs
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
// Pass the token to Adobe Campaign
Neolane_SDK *nl = [Neolane_SDK getInstance];
[nl registerDevice:tokenString:self.userKey:dic];
}
启用跟踪函数
利用跟踪函数,可在激活(打开)通知时进行跟踪。
(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)launchOptions
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
if( launchOptions ) { // Retrieve notification parameters here ... // Track application opening Neolane_SDK
*nl = [Neolane_SDK getInstance]; [nl track:launchOptions:NL_TRACK_CLICK]; }
...
completionHandler(UIBackgroundFetchResultNoData);
}
无提示通知跟踪
iOS允许您发送静默通知、通知或数据,这些通知或数据将直接发送到移动应用程序,而不显示。 Adobe Campaign允许您跟踪它们。
要跟踪无提示通知,请按照以下示例操作:
// AppDelegate.m
...
...
#import "AppDelegate.h"
#import "Neolane_SDK.h"
...
...
// Callback called when the application is already launched (whether the application is running foreground or background)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)launchOptions fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"IN didReceiveRemoteNotification:fetchCompletionHandler");
if (launchOptions) NSLog(@"IN launchOptions: %@", [launchOptions description]);
NSLog(@"Application state: %ld", (long)application.applicationState);
// Silent Notification (specific case, can use NL_TRACK_RECEIVE as the user does not have click/open the notification)
if ([launchOptions[@"aps"][@"content-available"] intValue] == 1 )
{
NSLog(@"Silent Push Notification");
...
...
//Call receive tracking
Neolane_SDK *nl = [Neolane_SDK getInstance];
[nl track:launchOptions:NL_TRACK_RECEIVE];
completionHandler(UIBackgroundFetchResultNoData); //Do not show notification
return;
}
...
...
completionHandler(UIBackgroundFetchResultNoData);
}
配置注册状态
委托协议允许您获取 registerDevice 调用和,可用于知道注册期间是否发生错误。
的 registerDeviceStatus 原型为:
- (void) registerDeviceStatus: (ACCRegisterDeviceStatus) status:(NSString *) errorReason;
状态 用于了解注册是否成功或是否发生错误。
错误原因 为您提供有关所发生错误的更多信息。 有关可用错误及其说明的更多信息,请参阅下表。
状态 | 说明 | 错误原因 |
---|---|---|
ACCRegisterDeviceStatusSuccess | 注册成功 | EMPTY |
ACCRegisterDeviceStatusFailureMarketingServerHostnameEmpty | ACC营销服务器主机名为空或未设置。 | EMPTY |
ACCRegisterDeviceStatusFailureIntegrationKeyEmpty | 集成键值为空或未设置。 | EMPTY |
ACCRegisterDeviceStatusFailureConnectionIssue | 与ACC的连接问题 | 更多信息(使用操作系统当前语言) |
ACCRegisterDeviceStatusFailureUnknownUUID | 提供的UUID(集成密钥)未知。 | EMPTY |
ACCRegisterDeviceStatusFailureExpectedError | 向ACC服务器返回意外错误。 | 返回到ACC的错误消息。 |
Neolane_SDKelegate 协议和 registerDeviceStatus 委托定义如下所示:
// Neolane_SDK.h
// Campaign SDK
..
..
// Register Device Status Enum
typedef NS_ENUM(NSUInteger, ACCRegisterDeviceStatus) {
ACCRegisterDeviceStatusSuccess, // Resistration Succeed
ACCRegisterDeviceStatusFailureMarketingServerHostnameEmpty, // The Campaign marketing server hostname is Empty or not set
ACCRegisterDeviceStatusFailureIntegrationKeyEmpty, // The integration key is empty or not set
ACCRegisterDeviceStatusFailureConnectionIssue, // Connection issue with Campaign, more information in errorReason
ACCRegisterDeviceStatusFailureUnknownUUID, // The provided UUID (integration key) is unknown
ACCRegisterDeviceStatusFailureUnexpectedError // Unexpected error returned by Campaign server, more information in errorReason
};
// define the protocol for the registerDeviceStatus delegate
@protocol Neolane_SDKDelegate <NSObject>
@optional
- (void) registerDeviceStatus: (ACCRegisterDeviceStatus) status :(NSString *) errorReason;
@end
@interface Neolane_SDK: NSObject {
}
...
...
// registerDeviceStatus delegate
@property (nonatomic, weak) id <Neolane_SDKDelegate> delegate;
...
...
@end
实施 registerDeviceStatus 委派,请执行以下步骤:
实施 setDelegate 在SDK初始化期间。
// AppDelegate.m
...
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
...
// Get the stored settings
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *strMktHost = [defaults objectForKey:@"mktHost"];
NSString *strTckHost = [defaults objectForKey:@"tckHost"];
NSString *strIntegrationKey = [defaults objectForKey:@"integrationKey"];
userKey = [defaults objectForKey:@"userKey"];
// Configure Campaign SDK on first launch
Neolane_SDK *nl = [Neolane_SDK getInstance];
[nl setMarketingHost:strMktHost];
[nl setTrackingHost:strTckHost];
[nl setIntegrationKey:strIntegrationKey];
[nl setDelegate:self]; // HERE
...
...
}
在 @interface 你班的。
// AppDelegate.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import "Neolane_SDK.h"
@class LandingPageViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, Neolane_SDKDelegate> {
CLLocationManager *locationManager;
NSString *userKey;
NSString *mktServerUrl;
NSString *tckServerUrl;
NSString *homeURL;
NSString *strLandingPageUrl;
NSTimer *timer;
}
在中实施委托 AppDelegate.
// AppDelegate.m
#import "AppDelegate.h"
#import "Neolane_SDK.h"
#import "LandingPageViewController.h"
#import "RootViewController.h"
...
...
- (void) registerDeviceStatus: (ACCRegisterDeviceStatus) status :(NSString *) errorReason
{
NSLog(@"registerStatus: %lu",status);
if ( errorReason != nil )
NSLog(@"errorReason: %@",errorReason);
if( status == ACCRegisterDeviceStatusSuccess )
{
// Registration successful
...
...
}
else { // An error occurred
NSString *message;
switch ( status ){
case ACCRegisterDeviceStatusFailureUnknownUUID:
message = @"Unkown IntegrationKey (UUID)";
break;
case ACCRegisterDeviceStatusFailureMarketingServerHostnameEmpty:
message = @"Marketing URL not set or Empty";
break;
case ACCRegisterDeviceStatusFailureIntegrationKeyEmpty:
message = @"Integration Key not set or empty";
break;
case ACCRegisterDeviceStatusFailureConnectionIssue:
message = [NSString stringWithFormat:@"%@ %@",@"Connection issue:",errorReason];
break;
case ACCRegisterDeviceStatusFailureUnexpectedError:
default:
message = [NSString stringWithFormat:@"%@ %@",@"Unexpected Error",errorReason];
break;
}
...
...
}
}
@end
利用变量,可在收到通知后定义移动应用程序行为。 这些变量必须在移动设备应用程序代码和Adobe Campaign控制台(位于 Variables 选项卡。
在 Campaign Classicv7文档 在移动设备应用程序上: iOS配置步骤 and Configuration steps for Andoid.
以下是允许移动设备应用程序收集通知中任何添加变量的代码示例。 在我们的示例中,我们使用“VAR”变量。
在Android中:
public void onReceive(Context context, Intent intent) {
...
String event = intent.getStringExtra("VAR");
...
}
在iOS:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
....
if( launchOptions )
{
// When application is not already launched, the notification data if any are stored in the key 'UIApplicationLaunchOptionsRemoteNotificationKey'
NSDictionary *localLaunchOptions = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
if( localLaunchOptions )
{
...
[localLaunchOptions objectForKey:@"VAR"];
...
}
}
}
// Callback called when the application is already launched (whether the application is running foreground or background)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)launchOptions
{
if( launchOptions )
{
...
[launchOptions objectForKey:@"VAR"];
}
}
Adobe建议选择短变量名称,因为对于iOS和Android,通知大小限制为4kB。
对于iOS
必须在通知服务扩展级别下载媒体。
#import "NotificationService.h"
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
NSDictionary *userInfo = nil;
NSString *url = nil;
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
userInfo = request.content.userInfo;
if ( userInfo != nil )
{
url = userInfo[@"mediaUrl"]; // Get the url of the media to download (Adobe Campaign additional variable)
}
...
// Perform the download to local storage
对于iOS
在此级别,您需要:
将内容扩展关联到由Adobe Campaign发送的类别:
如果您希望移动应用程序显示图像,则可以在Adobe Campaign中将类别值设置为“image”,并在移动应用程序中,使用 UNNotificationExtensionCategory 参数设置为“image”。 在设备上收到推送通知时,将根据定义的类别值调用扩展。
定义通知布局
您需要使用相关小组件定义布局。 对于图像,小组件名为 UIImageView.
显示媒体
您需要添加代码以将媒体数据馈送到小组件。 以下是图像的代码示例:
#import "NotificationViewController.h"
#import <UserNotifications/UserNotifications.h>
#import <UserNotificationsUI/UserNotificationsUI.h>
@interface NotificationViewController () <UNNotificationContentExtension>
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) IBOutlet UILabel *notifContent;
@property (strong, nonatomic) IBOutlet UILabel *label;
@end
@implementation NotificationViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any required interface initialization here.
}
- (void)didReceiveNotification:(UNNotification *)notification {
self.label.text = notification.request.content.title;
self.notifContent.text = notification.request.content.body;
UNNotificationAttachment *attachment = [notification.request.content.attachments objectAtIndex:0];
if ([attachment.URL startAccessingSecurityScopedResource])
{
NSData * imageData = [[NSData alloc] initWithContentsOfURL:attachment.URL];
self.imageView.image =[UIImage imageWithData: imageData];
[attachment.URL stopAccessingSecurityScopedResource];
}
}
@end