Engage and retain users in the mobile world
-
Upload
codemotion -
Category
Mobile
-
view
235 -
download
0
Transcript of Engage and retain users in the mobile world
Engage and retain users in the mobile world
Matteo Bonifazi
ROME 18-19 MARCH 2016
Who I am?
+Matteo Bonifazi
Android Google Developer Expert
Member of GDG Rome
@mbonifazi
matteobonifazi[at]gmail[dot]com
Do you need any Android book?
Sviluppare applicazioni per Android in sette giorni
AndroidProgrammazione Avanzata
Contents
● Goat Checker story
● User acquisition
● App Invites
● App usage
● App Indexing API
Goat Checker story
For a great app, all we need is a great idea!!!
Where can we find a good idea?
Goat Checker story
Goat Checker storyWhat is the best scored Android question?
http://developer.android.com/reference/android/os/UserManager.html
Goat Checker story
THE IDEA
Understand if Android user is a
goat or not
After the idea, let’s start programming
Goat Checker story
Goat Checker story
Nobody cares to know if he/she is
a goat or not
Goat Checker story
User acquisition
How people become aware about an app?
32% family, friends and collegues
13% TV
17% search engines 14% company website
24% app store
stats from https://think.storage.googleapis.com/docs/mobile-app-marketing-insights.pdf
Implement invitation from scratch
App Invites
App Invites
App Invites from Google
● App content sharing
● Personalized onboarding flows
● Compatible for both Android & iOS
● Sharing & installation stats are fully
integrated with Google Analytics
App Invites
App Invites widget makes easy for your users to send invites
App Invites
Send actionable cards with Install button
App Invites
Personalized onboard flows to offer discount offer or content
App Invites
App Invites
classpath 'com.google.gms:google-services:2.0.0-alpha5'
apply plugin: 'com.google.gms.google-services
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
AndroidManifest.xml
build.gradle
compile 'com.google.android.gms:play-services-appinvite:8.4.0'
project configuration
https://developers.google.com/mobile/add?platform=android&cntapi=appinvite
google-services.json
App Invites
public void sendInvite() {
Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title)
.setMessage(getString(R.string.invitation_message)) .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link))) .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image)))
.setCallToActionText(getString(R.string.invitation_cta)).build();
startActivityForResult(intent, REQUEST_INVITE);
}
mClient = new GoogleApiClient.Builder(this).addApi(AppInvite.API).build();
App Invites
Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
...
.setOtherPlatformsTargetApplication(
AppInviteInvitation.IntentBuilder.PlatformMode.PROJECT_PLATFORM_IOS,
getString(R.string.ios_app_client_id))
...
.build();
App Invites
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_INVITE && resultCode == RESULT_OK ) {
String[] ids = AppInviteInvitation.getInvitationIds(resultCode,data);
Log.d(TAG, getString(R.string.sent_invitations_fmt, ids.length));
}
}
App Invites
boolean autoLaunchDeepLink = true;
AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink)
.setResultCallback(new ResultCallback<AppInviteInvitationResult>(){
@Override
public void onResult(AppInviteInvitationResult result) {
Log.d(TAG, "getInvitation:onResult:+result.getStatus());
}});
Let’s start integrating App Invites
Goat Checker story
Goat Checker story
Number of downloads
Goat Checker story
App usage is still flat
Average app user has 36 apps installed
App usage
App usage
26% of installed smartphone apps are
used daily.
1 in 4 apps are never used.
Most installed apps are not used often
App usage
38% of app users are likely to download an app when it’s required to complete a
purchase, half of which would uninstall it after purchase is complete.
Consumers often abandon apps immediately after a download.
App Indexing
App Indexing
Engage your users with install buttons for your app in the Google search result
App Indexing
Re-engage users through Google Search App autocompletions
App Indexing
<activity
android:name=".GoatActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="goatchecker.webs.com/"
android:scheme="http" />
</intent-filter>
</activity>
App Indexing
protected void onNewIntent(Intent intent) {
String action = intent.getAction();
String data = intent.getDataString();
if (Intent.ACTION_VIEW.equals(action) && data != null) {
String productId = data.substring(data.lastIndexOf("/") + 1);
Uri contentUri = GoatChecker.CONTENT_URI.buildUpon()
.appendPath(productId).build();
//Handle content
}
}
App Indexing
android-app://dekra.goatchecker/http/goatchecker.webs.com
Protocol Package ID PathScheme
App Indexing Markup
App Indexing
<link rel=“alternate”
href=“android-app://dekra.goatchecker/http/goatchecker.webs.com” />
Approve request on Webmaster Tools - https://www.google.com/webmasters/tools
<html><head> ... <link rel="alternate" href="android-app://dekra.goatchecker/http/goatchecker.webs.com" /> ...</head><body> … </body>
In the web page
App Indexing
compile 'com.google.android.gms:play-services-appindexing:8.4.0'
build.gradle
Uri APP_URI = Uri.parse("android-app://dekra.goatchecker/http/goatchecker.webs.com");
Uri WEB_URL = Uri.parse("http://goatchecker.webs.com/");
URI definition
mClient = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
Google Client
App Indexing
mUrl = "http://goatchecker.webs.com/";
mTitle = "Are you a goat?";
public Action getAction() {
Thing object = new Thing.Builder()
.setName(mTitle).setUrl(mUrl).build();
return new Action.Builder(Action.TYPE_VIEW).setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED).build();
}
App Indexing
@Override
public void onStart() {
super.onStart();
mClient.connect();
AppIndex.AppIndexApi.start(mClient, getAction());
}
@Override
public void onStop() {
AppIndex.AppIndexApi.end(mClient, getAction());
mClient.disconnect();
super.onStop();
}
App Indexing
App Indexing example https://developers.google.com/app-indexing/partners/case-studies
iOS
App Invites● https://developers.google.com/app-invites/ios/guides/start
App Indexing - from iOS 9● https://developers.google.com/app-indexing/ios/app
● https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/
iOS Search API - from iOS 9
Questions?
Thanks!
ROME 18-19 MARCH 2016
+Matteo Bonifazi - @mbonifazi
matteobonifazi[at]gmail[dot]com
http://androidinsettegiorni.wordpress.comAll pictures belong to their respective authors
Discover today if you are a goat