Post on 15-Apr-2017
Google & Bing App IndexingEmily Grossman, Mobile Marketing Specialist, MobileMoxie
Emily Grossman | MobileMoxie 2
Meta-data can provide a “preview” of the type of content in the app
You don’t know what’s IN the app until you download it
App Store search is heavy on brand and head terms vs. long tail
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 3
“Google’s mission is to organize the world’s information and make it
universally accessible and useful.”- Google’s initial mission statement -
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 4@goutaste #SMXMunich
Emily Grossman | MobileMoxie 5
http://www.tripadvisor.com/Hotel_Review-g33388-d83020-Reviews-The_Curtis_Denver_a_DoubleTree_by_Hilton_Hotel-Denver_Colorado.html
tripadvisor://Hotel_Review-g33388-d83020-Reviews-The_Curtis_Denver_a_DoubleTree_by_Hilton_Hotel-Denver_Colorado.html
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 6
App Packs ≠ Deep Links
But Indexed Deep Links are a Small Ranking Factor for App Pack Results.
@goutaste #SMXMunich
7
App Pack Links Go to App Stores
8
Deep Links Go To App Content
Emily Grossman | MobileMoxie 9
Google App Indexing
bit.ly/appindexinggoogle
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 10
Android VS iOS AppsAndroid iOS
Step 1: Create Web Parity with Your App
Step 2: Set up HTTP Deep Links in Your App Manifest,Exclude Deep Links with noindex.XML
Set up Universal Links in App & Server,Exclude by Not Supporting for All Deep Links
Step 3: Optimize Deep Links in the App with API Markup
Optimize Web Markup* Add Cocoa Pods & App Indexing SDK Pod to App
Step 4: Submit Deep Links for Pre-Launch Crawling in Google Search Console & Fix Errors
Say a meaningful prayer to the god of your choice and/or grab a doughnut
Step 5: Go Live & Verify Proper Indexing & Behavior from SERPS
*Doh! Google can’t actually extract Title &Description info from iOS apps, so all keyword relevance comes from meta data on corresponding web pages.
@goutaste #SMXMunich
Custom URL Scheme
HTTP URL Scheme
Intent Filters (Where Android Deep Links are Born)
@goutaste #SMXMunich Emily Grossman | MobileMoxie 11
Custom URL Scheme
HTTP URL Scheme
Intent Filters (Where Android Deep Links are Born)
@goutaste #SMXMunich Emily Grossman | MobileMoxie 12
Intent Filters (Where Android Deep Links are Born)
Intent Filters need:
<action>
<data> android:schemeandroid:path
<category>
@goutaste #SMXMunich Emily Grossman | MobileMoxie 13
Emily Grossman | MobileMoxie 14
Control Indexing
@goutaste #SMXMunich
<?xml version="1.0" encoding="utf-8"?><search-engine xmlns:android="http://schemas.android.com/apk/res/android"> <noindex android:value="notification"/> <noindex uri="http://examplepetstore.com/dogs/hidden-page"/> <noindex uriPrefix="http://examplepetstore.com/cats/hidden_prefix"/></search-engine>
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.Petstore"> <application> <activity android:name="com.example.android.PetstoreActivity" ...> ... </activity> <meta-data android:name="search-engine" android:resource="@xml/noindex"/> </application> ...</manifest>
Noindex.xml
Reference it in the Manifest:
Emily Grossman | MobileMoxie 15
Control Indexing
@goutaste #SMXMunich
<?xml version="1.0" encoding="utf-8"?><search-engine xmlns:android="http://schemas.android.com/apk/res/android"> <noindex android:value="notification"/> <noindex uri="http://examplepetstore.com/dogs/hidden-page"/> <noindex uriPrefix="http://examplepetstore.com/cats/hidden_prefix"/></search-engine>
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.Petstore"> <application> <activity android:name="com.example.android.PetstoreActivity" ...> ... </activity> <meta-data android:name="search-engine" android:resource="@xml/noindex"/> </application> ...</manifest>
Noindex.xml
Reference it in the Manifest:
Emily Grossman | MobileMoxie 16
Prepare App:• Modify your application delegate• Adopt an entitlement in Xcode that
lists each domain associated with your app
READ:http://bit.ly/ios9universallinks http://bit.ly/UIApplicationDelegate-ReferenceWATCH: http://bit.ly/appleuniversallinks
Universal Links (Where iOS Deep Links Are Born)
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 17
{ "applinks": { "apps": [], "details": { »ABC0123.com.domain.App": { "paths":[ "*" ] } } }}
Associate App with Website:• Create an apple-app-site-
association file for each associated domain with the content your app supports and host it at the root level.
NOTE: The association file must be hosted on a domain that supports HTTPS/TLS, even if the HTTP deep links are not themselves served via HTTPS.
Universal Links (Where iOS Deep Links Are Born)
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 18
{ "applinks": { "apps": [], "details": { »ABC0123.com.domain.App": { "paths":[
”/folder/subfolder/”,
”/folder2/subfolder2/*”, ] } } }}
Modify apple-app-site-association file to specify only the content that is parallel between the app and the website.
@goutaste #SMXMunich
Control Indexing
Emily Grossman | MobileMoxie 19
App Indexing API (Where Android Deep Links are Discovered)
– Update App Code to include Google Play Services
– Define Indexable Activities or Fragments in the App• View/Search/Watch/Like/Listen/Reserve, Etc.
(https://developers.google.com/android/reference/com/google/android/gms/appindexing/Action)
– Modify App Activities or Fragments with proper API Calls – Including:• Title & Description• Web Url, Multiple Web Urls or ‘Null’
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 20
...public class MainActivity extends Activity { private GoogleApiClient mClient; private Uri mUrl; private String mTitle; private String mDescription;
@Override protected void onCreate(Bundle savedInstanceState) { mClient = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); mUrl = "http://examplepetstore.com/dogs/standard-poodle"; mTitle = "Standard Poodle"; mDescription = "The Standard Poodle stands at least 18 inches at the withers"; }...
Full code sample here: bit.ly/appindexingAPIcode
Android App Indexing API
@goutaste #SMXMunich
Emily Grossman | MobileMoxie
...@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(); }...
Full code sample here: bit.ly/appindexingAPIcode
Android App Indexing API
“Can Haz Engagement Data?”-Google
@goutaste #SMXMunich
Emily Grossman | MobileMoxie
...@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(); }...
Full code sample here: bit.ly/appindexingAPIcode
Android App Indexing API
“Can Haz Engagement Data?”-Google
+ ExtraRankings
Boost
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 23
1. Use most up-to-date version of CocoaPods
2. Add ‘GoogleAppIndexing’ pod to Podfile
3. Save and Install Pod
4. Import GoogleAppIndexing
5. Register app
pod 'GoogleAppIndexing'
pod install
#import <GoogleAppIndexing/GoogleAppIndexing.h>
[[GSDAppIndexing sharedInstance] registerApp:your iTunes ID];
Google App Indexing “Pod” (Where iOS Deep Links Are Discovered)
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 24
Where do I put my deep link Title and Description on iOS?
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 25
Where do I put my deep link Title and Description on iOS?
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 26
bit.ly/g-app-indexing
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 27
bit.ly/g-app-indexing
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 28
bit.ly/g-app-indexing
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 29@goutaste #SMXMunich
Emily Grossman | MobileMoxie 30@goutaste #SMXMunich
Emily Grossman | MobileMoxie 31
Android VS iOS AppsAndroid iOS
Step 1: Create Web Parity with Your App
Step 2: Set up HTTP Deep Links in Your App Manifest,Exclude Deep Links with noindex.XML
Set up Universal Links in App & Server,Exclude by Not Supporting for All Deep Links
Step 3: Optimize Deep Links in the App with API Markup
Optimize Web Markup* Add Cocoa Pods & App Indexing SDK Pod to App
Step 4: Submit Deep Links for Pre-Launch Crawling in Google Search Console & Fix Errors
Say a meaningful prayer to the god of your choice and/or grab a doughnut
Step 5: Go Live & Verify Proper Indexing & Behavior from SERPS
*Doh! Google can’t actually extract Title & Description info from iOS apps, so all keyword relevance comes from meta data on corresponding web pages.
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 32
Alternative Google App Indexing Methods (Android):
Web Markup Allow Googlebot App M URLs
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 33
Web Markup Allow Googlebot App M URLs
Custom URL Scheme
HTTP URL Scheme
Remember This?
@goutaste #SMXMunich
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 34
Web Markup Allow Googlebot App M URLs
Custom URL Scheme
HTTP URL Scheme
If you have to use custom schemes, you will make Google and Mariya sad have to use web markup to tell Google about your deep links
@goutaste #SMXMunich
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 35
Web Markup Allow Googlebot App M URLs
Custom URL Scheme
HTTP URL Scheme
If you have to use custom schemes, you will make Google and Mariya sad have to use web markup to tell Google about your deep links
@goutaste #SMXMunich
And NO API BOOST for you.
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 36
Web Markup Allow Googlebot App M URLs
android-app://com.travel_app/travel_app/travel-app.com/hotels/curtis-hotel-denver
Protocol PackageID Scheme(custom)
Host Path
@goutaste #SMXMunich
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 37
Web Markup Allow Googlebot App M URLs
<head> ... <link rel="alternate" href="android-app://com.travelapp.android/http/travelapp.com/examplescreen" /> ...</head>
@goutaste #SMXMunich
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 38
Web Markup Allow Googlebot App M URLs
Update App’s Robots.txt:
User-Agent: GooglebotAllow: /
@goutaste #SMXMunich
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 39
Web Markup Allow Googlebot App M URLs
• Uses an HTTP or HTTPS link scheme
• Declare the Website-App Association by hosting a Digital Asset Links (App Association) file assetlinks.json
@goutaste #SMXMunich
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 40
Web Markup Allow Googlebot App M URLs
• Uses an HTTP or HTTPS link scheme
• Declare the Website-App Association by hosting a Digital Asset Links (App Association) file assetlinks.json
@goutaste #SMXMunich
Alternative Google App Indexing Methods (Android):
Emily Grossman | MobileMoxie 41
What Breaks Deep Links?• Blocking Googlebot on Your Website• Android Users Signed into the Wrong
Account• Apple Products and Policies• Bad Custom URL Schemes• Bad handling of deep links in App Code• Forgetting to Deep Link Pages on an mDot
subdomain, Mobile Subdirectory & other Subdomains
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 42@goutaste #SMXMunich
You Need A Separate Intent Filter for EVERY
Domain Your App Supports
Emily Grossman | MobileMoxie 43
Deep Link Ranking Factors in GooglePositive Ranking Factors
• Installation Status• Good Technical Implementation• Website SEO Signals• App Indexing API (Android)• Positive Engagement
Negative Ranking Factors
• Installation Status (Esp for iOS)• Technical Errors• Website SEO Signals• Content Mis-Match• Interstitials on Web• Negative Engagement (Soon?)
+ -@goutaste #SMXMunich
Emily Grossman | MobileMoxie 44@goutaste #SMXMunich
45@goutaste
Deep Links (Uninstalled) On Android
Emily Grossman | MobileMoxie 46@goutaste #SMXMunich
Emily Grossman | MobileMoxie 47
Bing App Indexing
https://msdn.microsoft.com/en-us/library/dn614167.aspx
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 48
Bing Deep Linking = Windows Phone Apps
1
2
3
4
Publish App To Windows Store & Define Launch Protocol (AKA URL Scheme)
Add applinks.org markups to webpages that you want to link your app to.
Test implementation.
Set up “URI Activation” (AKA a default URL Scheme)
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 49
Bing Deep Linking = Windows Phone Apps
1
2
3
4
Publish App To Windows Store & Define Launch Protocol (AKA URL Scheme)
Add applinks.org markups to webpages that you want to link your app to.
Test implementation.
Set up “URI Activation”(AKA a default URL Scheme)
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 50
AppLinks.Org<html> <head> <meta property="al:windows:url" content=“foolinks://docs"/> <meta property="al:windows:app_id" content="115b13de-2d8e-4c70-9a36-dfd2c6a7a923"/> <meta property="al:windows:app_name" content=“Foo App" /> <meta property="al:windows:package" content=“Foo.Fooapp_54ggd3ev8bvz6"/> <meta property="al:windows_phone:url" content=“foolinks://docs"/> <meta property="al:windows_phone:app_name" content=“Foo App"/> <meta property="al:windows_phone:package" content=“Foo.Fooapp"/> <meta property="al:web:url" content="http://applinks.org/documentation" /> </head> <body>Hello, world!</body></html>
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 51
FYI, This Same Protocol Used for Apple Spotlight Search, Too
Just reference your iOS app properties instead…
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 52
bit.ly/applinks-validator
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 53
Further Reading for a Deeper Understanding of Deep Linking
@Goutaste
http://searchengineland.com/app-indexing-new-frontier-seo-apple-search-ios-app-indexing-223880
http://searchengineland.com/app-indexing-new-frontier-seo-google-search-deep-linking-226517
@goutaste #SMXMunich
Emily Grossman | MobileMoxie 54
http://searchengineland.com/android-marshmallow-seo-series-sponsored-google-now-cards-23-234719
http://searchengineland.com/android-marshmallow-seo-series-googles-private-index-screen-crawling-234711 @Suzzicks
Further Reading for a Deeper Understanding of Android Marshmallow & Now on Tap
@goutaste #SMXMunich
55
Emily Grossman@goutaste
www.mobilemoxie.com2 Months Free Code:
SMXMUNICHfacebook.com/mobilemoxie@mobilemoxie
Thank You!