Xamarin.ios의 siri 바로 가기Siri Shortcuts in Xamarin.iOS

IOS 10에서 Apple은 SiriKit를 도입 하 여 siri와 상호 작용 하는 메시지, VoIP 호출, 지불, 작업을 수행 하는 등의 작업을 수행할 수 있습니다.In iOS 10, Apple introduced SiriKit, making it possible to build messaging, VoIP calling, payments, workouts, ride booking, and photo search apps that interact with Siri.

IOS 11에서는 sirikit에서 더 많은 유형의 앱을 지원 하 고 UI 사용자 지정을 위한 유연성을 높일 수 있습니다.In iOS 11, SiriKit gained support for more types of apps and greater flexibility for UI customization.

iOS 12는 Siri 바로 가기를 추가 하 여 모든 유형의 앱이 해당 기능을 Siri에 노출할 수 있도록 합니다.iOS 12 adds Siri Shortcuts, allowing all types of apps to expose their functionality to Siri. Siri는 특정 앱 기반 작업이 사용자와 가장 관련이 있는 경우를 학습 하 고이 정보를 사용 하 여 _바로 가기를_통해 잠재적 작업을 제안 합니다.Siri learns when certain app-based tasks are most relevant to the user and uses this knowledge to suggest potential actions via shortcuts. 바로 가기를 누르거나 음성 명령을 사용 하 여 호출 하면 앱을 열거나 백그라운드 작업을 실행 합니다.Tapping on a shortcut or invoking it with a voice command will open an app or run a background task.

바로 가기를 사용 하 여 일반적인 작업을 수행 하는 사용자의 능력을 가속화 해야 합니다. 대부분의 경우에는 해당 앱을 열지 않아도 됩니다.Shortcuts should be used to accelerate a user's ability to accomplish a common task – in many cases without even opening the app in question.

샘플 앱: 수프 ChefSample app: Soup Chef

Siri 바로 가기를 더 잘 이해 하려면 수프 Chef 샘플 앱을 살펴보세요.To better understand Siri Shortcuts, take a look at the Soup Chef sample app. 수프 Chef를 사용 하면 사용자가 허수 수프 식당의 주문을 수행 하 고, 주문 기록을 확인 하 고, Siri와 상호 작용 하 여 수프를 주문할 때 사용할 구를 정의할 수 있습니다.Soup Chef allows users to place orders from an imaginary soup restaurant, view their order history, and define phrases to use when ordering soup by interacting with Siri.

IOS 12 시뮬레이터 또는 장치에서 수프 Chef을 테스트 하기 전에 바로 가기를 디버그할 때 유용한 다음 두 가지 설정을 사용 하도록 설정 합니다.Before testing Soup Chef on an iOS 12 simulator or device, enable the following two settings, which are useful when debugging shortcuts:

  • 설정 앱에서 개발자 > 최근 바로 가기를 표시하도록 설정 합니다.In the Settings app, enable Developer > Display Recent Shortcuts.
  • 설정 앱에서 개발자 > 잠금 화면에서 기부금을 표시하도록 설정 합니다.In the Settings app, enable Developer > Display Donations on Lock Screen.

이러한 디버그 설정을 사용 하면 iOS 잠금 화면 및 검색 화면에서 최근에 만든 (예측 하지 않고) 바로 가기를 쉽게 찾을 수 있습니다.These debug settings make it easy to find recently-created (instead of predicted) shortcuts on the iOS lock screen and search screen.

샘플 앱을 사용 하려면 다음을 수행 합니다.To use the sample app:

  • IOS 12 시뮬레이터 또는 장치에서 수프 Chef 샘플 앱을 설치 하 고 실행 합니다.Install and run the Soup Chef sample app on an iOS 12 simulator or device.
  • 오른쪽 위에 있는 + 단추를 클릭 하 여 새 주문을 만듭니다.Click the + button in the upper-right to create a new order.
  • 수프 유형을 선택 하 고, 수량 및 옵션을 지정 하 고, 주문 주문을 누릅니다.Select a type of soup, specify a quantity and options, and tap Place Order.
  • 주문 기록 화면에서 새로 만든 주문을 탭 하 여 세부 정보를 확인 합니다.On the Order History screen, tap the newly-created order to view its details.
  • 주문 세부 정보 화면 아래쪽에서 Siri에 추가를 누릅니다.At the bottom of order details screen, tap Add to Siri.
  • 주문과 연결할 음성 문구를 기록 하 고 완료를 누릅니다.Record a voice phrase to associate with the order and tap Done.
  • 수프 Chef를 최소화 하 고, Siri를 호출 하 고, 방금 기록한 음성 구를 사용 하 여 주문을 다시 입력 합니다.Minimize Soup Chef, invoke Siri, and place the order again by using the voice phrase you just recorded.
  • Siri가 주문을 완료 한 후 수프 Chef를 다시 열고 주문 기록 화면에 새 주문이 나열 되는지 확인 합니다.After Siri completes the order, re-open Soup Chef and notice that the new order is listed on the Order History screen.

샘플 앱에서는 다음을 수행 하는 방법을 보여 줍니다.The sample app demonstrates how to:

Info.plist 및 info.plistInfo.plist and Entitlements.plist

수프 Chef 코드에 대해 자세히 살펴보기 전에 info.plistinfo.plist 파일을 살펴보세요.Before digging more deeply in to the Soup Chef code, take a look at its Info.plist and Entitlements.plist files.

Info.plistInfo.plist

SoupChef 프로젝트의 Info.plist 파일은 번들 식별자com.xamarin.SoupChef으로 정의 합니다.The Info.plist file in the SoupChef project defines the Bundle Identifier as com.xamarin.SoupChef. 이 번들 식별자는이 문서의 뒷부분에서 설명 하는 의도 및 의도 UI 확장의 번들 식별자에 대 한 접두사로 사용 됩니다.This bundle identifier will be used as a prefix for the bundle identifiers of the Intents and Intents UI extensions discussed later in this document.

Info.plist 파일에는 다음 항목도 포함 됩니다 .The Info.plist file also contains the following:

<key>NSUserActivityTypes</key>
<array>
    <string>OrderSoupIntent</string>
    <string>com.xamarin.SoupChef.viewMenu</string>
</array>

NSUserActivityTypes 키/값 쌍은 수프 Chef에서 OrderSoupIntent를 처리 하는 방법 및 ""의 ActivityType 있는 NSUserActivity 를 인식 함을 나타냅니다.This NSUserActivityTypes key/value pair indicates that Soup Chef knows how to handle an OrderSoupIntent, and an NSUserActivity having an ActivityType of "com.xamarin.SoupChef.viewMenu".

응용 프로그램 자체에 전달 되는 활동 및 사용자 지정 의도는 확장과는 반대로 AppDelegate ( ContinueUserActivity 메서드에서 UIApplicationDelegate 처리 됩니다.Activities and custom intents passed to the app itself, as opposed to its extensions, are handled in the AppDelegate (a UIApplicationDelegate by the ContinueUserActivity method.

Entitlements.plistEntitlements.plist

SoupChef 프로젝트의 info.plist 파일에는 다음이 포함 됩니다.The Entitlements.plist file in the SoupChef project contains the following:

<key>com.apple.security.application-groups</key>
<array>
    <string>group.com.xamarin.SoupChef</string>
</array>
<key>com.apple.developer.siri</key>
<true/>

이 구성은 앱에서 "SoupChef" 앱 그룹을 사용 함을 나타냅니다.This configuration indicates that the app uses the "group.com.xamarin.SoupChef" app group. SoupChefIntents 앱 확장은이 동일한 앱 그룹을 사용 하 여 두 프로젝트를 공유할 수 있습니다 NSUserDefaultsThe SoupChefIntents app extension uses this same app group, which allows the two projects to share NSUserDefaults 데이터data.

com.apple.developer.siri 키는 앱이 Siri와 상호 작용 함을 나타냅니다.The com.apple.developer.siri key indicates that the app interacts with Siri.

참고

SoupChef 프로젝트의 빌드 구성에서는 사용자 지정 자격info.plist로 설정 합니다.The SoupChef project's build configuration sets Custom Entitlements to Entitlements.plist.

NSUserActivity 바로 가기를 사용 하 여 앱 열기Using an NSUserActivity shortcut to open an app

특정 콘텐츠를 표시 하는 앱을 여는 바로 가기를 만들려면 NSUserActivity 만들고 바로 가기를 열려는 화면에 대 한 보기 컨트롤러에 연결 합니다.To create a shortcut that opens an app to display specific content, create an NSUserActivity and attach it to the view controller for the screen you'd like the shortcut to open.

NSUserActivity 설정Setting up an NSUserActivity

메뉴 화면에서 SoupMenuViewController NSUserActivity 만들고 뷰 컨트롤러의 UserActivity 속성에 할당 합니다.On the menu screen, SoupMenuViewController creates an NSUserActivity and assigns it to the view controller's UserActivity property:

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    UserActivity = NSUserActivityHelper.ViewMenuActivity;
}

UserActivity 속성을 설정 하면 활동이 Siri로 donates 됩니다.Setting the UserActivity property donates the activity to Siri. 이에 대 한 Siri는이 활동이 사용자와 관련 된 시기와 위치에 대 한 정보를 획득 하 고 나중에 더 잘 제안 하기 위해 학습 합니다.From this donation, Siri gains information about when and where this activity is relevant to the user and learns to better suggest it in the future.

NSUserActivityHelperSoupKit 클래스 라이브러리의 SoupChef 솔루션에 포함 된 유틸리티 클래스입니다.NSUserActivityHelper is a utility class included in the SoupChef solution, in the SoupKit class library. NSUserActivity 만들고 Siri 및 검색과 관련 된 다양 한 속성을 설정 합니다.It creates an NSUserActivity and sets various properties related to Siri and search:

public static string ViewMenuActivityType = "com.xamarin.SoupChef.viewMenu";

public static NSUserActivity ViewMenuActivity {
    get
    {
        var userActivity = new NSUserActivity(ViewMenuActivityType)
        {
            Title = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_TITLE", "View menu activity title"),
            EligibleForSearch = true,
            EligibleForPrediction = true
        };

        var attributes = new CSSearchableItemAttributeSet(NSUserActivityHelper.SearchableItemContentType)
        {
            ThumbnailData = UIImage.FromBundle("tomato").AsPNG(),
            Keywords = ViewMenuSearchableKeywords,
            DisplayName = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_TITLE", "View menu activity title"),
            ContentDescription = NSBundleHelper.SoupKitBundle.GetLocalizedString("VIEW_MENU_CONTENT_DESCRIPTION", "View menu content description")
        };
        userActivity.ContentAttributeSet = attributes;

        var phrase = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_LUNCH_SUGGESTED_PHRASE", "Voice shortcut suggested phrase");
        userActivity.SuggestedInvocationPhrase = phrase;
        return userActivity;
    }
}

특히 다음과 같은 사항에 유의 하십시오.Note the following in particular:

  • EligibleForPredictiontrue로 설정 하면 Siri가이 작업을 예측 하 고이 작업을 바로 가기로 표시할 수 있음을 나타냅니다.Setting EligibleForPrediction to true indicates that Siri can predict this activity and surface it as a shortcut.
  • ContentAttributeSet 배열은 iOS 검색 결과에 NSUserActivity를 포함 하는 데 사용 되는 표준 CSSearchableItemAttributeSet 입니다.The ContentAttributeSet array is a standard CSSearchableItemAttributeSet used to include an NSUserActivity in iOS search results.
  • SuggestedInvocationPhrase 는 문구를 바로 가기로 할당할 때 사용자에 게 제안 하는 것이 좋습니다.SuggestedInvocationPhrase is a phrase that Siri will suggest to the user as a potential choice when assigning a phrase to a shortcut.

NSUserActivity 바로 가기 처리Handling an NSUserActivity shortcut

사용자가 호출 하는 NSUserActivity 바로 가기를 처리 하기 위해 iOS 응용 프로그램은 전달 된 NSUserActivity 개체의 ActivityType 필드에 따라 응답 하 여 AppDelegate 클래스의 ContinueUserActivity 메서드를 재정의 해야 합니다.To handle an NSUserActivity shortcut invoked by a user, an iOS application must override the ContinueUserActivity method of the AppDelegate class, responding based on the ActivityType field of the passed-in NSUserActivity object:

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    // ...
    else if (userActivity.ActivityType == NSUserActivityHelper.ViewMenuActivityType)
    {
        HandleUserActivity();
        return true;
    }
    // ...
}

이 메서드는 메뉴 화면에 segue를 찾고 호출 하는 HandleUserActivity를 호출 합니다.This method calls HandleUserActivity, which finds the segue to the menu screen and invokes it:

void HandleUserActivity()
{
    var rootViewController = Window?.RootViewController as UINavigationController;
    var orderHistoryViewController = rootViewController?.ViewControllers?.FirstOrDefault() as OrderHistoryTableViewController;
    if (orderHistoryViewController is null)
    {
        Console.WriteLine("Failed to access OrderHistoryTableViewController.");
        return;
    }
    var segue = OrderHistoryTableViewController.SegueIdentifiers.SoupMenu;
    orderHistoryViewController.PerformSegue(segue, null);
}

NSUserActivity에 구 할당Assigning a phrase to an NSUserActivity

NSUserActivity에 구를 할당 하려면 iOS 설정 앱을 열고 siri &를 선택 하 > 내 바로 가기를 검색합니다.To assign a phrase to an NSUserActivity, open the iOS Settings app and choose Siri & Search > My Shortcuts. 그런 다음 바로 가기 (이 경우 "주문 점심")를 선택 하 고 구를 기록 합니다.Then, select the shortcut (in this case, "Order Lunch") and record a phrase.

Siri를 호출 하 고이 구를 사용 하면 메뉴 화면에 수프 Chef가 열립니다.Invoking Siri and using this phrase will open Soup Chef to the menu screen.

사용자 지정 의도 바로 가기를 사용 하 여 작업 수행Using a custom intent shortcut to perform a task

사용자 지정 의도 정의Defining a custom intent

사용자가 앱과 관련 된 특정 작업을 신속 하 게 완료할 수 있도록 하는 바로 가기를 제공 하려면 사용자 지정 의도를 만듭니다.To provide a shortcut that allows a user to quickly complete a specific task related to your app, create a custom intent. 사용자 지정 의도는 사용자가 완료 해야 할 수 있는 작업, 해당 작업과 관련 된 매개 변수 및 작업 실행으로 인해 발생 하는 잠재적 응답을 나타냅니다.A custom intent represents a task a user may want to complete, parameters relevant to that task, and potential responses resulting from the task's execution. 사용자 지정 의도가 정의 된 방식에 따라 호출을 호출 하면 앱을 열거나 백그라운드 작업을 실행할 수 있습니다.Depending on how a custom intent is defined, invoking it can either open your app or run a background task.

Xcode 10을 사용 하 여 사용자 지정 의도를 만듭니다.Use Xcode 10 to create custom intents. SoupChef 리포지토리에서사용자 지정 의도는 목표-C 프로젝트인 OrderSoupIntentCodeGen에 정의 됩니다.In the SoupChef repository, the custom intent is defined in OrderSoupIntentCodeGen, an Objective-C project. 이 프로젝트를 열고 OrderSoup 의도를 보려면 프로젝트 탐색기 에서 해당 파일을 선택 합니다 .Open this project and select the Intents.intentdefinition file in the Project Navigator to view the OrderSoup intent.

다음 사항을 참고하십시오.Notice the following:

  • 의도에는 Order 범주가 있습니다.The intent has a Category of Order. 사용자 지정 의도에 사용할 수 있는 다양 한 미리 정의 된 범주가 있습니다. 사용자 지정 의도를 사용 하도록 설정할 작업과 가장 일치 하는 항목을 선택 합니다.There are various pre-defined categories that can be used for custom intents; select the one that most closely matches the task your custom intent will enable. 이는 수프 주문 앱 이므로 OrderSoupIntentOrder를 사용 합니다.Since this is a soup ordering app, OrderSoupIntent uses Order.
  • 확인 확인란은 siri가 작업을 실행 하기 전에 확인을 요청 해야 하는지 여부를 나타냅니다.The Confirmation checkbox indicates whether or not Siri must request confirmation before executing the task. 수프 Chef의 주문 수프 의도에 대해이 옵션은 사용자가 구매를 수행 하기 때문에 사용 하도록 설정 됩니다.For the Order Soup intent in Soup Chef, this option is enabled since the user is making a purchase.
  • . Intentdefinition 파일의 parameters 섹션은 바로 가기와 관련 된 매개 변수를 정의 합니다.The Parameters section of the .intentdefinition file defines the parameters relevant to a shortcut. 수프 순서를 적용 하려면 수프 Chef는 수프의 유형, 수량 및 관련 옵션을 알아야 합니다.To place a soup order, Soup Chef must know the type of soup, its quantity, and any associated options. 각 매개 변수에는 형식이 있습니다. 미리 정의 된 형식으로 나타낼 수 없는 매개 변수는 사용자 지정으로 설정 됩니다.Each parameter has a type; parameter that cannot be represented by a predefined type are set as Custom.
  • 바로 가기 형식 인터페이스에서는 siri가 바로 가기를 제안할 때 사용할 수 있는 다양 한 매개 변수 조합을 설명 합니다.The Shortcut Types interface describes the various parameter combinations Siri can use when suggesting your shortcut. 연결 된 제목부제목 섹션에서 사용자에 게 제안 된 바로 가기를 표시할 때 siri에서 사용할 메시지를 정의할 수 있습니다.The associated Title and Subtitle sections allow you to define the messages Siri will use when presenting a suggested shortcut to the user.
  • 추가 사용자 조작을 위해 앱을 열지 않고 실행할 수 있는 바로 가기에 대해 백그라운드 실행 지원 확인란을 선택 해야 합니다.The Supports Background Execution checkbox should be selected for any shortcut that can be executed without opening the app for further user interaction.

사용자 지정 의도 응답 정의Defining custom intent responses

OrderSoup 의도 아래에 중첩 된 응답 항목은 수프 order에서 발생 하는 잠재적 응답을 나타냅니다.The Response item nested below the OrderSoup intent represents the potential responses that result from a soup order.

OrderSoup 의도의 응답 정의에서 다음에 유의 하십시오.In the OrderSoup intent's response definition, note the following:

  • 응답의 속성 을 사용 하 여 사용자에 게 다시 전달 되는 메시지를 사용자 지정할 수 있습니다.A response's Properties can be used to customize the message communicated back to the user. OrderSoup 내재 응답에는 수프waitTime 속성이 있습니다.The OrderSoup intent response has soup and waitTime properties.
  • 응답 템플릿은 의도의 작업이 완료 된 후 상태를 표시 하는 데 사용할 수 있는 다양 한 성공 및 실패 메시지를 지정 합니다.The Response Templates specify the various success and failure messages that can be used to indicate status after an intent's task has completed.
  • 성공을 나타내는 응답에 대해 성공 확인란을 선택 해야 합니다.The Success checkbox should be selected for responses that indicate success.
  • OrderSoupIntent success 응답은 수프waitTime 속성을 사용 하 여 수프 주문이 준비 되는 경우를 설명 하는 친숙 하 고 유용한 메시지를 제공 합니다.The OrderSoupIntent success response uses the soup and waitTime properties to provide a friendly and useful message describing when the soup order will be ready.

사용자 지정 의도에 대 한 코드 생성Generating code for the custom intent

이 사용자 지정 의도 정의를 포함 하는 Xcode 프로젝트를 빌드하면 Xcode에서 사용자 지정 의도 및 응답을 사용 하 여 프로그래밍 방식으로 상호 작용 하는 데 사용할 수 있는 코드를 생성 합니다.Building the Xcode project containing this custom intent definition causes Xcode to generate code that can be used to interact programmatically with the custom intent and its responses.

이 생성 된 코드를 보려면 다음을 수행 합니다.To view this generated code:

  • AppDelegate를 엽니다.Open AppDelegate.m.
  • 사용자 지정 의도의 헤더 파일에 가져오기 추가: #import "OrderSoupIntent.h"Add an import to the custom intent's header file: #import "OrderSoupIntent.h"
  • 클래스의 모든 메서드에서 OrderSoupIntent에 대 한 참조를 추가 합니다.In any method in the class, add a reference to OrderSoupIntent.
  • OrderSoupIntent를 마우스 오른쪽 단추로 클릭 하 고 정의로 이동을 선택 합니다.Right-click on OrderSoupIntent and choose Jump to Definition.
  • 새로 열린 파일 ( OrderSoupIntent)을 마우스 오른쪽 단추로 클릭 하 고 Finder에 표시를 선택 합니다.Right-click in the newly-opened file, OrderSoupIntent.h, and select Show in Finder.
  • 이렇게 하면 생성 된 코드를 포함 하는 .h 및. m 파일이 포함 된 Finder 창이 열립니다.This will open a Finder window that contains a .h and .m file containing the generated code.

생성 되는 코드는 다음과 같습니다.This generated code includes:

  • OrderSoupIntent – 사용자 지정 의도를 나타내는 클래스입니다.OrderSoupIntent – A class that represents the custom intent.
  • OrderSoupIntentHandling – 의도를 실행 해야 하는지 확인 하는 데 사용 되는 메서드와 실제로이를 실행 하는 메서드를 정의 하는 프로토콜입니다.OrderSoupIntentHandling – A protocol that defines the methods that will be used to confirm that the intent should be executed and the method that actually executes it.
  • OrderSoupIntentResponseCode – 다양 한 응답 상태를 정의 하는 열거형입니다.OrderSoupIntentResponseCode – An enum that defines various response statuses.
  • OrderSoupIntentResponse – 의도 된 실행에 대 한 응답을 나타내는 클래스입니다.OrderSoupIntentResponse – a class that represents the response to an intent's execution.

사용자 지정 의도에 대 한 바인딩 만들기Creating a binding to the custom intent

Xamarin.ios 앱에서 Xcode에 의해 생성 된 코드를 사용 하려면 해당에 대 한 C# 바인딩을 만듭니다.To use the code generated by Xcode in a Xamarin.iOS app, create a C# binding for it.

정적 라이브러리 및 C# 바인딩 정의 만들기Creating a static library and C# binding definitions

SoupChef 리포지토리에서 OrderSoupIntentStaticLib 폴더를 살펴보고 OrderSoupIntentStaticLib. xcodeproj Xcode 프로젝트를 엽니다.In the SoupChef repository, take a look in the OrderSoupIntentStaticLib folder, and open the OrderSoupIntentStaticLib.xcodeproj Xcode project.

Cocoa Touch 정적 라이브러리 프로젝트에는 Xcode에 의해 생성 된 OrderSoupIntentOrderSoupIntent 파일이 포함 되어 있습니다.This Cocoa Touch Static Library project contains the OrderSoupIntent.h and OrderSoupIntent.m files generated by Xcode.

정적 라이브러리 프로젝트 빌드 설정 구성Configuring the static library project build settings

Xcode 프로젝트 탐색기에서 최상위 프로젝트 OrderSoupIntentStaticLib를 선택 하 고 빌드 > 단계로이동 하 여 소스를 컴파일합니다.In the Xcode Project Navigator, select the top-level project, OrderSoupIntentStaticLib, and navigate to Build Phases > Compile Sources. 여기에 OrderSoupIntent ( OrderSoupIntent를 가져오는)가 나열 됩니다.Notice that OrderSoupIntent.m (which imports OrderSoupIntent.h) is listed here. 라이브러리를 사용 하는 이진 파일 링크에는 의도 프레임 워크기본 프레임 워크가 포함 되어 있습니다.In Link Binary With Libraries, notice that Intents.framework and Foundation.framework are included. 이러한 설정이 적용 되 면 프레임 워크가 올바르게 빌드됩니다.With these settings in place, the framework will build correctly.

정적 라이브러리 빌드 및 바인딩 정의 C# 생성Building the static library and generating C# bindings definitions

정적 라이브러리를 빌드하고 해당 라이브러리에 C# 대 한 바인딩 정의를 생성 하려면 다음 단계를 수행 합니다.To build the static library and generate C# bindings definitions for it, follow these steps:

  • Xcode에서 만든 .h 및. m 파일에서 바인딩 정의를 생성 하는 데 사용 되는 도구인 Install Sharpie.Install Objective Sharpie, the tool used to generate bindings definitions from the .h and .m files created by Xcode.

  • Xcode 10 명령줄 도구를 사용 하도록 시스템을 구성 합니다.Configure your system to use Xcode 10 Command Line Tools:

    경고

    선택한 명령줄 도구를 업데이트 하면 시스템에 설치 된 Xcode의 모든 버전에 영향을 줍니다.Updating the selected Command Line Tools impacts all installed versions of Xcode on your system. 수프 Chef 샘플 앱 사용을 완료 한 후에는이 설정을 원래 구성으로 되돌려야 합니다.When you are done using the Soup Chef sample app, be sure to revert this setting to its original configuration.

    • Xcode에서 Xcode > 기본 설정 > 위치 를 선택 하 고, 명령줄 도구 를 시스템에서 사용할 수 있는 최신 Xcode 10 설치로 설정 합니다.In Xcode, choose Xcode > Preferences > Locations and set Command Line Tools to the most current Xcode 10 installation available on your system.
  • 터미널에서 OrderSoupIntentStaticLib 디렉터리를 cd 합니다.In the terminal, cd to the OrderSoupIntentStaticLib directory.

  • 다음을 빌드하는 make을 입력 합니다.Type make, which builds:

    • 정적 라이브러리 libOrderSoupIntentStaticLibThe static library, libOrderSoupIntentStaticLib.a
    • Bo 출력 디렉터리에서 C# 바인딩 정의:In the bo output directory, C# bindings definitions:
      • ApiDefinitions.csApiDefinitions.cs
      • StructsAndEnums.csStructsAndEnums.cs

이 정적 라이브러리와 연결 된 바인딩 정의에 의존 하는 OrderSoupIntentBindings 프로젝트는 이러한 항목을 자동으로 빌드합니다.The OrderSoupIntentBindings project, which relies on this static library and its associated bindings definitions, builds these items automatically. 그러나 위의 프로세스를 통해 수동으로 실행 하면 예상 대로 빌드됩니다.However, manually running through the above process will ensure that it builds as expected.

정적 라이브러리를 만드는 방법 및 목표 Sharpie를 사용 하 여 C# 바인딩 정의를 만드는 방법에 대 한 자세한 내용은 IOS 목표-C 라이브러리 바인딩 연습을 참조 하세요.For more information about creating a static library and using Objective Sharpie to create C# bindings definitions, take a look at the Binding an iOS Objective-C library walkthrough.

바인딩 라이브러리 만들기Creating a bindings library

정적 라이브러리 및 C# 바인딩 정의를 만든 후에는 xamarin.ios 프로젝트에서 Xcode 생성 된 의도 관련 코드를 사용 하는 데 필요한 나머지 부분이 바인딩 라이브러리입니다.With the static library and the C# bindings definitions created, the remaining piece necessary to consume the Xcode-generated intent-related code in a Xamarin.iOS project is a bindings library.

수프 Chef 리포지토리에서 SoupChef 파일을 엽니다.In the Soup Chef repository, open up the SoupChef.sln file. 무엇 보다도이 솔루션은 위에서 생성 된 정적 라이브러리에 대 한 바인딩 라이브러리인 OrderSoupIntentBinding를 포함 합니다.Among other things, this solution contains OrderSoupIntentBinding, a bindings library for the static library generated above.

특히이 프로젝트에는 다음이 포함 됩니다.Notice in particular that this project includes:

  • ApiDefinitions.cs – 목표 Sharpie이 프로젝트에 추가 하 고이 프로젝트에 추가 된 파일입니다.ApiDefinitions.cs – A file generated above by Objective Sharpie and added to this project. 이 파일의 빌드 작업Objcbindingapidefinition으로 설정 되어 있습니다.This file's Build Action is set to ObjcBindingApiDefinition.
  • StructsAndEnums.cs – 목표 Sharpie 하 여 위에서 생성 되 고이 프로젝트에 추가 된 다른 파일입니다.StructsAndEnums.cs – Another file generated above by Objective Sharpie and added to this project. 이 파일의 빌드 작업Objcbindingcor9로설정 됩니다.This file's Build Action is set to ObjcBindingCoreSource.
  • 위에서 빌드한 정적 라이브러리인 libOrderSoupIntentStaticLib에 대 한 네이티브 참조 입니다.A Native Reference to libOrderSoupIntentStaticLib.a, the static library built above.

참고

ApiDefinitions.csStructsAndEnums.cs 모두 [Watch (5,0), iOS (12,0)]와 같은 특성을 포함 합니다.Both ApiDefinitions.cs and StructsAndEnums.cs contain attributes such as [Watch (5,0), iOS (12,0)]. 목표 Sharpie에서 생성 된 이러한 특성은이 프로젝트에 필요 하지 않기 때문에 주석으로 처리 되었습니다.These attributes, generated by Objective Sharpie, have been commented out since they aren't necessary for this project.

C# 바인딩 라이브러리를 만드는 방법에 대 한 자세한 내용은 iOS 목표 가져오기-C 라이브러리 연습을 참조 하세요.For more information about creating a C# bindings library, take a look at the Binding an iOS Objective-C Library walkthrough.

SoupChef 프로젝트에는 OrderSoupIntentBinding에 대 한 참조가 포함 되어 있습니다 .이는 이제 포함 된 클래스, C#인터페이스 및 열거형에 액세스할 수 있음을 의미 합니다.Notice that the SoupChef project contains a reference to OrderSoupIntentBinding, which means that it can now access, in C#, the classes, interfaces, and enums it contains:

  • OrderSoupIntent
  • OrderSoupIntentHandling
  • OrderSoupIntentResponse
  • OrderSoupIntenseResponseCode

솔루션에 intentdefinition 파일 추가Adding the .intentdefinition file to your solution

C# SoupChef 솔루션에서 SoupKit 프로젝트는 앱과 해당 확장 간에 공유 되는 코드를 포함 합니다.In the C# SoupChef solution, the SoupKit project contains code shared between the app and its extensions. 의도. intentdefinition 파일은 SoupKitBase. Lproj 디렉터리에 배치 되었으며 콘텐츠의 빌드 작업 을 포함 합니다.The Intents.intentdefinition file has been placed in the Base.lproj directory of SoupKit, and it has a Build Action of Content. 빌드 프로세스는 응용 프로그램이 제대로 작동 하는 데 필요한 수프 Chef app 번들로이 파일을 복사 합니다.The build process copies this file into the Soup Chef app bundle, where it is required for the app to function correctly.

기증 의도Donating an intent

Siri가 바로 가기를 제안 하려면 먼저 바로 가기가 관련 된 경우를 이해 해야 합니다.In order for Siri to suggest a shortcut, it must first understand when the shortcut is relevant.

Siri를 이해 하기 위해 수프 Chef는 사용자가 수프 주문을 배치할 때마다 Siri에 대 한 의도 를 제공 합니다.To give Siri this understanding, Soup Chef donates an intent to Siri each time the user places a soup order. 이러한 기부에 기반 하 여 기증 된 곳에서 기증 된 경우 포함 된 매개 변수 – Siri는 나중에 바로 가기를 제안할 시기를 학습 합니다.Based on this donation – when it was donated, where it was donated, the parameters it contains – Siri learns when to suggest the shortcut in the future.

SoupChefSoupOrderDataManager 클래스를 사용 하 여 기부금을 넣습니다.SoupChef uses the SoupOrderDataManager class to place donations. 사용자에 대 한 수프 order를 설정 하기 위해 호출 하는 경우 PlaceOrder 메서드는 DonateInteraction를 호출 합니다.When called to place a soup order for a user, the PlaceOrder method in turn calls DonateInteraction:

void DonateInteraction(Order order)
{
    var interaction = new INInteraction(order.Intent, null);
    interaction.Identifier = order.Identifier.ToString();
    interaction.DonateInteraction((error) =>
    {
        // ...
    });
}

의도를 인출 한 후에는 INInteraction에 래핑됩니다.After fetching an intent, it is wrapped in an INInteraction. INInteraction에는 Identifier 제공 됩니다.The INInteraction is given an Identifier 주문에 대 한 고유 ID와 일치 합니다 .이는 나중에 더 이상 유효 하지 않은 의도 기부를 삭제할 때 유용 합니다.that matches the unique ID of the order (this will be helpful later when deleting intent donations that are no longer valid). 그런 다음 상호 작용이 Siri에 기증 됩니다.Then, the interaction is donated to Siri.

order.Intent getter에 대 한 호출은 해당 Quantity, Soup, Options및 이미지를 설정 하 여 주문을 나타내는 OrderSoupIntent를 가져오고 사용자가 Siri에 대 한 구를 기록 하 여 의도에 연결 하는 데 사용할 수 있는 호출 문구를 가져옵니다. :The call to the order.Intent getter fetches an OrderSoupIntent that represents the order by setting its Quantity, Soup, Options, and image, and an invocation phrase to use as a suggestion when the user records a phrase for Siri to associate with the intent:

public OrderSoupIntent Intent
{
    get
    {
        var orderSoupIntent = new OrderSoupIntent();
        orderSoupIntent.Quantity = new NSNumber(Quantity);
        orderSoupIntent.Soup = new INObject(MenuItem.ItemNameKey, MenuItem.LocalizedString);

        var image = UIImage.FromBundle(MenuItem.IconImageName);
        if (!(image is null))
        {
            var data = image.AsPNG();
            orderSoupIntent.SetImage(INImage.FromData(data), "soup");
        }

        orderSoupIntent.Options = MenuItemOptions
            .ToArray<MenuItemOption>()
            .Select<MenuItemOption, INObject>(arg => new INObject(arg.Value, arg.LocalizedString))
            .ToArray<INObject>();

        var comment = "Suggested phrase for ordering a specific soup";
        var phrase = NSBundleHelper.SoupKitBundle.GetLocalizedString("ORDER_SOUP_SUGGESTED_PHRASE", comment);
        orderSoupIntent.SuggestedInvocationPhrase = String.Format(phrase, MenuItem.LocalizedString);

        return orderSoupIntent;
    }
}

잘못 된 기부 제거Removing invalid donations

Siri가 유용 하거나 혼동 하지 않는 바로 가기 제안을 하지 않도록 더 이상 유효 하지 않은 기부금을 제거 하는 것이 중요 합니다.It's important to remove donations that are no longer valid so that Siri does not make unhelpful or confusing shortcut suggestions.

수프 Chef에서는 구성 메뉴 화면을 사용 하 여 메뉴 항목을 사용할 수 없는 것으로 표시할 수 있습니다.In Soup Chef, the Configure Menu screen can be used to mark a menu item as unavailable. Siri는 더 이상 사용할 수 없는 메뉴 항목의 순서를 지정 하는 바로 가기를 제안 하지 않아야 합니다. 따라서 SoupMenuManagerRemoveDonation 메서드는 더 이상 사용할 수 없는 메뉴 항목에 대 한 기부금을 삭제 합니다.Siri should no longer suggest a shortcut to order an unavailable menu item, so the RemoveDonation method of SoupMenuManager deletes donations for menu items that are no longer available. 이렇게 하려면 다음을 수행 합니다.It does this by:

  • 현재 사용할 수 없는 메뉴 항목과 연결 된 주문 찾기Finding orders associated with the now-unavailable menu item.
  • 식별자를 증명 합니다.Grabbing their identifiers.
  • 동일한 식별자를 가진 상호 작용을 삭제 합니다.Deleting interactions that have that same identifier.
void RemoveDonation(MenuItem menuItem)
{
    if (!menuItem.IsAvailable)
    {
        Order[] orderHistory = OrderManager?.OrderHistory.ToArray<Order>();
        if (orderHistory is null)
        {
            return;
        }

        string[] orderIdentifiersToRemove = orderHistory
            .Where<Order>((order) => order.MenuItem.ItemNameKey == menuItem.ItemNameKey)
            .Select<Order, string>((order) => order.Identifier.ToString())
            .ToArray<string>();

        INInteraction.DeleteInteractions(orderIdentifiersToRemove, (error) =>
        {
            if (!(error is null))
            {
                Console.WriteLine($"Failed to delete interactions with error {error.ToString()}");
            }
            else
            {
                Console.WriteLine("Successfully deleted interactions");
            }
        });
    }
}

의도 확장 만들기Creating an Intents extension

Siri가 의도를 호출할 때 실행 하는 코드는 수프 Chef 같은 기존 Xamarin.ios 앱과 동일한 솔루션에 새 프로젝트로 추가 될 수 있는 의도 확장에 배치 됩니다.The code that runs when Siri invokes an intent is placed in an Intents extension, which can be added as a new project to the same solution as an existing Xamarin.iOS app such as Soup Chef. SoupChef 솔루션에서 확장을 SoupChefIntents라고 합니다.In the SoupChef solution, the extension is called SoupChefIntents.

SoupChefIntents – info.plist 및 info.plistSoupChefIntents – Info.plist and Entitlements.plist

SoupChefIntents – info.plistSoupChefIntents – Info.plist

SoupChefIntents 프로젝트의 info.plistcom.xamarin.SoupChef.SoupChefIntents으로 번들 식별자 를 정의 합니다.The Info.plist in the SoupChefIntents project defines the Bundle Identifier as com.xamarin.SoupChef.SoupChefIntents.

Info.plist 파일에는 다음 항목도 포함 됩니다 .The Info.plist file also contains the following:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>IntentsRestrictedWhileLocked</key>
        <array/>
        <key>IntentsSupported</key>
        <array>
            <string>OrderSoupIntent</string>
        </array>
        <key>IntentsRestrictedWhileProtectedDataUnavailable</key>
        <array/>
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.intents-service</string>
    <key>NSExtensionPrincipalClass</key>
    <string>IntentHandler</string>
</dict>

위의 info.plist에서 다음을 수행 합니다.In the above Info.plist:

  • IntentsRestrictedWhileLocked은 장치의 잠금이 해제 될 때만 처리 해야 하는 의도를 나열 합니다.IntentsRestrictedWhileLocked lists intents that should only be handled when the device is unlocked.
  • IntentsSupported이 확장 프로그램에서 처리 하는 의도를 나열 합니다.IntentsSupported lists the intents handled by this extension.
  • NSExtensionPointIdentifier 앱 확장의 유형을 지정 합니다. 자세한 내용은 Apple 설명서 를 참조 하세요.NSExtensionPointIdentifier specifies the type of app extension (see Apple's documentation for more information).
  • NSExtensionPrincipalClass이 확장 프로그램에서 지 원하는 의도를 처리 하는 데 사용 해야 하는 클래스를 지정 합니다.NSExtensionPrincipalClass specifies the class that should be used to handle intents supported by this extension.
SoupChefIntents – info.plistSoupChefIntents – Entitlements.plist

SoupChefIntents 프로젝트의 Info.plist 에는 앱 그룹 기능이 있습니다.The Entitlements.plist in the SoupChefIntents project has the App Groups capability. 이 기능은 SoupChef 프로젝트와 동일한 앱 그룹을 사용 하도록 구성 됩니다.This capability is configured to use the same app group as the SoupChef project:

<key>com.apple.security.application-groups</key>
<array>
    <string>group.com.xamarin.SoupChef</string>
</array>

수프 Chef는 NSUserDefaults을 사용 하 여 데이터를 유지 합니다.Soup Chef persists data with NSUserDefaults. 앱과 앱 확장 간에 데이터를 공유 하기 위해 info.plist 파일에서 동일한 앱 그룹을 참조 합니다.In order to share data between the app and the app extension, they reference the same app group in their Entitlements.plist files.

참고

SoupChefIntents 프로젝트의 빌드 구성에서는 사용자 지정 자격info.plist로 설정 합니다.The SoupChefIntents project's build configuration sets Custom Entitlements to Entitlements.plist.

OrderSoupIntent 백그라운드 작업 처리Handling an OrderSoupIntent background task

의도 확장은 사용자 지정 의도에 따라 바로 가기에 필요한 백그라운드 작업을 실행 합니다.An Intents extension executes the necessary background tasks for a shortcut based on a custom intent.

Siri는 OrderSoupIntent를 처리 하는 데 사용할 수 있는 OrderSoupIntentHandling를 확장 하는 클래스의 인스턴스를 가져오기 위해 IntentHandler 클래스 ( info.plistNSExtensionPrincipalClass로 정의 됨)의 GetHandler 메서드를 호출 합니다.Siri calls the GetHandler method of the IntentHandler class (defined in Info.plist as the NSExtensionPrincipalClass) to get an instance of a class that extends OrderSoupIntentHandling, which can be used to handle an OrderSoupIntent:

[Register("IntentHandler")]
public class IntentHandler : INExtension
{
    public override NSObject GetHandler(INIntent intent)
    {
        if (intent is OrderSoupIntent)
        {
            return new OrderSoupIntentHandler();
        }
        throw new Exception("Unhandled intent type: ${intent}");
    }

    protected IntentHandler(IntPtr handle) : base(handle) { }
}

공유 코드의 SoupKit 프로젝트에 정의 된 OrderSoupIntentHandler는 다음과 같은 두 가지 중요 한 메서드를 구현 합니다.OrderSoupIntentHandler, defined in the SoupKit project of shared code, implements two important methods:

  • ConfirmOrderSoup – 의도와 연결 된 작업이 실제로 실행 되어야 하는지 여부를 확인 합니다.ConfirmOrderSoup – Confirms whether or not the task associated with the intent should actually be executed
  • HandleOrderSoup – 전달 된 완료 처리기를 호출 하 여 수프 순서를 배치 하 고 사용자에 게 응답 합니다.HandleOrderSoup – Places the soup order and responds to the user by calling the passed-in completion handler

앱을 여는 OrderSoupIntent 처리Handling an OrderSoupIntent that opens the app

앱은 백그라운드에서 실행 되지 않는 의도를 올바르게 처리 해야 합니다.An app must properly handle intents that do not run in the background. 이러한 작업은 AppDelegateContinueUserActivity 메서드에서 NSUserActivity 바로 가기와 동일한 방식으로 처리 됩니다.These are handled in the same way as NSUserActivity shortcuts, in the ContinueUserActivity method of AppDelegate:

public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
    var intent = userActivity.GetInteraction()?.Intent as OrderSoupIntent;
    if (!(intent is null))
    {
        HandleIntent(intent);
        return true;
    }
    // ...
}  

사용자 지정 의도에 대 한 사용자 인터페이스 제공Providing a user interface for a custom intent

의도 UI 확장은 의도 확장에 대 한 사용자 지정 사용자 인터페이스를 제공 합니다.An Intents UI extension provides a custom user interface for an Intents extension. SoupChef 솔루션에서 SoupChefIntentsUISoupChefIntents에 대 한 인터페이스를 제공 하는 의도 UI 확장입니다.In the SoupChef solution, SoupChefIntentsUI is an Intents UI extension that provides an interface for SoupChefIntents.

SoupChefIntentsUI – info.plist 및 info.plistSoupChefIntentsUI – Info.plist and Entitlements.plist

SoupChefIntentsUI – info.plistSoupChefIntentsUI – Info.plist

SoupChefIntentsUI 프로젝트의 info.plistcom.xamarin.SoupChef.SoupChefIntentsui으로 번들 식별자 를 정의 합니다.The Info.plist in the SoupChefIntentsUI project defines the Bundle Identifier as com.xamarin.SoupChef.SoupChefIntentsui.

Info.plist 파일에는 다음 항목도 포함 됩니다 .The Info.plist file also contains the following:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>IntentsSupported</key>
        <array>
            <string>OrderSoupIntent</string>
        </array>
        <!-- ... -->
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.intents-ui-service</string>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
</dict>

위의 info.plist에서 다음을 수행 합니다.In the above Info.plist:

  • IntentsSupported OrderSoupIntent이 의도 UI 확장에 의해 처리 됨을 나타냅니다.IntentsSupported indicates that the OrderSoupIntent is handled by this Intents UI extension.
  • NSExtensionPointIdentifier 앱 확장의 유형을 지정 합니다. 자세한 내용은 Apple 설명서 를 참조 하세요.NSExtensionPointIdentifier specifies the type of app extension (see Apple's documentation for more information).
  • 이 확장의 기본 인터페이스를 정의 하는 스토리 보드를 지정 NSExtensionMainStoryboardNSExtensionMainStoryboard specifies the storyboard that defines the primary interface of this extension

SoupChefIntentsUI – info.plistSoupChefIntentsUI – Entitlements.plist

SoupChefIntentsUI 프로젝트에는 info.plist 파일이 필요 하지 않습니다.The SoupChefIntentsUI project does not need an Entitlements.plist file.

사용자 인터페이스 만들기Creating the user interface

SoupChefIntentsUI 에 대 한 info.plistNSExtensionMainStoryboardMainInterface설정 하므로, MainInterace 파일은 의도 UI 확장에 대 한 인터페이스를 정의 합니다.Since the Info.plist for SoupChefIntentsUI sets the NSExtensionMainStoryboard key to MainInterface, the MainInterace.storyboard file defines the interface for the Intents UI extension.

이 스토리 보드에는 Intentviewcontroller형식의 단일 뷰 컨트롤러가 있습니다.In this storyboard, there is a single view controller, of type IntentViewController. 두 개의 뷰를 참조 합니다.It references two views:

  • InvoiceView 형식의 invoiceViewinvoiceView, of type InvoiceView
  • ConfirmOrderView 형식의 confirmationViewconfirmationView, of type ConfirmOrderView

참고

InvoiceViewconfirmationView 에 대 한 인터페이스는 기본 storyboard 에서 보조 뷰로 정의 됩니다.The interfaces for invoiceView and confirmationView are defined in Main.storyboard as secondary views. Mac용 Visual Studio 및 Visual Studio 2017의 iOS 디자이너는 보조 뷰를 보거나 편집할 수 있는 기능을 제공 하지 않습니다. 이렇게 하려면 Xcode의 Interface Builder에서 기본 storyboard 를 엽니다.The iOS Designer in Visual Studio for Mac and Visual Studio 2017 does not provide support for viewing or editing secondary views; to do so, open Main.storyboard in Xcode's Interface Builder.

IINUIHostedViewControlling 구현 IntentViewControllerIntentViewController implements the IINUIHostedViewControlling Siri 의도를 사용할 때 사용자 지정 인터페이스를 제공 하는 데 사용 되는 인터페이스입니다.interface, used to provide a custom interface when working with Siri Intents. ConfigureViewThe ConfigureView 상호 작용이 확인 (INIntentHandlingStatus.Ready) 되었는지 아니면 성공적으로 실행 되었는지 (INIntentHandlingStatus.Success)에 따라 인터페이스를 사용자 지정 하 여 확인 또는 송장을 표시 하는 메서드가 호출 됩니다.method is called to customize the interface, displaying the confirmation or the invoice, depending on whether the interaction is being confirmed (INIntentHandlingStatus.Ready) or has been executed successfully (INIntentHandlingStatus.Success):

[Export("configureViewForParameters:ofInteraction:interactiveBehavior:context:completion:")]
public void ConfigureView(
    NSSet<INParameter> parameters,
    INInteraction interaction,
    INUIInteractiveBehavior interactiveBehavior,
    INUIHostedViewContext context,
    INUIHostedViewControllingConfigureViewHandler completion)
{
    // ...
    if (interaction.IntentHandlingStatus == INIntentHandlingStatus.Ready)
    {
        desiredSize = DisplayInvoice(order, intent);
    }
    else if(interaction.IntentHandlingStatus == INIntentHandlingStatus.Success)
    {
        var response = interaction.IntentResponse as OrderSoupIntentResponse;
        if (!(response is null))
        {
            desiredSize = DisplayOrderConfirmation(order, intent, response);
        }
    }
    completion(true, parameters, desiredSize);
}

ConfigureView 방법에 대 한 자세한 내용은 Apple의 WWDC 2017 프레젠테이션, SiriKit의 새로운 기능을 시청 하세요.For more information about the ConfigureView method, watch Apple's WWDC 2017 presentation, What's New in SiriKit.

음성 바로 가기 만들기Creating a voice shortcut

수프 Chef는 각 주문에 음성 바로 가기를 할당 하는 인터페이스를 제공 하므로 Siri를 사용 하 여 수프를 주문할 수 있습니다.Soup Chef provides an interface to assign a voice shortcut to each order, making it possible to order soup with Siri. 실제로 음성 바로 가기를 기록 하 고 할당 하는 데 사용 되는 인터페이스는 iOS에서 제공 되며 사용자 지정 코드가 거의 필요 하지 않습니다.In fact, the interface used to record and assign voice shortcuts is provided by iOS and requires little custom code.

OrderDetailViewController에서 사용자가 테이블의 Siri 행에 추가 를 탭 하면 RowSelected 메서드는 음성 바로 가기를 추가 하거나 편집할 수 있는 화면을 표시 합니다.In OrderDetailViewController, when a user taps the table's Add to Siri row, the RowSelected method presents a screen to either add or edit a voice shortcut:

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    // ...
    else if (TableConfiguration.Sections[indexPath.Section].Type == OrderDetailTableConfiguration.SectionType.VoiceShortcut)
    {
        INVoiceShortcut existingShortcut = VoiceShortcutDataManager?.VoiceShortcutForOrder(Order);
        if (!(existingShortcut is null))
        {
            var editVoiceShortcutViewController = new INUIEditVoiceShortcutViewController(existingShortcut);
            editVoiceShortcutViewController.Delegate = this;
            PresentViewController(editVoiceShortcutViewController, true, null);
        }
        else
        {
            // Since the app isn't yet managing a voice shortcut for
            // this order, present the add view controller
            INShortcut newShortcut = new INShortcut(Order.Intent);
            if (!(newShortcut is null))
            {
                var addVoiceShortcutVC = new INUIAddVoiceShortcutViewController(newShortcut);
                addVoiceShortcutVC.Delegate = this;
                PresentViewController(addVoiceShortcutVC, true, null);
            }
        }
    }
}

현재 표시 되는 순서에 대 한 기존 음성 단축키가 있는지 여부에 따라 RowSelected INUIEditVoiceShortcutViewController 또는 INUIAddVoiceShortcutViewController형식의 뷰 컨트롤러를 제공 합니다.Based on whether or not an existing voice shortcut exists for the currently-displayed order, RowSelected presents a view controller of type INUIEditVoiceShortcutViewController or INUIAddVoiceShortcutViewController. 각각의 경우 OrderDetailViewController는 자체를 뷰 컨트롤러의 Delegate으로 설정 합니다. 따라서는이를 구현 하기도 IINUIAddVoiceShortcutViewControllerDelegateIn each case, OrderDetailViewController sets itself as the view controller's Delegate, which is why it also implements IINUIAddVoiceShortcutViewControllerDelegate 및를 IINUIEditVoiceShortcutViewControllerDelegate합니다.and IINUIEditVoiceShortcutViewControllerDelegate.

장치에서 테스트Testing on device

장치에서 수프 Chef를 실행 하려면 아래 지침을 따르세요.To run Soup Chef on a device, follow the instructions below. 자동 프로 비전에 대 한 참고사항도 읽어 보세요.Also read the note about automatic provisioning.

앱 그룹, 앱 Id, 프로 비전 프로필App Group, App IDs, Provisioning Profiles

Apple 개발자 포털인증서, id & 프로필 섹션에서 다음을 수행 합니다.In the Certificates, IDs & Profiles section of the Apple Developer Portal, do the following:

  • 수프 Chef 앱과 해당 확장 간에 데이터를 공유 하는 앱 그룹을 만듭니다.Create an app group to share data between the Soup Chef app and its extensions. 예를 들면 다음과 같습니다. SoupChefFor example: group.com.yourcompanyname.SoupChef

  • 응용 프로그램 자체에 대 한 세 가지 앱 Id를 만듭니다. 하나는 의도 확장을 위한 것이 고 다른 하나는 의도 UI 확장에 대 한 Id입니다.Create three App IDs: one for the app itself, one for the Intents extension, and one for the Intents UI extension. 예를 들면,For example:

    • 앱: com. SoupChefApp: com.yourcompanyname.SoupChef

      • 이 앱 ID로 SiriKit 및 앱 그룹 기능을 할당 합니다.To this App ID, assign the SiriKit and App Groups capabilities.
    • 의도 확장: com. SoupChef.Intents extension: com.yourcompanyname.SoupChef.Intents

      • 이 앱 ID에 앱 그룹 기능을 할당 합니다.To this App ID, assign the App Groups capability.
    • 의도 UI 확장: com. SoupChef. IntentsuiIntents UI extension: com.yourcompanyname.SoupChef.Intentsui

      • 이 앱 ID에는 특별 한 기능이 필요 하지 않습니다.This App ID needs no special capabilities.
  • 위의 앱 Id를 만든 후 위에 만든 특정 앱 그룹을 지정 하 여 앱 및 의도 확장에 할당 된 앱 그룹 기능을 편집 합니다.After creating the above App IDs, edit the App Groups capability assigned to the app and the Intents extension, specifying the specific app group created above.

  • 새 앱 Id 각각에 대해 하나씩, 세 개의 새로운 개발 프로 비전 프로필을 만듭니다.Create three new development provisioning profiles, one for each of the new App IDs.

  • 이러한 프로 비전 프로필을 다운로드 하 고 각 프로필을 두 번 클릭 하 여 설치 합니다.Download these provisioning profiles and double-click each one to install it. Mac용 Visual Studio 또는 Visual Studio 2017가 이미 실행 중인 경우에는 다시 시작 하 여 새 프로 비전 프로필을 등록 해야 합니다.If Visual Studio for Mac or Visual Studio 2017 is already running, restart it to make sure it registers the new provisioning profiles.

Info.plist, info.plist 및 소스 코드 편집Editing Info.plist, Entitlements.plist, and source code

Mac용 Visual Studio 또는 Visual Studio 2017에서 다음을 수행 합니다.In Visual Studio for Mac or Visual Studio 2017, do the following:

  • 솔루션의 다양 한 info.plist 파일을 업데이트 합니다.Update the various Info.plist files in the solution. 앱, 의도 확장 및 의도 UI 확장 번들 식별자 를 위에서 정의한 앱 id로 설정 합니다.Set the app, Intents extension, and Intents UI extension Bundle Identifier to the App IDs defined above:

    • 앱: com. SoupChefApp: com.yourcompanyname.SoupChef
    • 의도 확장: com. SoupChef.Intents Extension: com.yourcompanyname.SoupChef.Intents
    • 의도 UI 확장: com. SoupChef. IntentsuiIntents UI Extension: com.yourcompanyname.SoupChef.Intentsui
  • SoupChef 프로젝트에 대 한 info.plist 파일을 업데이트 합니다.Update the Entitlements.plist file for the SoupChef project:

    • 앱 그룹 기능에 대해 위에서 만든 새 앱 그룹으로 그룹을 설정 합니다 (위의 예제에서는 SoupChef).For the App Groups capability, set the group to the new app group created above (in the example above, it was group.com.yourcompanyname.SoupChef).
    • Sirikit 를 사용 하도록 설정 했는지 확인 합니다.Make sure that SiriKit is enabled.
  • SoupChefIntents 프로젝트에 대 한 info.plist 파일을 업데이트 합니다.Update the Entitlements.plist file for the SoupChefIntents project:

    • 앱 그룹 기능에 대해 위에서 만든 새 앱 그룹으로 그룹을 설정 합니다 (위의 예제에서는 SoupChef).For the App Groups capability, set the group to the new app group created above (in the example above, it was group.com.yourcompanyname.SoupChef).
  • 마지막으로 NSUserDefaultsHelper.cs를 엽니다.Finally, open NSUserDefaultsHelper.cs. AppGroup 변수를 새 앱 그룹의 값으로 설정 합니다 (예: group.com.yourcompanyname.SoupChef로 설정).Set the AppGroup variable to the value of your new app group (for example, set it to group.com.yourcompanyname.SoupChef).

빌드 설정 구성Configuring the build settings

Mac용 Visual Studio 또는 Visual Studio 2017:In Visual Studio for Mac or Visual Studio 2017:

  • SoupChef 프로젝트에 대 한 옵션/속성을 엽니다.Open the options/properties for the SoupChef project. IOS 번들 서명 탭에서 서명 id 를 자동으로 설정 하 고 프로 비전 프로필 을 위에서 만든 새 앱 특정 프로 비전 프로필로 설정 합니다.On the iOS Bundle Signing tab, set Signing Identity to automatic and Provisioning Profile to the new app-specific provisioning profile you created above.

  • SoupChefIntents 프로젝트에 대 한 옵션/속성을 엽니다.Open the options/properties for the SoupChefIntents project. IOS 번들 서명 탭에서 서명 id 를 자동으로 설정 하 고 프로 비전 프로필 을 위에서 만든 새 의도 확장의 프로 비전 프로필로 설정 합니다.On the iOS Bundle Signing tab, set Signing Identity to automatic and Provisioning Profile to the new Intents extension-specific provisioning profile you created above.

  • SoupChefIntentsUI 프로젝트에 대 한 옵션/속성을 엽니다.Open the options/properties for the SoupChefIntentsUI project. IOS 번들 서명 탭에서 서명 id 를 자동으로 설정 하 고 프로 비전 프로필 을 위에서 만든 새 의도 UI 확장 특정 프로 비전 프로필로 설정 합니다.On the iOS Bundle Signing tab, set Signing Identity to automatic and Provisioning Profile to the new Intents UI extension-specific provisioning profile you created above.

이러한 변경 내용을 적용 하면 앱이 iOS 장치에서 실행 됩니다.With these changes in place, the app will run on an iOS device.

자동 프로 비전Automatic provisioning

자동 프로 비전 을 사용 하 여 IDE에서 이러한 여러 프로 비전 작업을 직접 수행할 수 있습니다.Note that you can use automatic provisioning to accomplish many of these provisioning tasks directly in the IDE. 그러나 자동 프로 비전은 앱 그룹을 설정 하지 않습니다.However, automatic provisioning does not set up app groups. 사용 하려는 앱 그룹의 이름으로 info.plist 파일을 수동으로 구성 해야 합니다. Apple 개발자 포털을 방문 하 여 앱 그룹을 만들고, 자동 프로 비전으로 만든 각 앱 ID에 해당 앱 그룹을 할당 하 고, 다시 생성 하세요. 새로 만든 앱 그룹을 포함 하 고 다운로드 하 여 설치 하는 프로 비전 프로필 (앱, 의도 확장, 의도 UI 확장)입니다.You will need to manually configure the Entitlements.plist files with the name of the app group you would like to use, visit the Apple Developer Portal to create the app group, assign that app group to each App ID created by automatic provisioning, regenerate the provisioning profiles (app, Intents extension, Intents UI extension) to include the newly created app group, and download and install them.