SlideShare a Scribd company logo
1 of 80
Download to read offline
PETR DVOŘÁK
CEO at Lime
Push notifications.
The big way.
Should be part of every app.
Are not part of every app.
Are simple when done simple.
Mostly, they are pretty hard.
Push notifications
Why?
Users who opt in to push messages averaged 3x more
app launches than those who opted out.
— Localytics
65% of users returned to an app in the 30 days after
the app’s initial download, if they have push enabled.
— Localytics
Forced social login
Privacy concerns
Intrusive ads
Bad UI/UX
Freezing
Complex sign-up
Annoying notifications
0 20 40 60 80
71%
68%
48%
42%
29%
23%
19%
Top 7 reasons why people uninstall mobile apps
Source: Appiterate Survey, as % of all respondent (each respondent picked 3 reasons)
Personalized and relevant content.
Delivered in the right time.
Spamming users results in uninstalls.
Test, measure, improve.
Automate engagement.
When it works?
Utility & Finance
Taxi & Ride sharing
Travel & Hospitality
Sport
Food & Beverage
Media
Social
Retail & e-commerce
0 10 20 30 40
11%
13%
19%
25%
26%
29%
30%
40%
Push notification engagement by industry
Source: Kahuna
In 2015, 49.8% of app users opted in to receiving
push notifications. In 2014, it was 52.0%.
— Localytics
Implementation topics
APNs / GCM
Provider
1. Register device at APNs and provider.
2. Identify (or segment) users.
3. Send push notifications.
4. Analyze data.
5. Remove unused devices.
What needs to be done?
Device registration
Registration
APNs
Provider
1. Ask for APNs token.
Registration
APNs
Provider
1. Ask for APNs token.
2. Get APNs token
Registration
APNs
Provider
1. Ask for APNs token.
2. Get APNs token
3. Send APNs token to provider
APNs token
User identifier
Push notification settings
User demographics
User location
… and much more :-)
Data sent to provider
- (BOOL)application:(UIApplication *)app
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *set =
[UIUserNotificationSettings settingsForTypes:types
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:set];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
AppDelegate.m
Register for remote notifications
- (BOOL)application:(UIApplication *)app
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *set =
[UIUserNotificationSettings settingsForTypes:types
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:set];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
AppDelegate.m
Register for remote notifications
- (BOOL)application:(UIApplication *)app
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *set =
[UIUserNotificationSettings settingsForTypes:types
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:set];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
AppDelegate.m
Register for remote notifications
- (BOOL)application:(UIApplication *)app
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *set =
[UIUserNotificationSettings settingsForTypes:types
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:set];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
AppDelegate.m
Register for remote notifications
- (void)application:(UIApplication *)app
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
self.registered = YES;
[self sendProviderDeviceToken:devToken]; // custom method
}
- (void)application:(UIApplication *)app
didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSLog(@"Error in registration. Error: %@", err);
}
AppDelegate.m
Register for remote notifications
- (void)application:(UIApplication *)app
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
self.registered = YES;
[self sendProviderDeviceToken:devToken]; // custom method
}
- (void)application:(UIApplication *)app
didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSLog(@"Error in registration. Error: %@", err);
}
AppDelegate.m
Register for remote notifications
Sending notifications
Send push notifications
APNs
Provider
1. Decide to send push
Send push notifications
APNs
Provider
1. Decide to send push
2. Send payload and APNs token
Send push notifications
APNs
Provider
1. Decide to send push
2. Send payload and APNs token
3. Deliver the push message
Push notification payload
{
"aps" : {
"alert" : {
"title" : "Hello there!",
"body" : "It has been a while."
}
}
}
Maximum payload length is 4096 bytes.
Ehm… security?
Ehm… security?
Push Certifikát (*.pem, *.p12)
$ openssl pkcs12 -in apns-dev-cert.p12
-out apns-dev-cert.pem -nodes -clcerts
Ehm… security?
Push Certifikát (*.pem, *.p12)
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$devices = new DeviceCollection(array(
new Device('???????')
));
$message = new Message('Hello guys!');
$push = new Push($apnsAdapter, $devices, $message);
$pushManager->add($push);
$pushManager->push();
Send push notifications
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$devices = new DeviceCollection(array(
new Device('???????')
));
$message = new Message('Hello guys!');
$push = new Push($apnsAdapter, $devices, $message);
$pushManager->add($push);
$pushManager->push();
Send push notifications
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$devices = new DeviceCollection(array(
new Device('???????')
));
$message = new Message('Hello guys!');
$push = new Push($apnsAdapter, $devices, $message);
$pushManager->add($push);
$pushManager->push();
Send push notifications
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$devices = new DeviceCollection(array(
new Device('???????')
));
$message = new Message('Hello guys!');
$push = new Push($apnsAdapter, $devices, $message);
$pushManager->add($push);
$pushManager->push();
Send push notifications
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$devices = new DeviceCollection(array(
new Device('???????')
));
$message = new Message('Hello guys!');
$push = new Push($apnsAdapter, $devices, $message);
$pushManager->add($push);
$pushManager->push();
Send push notifications
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$devices = new DeviceCollection(array(
new Device('???????')
));
$message = new Message('Hello guys!');
$push = new Push($apnsAdapter, $devices, $message);
$pushManager->add($push);
$pushManager->push();
Send push notifications
- (BOOL)application:(UIApplication *)app
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UILocalNotification *localNotif =
launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
NSDictionary *userInfo = localNotif.userInfo;
}
- (void) application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
}
Handle push notifications
- (BOOL)application:(UIApplication *)app
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UILocalNotification *localNotif =
launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
NSDictionary *userInfo = localNotif.userInfo;
}
- (void) application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
}
Handle push notifications
- (BOOL)application:(UIApplication *)app
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UILocalNotification *localNotif =
launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
NSDictionary *userInfo = localNotif.userInfo;
}
- (void) application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
}
Handle push notifications
Feedback service
Feedback service
APNs
Provider
1. Request expired tokens
Feedback service
APNs
Provider
1. Request expired tokens
2. Expired token list
Feedback service
APNs
Provider
1. Request expired tokens
2. Expired token list
3. Delete tokens
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$feedback = $pushManager->getFeedback($apnsAdapter);
// $feedback contains collection of [device_token, timestamp] pairs
Clean up device tokens
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$feedback = $pushManager->getFeedback($apnsAdapter);
// $feedback contains collection of [device_token, timestamp] pairs
Clean up device tokens
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$feedback = $pushManager->getFeedback($apnsAdapter);
// $feedback contains collection of [device_token, timestamp] pairs
Clean up device tokens
$pushManager = new PushManager(PushManager::ENVIRONMENT_DEV);
$apnsAdapter = new ApnsAdapter(array(
'certificate' => '/path/to/your/apns-certificate.pem',
));
$feedback = $pushManager->getFeedback($apnsAdapter);
// $feedback contains collection of [device_token, timestamp] pairs
Clean up device tokens
Silent push notifcation
Interactive actions
Localization
Badge number
Custom sound
Extras
Scaling big
User management - fast segmentation… by what?
Delivery time - 100k devices x 4096 … 1M devices?
Multiple apps - Reusing the push server
Hardware and infrastructure
Engineering - project grows big, multiple platforms
Dimensions of scaling
APNS / GCM
Provider
APNs
Provider
(business logic)
GCM
SDK SDK
App Management Service
Device Registration Service
User Segmentation Service
Analytics Data Service
APNS Node GCM Node
APNs
Provider
(business logic)
App Management Service
Device Registration Service
User Segmentation Service
Analytics Data Service
GCM
APNS Node GCM Node
SDK SDK
APNs
Provider
(business logic)
GCM
SDK SDK
APP KEY
App Management Service
Device Registration Service
User Segmentation Service
Analytics Data Service
APNS Node GCM Node
APP KEYAPP KEY
1. Create campaign object
2. Select the audience
3. Send notifications
4. Collect analytics
Campaign planning
APNs
Provider
(business logic)
GCM
SDK SDK
App Management Service
Device Registration Service
User Segmentation Service
Analytics Data Service
APNS Node GCM Node
APNs
Provider
(business logic)
GCM
SDK SDK
App Management Service
Device Registration Service
User Segmentation Service
Analytics Data Service
APNS Node GCM Node
APNs
Provider
(business logic)
GCM
SDK SDKApp Management Service
Device Registration Service
User Segmentation Service
Analytics Data Service
MongoDBMongoDBMongoDB
APNS Node GCM Node
N instances
Partitioning
APNs GCM
SDK SDK
API, admin, workers
IBM Bluemix - price, HW scaling, connectivity, …
MongoDB - performance, queries, … (Compose)
Node.js - for “nodes”, speed, efficiency, …
RESTful API - standards, easy to work with, … (PHP, Nette)
Server Technologies
Device registration
Push notification processing
UI Features
User profile synchronization
Location monitoring
Analytics
Mobile SDK
- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions {
LimeEngate *lime = [LimeEngage sharedInstance];
[lime startFetchingContextForApplicationKey:@“app_8cb31c49a46df1fea11"];
[lime handleRemoteNotificationInfo:[launchOptions
objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]];
return YES;
}
Set up SDK
- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions {
LimeEngate *lime = [LimeEngage sharedInstance];
[lime startFetchingContextForApplicationKey:@"app_8cb31c49a46df1fea11"];
[lime handleRemoteNotificationInfo:[launchOptions
objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]];
return YES;
}
Set up SDK
- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions {
LimeEngate *lime = [LimeEngage sharedInstance];
[lime startFetchingContextForApplicationKey:@"app_8cb31c49a46df1fea11"];
[lime handleRemoteNotificationInfo:[launchOptions
objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]];
return YES;
}
Handle notifications
- (void) application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
LimeEngage *lime = [LimeEngage sharedInstance];
[lime handleRemoteNotificationInfo:userInfo];
}
Handle notifications
- (void) application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
LimeEngage *lime = [LimeEngage sharedInstance];
[lime handleRemoteNotificationInfo:userInfo];
}
Handle notifications
LimeEngage *lime = [LimeEngage sharedInstance];
lime.currentUser.internalId = @"4378924";
lime.currentUser.name = @"Jan";
lime.currentUser.surname = @"Novak";
lime.currentUser.sex = @"male";
[lime synchronizeCurrentUser];
Update user info
LimeEngage *lime = [LimeEngage sharedInstance];
lime.currentUser.internalId = @"4378924";
lime.currentUser.name = @"Jan";
lime.currentUser.surname = @"Novak";
lime.currentUser.sex = @"male";
[lime synchronizeCurrentUser];
Update user info
Demo
Open-source
04/2016
Thank you! :)
@joshis_tweets http://getlime.io/
WWW.MDEVTALK.CZ
mdevtalk

More Related Content

Similar to Petr Dvořák: Push notifikace ve velkém

Lime - Push notifications. The big way.
Lime - Push notifications. The big way.Lime - Push notifications. The big way.
Lime - Push notifications. The big way.Petr Dvorak
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP pluginsPierre MARTIN
 
Android 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture ComponentsAndroid 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture ComponentsKai Koenig
 
Internet of Things: Understanding the Business Impact
Internet of Things: Understanding the Business ImpactInternet of Things: Understanding the Business Impact
Internet of Things: Understanding the Business ImpactKony, Inc.
 
Hieu Xamarin iOS9, Android M 3-11-2015
Hieu Xamarin iOS9, Android M  3-11-2015Hieu Xamarin iOS9, Android M  3-11-2015
Hieu Xamarin iOS9, Android M 3-11-2015Nguyen Hieu
 
Gps based search coupons on map view ios, android mobile application
Gps based search coupons on map view   ios, android mobile applicationGps based search coupons on map view   ios, android mobile application
Gps based search coupons on map view ios, android mobile applicationMike Taylor
 
Android Evolution, AppForum 2014, Brussels, Friedger Müffke
Android Evolution, AppForum 2014, Brussels, Friedger MüffkeAndroid Evolution, AppForum 2014, Brussels, Friedger Müffke
Android Evolution, AppForum 2014, Brussels, Friedger MüffkeFriedger Müffke
 
KKBOX WWDC17 Notification and Autolayout - Jefferey
KKBOX WWDC17 Notification and Autolayout - JeffereyKKBOX WWDC17 Notification and Autolayout - Jefferey
KKBOX WWDC17 Notification and Autolayout - JeffereyLiyao Chen
 
Android Wearables ii
Android Wearables iiAndroid Wearables ii
Android Wearables iiKetan Raval
 
Blogging tizen devlab@seoul ppt - optimization
Blogging   tizen devlab@seoul ppt - optimizationBlogging   tizen devlab@seoul ppt - optimization
Blogging tizen devlab@seoul ppt - optimizationJin Yoon
 
Startup Analytics
Startup Analytics Startup Analytics
Startup Analytics Resad Zacina
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...mharkus
 
Xamarin Test Cloud - from zero to hero in automated ui testing
Xamarin Test Cloud - from zero to hero in automated ui testingXamarin Test Cloud - from zero to hero in automated ui testing
Xamarin Test Cloud - from zero to hero in automated ui testingGeert van der Cruijsen
 

Similar to Petr Dvořák: Push notifikace ve velkém (20)

Lime - Push notifications. The big way.
Lime - Push notifications. The big way.Lime - Push notifications. The big way.
Lime - Push notifications. The big way.
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP plugins
 
Events vs Notifications
Events vs NotificationsEvents vs Notifications
Events vs Notifications
 
Weacons overview
Weacons overviewWeacons overview
Weacons overview
 
How to create android push notifications with custom view
How to create android push notifications with custom viewHow to create android push notifications with custom view
How to create android push notifications with custom view
 
Android 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture ComponentsAndroid 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture Components
 
Internet of Things: Understanding the Business Impact
Internet of Things: Understanding the Business ImpactInternet of Things: Understanding the Business Impact
Internet of Things: Understanding the Business Impact
 
Azure notification hubs
Azure notification hubsAzure notification hubs
Azure notification hubs
 
Hieu Xamarin iOS9, Android M 3-11-2015
Hieu Xamarin iOS9, Android M  3-11-2015Hieu Xamarin iOS9, Android M  3-11-2015
Hieu Xamarin iOS9, Android M 3-11-2015
 
Android_ver_01
Android_ver_01Android_ver_01
Android_ver_01
 
Android Froyo
Android FroyoAndroid Froyo
Android Froyo
 
Gps based search coupons on map view ios, android mobile application
Gps based search coupons on map view   ios, android mobile applicationGps based search coupons on map view   ios, android mobile application
Gps based search coupons on map view ios, android mobile application
 
Android Evolution, AppForum 2014, Brussels, Friedger Müffke
Android Evolution, AppForum 2014, Brussels, Friedger MüffkeAndroid Evolution, AppForum 2014, Brussels, Friedger Müffke
Android Evolution, AppForum 2014, Brussels, Friedger Müffke
 
KKBOX WWDC17 Notification and Autolayout - Jefferey
KKBOX WWDC17 Notification and Autolayout - JeffereyKKBOX WWDC17 Notification and Autolayout - Jefferey
KKBOX WWDC17 Notification and Autolayout - Jefferey
 
Android Wearables ii
Android Wearables iiAndroid Wearables ii
Android Wearables ii
 
Blogging tizen devlab@seoul ppt - optimization
Blogging   tizen devlab@seoul ppt - optimizationBlogging   tizen devlab@seoul ppt - optimization
Blogging tizen devlab@seoul ppt - optimization
 
Startup Analytics
Startup Analytics Startup Analytics
Startup Analytics
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
 
Xamarin Test Cloud - from zero to hero in automated ui testing
Xamarin Test Cloud - from zero to hero in automated ui testingXamarin Test Cloud - from zero to hero in automated ui testing
Xamarin Test Cloud - from zero to hero in automated ui testing
 
Phase3 4
Phase3 4Phase3 4
Phase3 4
 

More from mdevtalk

Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftumdevtalk
 
Jarda Machaň: Proč je dobré míti Developer Evangelistu
Jarda Machaň: Proč je dobré míti Developer EvangelistuJarda Machaň: Proč je dobré míti Developer Evangelistu
Jarda Machaň: Proč je dobré míti Developer Evangelistumdevtalk
 
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOSPavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOSmdevtalk
 
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...mdevtalk
 
Michal Havryluk: How To Speed Up Android Gradle Builds
Michal Havryluk: How To Speed Up Android Gradle BuildsMichal Havryluk: How To Speed Up Android Gradle Builds
Michal Havryluk: How To Speed Up Android Gradle Buildsmdevtalk
 
Vladislav Iliushin: Dark side of IoT
Vladislav Iliushin: Dark side of IoTVladislav Iliushin: Dark side of IoT
Vladislav Iliushin: Dark side of IoTmdevtalk
 
Georgiy Shur: Bring onboarding to life
Georgiy Shur: Bring onboarding to lifeGeorgiy Shur: Bring onboarding to life
Georgiy Shur: Bring onboarding to lifemdevtalk
 
David Bilík: Anko – modern way to build your layouts?
David Bilík: Anko – modern way to build your layouts?David Bilík: Anko – modern way to build your layouts?
David Bilík: Anko – modern way to build your layouts?mdevtalk
 
Maxim Zaks: Deep dive into data serialisation
Maxim Zaks: Deep dive into data serialisationMaxim Zaks: Deep dive into data serialisation
Maxim Zaks: Deep dive into data serialisationmdevtalk
 
Nikita Tuk: Handling background processes in iOS: problems & solutions
Nikita Tuk: Handling background processes in iOS: problems & solutionsNikita Tuk: Handling background processes in iOS: problems & solutions
Nikita Tuk: Handling background processes in iOS: problems & solutionsmdevtalk
 
Milan Oulehla: Bezpečnost mobilních aplikací na Androidu
Milan Oulehla: Bezpečnost mobilních aplikací na AndroiduMilan Oulehla: Bezpečnost mobilních aplikací na Androidu
Milan Oulehla: Bezpečnost mobilních aplikací na Androidumdevtalk
 
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundůTomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundůmdevtalk
 
David Vávra: Firebase + Kotlin + RX + MVP
David Vávra: Firebase + Kotlin + RX + MVPDavid Vávra: Firebase + Kotlin + RX + MVP
David Vávra: Firebase + Kotlin + RX + MVPmdevtalk
 
Adam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerViewAdam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerViewmdevtalk
 
Paul Lammertsma: Account manager & sync
Paul Lammertsma: Account manager & syncPaul Lammertsma: Account manager & sync
Paul Lammertsma: Account manager & syncmdevtalk
 
Charles Du: Introduction to Mobile UX Design
Charles Du: Introduction to Mobile UX DesignCharles Du: Introduction to Mobile UX Design
Charles Du: Introduction to Mobile UX Designmdevtalk
 
Honza Dvorský: Swift Package Manager
Honza Dvorský: Swift Package ManagerHonza Dvorský: Swift Package Manager
Honza Dvorský: Swift Package Managermdevtalk
 
David Bureš - Xamarin, IoT a Azure
David Bureš - Xamarin, IoT a AzureDavid Bureš - Xamarin, IoT a Azure
David Bureš - Xamarin, IoT a Azuremdevtalk
 
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptatDominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptatmdevtalk
 
Jiří Dutkevič: Ochrana citlivých dat v iOS
Jiří Dutkevič: Ochrana citlivých dat v iOSJiří Dutkevič: Ochrana citlivých dat v iOS
Jiří Dutkevič: Ochrana citlivých dat v iOSmdevtalk
 

More from mdevtalk (20)

Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
 
Jarda Machaň: Proč je dobré míti Developer Evangelistu
Jarda Machaň: Proč je dobré míti Developer EvangelistuJarda Machaň: Proč je dobré míti Developer Evangelistu
Jarda Machaň: Proč je dobré míti Developer Evangelistu
 
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOSPavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
 
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
 
Michal Havryluk: How To Speed Up Android Gradle Builds
Michal Havryluk: How To Speed Up Android Gradle BuildsMichal Havryluk: How To Speed Up Android Gradle Builds
Michal Havryluk: How To Speed Up Android Gradle Builds
 
Vladislav Iliushin: Dark side of IoT
Vladislav Iliushin: Dark side of IoTVladislav Iliushin: Dark side of IoT
Vladislav Iliushin: Dark side of IoT
 
Georgiy Shur: Bring onboarding to life
Georgiy Shur: Bring onboarding to lifeGeorgiy Shur: Bring onboarding to life
Georgiy Shur: Bring onboarding to life
 
David Bilík: Anko – modern way to build your layouts?
David Bilík: Anko – modern way to build your layouts?David Bilík: Anko – modern way to build your layouts?
David Bilík: Anko – modern way to build your layouts?
 
Maxim Zaks: Deep dive into data serialisation
Maxim Zaks: Deep dive into data serialisationMaxim Zaks: Deep dive into data serialisation
Maxim Zaks: Deep dive into data serialisation
 
Nikita Tuk: Handling background processes in iOS: problems & solutions
Nikita Tuk: Handling background processes in iOS: problems & solutionsNikita Tuk: Handling background processes in iOS: problems & solutions
Nikita Tuk: Handling background processes in iOS: problems & solutions
 
Milan Oulehla: Bezpečnost mobilních aplikací na Androidu
Milan Oulehla: Bezpečnost mobilních aplikací na AndroiduMilan Oulehla: Bezpečnost mobilních aplikací na Androidu
Milan Oulehla: Bezpečnost mobilních aplikací na Androidu
 
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundůTomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů
 
David Vávra: Firebase + Kotlin + RX + MVP
David Vávra: Firebase + Kotlin + RX + MVPDavid Vávra: Firebase + Kotlin + RX + MVP
David Vávra: Firebase + Kotlin + RX + MVP
 
Adam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerViewAdam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerView
 
Paul Lammertsma: Account manager & sync
Paul Lammertsma: Account manager & syncPaul Lammertsma: Account manager & sync
Paul Lammertsma: Account manager & sync
 
Charles Du: Introduction to Mobile UX Design
Charles Du: Introduction to Mobile UX DesignCharles Du: Introduction to Mobile UX Design
Charles Du: Introduction to Mobile UX Design
 
Honza Dvorský: Swift Package Manager
Honza Dvorský: Swift Package ManagerHonza Dvorský: Swift Package Manager
Honza Dvorský: Swift Package Manager
 
David Bureš - Xamarin, IoT a Azure
David Bureš - Xamarin, IoT a AzureDavid Bureš - Xamarin, IoT a Azure
David Bureš - Xamarin, IoT a Azure
 
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptatDominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat
 
Jiří Dutkevič: Ochrana citlivých dat v iOS
Jiří Dutkevič: Ochrana citlivých dat v iOSJiří Dutkevič: Ochrana citlivých dat v iOS
Jiří Dutkevič: Ochrana citlivých dat v iOS
 

Recently uploaded

9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7Pooja Nehwal
 
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort ServiceDelhi Call girls
 
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Pooja Nehwal
 
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCRFULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCRnishacall1
 
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPowerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPsychicRuben LoveSpells
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceanilsa9823
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceanilsa9823
 

Recently uploaded (7)

9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7
 
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
 
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
 
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCRFULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
 
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPowerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
 

Petr Dvořák: Push notifikace ve velkém

  • 1.
  • 4. Should be part of every app. Are not part of every app. Are simple when done simple. Mostly, they are pretty hard. Push notifications
  • 6. Users who opt in to push messages averaged 3x more app launches than those who opted out. — Localytics
  • 7. 65% of users returned to an app in the 30 days after the app’s initial download, if they have push enabled. — Localytics
  • 8. Forced social login Privacy concerns Intrusive ads Bad UI/UX Freezing Complex sign-up Annoying notifications 0 20 40 60 80 71% 68% 48% 42% 29% 23% 19% Top 7 reasons why people uninstall mobile apps Source: Appiterate Survey, as % of all respondent (each respondent picked 3 reasons)
  • 9. Personalized and relevant content. Delivered in the right time. Spamming users results in uninstalls. Test, measure, improve. Automate engagement. When it works?
  • 10. Utility & Finance Taxi & Ride sharing Travel & Hospitality Sport Food & Beverage Media Social Retail & e-commerce 0 10 20 30 40 11% 13% 19% 25% 26% 29% 30% 40% Push notification engagement by industry Source: Kahuna
  • 11. In 2015, 49.8% of app users opted in to receiving push notifications. In 2014, it was 52.0%. — Localytics
  • 12.
  • 15. 1. Register device at APNs and provider. 2. Identify (or segment) users. 3. Send push notifications. 4. Analyze data. 5. Remove unused devices. What needs to be done?
  • 18. Registration APNs Provider 1. Ask for APNs token. 2. Get APNs token
  • 19. Registration APNs Provider 1. Ask for APNs token. 2. Get APNs token 3. Send APNs token to provider
  • 20. APNs token User identifier Push notification settings User demographics User location … and much more :-) Data sent to provider
  • 21. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:set]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } AppDelegate.m Register for remote notifications
  • 22. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:set]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } AppDelegate.m Register for remote notifications
  • 23. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:set]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } AppDelegate.m Register for remote notifications
  • 24. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:set]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } AppDelegate.m Register for remote notifications
  • 25. - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { self.registered = YES; [self sendProviderDeviceToken:devToken]; // custom method } - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSLog(@"Error in registration. Error: %@", err); } AppDelegate.m Register for remote notifications
  • 26. - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { self.registered = YES; [self sendProviderDeviceToken:devToken]; // custom method } - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSLog(@"Error in registration. Error: %@", err); } AppDelegate.m Register for remote notifications
  • 29. Send push notifications APNs Provider 1. Decide to send push 2. Send payload and APNs token
  • 30. Send push notifications APNs Provider 1. Decide to send push 2. Send payload and APNs token 3. Deliver the push message
  • 31. Push notification payload { "aps" : { "alert" : { "title" : "Hello there!", "body" : "It has been a while." } } } Maximum payload length is 4096 bytes.
  • 34.
  • 35.
  • 36.
  • 37. $ openssl pkcs12 -in apns-dev-cert.p12 -out apns-dev-cert.pem -nodes -clcerts
  • 39. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $devices = new DeviceCollection(array( new Device('???????') )); $message = new Message('Hello guys!'); $push = new Push($apnsAdapter, $devices, $message); $pushManager->add($push); $pushManager->push(); Send push notifications
  • 40. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $devices = new DeviceCollection(array( new Device('???????') )); $message = new Message('Hello guys!'); $push = new Push($apnsAdapter, $devices, $message); $pushManager->add($push); $pushManager->push(); Send push notifications
  • 41. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $devices = new DeviceCollection(array( new Device('???????') )); $message = new Message('Hello guys!'); $push = new Push($apnsAdapter, $devices, $message); $pushManager->add($push); $pushManager->push(); Send push notifications
  • 42. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $devices = new DeviceCollection(array( new Device('???????') )); $message = new Message('Hello guys!'); $push = new Push($apnsAdapter, $devices, $message); $pushManager->add($push); $pushManager->push(); Send push notifications
  • 43. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $devices = new DeviceCollection(array( new Device('???????') )); $message = new Message('Hello guys!'); $push = new Push($apnsAdapter, $devices, $message); $pushManager->add($push); $pushManager->push(); Send push notifications
  • 44. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $devices = new DeviceCollection(array( new Device('???????') )); $message = new Message('Hello guys!'); $push = new Push($apnsAdapter, $devices, $message); $pushManager->add($push); $pushManager->push(); Send push notifications
  • 45. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UILocalNotification *localNotif = launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; NSDictionary *userInfo = localNotif.userInfo; } - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { } Handle push notifications
  • 46. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UILocalNotification *localNotif = launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; NSDictionary *userInfo = localNotif.userInfo; } - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { } Handle push notifications
  • 47. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UILocalNotification *localNotif = launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; NSDictionary *userInfo = localNotif.userInfo; } - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { } Handle push notifications
  • 50. Feedback service APNs Provider 1. Request expired tokens 2. Expired token list
  • 51. Feedback service APNs Provider 1. Request expired tokens 2. Expired token list 3. Delete tokens
  • 52. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $feedback = $pushManager->getFeedback($apnsAdapter); // $feedback contains collection of [device_token, timestamp] pairs Clean up device tokens
  • 53. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $feedback = $pushManager->getFeedback($apnsAdapter); // $feedback contains collection of [device_token, timestamp] pairs Clean up device tokens
  • 54. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $feedback = $pushManager->getFeedback($apnsAdapter); // $feedback contains collection of [device_token, timestamp] pairs Clean up device tokens
  • 55. $pushManager = new PushManager(PushManager::ENVIRONMENT_DEV); $apnsAdapter = new ApnsAdapter(array( 'certificate' => '/path/to/your/apns-certificate.pem', )); $feedback = $pushManager->getFeedback($apnsAdapter); // $feedback contains collection of [device_token, timestamp] pairs Clean up device tokens
  • 56. Silent push notifcation Interactive actions Localization Badge number Custom sound Extras
  • 58. User management - fast segmentation… by what? Delivery time - 100k devices x 4096 … 1M devices? Multiple apps - Reusing the push server Hardware and infrastructure Engineering - project grows big, multiple platforms Dimensions of scaling
  • 60. APNs Provider (business logic) GCM SDK SDK App Management Service Device Registration Service User Segmentation Service Analytics Data Service APNS Node GCM Node
  • 61. APNs Provider (business logic) App Management Service Device Registration Service User Segmentation Service Analytics Data Service GCM APNS Node GCM Node SDK SDK
  • 62. APNs Provider (business logic) GCM SDK SDK APP KEY App Management Service Device Registration Service User Segmentation Service Analytics Data Service APNS Node GCM Node APP KEYAPP KEY
  • 63. 1. Create campaign object 2. Select the audience 3. Send notifications 4. Collect analytics Campaign planning
  • 64. APNs Provider (business logic) GCM SDK SDK App Management Service Device Registration Service User Segmentation Service Analytics Data Service APNS Node GCM Node
  • 65. APNs Provider (business logic) GCM SDK SDK App Management Service Device Registration Service User Segmentation Service Analytics Data Service APNS Node GCM Node
  • 66. APNs Provider (business logic) GCM SDK SDKApp Management Service Device Registration Service User Segmentation Service Analytics Data Service MongoDBMongoDBMongoDB APNS Node GCM Node N instances Partitioning
  • 67. APNs GCM SDK SDK API, admin, workers
  • 68. IBM Bluemix - price, HW scaling, connectivity, … MongoDB - performance, queries, … (Compose) Node.js - for “nodes”, speed, efficiency, … RESTful API - standards, easy to work with, … (PHP, Nette) Server Technologies
  • 69. Device registration Push notification processing UI Features User profile synchronization Location monitoring Analytics Mobile SDK
  • 70. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { LimeEngate *lime = [LimeEngage sharedInstance]; [lime startFetchingContextForApplicationKey:@“app_8cb31c49a46df1fea11"]; [lime handleRemoteNotificationInfo:[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]]; return YES; } Set up SDK
  • 71. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { LimeEngate *lime = [LimeEngage sharedInstance]; [lime startFetchingContextForApplicationKey:@"app_8cb31c49a46df1fea11"]; [lime handleRemoteNotificationInfo:[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]]; return YES; } Set up SDK
  • 72. - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { LimeEngate *lime = [LimeEngage sharedInstance]; [lime startFetchingContextForApplicationKey:@"app_8cb31c49a46df1fea11"]; [lime handleRemoteNotificationInfo:[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]]; return YES; } Handle notifications
  • 73. - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { LimeEngage *lime = [LimeEngage sharedInstance]; [lime handleRemoteNotificationInfo:userInfo]; } Handle notifications
  • 74. - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { LimeEngage *lime = [LimeEngage sharedInstance]; [lime handleRemoteNotificationInfo:userInfo]; } Handle notifications
  • 75. LimeEngage *lime = [LimeEngage sharedInstance]; lime.currentUser.internalId = @"4378924"; lime.currentUser.name = @"Jan"; lime.currentUser.surname = @"Novak"; lime.currentUser.sex = @"male"; [lime synchronizeCurrentUser]; Update user info
  • 76. LimeEngage *lime = [LimeEngage sharedInstance]; lime.currentUser.internalId = @"4378924"; lime.currentUser.name = @"Jan"; lime.currentUser.surname = @"Novak"; lime.currentUser.sex = @"male"; [lime synchronizeCurrentUser]; Update user info
  • 77. Demo
  • 79. Thank you! :) @joshis_tweets http://getlime.io/