Connect/Create an account automatically
Use the method [APMUIServicesUser userClientConnect] for connect automatically your user to app’s miles.
If no account exist with this informations, the server create automatically this account.
This method needs : « email », « userID » and « optIn »
– « email » is the email of user
– « userID » is a unique identifier in your database
– « optIn » is the RGPD OptIn
If you don’t want pass the email , you can build a encrypted email with the userID , for example : 123456789@appsmiles.fr
– 123456789 is the userID
Copy NSString* email = _textFieldEmail.text; //Required
NSString* userId = _textFieldUserId.text; //Required
//optIn, APM_DEVICE_OPT_IN_NOT_SET, APM_DEVICE_OPT_IN_REFUSE, APM_DEVICE_OPT_IN_ACCEPT
NSNumber* optIn = APM_DEVICE_OPT_IN_ACCEPT; //Required
[APMUIServicesUser userClientConnect:email
partnerClientId:userId
optIn:optIn
userConnectSuccess:^(APMUser *user) {
NSLog(@"%@ --> connected !", user);
} failure:^(NSError *error) {
NSLog(@"%@", error);
}];
Update an account automatically
You can update an app’s miles account automatically with the method
[APMUIServicesUser userClientSave]
This method needs : « userId »
Copy NSString* email = _textFieldEmail.text;
NSString* firstname = _textFieldFirstname.text;
NSString* lastname = _textFieldLastname.text;
NSString* mobile = _textFieldMobile.text;
NSString* city = _textFieldCity.text;
NSString* gender = [NSString stringWithFormat:@"%li", (long)APM_K_USER_GENDER_M];
NSString* birthday = _textFieldBirthday.text;
NSString* userId = _textFieldUserId.text;
NSMutableDictionary* segments = nil;
[APMUIServicesUser userClientSave:email
firstname:firstname
lastname:lastname
mobile:mobile
gender:gender
birthday:birthday
city:city
facebookId:nil
partnerClientId:userId
segments:segments
userSaveSuccess:^(APMUser *user)
{
NSLog(@"%@ --> updated !", user);
} failure:^(NSError *error)
{
NSLog(@"%@", error);
}];
Logout an account automatically
You can logout an app’s miles account automatically with the method [APMUIServicesUser userLogout]
Copy [APMUIServicesUser userLogout:^{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Logout" message:@"Logout success" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
} failure:^(NSError *error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Logout" message:error.localizedDescription delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
}];
The badge is automatically refreshes
UserProperties
Use the class APMUserPropertiesUtils to manager user properties fo user.
key : Property keys are strings. (e.g. « zipcode », « profession »).
value :Property values are strings. (e.g. « 33000 », « doctor »).
You can add user properties with the followings methods :
Copy -(void)addUserProperty:(NSString*)userProperty forKey:(NSString*)key;
-(void)addUserProperties:(NSDictionary*)userProperties;
For remove one user property, you can use :
Copy -(void)removeUserProperty:(NSString*)key
or for remove all user properties :
Copy -(void)removeUserProperties
If you need to refresh SDK after set your UserProperties, you can call :
Copy [[APMServices sharedInstance] refreshSDK:YES];
Segments
You can pass a segmentation during connection with the method [APMUIServicesUser.userClientConnect]
Copy //Segments
NSMutableDictionary* segments = [NSMutableDictionary dictionary];
[segments setValue:@"green" forKey:@"1"]; //Axe 1 : color
[segments setValue:@"1998" forKey:@"2"]; //Axe 2 : year
[APMUIServicesUser userClientConnect/*....*/ segments:segments /*....*/];
Override click on the badge
You can override the click on the badge with the method [APMBadgeManager setOnBadgeClick]
Copy APMBadgeManager *badgeManager = [APM sharedInstanceBadgeManager];
[badgeManager setOnBadgeClick:^BOOL(NSInteger badge) {
if(badge == APM_BADGE_INIT)
NSLog(@"Click on the badge init !");
else if(badge == APM_BADGE_OTHER_WIN)
NSLog(@"Click on the badge other win !");
else if(badge == APM_BADGE_WIN)
NSLog(@"Click on the badge win !");
else if(badge == APM_BADGE_GIFT)
NSLog(@"Click on the badge gift !");
else if(badge == APM_BADGE_INFOS)
NSLog(@"Click on the badge infos !");
else if(badge == APM_BADGE_ADMIN)
NSLog(@"Click on the badge admin !");
return true;
}];
Comment :
Return true if the event was handled, false otherwise.
Show/Hide badge
You can hide the badge with the method :
Copy [[APM sharedInstance] hideBadge];
And show the badge :
Copy [[APM sharedInstance] showBadge];
Comment : The method APMUIServicesUser.userClientConnect() use theses methods to hide and show the badge after connection success.
Debug Mode
Copy [APM sharedInstance].debugMode = YES; //To show trace log app's miles
Onboarding (get events with listener)
For retrieve events of onboarding. Use class APMOnboardingUtils and APMOnboardingUtilsListener .
Example with AbstractViewController lifecycle.
Copy @interface AbstractViewController() <APMOnboardingUtilsListener>
//...
//Declare a object of APMOnboardingUtils in your class
@property (strong, nonatomic) APMOnboardingUtils* onboardingUtils;
@end
@implementation AbstractViewController
-(void)viewDidLoad
{
[super viewDidLoad];
//...
//AbstractViewController become the listener on events of onboarding
self.onboardingUtils = [[APMOnboardingUtils alloc] init];
self.onboardingUtils.delegate = self;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//...
//Listen events of onboarding
[self.onboardingUtils registerNotifications];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
//...
//Unlisten events of onboarding
[self.onboardingUtils unregisterNotifications];
}
#pragma mark - APMOnboardingUtilsListener
-(void)apmOnboardingButtonOkClicked
{
//Get the event OnboardingButtonOkClicked
}
-(void)apmOnboardingButtonLaterClicked
{
//Get the event OnboardingButtonLaterClicked
}
-(void)apmOnboardingButtonNeverClicked
{
//Get the event OnboardingButtonNeverClicked
}
@end
DeepLinks (get events with listener)
For retrieve events of deepLinks. Use class APMDeepLinkActionUtils and APMDeepLinkActionUtilsListener .
Example with AbstractViewController lifecycle.
Copy @interface AbstractViewController() <APMDeepLinkActionUtilsListener>
//...
//Declare a object of APMDeepLinkActionUtils in your class
@property (strong, nonatomic) APMDeepLinkActionUtils* deepLinkActionUtils;
@end
@implementation AbstractViewController
-(void)viewDidLoad
{
[super viewDidLoad];
//...
//Activity become the listener on events of deeplinks
self.deepLinkActionUtils = [[APMDeepLinkActionUtils alloc] init];
self.deepLinkActionUtils.delegate = self;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//...
//Listen events of deeplinks
[self.deepLinkActionUtils registerNotifications];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
//...
//Unlisten events of deeplinks
[self.deepLinkActionUtils unregisterNotifications];
}
#pragma mark - APMDeepLinkActionUtilsListener
-(void)apmDeepLinkActionButtonGoClicked:(NSString *)url action:(NSString *)action params:(NSMutableDictionary *)params
{
//Get the event DeepLinkActionButtonGoClicked
}
@end
APMServicesUserListener
You can be notify when the user changed with the class APMServicesUserListener
Set a listener with
Copy [APMServices sharedInstance].servicesUserListener = self;
Get the callback with the method apmServicesUserChanged
Copy #pragma mark - APMServicesUserListener
-(void)apmServicesUserChanged:(APMUser *)user
{
NSLog(@"apmServicesUserChanged : %@", user);
}
Communicate with a WebView
You can communicate with APM natively with your Webview.
Here, methods that reachable via APMJavaScriptInterface :
[[APM sharedInstance] registerAction:<ACTION>];
[[APM sharedInstance] triggerAction:<ACTION_NAME>];
In your MainViewController.m , override method [webView:shouldStartLoadWithRequest:navigationType]
Copy - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
BOOL urlCatched = [APMJavaScriptInterface webView:webView handleUrlSchemeAppsmiles:request];
if(urlCatched) //Url catched, so return NO for webView don't load url
return NO;
return YES;
}
Implement this JS method :
Copy function execute(url)
{
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", url);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
}
registerAction(IOS) == addActions(JS)
Call addActions appsmilessdk://addActions/+PARAMS in your webview to call registerAction in IOS
PARAMS is a JSONObject converted to String :
Copy {
"classID":"product",
"actions":
[
{
"labels":["label 1", "label 2", "label 3"],
"props":["property 1", "property 2", "property 3"]
}
]
}
Example :
Copy execute("appsmilessdk://addActions/{"classID":"product", "actions":[{"labels":["Clic sur un produit", "Clic sur un produit de la catégorie Google", "Clic sur le produit GOOGLE !"], "props":["click_product", "categoryID=1", "productID=1"]}]}");
triggerAction(IOS) == triggerAction(JS)
Call triggerAction appsmilessdk://triggerAction/+ACTION_NAME in your webview to call triggerAction in IOS
ACTION_NAME is a String
Example :
Copy execute("appsmilessdk://triggerAction/click_product"); //click_product == ACTION_NAME