티스토리 뷰
앱이 인스톨 되고 나서 어떻게 사용자를 지속적으로 유입시키고 다시 사용하게 할 수 있을까요? 구글에 따르면 설치된 앱의 약 26%만이 사용자에 의해 매일 사용된다고 합니다. 사용자가 앱을 다시 사용할 수 있도록 할 수 있는 몇가지 혁신적인 방법이 있습니다. iOS에서는 NSUserActivity 또는 Core Spotlight를 통해 사용자가 정보를 검색 할때 앱을 노출시킬 수 있습니다. Google’s App Invites 를 사용하여 사용자가 친구에게 앱을 추천하도록 할 수 있습니다.(iOS와 Android 모두 사용가능)
앱이 사용자의 필요를 충족했더라도 일단 사용자가 브라우저에서 정보를 검색한다면
사용자와 앱을 다시 연결하고자 하는 희망은 물거품이 되버립니다.
이러한 문제를 해결하고자 구글은 App Indexing을 소개하였으며,
이를 통해 사용자가 웹이든 스마트폰이든 검색을 하면 앱을 검색결과로 노출시킬 수 있습니다.
App Indexing은 Google Play Service의 일부분으로 iOS와 Android에서 이용할 수 있습니다. (현재는 Google Play Service가 아닌 Google Firebase로 분리되었음) App Indexing을 통해 App 내부의 컨텐트를 검색 결과에 포함할 수 있게 되며, 사용자를 다시 앱으로 유입시키거나 새로운 사용자가 앱을 설치하도록 유도할 수 있습니다. 이 포스트에서는 Xamarin.Android(Xamarin.Forms 아님)에 초점을 두고 진행할 것입니다. 샘플로 다루게 되는 Monkey App은 사용자들이 좋아하는 원숭이에 대한 정보를 제공하는 단순한 앱입니다. 이 앱은 App Indexing을 구현하여 Monkey App에 포함된 컨텐트 중에서 검색어와 연관된 내용을 검색결과로 노출시킬 수 있습니다. 검색결과에 나타난 링크들은 Deep Link이며 사용자를 Monkey App의 특정 컨텐트로 연결하게 됩니다. 만약 Google 웹사이트에서 검색을 하면 Monkey App 웹사이트가 검색결과로 나타납니다. 이 링크를 클릭했을 때 사용자에게 앱 설치를 권유하는 버튼을 출력하여 새로운 사용자를 유입시킬 수 있습니다. 이미 앱이 설치된 사용자라면 앱을 즉시 실행하여 해당 내용으로 연결하게 됩니다. 이러한 검색결과는 Androind M의 Now on Tap에서도 나타날 수 있습니다.
여기서는 얼마나 쉽게 Google’s App Indexing SDK를 Android Monkey App과 WebSite에 연결할 수 있는지 보여드릴 것입니다. 물론 App Indexing을 iOS App에도 연결할 수 있으며 이에대한 자세한 정보는 Goolge Developer portal과 App Indexing iOS Compoent에서 확인하실 수 있습니다.
결과 미리보기
아래는 최종적으로 통합된 결과에 대해 핵심적인 부분을 소개하는 비디오 입니다.
시작하기
시작하기 전에 App은 반드시 Google Play에 게시되어 있어야 하며 웹사이트는 도메인을 가지고 호스팅 되어 있어야 합니다. 여기서는 Google Play에 게시된 앱과 도메인을 가진 웹사이트를 App Indexing을 통해 연계하는 방법을 소개합니다.
HTTP URL 지원
App Indexing 통합을 시작하기 전에, HTTP와 같은 특정 Data Scheme을 처리하기 위한 새로운 Intent Filter와 함께 Activity를 제공할 수 있습니다. 이는 "http://monkeysapp.com/Home/Detail/Baboon to navigate"와 같은 특정 HTTP URL을 웹사이트로 연결하는 대신 앱의 특정 Activity로 연결하기 위해 필요한 첫번째 단계입니다. 이러한 설정은 "http://monkeysapp.com"와 같은 URL도 앱을 실행하는 형태로 처리하게 될것입니다.
Intent Filter 추가
Intent Filter는 App의 Manifest 파일 구성의 일부분으로 Activity가 수신할 수 있는 Intent 유형을 정의합니다. 텍스트나 사진을 공유하기 위해 다른 앱이 내 앱의 특정 Activity를 실행하도록 만들고 싶은 상황에서 일반적으로 사용하는 기술입니다. 여기에서 Filter는 App Indexing에게 당신의 앱이 어떤 유형의 URL Scheme을 처리할 수 있는지(예: HTTP URL) 알려줍니다. Filter는 Activity에 Attribute 형태로 추가됩니다.
[Activity(Name = "com.refractored.monkeysapp.MainActivity", Label = "Monkeys App", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, Icon = "@drawable/ic_launcher")] [IntentFilter(new []{ Intent.ActionView }, Categories = new [] { Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable }, DataScheme = "http", //필수 DataHost = "www.monkeysapp.com", //필수 DataPathPrefix = "/Home/Detail/")] public class MainActivity : AppCompatActivity { //... }
DataPathPrefix는 URL의 Host 이후의 URL형태를 정의할 수 있습니다. 위에서 DataPathPrefix를 "/Home/Detail/"로 정의하여 App Indexing에게 Content의 위치를 구체적으로 알려주고 있습니다. 여러 도메인이나 URL패턴을 정의하기 위해 여러개의 IntentFilter를 정의할 수 있습니다. 아래는 https를 수신하는 IntentFilter를 추가로 정의하였습니다.
[IntentFilter(new []{ Intent.ActionView }, Categories = new [] { Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable }, DataScheme = "https", DataHost = "www.monkeysapp.com", DataPathPrefix = "/Home/Detail/")]
Intent Filter 처리
위와 같은 Intent Filterd에 해당하는 정보를 수신하면 앱은 Deep Link에 해당하는 내용을 출력할 수 있도록 Parsing될 수 있는 추가정보를 전달하게 됩니다. 이 정보는 Intent의 DataString에 포함되어 있습니다. 이 예제에서는 전달된 URL의 마지막 '/'를 검색하여 Monkey ID를 찾고 있습니다.
protected override void OnCreate(Android.OS.Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.activity_main); //Monkey 정보를 해석 OnNewIntent(Intent); } //Activity가 실행된 상태에서 새로운 Intent가 전달되었을 때 실행됨 protected override void OnNewIntent(Intent intent) { base.OnNewIntent(intent); var action = intent.Action; var data = intent.DataString; if (Intent.ActionView != action || string.IsNullOrWhiteSpace(data)) return; //IntentFilter의 DataPathPrefix를 통해 DeepLink 된 것이 맞는지 확인 if (!data.Contains("/Home/Detail/")) return; var monkeyId = data.Substring(data.LastIndexOf("/", StringComparison.Ordinal) + 1).Replace("%20", " "); if (!string.IsNullOrWhiteSpace(monkeyId)) { var i = new Intent(this, typeof(DetailsActivity)); i.PutExtra("Name", monkeyId); StartActivity(i); } }
App과 WebSite 연계
아마 이 부분이 가장 까다로운 부분이 아닌가 생각됩니다. 왜냐하면 Google Play와 Google Search에서 앱을 등록하고 설정해야 하니까요. 먼저 Google Play에서 앱의 소유주임을 입증해야합니다. 여기에 사용된 계정은 반드시 Search Console에서 사용한 계정과 동일해야 합니다.
- Search Console 에 방문하신 후: 앱을 등록하시고 소유권을 확인하세요. (자세한 절차는 Search Console for Apps를 확인하세요.) Associate a Website에 방문하신 후, 소유권의 확인된 앱을 리스트에서 선택하세요. 그리고 연계할 웹사이트의 주소를 등록해 주세요.
-
Developer Console에 방문하신 후: 웹사이트 소유권 확인을 요청하세요. 이 작업은 앱과 웹사이트를 연계하기 위한 메시지를 웹마스터에게 발송합니다. 자세한 사항은 Developer Console Help Center의 App Indexing on Google Search를 확인해보세요.
작업이 마무리되면 아래와 같이 구글 검색결과에 앱과 웹사이트가 연계되어 검색됩니다.
App Indexing API 추가
이제 App Inexing을 앱에 추가할 차례입니다. 이 API를 사용하여 App Indexing에게 스마트폰의 검색 자동완성을 위한 쿼리 작성정보를 제공하게 됩니다. 제목, 설명, 아이콘과 같은 구조화된 데이터 정보를 API에게 제공하여 사용자가 검색결과로 확인할 수 있는 정보를 제공하고 사용자를 당신의 앱으로 다시 한번 유도될 것입니다.
Google Play Service 추가하기 (GPS)
App Indexing NuGet을 Xamarin.Andorid 앱에 추가시다.
App Indexing namespace 추가
App Indexing API를 적용할 Activity를 열고 아래와 구문을 추가해주세요. 이 포스트에서는 mokey details 페이지에 추가하였습니다.
using Android.Gms.AppIndexing; using Android.Gms.Common.Apis; using Android.Runtime; using IndexingAction = Android.Gms.AppIndexing.Action;
App Indexing API 호출 추가
이제 Activity와 App Indexing에 을 연계할 차례입니다. 여기에서는 Activity에서 출력하고 있는 원숭이 정보를 App Indexing에 제공하도록 합니다.
public class DetailsActivity : AppCompatActivity { Monkey monkey; GoogleApiClient client; string url, title, description, schemaType; protected override void OnCreate(Android.OS.Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.activity_detail); //GoogleApiClient를 준비하고 원숭이 정보를 설정 client = new GoogleApiClient.Builder(this).AddApi(AppIndex.API).Build(); url = $"http://monkeysapp.com/Home/Detail/{monkey.Name.Replace(" ", "%20")}"; title = monkey.Name; description = monkey.Details; schemaType = "http://schema.org/Article"; } // 현재 페이지 정보를 IndexingAction로 반환하도록 함 public IndexingAction AppIndexAction { get { var item = new Thing.Builder() .SetName(title) .SetDescription(description) .SetUrl(Android.Net.Uri.Parse(url)) .Build(); var thing = new IndexingAction.Builder(IndexingAction.TypeView) .SetObject(item) .SetActionStatus(IndexingAction.StatusTypeCompleted) .Build(); return thing.JavaCast<IndexingAction>(); } } }
App Activity 설정
Activity가 생성되면 새로운 Indexing Action을 생성하고, App Indexing API에 전달 합니다.
protected override async void OnStart() { base.OnStart(); client.Connect(); await AppIndex.AppIndexApi.StartAsync(client, AppIndexAction); } protected override async void OnStop() { base.OnStop(); await AppIndex.AppIndexApi.EndAsync(client, AppIndexAction); client.Disconnect(); }
StartAsync 메서드를 통해 현재 보여지고 있는 항목과 웹사이트 URL을 연결하게되며, 이 작업이 App Indexing API의 핵심코드입니다.
Test 구현
Android Debug Bridge를 통해 URL 링크가 앱을 열수 있는지 테스트해보세요. 아래에서 {DEEP-LINK}는 앱의 Manifest에 설정된 URI로 지정하시면 됩니다.
adb shell am start -a android.intent.action.VIEW -d "{DEEP-LINK}" com.your.packagename
테스트에 관한 자세한 정보는 https://firebase.google.com/docs/app-indexing/android/test를 확인하세요.
좀더 자세한 정보
몇줄의 코드와 Intent Filter를 추가하여 Google Search와 App Indexing을 연계하여 사용자의 재방문률을 높일 수 있습니다. App indexing에 대한 자세한 정보를 확인하시려면 Google Developer Portal에 방문하신 후 Google App Indexing Component for iOS, Android's Google Play Service를 확인해보세요. (현재는 Google Developer Portal 보다 Google Firebase에서 좀더 상세한 정보를 확인할 수 있습니다.) 이 포스트에 사용된 샘플 전체 샘플코드는 Monkeys app on my GitHub에서 확인하실 수 있습니다.
'Mobile > Xamarin' 카테고리의 다른 글
Xamarin Live Reload (1) | 2018.08.05 |
---|
- Vue
- Xamarin.iOS
- Xamarin.Forms
- material-ui
- StringComparison
- MS SQL
- flutter
- VisualStudio
- ios
- ASP.NET Core
- React
- Xamarin.Forms 요약
- .NET Standard
- TypeScript
- Xamarin
- c#
- Android
- WPF
- npm
- Xamarin.Forms eBook
- Total
- Today
- Yesterday