beyond the web: why app deep linking is the next big thing by emily grossman

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

Upload: search-marketing-expo-smx

Post on 15-Apr-2017

1.829 views

Category:

Mobile


0 download

TRANSCRIPT

#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 1 1

AUG 1 25

#SMX #23C @goutaste

AUG 1 1

AUG 1 29

#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:scheme android: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 Schema XML 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-Reference WATCH: 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 @goutaste Image 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 SAFARI SIRI

#SMX #23C @goutaste

High-Engagement App Screens Suggested 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 Public Public Only

Search results meta data for

display and rankings

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

#SMX #23C @goutaste

CoreSpotlight NSUserActivity Web Markup NSUserActivity

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 Markup NSUserActivity

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, CA

MARCH 1-3, 2016