Xamarin.iOS의 사전 제안 소개

이 문서에서는 Xamarin.iOS 앱에서 자동 관리 제안을 사용하여 시스템이 사용자에게 유용한 정보를 자동으로 자동으로 표시할 수 있도록 하여 참여를 유도하는 방법을 보여 줍니다.

iOS 10의 새로운 사전 제안에서는 적절한 시기에 사용자에게 유용한 정보를 자동으로 사전에 제공하여 사용자가 Xamarin.iOS 앱에 참여할 수 있는 뉴스 방법을 제공합니다.

iOS 10은 시스템이 적절한 시기에 사용자에게 유용한 정보를 자동으로 자동으로 표시할 수 있도록 하여 앱에 대한 참여를 유도하는 새로운 방법을 제공합니다. iOS 9가 추천, 핸드오프 및 Siri 제안(새 검색 API 참조)을 사용하여 앱에 심층 검색을 추가하는 기능을 제공한 것처럼 iOS 10에서는 앱이 다음 위치 내에서 시스템에서 사용자에게 제공할 수 있는 기능을 노출할 수 있습니다.

  • 앱 전환기
  • 잠금 화면
  • CarPlay
  • 지도
  • Siri 상호 작용
  • QuickType 제안

앱은 웹 태그, Core Spotlight, MapKit, 미디어 플레이어 및 UIKit과 같은 NSUserActivity기술 컬렉션을 사용하여 이 기능을 시스템에 노출합니다. 또한 앱에 대한 사전 제안 지원을 제공하여 Siri를 무료로 더 깊이 통합할 수 있습니다.

위치 기반 제안

iOS 10 NSUserActivity 을 새롭게 접하는 클래스에는 개발자가 다른 컨텍스트에서 사용할 수 있는 위치 정보를 제공할 수 있는 속성이 포함되어 MapItem 있습니다. 예를 들어 앱에 식당 리뷰가 표시되면 개발자는 사용자가 앱에서 보고 있는 식당의 위치로 속성을 설정할 MapItem 수 있습니다. 사용자가 지도 앱으로 전환하면 레스토랑의 위치를 자동으로 사용할 수 있습니다.

앱이 App Search를 지원하는 경우 클래스의 CSSearchableItemAttributesSet 새 주소 구성 요소를 사용하여 사용자가 방문할 위치를 지정할 수 있습니다. 속성을 설정 MapItem 하면 다른 속성이 자동으로 채워집니다.

주소 구성 요소 속성을 설정하는 LatitudeLongitude 것 외에도 Siri가 위치에 대한 호출을 시작할 수 있도록 앱에서 NamedLocation 해당 속성과 PhoneNumbers 속성을 제공하는 것이 좋습니다.

웹 태그 기반 제안

iOS 9는 사용자가 추천 및 Safari 검색 결과에서 볼 수 있는 콘텐츠를 보강하는 구조적 데이터 태그를 웹 사이트에 포함하는 기능에 추가되었습니다(웹 태그를 사용하여 검색 참조). iOS 10은 위치 기반 태그(예: Schema.org 정의된 PostalAddress)를 포함하는 기능을 추가하여 사용자의 환경을 더욱 향상시킵니다. 예를 들어 사용자가 웹 사이트에서 표시된 위치를 보는 경우 시스템은 지도 열 때 동일한 위치를 제안할 수 있습니다.

텍스트 기반 제안

UIKit이 iOS 10에서 확장되어 텍스트 영역에 있는 콘텐츠의 의미 체계적 의미를 지정하기 위해 UITextInputTraits 클래스의 TextContentType 속성을 포함합니다. 이 정보를 사용하면 시스템은 일반적으로 적절한 키보드 유형을 자동으로 선택하고, 자동 고침 제안을 개선하고, 다른 앱 및 웹 사이트의 정보를 사전에 통합할 수 있습니다.

예를 들어 사용자가 표시된 UITextContentType.FullStreetAddress텍스트 필드에 텍스트를 입력하는 경우 시스템은 사용자가 최근에 보고 있던 위치로 필드를 자동으로 채우라고 제안할 수 있습니다.

미디어 기반 제안

앱이 MPPlayableContentManager API를 사용하여 미디어를 재생하는 경우 iOS 10을 사용하면 사용자가 앨범 아트를 보고 잠금 화면에서 앱을 통해 미디어를 재생할 수 있습니다.

상황에 맞는 Siri 미리 알림

사용자가 Siri를 사용하여 나중에 앱에서 현재 보고 있는 콘텐츠를 볼 수 있도록 미리 알림을 빠르게 만들 수 있습니다. 예를 들어 앱에서 식당 리뷰를 보는 경우 Siri를 호출하고 "집에 돌아오면 이 사실을 알려주세요"라고 말할 수 있습니다. Siri는 앱에서 검토에 대한 링크와 함께 미리 알림을 생성합니다.

연락처 기반 제안

앱의 연락처(및 연락처 관련 정보)가 시스템에 저장된 모든 사용자 연락처와 함께 iOS 디바이스의 연락처 앱에 표시되도록 허용합니다.

라이드 쉐어 공유 기반 제안

승차 공유 앱이 MKDirectionsRequest API를 사용하는 경우 iOS 10은 사용자가 타고 싶어할 때 앱 전환기에서 옵션으로 제공합니다. 또한 파일에서 MKDirectionsApplicationSupportedModesInfo.plist 에 대한 앱을 지정하여 MKDirectionsModeRideShare 앱을 라이드 쉐어링 앱으로 등록해야 합니다.

앱이 승차 공유만 지원하는 경우 시스템 제안은 "Get a ride to..."시작하며, 다른 유형의 라우팅 방향(예: 걷기 또는 자전거)이 지원되면 시스템은 "길 가져오기..."를 사용합니다.

Important

앱이 수신하는 MKMapItem 개체에는 경도 및 위도 정보가 포함되지 않을 수 있으며 지오코딩이 필요합니다.

자동 관리 제안 구현

Xamarin.iOS 앱에 자동 관리 제안 지원을 추가하는 것은 일반적으로 몇 가지 API를 구현하거나 앱이 이미 구현하고 있는 몇 가지 API에서 확장하는 것만큼 쉽습니다.

자동 관리 제안은 다음 세 가지 기본 방법으로 앱에서 작동합니다.

  • NSUserActivity 및 Schema.org - NSUserActivity 통해 시스템에서 사용자가 현재 화면에서 작업하고 있는 정보를 파악할 수 있습니다. Schema.org 웹 페이지에 유사한 기능을 추가합니다.
  • 위치 제안 - 앱이 위치 기반 정보를 제공하거나 사용하는 경우 이러한 API 확장은 앱 간에 이 정보를 공유하는 새로운 방법을 제공합니다.
  • 미디어 앱 제안 - 시스템은 iOS 디바이스와 사용자의 상호 작용 컨텍스트에 따라 앱 및 해당 미디어 콘텐츠를 승격할 수 있습니다.

그리고 다음을 구현하여 앱에서 지원됩니다.

  • 핸드오프 - NSUserActivity는 개발자가 한 장치에서 작업을 시작한 다음 다른 장치에서 작업을 계속할 수 있도록 하는 핸드오프를 지원하기 위해 iOS 8에 추가되었습니다(핸드오프 소개 참조).
  • 스포트라이트 검색 - iOS 9는 추천 검색 결과 내에서 앱 콘텐츠를 승격하는 기능을 추가했습니다(핵심 추천을 사용한 NSUserActivity 검색 참조).
  • 상황에 맞는 Siri 미리 알림 - iOS 10 NSUserActivity 에서는 Siri가 사용자가 나중에 앱에서 현재 보고 있는 콘텐츠를 볼 수 있도록 미리 알림을 빠르게 만들 수 있도록 확장되었습니다.
  • 위치 제안 - iOS 10은 NSUserActivity 앱 내부에서 볼 수 있는 위치를 캡처하고 시스템 전체의 여러 위치에서 승격하도록 향상시킵니다.
  • 상황에 맞는 Siri 요청은 - NSUserActivity 사용자가 앱 내에서 Siri를 호출하는 지시를 받거나 전화를 걸 수 있도록 Siri에 앱 내부에 제공된 정보에 대한 컨텍스트를 제공합니다.
  • 연락처 상호 작용 - iOS 10의 새로운 기능으로, NSUserActivity 대체 통신 방법으로 연락처 카드(연락처 앱)에서 통신 앱을 승격할 수 있습니다.

이러한 모든 기능에는 한 가지 공통점이 있습니다. 이러한 기능은 모두 한 가지 형식 또는 다른 형식으로 사용하여 NSUserActivity 기능을 제공합니다.

NSUserActivity

위에서 NSUserActivity 설명한 대로 시스템에서 사용자가 현재 화면에서 작업하고 있는 정보를 이해하는 데 도움이 됩니다. NSUserActivity 는 사용자가 앱을 탐색할 때 사용자의 활동을 캡처하는 가벼운 상태 캐싱 메커니즘입니다. 예를 들어 레스토랑 앱을 살펴보는 경우:

The NSUserActivity light-weight state caching mechanism

다음 상호 작용을 사용합니다.

  1. 사용자가 앱에서 작업할 때 나중에 앱 NSUserActivity 의 상태를 다시 만들기 위해 A가 만들어집니다.
  2. 사용자가 레스토랑을 검색하는 경우 동일한 활동 만들기 패턴이 따릅니다.
  3. 그리고 다시, 사용자가 결과를 볼 때. 이 마지막 경우 사용자가 위치를 보고 있으며 iOS 10에서 시스템은 특정 개념(예: 위치 또는 통신 상호 작용)을 더 잘 알고 있습니다.

마지막 화면을 자세히 살펴보세요.

The NSUserActivity details

여기서 앱은 a를 NSUserActivity 만들고 나중에 상태를 다시 만들기 위한 정보로 채워졌습니다. 앱에는 위치의 이름 및 주소와 같은 일부 메타데이터도 포함되어 있습니다. 이 활동을 만들면 앱은 iOS가 사용자의 현재 상태를 나타낸다는 것을 알 수 있습니다.

그런 다음 앱은 활동이 핸드오프에 대해 무선으로 보급되거나, 위치 제안에 대한 임시 값으로 저장되거나, 검색 결과에 표시하기 위해 디바이스의 스포트라이트 인덱스에 추가될지 여부를 결정합니다.

핸드오프 및 스포트라이트 검색에 대한 자세한 내용은 핸드오프iOS 9 새 검색 API 가이드 소개를 참조하세요.

활동 만들기

활동을 만들기 전에 활동을 식별하기 위해 활동 유형 식별자를 만들어야 합니다. 활동 유형 식별자는 지정된 사용자 활동 형식을 NSUserActivityTypes 고유하게 식별하는 데 사용되는 앱 파일의 Info.plist 배열에 추가된 짧은 문자열입니다. 앱이 App Search를 지원하고 노출하는 각 활동에 대해 배열에 하나의 항목이 있습니다. 자세한 내용은 활동 유형 식별자 참조 만들기를 참조하세요.

활동의 예를 살펴봅니다.

// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");

// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));

// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;

// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;

// Inform system of Activity
activity.BecomeCurrent();

활동 유형 식별자를 사용하여 새 활동을 만듭니다. 다음으로, 작업을 정의하는 일부 메타데이터가 만들어지므로 나중에 이 상태를 복원할 수 있습니다. 그런 다음, 활동에 의미 있는 제목이 지정되고 사용자 정보에 첨부됩니다. 마지막으로 일부 기능이 활성화되고 활동이 시스템으로 전송됩니다.

위의 코드는 다음을 변경하여 활동에 컨텍스트를 제공하는 메타데이터를 포함하도록 더욱 향상될 수 있습니다.

...

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" }; 
activity.ContentAttributeSet = attributes;

// Inform system of Activity
activity.BecomeCurrent();

개발자가 앱과 동일한 정보를 표시할 수 있는 웹 사이트가 있는 경우 앱에 URL을 포함할 수 있으며, 앱이 설치되지 않은 다른 디바이스에 콘텐츠를 표시할 수 있습니다(핸드오프를 통해).

// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");

활동 복원

앱의 검색 결과(NSUserActivity)를 탭하는 사용자에 응답하려면 AppDelegate.cs 파일을 편집하고 메서드를 재정의합니다ContinueUserActivity. 예시:

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Take action based on the activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.platform":
        // Restore the state of the app here...
        break;
    }

    return true;
}

개발자는 위에서 만든 활동과 동일한 활동 유형 식별자(com.xamarin.platform)가 되도록 해야 합니다. 앱은 사용자가 중단한 NSUserActivity 상태로 다시 복원하기 위해 저장된 정보를 사용합니다.

활동 만들기의 이점

위에서 제시한 최소한의 코드로 앱은 이제 세 가지 새로운 iOS 10 기능을 활용할 수 있습니다.

  • 핸드오프
  • 추천 검색
  • 상황에 맞는 Siri 미리 알림

다음 섹션에서는 다른 두 가지 새로운 iOS 10 기능을 사용하도록 설정하는 것을 살펴보겠습니다.

  • 위치 제안
  • 상황에 맞는 Siri 요청

위치 기반 제안

위의 식당 검색 앱의 예를 들어 보세요. 모든 메타데이터 및 특성을 구현 NSUserActivity 하고 올바르게 채인 경우 사용자는 다음을 수행할 수 있습니다.

  1. 앱에서 친구를 만나고 싶은 레스토랑을 찾습니다.
  2. 사용자가 멀티태스킹 앱 전환기를 사용하여 앱에서 멀어지면 시스템에서 자동으로 제안(화면 아래쪽)을 표시하여 즐겨 찾는 탐색 앱을 사용하여 식당으로 가는 길 찾기를 가져옵니다.
  3. 사용자가 메시지 앱으로 전환하고 "모임 시작"을 입력하기 시작하면 QuickType 키보드에서 자동으로 식당 주소에 붙여넣기를 제안합니다.
  4. 사용자가 지도 앱으로 전환하면 식당의 주소가 자동으로 대상으로 제안됩니다.
  5. 이는 타사 앱(지원 NSUserActivity)에서도 작동하므로 사용자가 승차 공유 앱으로 전환할 수 있으며 레스토랑 주소도 자동으로 목적지로 제안됩니다.
  6. 또한 Siri에 대한 컨텍스트를 제공하므로 사용자는 식당 앱 내에서 Siri를 호출하고 "길 보기..."를 요청할 수 있으며 Siri는 사용자가 보고 있는 레스토랑에 지침을 제공합니다.

위의 모든 기능에는 한 가지 공통점이 있으며, 모두 제안이 원래 어디에서 오는지 나타냅니다. 위의 예제의 경우 가상의 레스토랑 리뷰 앱입니다.

iOS 10은 기존 프레임워크에 대한 몇 가지 작은 수정 및 추가를 통해 앱에 이 기능을 사용하도록 향상되었습니다.

  • NSUserActivity 에는 앱 내부에서 볼 수 있는 위치 정보를 캡처하기 위한 추가 필드가 있습니다.
  • 위치를 캡처하기 위해 MapKit 및 CoreSpotlight에 몇 가지 추가가 이루어졌습니다.
  • 위치 인식 기능이 Siri, 지도, 키보드, 멀티태스킹 및 시스템 내의 다른 앱에 추가되었습니다.

위치 기반 제안을 구현하려면 위에 표시된 것과 동일한 활동 코드로 시작합니다.

// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");

// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));

// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;

// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" }; 
activity.ContentAttributeSet = attributes;

// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");

// Inform system of Activity
activity.BecomeCurrent();

앱이 MapKit을 사용하는 경우 현재 맵 MKMapItem 을 활동에 추가하는 것만큼 간단합니다.

// Save MKMapItem location
activity.MapItem = myMapItem;

앱이 MapKit을 사용하지 않는 경우 App Search를 채택하고 위치에 대해 다음과 같은 새 특성을 지정할 수 있습니다.

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
...

attributes.NamedLocation = "Apple Inc.";
attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";
attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;
attributes.PhoneNumbers = new string[]{"(800) 275-2273"};
attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;

위의 코드를 자세히 살펴보세요. 첫째, 위치의 이름은 모든 인스턴스에서 필요합니다.

attributes.NamedLocation = "Apple Inc.";

그런 다음, 위치의 텍스트 기반 설명은 텍스트 기반 인스턴스(예: QuickType 키보드)에 필요합니다.

attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";

위도 및 경도는 선택 사항이지만 사용자가 앱에서 보내려는 정확한 위치로 라우팅되도록 하므로 다음을 포함해야 합니다.

attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;

전화 번호를 설정하면 앱에서 Siri에 액세스할 수 있으므로 사용자가 "이 위치로 전화하세요"와 같은 말을 하여 앱에서 Siri를 호출할 수 있습니다.

attributes.PhoneNumbers = new string[]{"(800) 275-2273"};

마지막으로 앱은 인스턴스가 탐색 및 전화 통화에 적합한지 여부를 나타낼 수 있습니다.

attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;

연락처 상호 작용 구현

iOS 10의 새로운 기능인 통신 앱은 연락처 카드 연락처 앱에 깊이 통합되어 있습니다. 연락처 상호 작용을 구현한 앱의 경우 사용자는 대화 상대의 특정 사용자에게 지정된 앱의 정보를 추가할 수 있습니다. 예를 들어 메시지를 보내기 위해 카드 맨 위에 있는 빠른 작업 단추를 누르면 연결된 앱이 메시지를 보내는 옵션으로 나열됩니다.

타사 앱을 선택한 경우 다음번에 사용자가 연락하려고 할 때 지정된 사람에게 메시지를 표시하는 기본 방법으로 기억하고 표시할 수 있습니다.

연락처 상호 작용은 iOS 10에 도입된 새 의도 프레임워크를 사용하여 NSUserActivity 앱에서 구현됩니다. 의도 작업에 대한 자세한 내용은 SiriKit 개념 이해 및 SiriKit 구현 가이드를 참조하세요.

상호 작용 기부

앱에서 상호 작용을 기부하는 방법을 살펴보세요.

Donating Interactions overview

앱은 의도(), 참가자 및 메타데이터를 포함하는 개체를 만듭니다INInteraction.INIntent 의도화상 통화 또는 문자 메시지 보내기와 같은 사용자 작업을 나타냅니다. 참가자통신을 받는 사람들을 포함합니다. 메타데이터메시지를 성공적으로 보내는 등의 추가 정보를 정의합니다.

개발자는 이러한 부모 클래스에서 상속하는 특정 자식 클래스(앱이 사용자를 대신하여 수행하는 작업에 따라) 중 하나를 직접 만들 INIntent 거나 INIntentResponse사용하지 않습니다. 예를 들어 INSendMessageIntentINSendMessageIntentResponse 문자 메시지를 보내는 경우입니다.

상호 작용이 완전히 채워지면 메서드를 DonateInteraction 호출하여 상호 작용을 사용할 수 있음을 시스템에 알릴 수 있습니다.

사용자가 Contact 카드 앱과 상호 작용하면 상호 작용이 번NSUserActivity들로 묶인 다음, 앱을 시작하는 데 사용됩니다.

The interaction gets bundled with a NSUserActivity that is used to launch the app

메시지 보내기 의도의 다음 예제를 살펴보세요.

using System;
using Foundation;
using UIKit;
using Intents;

namespace MonkeyNotification
{
  public class DonateInteraction
  {
    #region Constructors
    public DonateInteraction ()
    {
    }
    #endregion

    #region Public Methods
    public void SendMessageIntent (string text, INPerson from, INPerson[] to)
    {

      // Create App Activity
      var activity = new NSUserActivity ("com.xamarin.message");

      // Define details
      var info = new NSMutableDictionary ();
      info.Add (new NSString ("message"), new NSString (text));

      // Populate Activity
      activity.Title = "Sent MonkeyChat Message";
      activity.UserInfo = info;

      // Enable capabilities
      activity.EligibleForSearch = true;
      activity.EligibleForHandoff = true;
      activity.EligibleForPublicIndexing = true;

      // Inform system of Activity
      activity.BecomeCurrent ();

      // Create message Intent
      var intent = new INSendMessageIntent (to, text, "", "MonkeyChat", from);

      // Create Intent Reaction
      var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, activity);

      // Create interaction
      var interaction = new INInteraction (intent, response);

      // Donate interaction to the system
      interaction.DonateInteraction ((err) => {
        // Handle donation error
        ...
      });
    }
    #endregion
  }
}

이 코드를 자세히 살펴보면 위의 작업 만들기 섹션에 표시된 것처럼 인스턴스 NSUserActivity 를 만들고 채웁니다. 다음으로, (상속되는) 인스턴스 INSendMessageIntentINIntent만들고 전송되는 메시지의 세부 정보로 채웁니다.

var intent = new INSendMessageIntent (to, text, "", "MonkeyChat", from);

위에서 INSendMessageIntentResponse 만든 항목이 만들어지고 전달됩니다 NSUserActivity .

var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, activity);

메시지 INInteraction 보내기 의도(INSendMessageIntent) 및 방금 만든 응답(INSendMessageIntentResponse)에서 빌드됩니다.

var interaction = new INInteraction (intent, response);

마지막으로, 시스템은 상호 작용에 대한 알림입니다.

// Donate interaction to the system
interaction.DonateInteraction ((err) => {
  // Handle donation error
  ...
});

완료 처리기는 앱이 기부 성공 또는 실패에 응답할 수 있는 위치에 전달됩니다.

활동 모범 사례

Apple은 활동을 사용할 때 다음과 같은 모범 사례를 제안합니다.

  • 지연 페이로드 업데이트에 사용합니다 NeedsSave .
  • 현재 활동에 대한 강력한 참조를 유지합니다.
  • 상태를 복원하기에 충분한 정보가 포함된 작은 페이로드만 전송합니다.
  • 역방향 DNS 표기법을 사용하여 활동 유형 식별자가 고유하고 설명적인지 확인합니다.

Schema.org

NSUserActivity 와 같이 시스템에서 사용자가 현재 화면에서 작업하고 있는 정보를 이해하는 데 도움이 됩니다. Schema.org 웹 페이지에 유사한 기능을 추가합니다.

Schema.org 웹 사이트에 동일한 유형의 위치 기반 상호 작용을 제공할 수 있습니다. Apple은 Safari에서 네이티브 앱과 마찬가지로 볼 때도 작동하도록 새로운 위치 제안을 디자인했습니다.

일부 Schema.org 배경:

  • 오픈 웹 태그 어휘 표준을 제공합니다.
  • 웹 페이지에 구조적 메타데이터를 포함하여 작동합니다.
  • 사용 가능한 다양한 개념을 나타내는 500개가 넘는 스키마가 있습니다.
  • 개발자는 웹 사이트에서 구현하여 네이티브 앱에서 사용할 NSUserActivity 경우의 이점 중 일부를 얻을 수 있습니다.

스키마는 구조와 같은 트리에 정렬됩니다. 여기서 Restaurant과 같은 특정 형식은 로컬 비즈니스와 같은 보다 일반적인 형식에서 상속됩니다. 자세한 내용은 Schema.org 참조하세요.

예를 들어 웹 페이지에 다음 데이터가 포함된 경우:

<script type="application/ld+json">
{
  "@context":"http://schema.org",
  "@type":"Restaurant",
  "telephone":"(415) 781-1111",
  "url":"https://www.yanksing.com",
  "address":{
    "@type":"PostalAddress",
    "streetAddress":"101 Spear St",
    "addressLocality":"San Francisco",
    "postalCode":"94105",
    "addressRegion":"CA"
  },
  "aggregateRating":{
    "@type":"AggregateRating",
    "ratingValue":"3.5",
    "reviewCount":"2022"
  }
}
</script>

사용자가 Safari에서 이 페이지를 방문한 다음 다른 앱으로 전환하면 페이지의 위치 정보가 캡처되어 시스템의 다른 부분에서 위치 제안으로 제공됩니다(위의 활동에서 볼 수 있음).

Safari는 다음 스키마 속성을 준수하는 웹 페이지에서 모든 항목을 추출합니다.

  • PostalAddress
  • GeoCoordinates
  • 전화 속성입니다.

자세한 내용은 웹 태그를 사용한 검색 가이드를 참조하세요.

위치 제안 사용

이 다음 섹션에서는 시스템의 다른 부분(예: 지도 앱) 또는 기타 타사 앱에서 제공되는 위치 제안을 사용하는 방법을 설명합니다.

앱에서 위치 제안을 사용할 수 있는 두 가지 기본 방법이 있습니다.

  • QuickType 키보드를 통해.
  • 라우팅 앱에서 위치 정보를 직접 사용합니다.

위치 제안 및 QuickType 키보드

앱이 텍스트 기반 형식의 주소를 처리하는 경우 앱은 QuickType UI를 통해 위치 제안을 활용할 수 있습니다. iOS 10은 다음 기능을 사용하여 QuickType UI를 확장합니다.

  • 앱은 UI의 텍스트 필드에 대한 의미 체계 의도에 대한 힌트를 추가할 수 있습니다.
  • 앱은 앱에서 사전 제안을 받을 수 있습니다.
  • 앱은 향상된 자동 고침을 활용할 수 있습니다.

iOS 10에서 텍스트 필드 컨트롤의 새 TextContentType 속성을 사용하면 개발자가 사용자가 지정된 필드에 입력할 값에 대한 의미 체계 의도를 정의할 수 있습니다. 예시:

var textField = new UITextField();
textField.TextContentType = UITextContentType.FullStreetAddress;

앱에서 사용자가 지정된 필드에 전체 거리 주소를 입력해야 한다는 것을 시스템에 알릴 것입니다. 이렇게 하면 사용자가 이 필드에 값을 입력할 때 QuickType 키보드가 키보드에 위치 제안을 자동으로 제공할 수 있습니다.

다음은 정적 클래스에서 개발자가 사용할 수 있는 UITextContentType 몇 가지 일반적인 형식입니다.

  • Name
  • GivenName
  • FamilyName
  • Location
  • FullStreetAddress
  • AddressCityAndState
  • TelephoneNumber
  • EmailAddress

라우팅 앱 및 위치 제안

이 섹션에서는 라우팅 앱 내에서 직접 위치 제안을 사용하는 방법을 살펴봅니다. 라우팅 앱이 이 기능을 추가하려면 개발자는 다음과 같이 기존 프레임워크를 MKDirectionsRequest 활용합니다.

  • 멀티태스킹에서 앱을 승격합니다.
  • 앱을 라우팅 앱으로 등록하려면
  • MapKit MKDirectionsRequest 개체를 사용하여 앱 시작을 처리합니다.
  • iOS에 사용자 참여에 따라 적절한 시기에 사용자에게 앱을 제안하는 방법을 배울 수 있는 기능을 제공합니다.

MapKit MKDirectionsRequest 개체로 앱이 시작되면 자동으로 요청된 위치에 대한 사용자 지침을 제공하기 시작하거나 사용자가 길 안내를 쉽게 시작할 수 있도록 하는 UI를 제공해야 합니다. 예시:

using System;
using Foundation;
using UIKit;
using MapKit;
using CoreLocation;

namespace MonkeyChat
{
  [Register ("AppDelegate")]
  public class AppDelegate : UIApplicationDelegate, IUISplitViewControllerDelegate
  {
    ...
    
    public override bool OpenUrl (UIApplication app, NSUrl url, NSDictionary options)
    {
      if (MKDirectionsRequest.IsDirectionsRequestUrl (url)) {
        var request = new MKDirectionsRequest (url);
        var coordinate = request.Destination?.Placemark.Location?.Coordinate;
        var address = request.Destination.Placemark.AddressDictionary;
        if (coordinate.IsValid()) {
          var geocoder = new CLGeocoder ();
          geocoder.GeocodeAddress (address, (place, err) => {
            // Handle the display of the address

          });
        }
      }

      return true;
    }
  }    
}

이 코드를 자세히 살펴보세요. 테스트하여 유효한 대상 요청인지 확인합니다.

if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {

이 경우 URL에서 만듭니다 MKDirectionsRequest .

var request = new MKDirectionsRequest(url);

iOS 10의 새로운 기능으로, 개발자가 주소를 인코딩해야 하는 지역 좌표가 없는 주소를 앱에 보낼 수 있습니다.

var geocoder = new CLGeocoder();
geocoder.GeocodeAddress(address, (place, err)=> {
  // Handle the display of the address
  
});

미디어 앱 제안

앱이 iOS 10을 사용하여 팟캐스트 앱 또는 오디오 또는 비디오와 같은 스트리밍 미디어 콘텐츠와 같은 모든 유형의 미디어를 처리하는 경우 시스템에서 미디어 제안을 활용할 수 있습니다.

미디어를 처리하는 앱의 경우 iOS는 다음 동작을 지원합니다.

  • iOS는 사용자가 이전 동작에 따라 사용할 가능성이 있는 앱을 승격합니다.
  • 앱과 관련된 제안은 추천 및 오늘 보기에 표시됩니다.
  • 앱이 다음 트리거 중 하나를 충족하는 경우 잠금 화면 제안으로 승격될 수 있습니다.
    • 헤드폰 또는 Bluetooth 장치를 연결한 후 연결합니다.
    • 차에 타고 후.
    • 집이나 직장에 도착한 후.

개발자는 iOS 10에 간단한 API 호출을 포함하여 미디어 앱 사용자에게 보다 매력적인 잠금 화면 환경을 만들 수 있습니다. 클래스를 MPPlayableContentManager 사용하여 미디어 재생을 관리하면 앱의 잠금 화면에 전체 미디어 컨트롤(예: 음악 앱에서 제공하는 컨트롤)이 표시됩니다.

using System;
using MediaPlayer;
using UIKit;

namespace MonkeyPlayer
{
  public class PlayableContentDelegate : MPPlayableContentDelegate
  {
    #region Constructors
    public PlayableContentDelegate ()
    {
    }
    #endregion

    #region Override methods
    public override void InitiatePlaybackOfContentItem (MPPlayableContentManager contentManager, Foundation.NSIndexPath indexPath, Action<Foundation.NSError> completionHandler)
    {
      // Access the media item to play
      var item = LoadMediaItem (indexPath);

      // Populate the lock screen
      PopulateNowPlayingItem (item);

      // Prep item to be played
      var status = PreparePlayback (item);

      // Call completion handler
      completionHandler (null);
    }
    #endregion

    #region Public Methods
    public MPMediaItem LoadMediaItem (Foundation.NSIndexPath indexPath)
    {
      var item = new MPMediaItem ();

      // Load item from media store
      ...

      return item;
    }

    public void PopulateNowPlayingItem (MPMediaItem item)
    {
      // Get Info Center and album art
      var infoCenter = MPNowPlayingInfoCenter.DefaultCenter;
      var albumArt = (item.Artwork == null) ? new MPMediaItemArtwork (UIImage.FromFile ("MissingAlbumArt.png")) : item.Artwork;

      // Populate Info Center
      infoCenter.NowPlaying.Title = item.Title;
      infoCenter.NowPlaying.Artist = item.Artist;
      infoCenter.NowPlaying.AlbumTitle = item.AlbumTitle;
      infoCenter.NowPlaying.PlaybackDuration = item.PlaybackDuration;
      infoCenter.NowPlaying.Artwork = albumArt;
    }

    public bool PreparePlayback (MPMediaItem item)
    {
      // Prepare media item for playback
      ...

      // Return results
      return true;
    }
    #endregion
  }
}

요약

이 문서에서는 사전 제안을 다루며 개발자가 이를 사용하여 Xamarin.iOS 앱으로 트래픽을 구동하는 방법을 보여 줍니다. 사전 제안을 구현하는 단계와 사용 지침을 제시했습니다.