Google & Bing App Indexing - SMX Munich 2016

Post on 15-Apr-2017

421 views 2 download

Transcript of Google & Bing App Indexing - SMX Munich 2016

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!