Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015

60
#SMX #23C @goutaste Emily Grossman, MobileMoxie Beyond The Web: Why App Deep Linking Is The Next Big Thing

Transcript of Why Deep Linking is the Next Big Thing: App Indexing - SMX East 2015

#SMX #23C @goutaste

Emily Grossman, MobileMoxie

Beyond The Web: Why App Deep Linking Is The Next Big Thing

#SMX #23C @goutaste

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

#SMX #23C @goutaste

“Google’s mission is to organize the world’s information and make it universally accessible

and useful.”- Google’s initial mission statement -

#SMX #23C @goutaste

#SMX #23C @goutaste

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

#SMX #23C @goutaste

Google App Indexing

bit.ly/appindexinggoogle

#SMX #23C @goutaste

#SMX #23C @goutaste

#SMX #23C @goutaste

AUG

11

AUG

125

#SMX #23C @goutaste

AUG

11

AUG

129

#SMX #23C @goutaste

#SMX #23C @goutaste

Google App Indexing: ANDROID

#SMX #23C @goutaste

Android – Intent Filters

Custom URL Scheme

HTTP URL Scheme

Create Intent Filters:

#SMX #23C @goutaste

Android – Intent filters

Intent Filters need:

<action>

<data> android:schemeandroid:path

<category>

#SMX #23C @goutaste

Android App Indexing API

Deep Link to previously-viewed ‘Calafia Café’ screen in the Zagat app

#SMX #23C @goutaste

Android App Indexing API

...public class MainActivity extends Activity {

  static final Uri APP_URI = Uri.parse("android-app://com.example.android.recipes/http/recipe-app.com/recipes");  static final Uri WEB_URL = Uri.parse("http://recipe-app.com/recipes/");  private GoogleApiClient mClient;    ...   }

  @Override  public void onStop() {    ...    // Call end() and disconnect the client    String title = "App Indexing API Title";    Action viewAction = Action.newAction(Action.TYPE_VIEW, title, WEB_URL, APP_URI);    AppIndex.AppIndexApi.end(mClient, viewAction);    mClient.disconnect();    ... Full code sample here: bit.ly/appindexingAPIcode

#SMX #23C @goutaste

Android – Robots.txt (Required if you don’t use the API)

Update App’s Robots.txt:

User-Agent: GooglebotAllow: /

#SMX #23C @goutaste

Custom URL Schemes: Web Markup

#SMX #23C @goutaste

Android

Deep Link URL Format:

android-app://com.travel_app/travel_app/travel-app.com/hotels/curtis-hotel-denver

Protocol PackageID Scheme(custom)

Host Path

#SMX #23C @goutaste

Rel=alternate XML Sitemaps Schema

<head> ... <link rel="alternate" href="android-app://com.travelapp.android/http/travelapp.com/examplescreen" /> ...</head>

<head> ... <link rel="alternate" href="android-app://com.travelapp.android/travelapp/examplescreen" /> <link rel="alternate" href="ios-app://123456/travelapp/examplescreen" /> ...</head>

#SMX #23C @goutaste

Rel=alternate XML Sitemaps Schema

<?xml version="1.0" encoding="UTF-8" ?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url> <loc>http://travelwebsite.com/examplepage</loc> <xhtml:link rel="alternate" href="android-app://com.travelapp.android/travelapp/examplescreen" /> <xhtml:link rel="alternate" href="ios-app://123456/travelapp/examplescreen" /></url> <xhtml:link rel="alternate" href="android-app://com.travelapp.android/http/travelapp.com/examplescreen" />...</urlset>

#SMX #23C @goutaste

Rel=alternate SchemaXML Sitemaps

<script type="application/ld+json">{ "@context": "http://schema.org", "@type": "WebPage", "@id": "http://travelwebsite.com/examplepage", "potentialAction": { "@type": "ViewAction", "target": "android-app://com.travelapp.android/http/travelapp.com/examplescreen" }}</script>

#SMX #23C @goutaste

Android – Google Play Developer Console/ Google Search Console Sync

#SMX #23C @goutaste

Google App Indexing: iOS

#SMX #23C @goutaste

The Good News Is…

#SMX #23C @goutaste

The Bad News Is…

#SMX #23C @goutaste

iOS – Support Universal Links

https://subdomain.domain.com/path/subpath/

Scheme“http” or “https”

Domain or Host Name Path or Prefix

Anatomy of a Universal Link:

#SMX #23C @goutaste

iOS – Support Universal Links

Requirements:• A registered domain• SSL access to your domain• Ability to upload a JSON file to your domain

#SMX #23C @goutaste

iOS – Support Universal Links

1 Get Your App Ready

• 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

#SMX #23C @goutaste

iOS – Support Universal Links

2 Get Your Server Ready

• 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.

{ "applinks": { "apps": [], "details": {  »ABC0123.com.domain.App": { "paths":[ "*" ] } } }}

#SMX #23C @goutaste

iOS – Support Universal Links

2

{ "applinks": { "apps": [], "details": {  »ABC0123.com.domain.App": { "paths":[

”/folder/subfolder/”,”/folder2/subfolder2/*”,

] } } }}

Get Your Server Ready

• 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.

#SMX #23C @goutaste

iOS – Cocoapods Support

#SMX #23C @goutaste

iOS – Cocoapods Support

#SMX #23C @goutaste

iOS – Cocoapods Support

#SMX #23C @goutaste

iOS – Cocoapods Support

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];

#SMX #23C @goutaste

Custom URL Schemes: Web Markup

#SMX #23C @goutasteImage attribution: http://k9s4cops.org/coming-soon-the-pack/

iOS – Testing

#SMX #23C @goutaste

Apple Search App Indexing

#SMX #23C @goutaste

“Apple’s App Store commission is now at a run-rate of $9 billion, more than its total revenue

in the year the iPod launched.”- Benedict Evans, @BenedictEvans -

#SMX #23C @goutaste

Apple Search SPOTLIGHT SAFARISIRI

#SMX #23C @goutaste

High-EngagementApp ScreensSuggested in

‘Siri Suggestions’ on iOS 9 Spotlight

#SMX #23C @goutaste

DEVICE INDEX(PRIVATE)

CLOUD INDEX(PUBLIC)

Apple Search Sources from Two Indexes

#SMX #23C @goutaste

APPLE SEARCH APP INDEXING

CoreSpotlight NSUserActivity Web Markup

#SMX #23C @goutaste

Apple Search App Indexing Option 1:

NSUserActivity

#SMX #23C @goutaste

Core Spotlight NSUserActivity Web Markup

Used for… Indexing public app screens that mirror content on the web

DOES require corresponding web content

Add code to WEB

Public Cloud Index

Used for… Indexing app screens that contain private/ personal data

Does NOT require corresponding web content

Add code to APP

Private Device Index

Used for… Indexing private and public navigation points in the app

Does NOT require corresponding web content

Add code to APP

Private Device Index and/ or Public Cloud Index

Private Public

#SMX #23C @goutaste

NSUserActivity

Private or PublicPublic Only

Search results meta data for

display and rankings

‘Canonical’More info here: bit.ly/NSUserActivity

#SMX #23C @goutaste

CoreSpotlight NSUserActivity Web MarkupNSUserActivity

with var eligibleForSearch with var eligibleForPublicIndexing

Private/Device Index Public/ Cloud Index

PRIVATE APP SCREEN PUBLIC APP SCREEN

#SMX #23C @goutaste

Apple Search App Indexing Option 2:

Core Spotlight

#SMX #23C @goutaste

Core Spotlight NSUserActivity Web Markup

Used for… Indexing public app screens that mirror content on the web

DOES require corresponding web content

Add code to WEB

Public Cloud Index

Used for… Indexing app screens that contain private/ personal data

Does NOT require corresponding web content

Add code to APP

Private Device Index

Used for… Indexing private and public navigation points in the app

Does NOT require corresponding web content

Add code to APP

Private Device Index and/ or Public Cloud Index

Private Public

#SMX #23C @goutaste

CoreSpotlight

Search results meta data for

display and rankings

More info here: bit.ly/corespotlight

#SMX #23C @goutaste

Apple Search App Indexing Option 3:

Web Markup

#SMX #23C @goutaste

CoreSpotlight NSUserActivity Web MarkupNSUserActivity

with var eligibleForSearch with var eligibleForPublicIndexing

Private/Device Index Public/ Cloud Index

PRIVATE APP SCREEN PUBLIC APP SCREEN

#SMX #23C @goutaste

Core Spotlight NSUserActivity Web Markup

Used for… Indexing public app screens that mirror content on the web

DOES require corresponding web content

Add code to WEB

Public Cloud Index

Used for… Indexing app screens that contain private/ personal data

Does NOT require corresponding web content

Add code to APP

Private Device Index

Used for… Indexing private and public navigation points in the app

Does NOT require corresponding web content

Add code to APP

Private Device Index and/ or Public Cloud Index

Private Public

#SMX #23C @goutaste

Web Markup

#SMX #23C @goutaste

Web Markup

Twitter Cards AppLinks Smart App Banners

#SMX #23C @goutaste

Web Markup

Twitter Cards AppLinks Smart App Banners

#SMX #23C @goutaste

Web Markup

Twitter Cards AppLinks Smart App Banners

#SMX #23C @goutaste

Web Markup – Meta Data (Schema & Open Graph)

#SMX #23C @goutaste

http://bit.ly/applesearchvalidator

#SMX #23C @goutaste

THANK YOU!

SEE YOU @SMX WEST

SAN JOSE, CAMARCH 1-3, 2016