Xamarin.iOS의 iOS 확장iOS extensions in Xamarin.iOS

IOS에서 비디오 확장명 만들기Creating Extensions in iOS video

확장을 iOS 8에에서 도입 된 특수화 된 UIViewControllers 하 여 표시 되는 표준 컨텍스트 내에서 iOS 등으로 내 합니다 알림 센터처럼 특수화 하는 데 사용자가 요청 하는 사용자 지정 키보드 형식 입력 또는 다른 컨텍스트 확장 필터 특수 효과 제공할 수 있는 사진 편집을 선호 합니다.Extensions, as introduced in iOS 8, are specialized UIViewControllers that are presented by iOS inside standard contexts such as within the Notification Center, as custom keyboard types requested by the user to perform specialized input or other contexts like editing a photo where the Extension can provide special effect filters.

모든 확장 (와 함께 64 비트 통합 Api를 사용 하 여 기록 되는 두 요소) 컨테이너 앱을 함께 설치 되 고 호스트 응용 프로그램에서 특정 확장 지점에서 활성화 됩니다.All Extensions are installed in conjunction with a Container app (with both elements written using the 64-bit Unified APIs) and are activated from a particular Extension Point in a Host app. 하며 하므로 기존 시스템 함수에 대 한 조항은로 사용할 것인지, 고성능, 린 (lean), 및 강력한 여야 합니다.And since they will be used as supplements to existing system functions, they must be high performance, lean, and robust.

확장 지점Extension points

형식Type 설명Description 확장 지점Extension Point 호스트 응용 프로그램Host App
작업Action 특수 편집기 또는 특정 미디어 유형에 대 한 뷰어Specialized editor or viewer for a particular media type com.apple.ui-services 임의의 값Any
문서 공급자Document Provider 앱 원격 문서 저장소를 사용할 수 있도록 허용Allows app to use a remote document store com.apple.fileprovider-ui 사용 하 여 앱을 UIDocumentPickerViewControllerApps using a UIDocumentPickerViewController
키보드Keyboard 대체 키보드Alternate keyboards com.apple.keyboard-service 임의의 값Any
사진 편집Photo Editing 사진 조작 및 편집Photo manipulation and editing com.apple.photo-editing Photos.app 편집기Photos.app editor
공유Share 소셜 네트워크, 메시징 등 서비스를 사용 하 여 데이터를 공유 합니다.Shares data with social networks, messaging services, etc. com.apple.share-services 임의의 값Any
오늘Today 알림 센터를 현재 화면에 표시 되는 "widget"“Widgets” that appear on the Today screen or Notification Center com.apple.widget-extensions 오늘 및 알림 센터Today and Notification Center

추가 확장 지점 iOS 10에에서 추가 되었습니다.Additional extension points were added in iOS 10.

제한 사항Limitations

확장 수 제한 사항 중 일부는 모든 형식에 유니버설 (확장의 형식이 없는 경우 카메라 또는 마이크에 액세스할 수 있음)의 다른 형식 확장과 용도 (예를 들어, 사용자 지정 키보드에서 특정 제한 될 수 있지만 사용할 수 없습니다 암호와 같은 보안 데이터 항목 필드에 대 한).Extensions have a number of limitations, some of which are universal to all types (for instance, no type of Extension can access the cameras or microphones) while other types of Extension may have specific limitations on their usage (for instance, custom keyboards cannot be used for secure data entry fields such as for passwords).

유니버설 제한은 다음과 같습니다.The universal limitations are:

개별 제한 사항에 대 한 Apple의를 참조 하세요 앱 확장의 프로그래밍 가이드합니다.For individual limitations, please see Apple's App Extension Programming Guide.

배포, 설치 및 확장 실행Distributing, installing, and running extensions

확장은 다시 전송 하 고 분산 앱 스토어를 통해 컨테이너 앱 내에서 배포 됩니다.Extensions are distributed from within a container app, which, in turn is submitted and distributed via the App Store. 앱을 사용 하 여 분산 확장명 해당 시점에 설치 되지만 사용자는 각 확장을 명시적으로 사용 해야 합니다.The Extension(s) distributed with the app are installed at that point, but the user must enable each Extension explicitly. 다양 한 유형의 확장은 다양 한 방법으로;에서 사용 하도록 설정 로 이동 해야 할 몇 가지는 설정을 앱에서에서 사용 하도록 설정 합니다.The different types of Extensions are enabled in different ways; several require the user to navigate to the Settings app and enable them from there. 하지만 다른 보내면 사진을 공유 확장을 사용 하도록 설정 하는 등의 사용 시점에 활성화 됩니다.While others are enabled at point of use, such as enabling a Sharing Extension when sending a photo.

앱 확장을 사용 하는 (여기서 발생 하는 확장 지점) 라고 합니다 호스트 앱실행 될 때 확장을 호스트 하는 앱 이므로, 합니다.The app in which the Extension is used (where the user encounters the Extension Point) is referred to as the Host app, since it is the app that hosts the Extension when it executes. 확장을 설치 하는 앱은는 컨테이너 앱설치 된 경우 확장을 포함 하는 앱 이므로, 합니다.The app that installs the Extension is the Container app, because it is the app that contained the Extension when it was installed.

일반적으로 컨테이너 앱 확장에 설명 하 고 사용 하도록 설정 하는 과정을 안내 합니다.Typically, the container app describes the extension and walks the user through the process of enabling it.

확장 수명 주기Extension lifecycle

확장 단일 처럼 간단할 수 있습니다 UIViewController 또는 UI의 여러 화면을 제공 하는 더 복잡 한 확장입니다.An Extension can be as simple as a single UIViewController or more complex Extensions that present multiple screens of UI. 발견할 경우에 사용자를 확장점 (때와 같이 이미지를 공유), 해당 확장 지점에 대해 등록 된 확장을 선택할 수 있는 기회를 갖게 됩니다.When the user encounters an Extension Points (such as when sharing an image), they will have an opportunity to choose from the Extensions registered for that Extension Point.

앱 중 하나 선택 하는 경우의 확장을 해당 UIViewController 를 인스턴스화할 수 및 일반 뷰 컨트롤러 수명 주기를 시작 합니다.If they choose one of your app's Extensions, its UIViewController will be instantiated and begin the normal View Controller lifecycle. 그러나 일시 중단 하지만 일반적으로 사용자가 상호 작용을 마치면 종료, 일반 앱와 달리 확장은 로드, 실행 및을 반복적으로 종료 합니다.However, unlike a normal app, which are suspended but not generally terminated when the user finishes interacting with them, Extensions are loaded, executed, and then terminated repeatedly.

확장을 통해 앱을 해당 호스트와 통신할 수 있는 NSExtensionContext 개체입니다.Extensions can communicate with their Host apps via an NSExtensionContext object. 일부 확장에는 결과 사용 하 여 비동기 콜백을 수신 하는 작업이 있습니다.Some Extensions have operations that receive asynchronous callbacks with the results. 이러한 콜백을 백그라운드 스레드에서 실행 되 고 확장이 고려해 야 합니다. 사용 하 여 예를 들어 NSObject.InvokeOnMainThread 사용자 인터페이스를 업데이트 하는 경우.These callbacks will be executed on background threads and the Extension must take this into consideration; for instance, by using NSObject.InvokeOnMainThread if they want to update the user interface. 참조 된 호스트 앱을 사용 하 여 통신 대 한 자세한 내용은 아래 섹션입니다.See the Communicating with the Host App section below for more details.

기본적으로 확장 및 해당 컨테이너 앱 수 통신 하지 않습니다, 함께 설치 되 고 불구 하 고.By default, Extensions and their container apps can not communicate, despite being installed together. 경우에 따라 컨테이너 앱은 기본적으로 빈 "shipping" 컨테이너 확장이 설치 되 면 해당 용도로 제공 됩니다.In some cases, the Container app is essentially an empty "shipping" container whose purpose is served once the Extension is installed. 그러나 상황에 따라 필요 하는 경우 컨테이너 앱 및 확장 공유할 수 있습니다 일반 영역에서 리소스.However, if circumstances dictate, the Container app and the Extension may share resources from a common area. 또한 한 오늘 확장 는 URL을 열 수는 컨테이너 앱을 요청할 수 있습니다.Additionally, a Today Extension may request its Container app to open a URL. 이 동작에 표시 됩니다는 이벤트 카운트다운 위젯합니다.This behavior is shown in the Event Countdown Widget.

확장 만들기Creating an extension

확장 (및 해당 컨테이너 앱) 64 비트 이진 파일 이어야 합니다 하 고는 Xamarin.iOS를 사용 하 여 빌드된 Unified Api합니다.Extensions (and their Container apps) must be 64-bit binaries and built using the Xamarin.iOS Unified APIs. 확장을 개발 하는 경우, 솔루션 적어도 두 개의 프로젝트가 포함 됩니다: 각 확장의 컨테이너 제공에 대 한 컨테이너 앱 및 프로젝트입니다.When developing an Extension, your solutions will contain at least two projects: the container app and one project for each Extension the container provides.

컨테이너 앱 프로젝트 요구 사항Container app project requirements

컨테이너 앱 확장을 설치 하는 데에 다음 요구 사항을 있습니다.The Container app used to install the Extension has the following requirements:

  • 이 확장 프로젝트에 대 한 참조를 유지 해야 합니다.It must maintain a reference to the Extension project.
  • (시작 하 고 성공적으로 실행 하는 일을 할 수 있어야) 앱을 완료 해야이 아무 작업도 수행 하지 보다 확장을 설치 하는 방법을 제공 하는 경우에 합니다.It must be a complete app (must be able to launch and run successfully) even if it does nothing more than provide a way to install an Extension.
  • 확장 프로그램의 번들 식별자에 대 한 기반이 되는 번들 식별자 있어야 합니다 (자세한 내용은 아래 섹션 참조) 프로젝트.It must have a Bundle Identifier that is the basis for the Bundle Identifier of the Extension project (see the section below for more details).

확장 프로젝트 요구 사항Extension project requirements

또한 확장의 프로젝트에 다음 요구 사항:Additionally, the Extension's project has the following requirements:

  • 해당 컨테이너 앱의 번들 식별자로 시작 하는 번들 식별자 있어야 합니다.It must have a Bundle Identifier that starts with its Container app's Bundle Identifier. 예를 들어 컨테이너 앱의 번들 식별자가 com.myCompany.ContainerApp, 확장의 식별자 com.myCompany.ContainerApp.MyExtension:For example, if the Container app's has a Bundle Identifier of com.myCompany.ContainerApp, the Extension's identifier might be com.myCompany.ContainerApp.MyExtension:

  • 키를 정의 해야 합니다 NSExtensionPointIdentifier을 적절 한 값 (같은 com.apple.widget-extension 에 대 한를 지금 알림 센터 위젯)에서 해당 Info.plist 파일입니다.It must define the key NSExtensionPointIdentifier, with an appropriate value (such as com.apple.widget-extension for a Today Notification Center widget), in its Info.plist file.

  • 도 정의 해야 합니다 중 하나NSExtensionMainStoryboard 키 또는 NSExtensionPrincipalClass 키에 해당 Info.plist 적절 한 값을 사용 하 여 파일:It must also define either the NSExtensionMainStoryboard key or the NSExtensionPrincipalClass key in its Info.plist file with an appropriate value:

    • 사용 된 NSExtensionMainStoryboard 확장에 대 한 기본 UI를 제공 하는 스토리 보드의 이름을 지정 하는 키 (빼기 .storyboard).Use the NSExtensionMainStoryboard key to specify the name of the Storyboard that presents the main UI for the Extension (minus .storyboard). 예를 들어 Main 에 대 한는 Main.storyboard 파일입니다.For example, Main for the Main.storyboard file.
    • 사용 된 NSExtensionPrincipalClass 키 확장 시작 될 때 초기화 될 클래스를 지정 합니다.Use the NSExtensionPrincipalClass key to specify the class that will be initialized when the Extension is started. 값이 일치 해야 합니다 등록 의 값에 UIViewController:The value must match the Register value of your UIViewController:

특정 유형의 확장에는 추가 요구 사항이 있을 수 있습니다.Specific types of Extensions may have additional requirements. 예를 들어를 오늘 또는 알림 센터 확장의 보안 주체 클래스를 구현 해야 INCWidgetProviding합니다.For instance, a Today or Notification Center Extension’s principal class must implement INCWidgetProviding.

중요

Mac 용 Visual Studio에서 제공 되는 확장 템플릿을 하나를 사용 하 여 프로젝트를 시작 하는 경우 (모두는 아님) 경우에 대부분의 이러한 요구 사항은 제공 되며 템플릿에서 자동으로를 충족 합니다.If you start your project using one the Extensions templates provided by Visual Studio for Mac, most (if not all) these requirements will be provided and met for you automatically by the template.

연습Walkthrough

다음 연습에서는 예로 만들어집니다 오늘 일 및 연도에 남은 일 수를 계산 하는 위젯:In following walkthrough, you will create an example Today widget that calculates the day and number of days remaining in the year:

솔루션 만들기Creating the solution

필요한 솔루션을 만들려면 다음을 수행 합니다.To create the required solution, do the following:

  1. 먼저 새 iOS를 만듭니다 단일 뷰 앱 프로젝트을 클릭 합니다 다음 단추:First, create a new iOS, Single View App project and click the Next button:

  2. 프로젝트를 호출 합니다 TodayContainer 을 클릭 합니다 다음 단추:Call the project TodayContainer and click the Next button:

  3. 확인 합니다 프로젝트 이름SolutionName 을 클릭 합니다 만들기 솔루션을 만드는 단추:Verify the Project Name and SolutionName and click the Create button to create the solution:

  4. 다음으로 솔루션 탐색기솔루션을 마우스 오른쪽 단추로 클릭 하 고 새 iOS 확장 에서 프로젝트를 오늘 확장 템플릿:Next, in the Solution Explorer, right-click on the Solution and add a new iOS Extension project from the Today Extension template:

  5. 프로젝트를 호출 합니다 DaysRemaining 을 클릭 합니다 다음 단추:Call the project DaysRemaining and click the Next button:

  6. 프로젝트를 검토 하 고 클릭 합니다 만들기 단추를 만듭니다.Review the project and click the Create button to create it:

결과 솔루션 아래 그림과 같이 이제 두 개의 프로젝트가 있습니다.The resulting Solution should now have two projects, as shown here:

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

에 대 한 인터페이스를 디자인 해야 하는 다음으로 프로그램 오늘 위젯입니다.Next, you will need to design the interface for your Today widget. 수행할 수 있습니다 하거나 스토리 보드를 사용 하 여 또는 코드에서 UI를 만들어 합니다.This can either be done using a Storyboard or by creating the UI in code. 두 방법 모두 아래 자세히 설명 합니다.Both methods will be covered below in detail.

스토리 보드를 사용 하 여Using storyboards

스토리 보드를 사용 하 여 UI를 빌드하려면 다음을 수행 합니다.To build the UI with a Storyboard, do the following:

  1. 솔루션 탐색기, 확장 프로젝트를 두 번 클릭 Main.storyboard 파일을 편집용으로 엽니다.In the Solution Explorer, double-click the Extension project's Main.storyboard file to open it for editing:

  2. 템플릿에서 UI에 자동으로 추가 된 레이블을 선택 하 고 지정는 이름 TodayMessage위젯 탭을 속성 탐색기:Select the Label that was automatically added to the UI by template and give it the Name TodayMessage in the Widget tab of the Properties Explorer:

  3. 스토리 보드에 변경 내용을 저장 합니다.Save the changes to the Storyboard.

코드를 사용 하 여Using code

코드에서 UI를 빌드하려면 다음을 수행 합니다.To build the UI in code, do the following:

  1. 솔루션 탐색기를 선택 합니다 DaysRemaining 프로젝트에서 새 클래스를 추가 하 고 호출 CodeBasedViewController:In the Solution Explorer, select the DaysRemaining project, add a new class and call it CodeBasedViewController:

  2. 를 다시 합니다 솔루션 탐색기, 확장의 두 번 클릭 Info.plist 파일을 편집용으로 엽니다.Again, in the Solution Explorer, double-click Extension's Info.plist file to open it for editing:

  3. 선택 된 원본 뷰 (화면 맨 아래)에서 연는 NSExtension 노드:Select the Source View (from the bottom of the screen) and open the NSExtension node:

  4. 제거 합니다 NSExtensionMainStoryboard 키를 추가 된 NSExtensionPrincipalClass 값을 사용 하 여 CodeBasedViewController:Remove the NSExtensionMainStoryboard key and add a NSExtensionPrincipalClass with the value CodeBasedViewController:

  5. 변경 내용을 저장합니다.Save your changes.

다음에 편집을 CodeBasedViewController.cs 파일을 다음과 같이 표시 되도록 합니다.Next, edit the CodeBasedViewController.cs file and make it look like the following:

using System;
using Foundation;
using UIKit;
using NotificationCenter;
using CoreGraphics;

namespace DaysRemaining
{
    [Register("CodeBasedViewController")]
    public class CodeBasedViewController : UIViewController, INCWidgetProviding
    {
        public CodeBasedViewController ()
        {
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Add label to view
            var TodayMessage = new UILabel (new CGRect (0, 0, View.Frame.Width, View.Frame.Height)) {
                TextAlignment = UITextAlignment.Center
            };

            View.AddSubview (TodayMessage);
            
            // Insert code to power extension here...

        }
    }
}

[Register("CodeBasedViewController")] 에 대해 지정한 값과 일치 하는 NSExtensionPrincipalClass 위에 있습니다.Note that the [Register("CodeBasedViewController")] matches the value that you specified for the NSExtensionPrincipalClass above.

확장 코딩Coding the extension

만든 사용자 인터페이스를 사용 하 여 열 중 하나는 TodayViewController.cs 또는 CodeBasedViewController.cs 파일 (위의 사용자 인터페이스를 만드는 데 메서드 기반)을 변경 합니다 ViewDidLoad 메서드 수 있으며 다음과 같은 모양:With the User Interface created, open either the TodayViewController.cs or the CodeBasedViewController.cs file (based of the method used to create the User Interface above), change the ViewDidLoad method and make it look like the following:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    // Calculate the values
    var dayOfYear = DateTime.Now.DayOfYear;
    var leapYearExtra = DateTime.IsLeapYear (DateTime.Now.Year) ? 1 : 0;
    var daysRemaining = 365 + leapYearExtra - dayOfYear;

    // Display the message
    if (daysRemaining == 1) {
        TodayMessage.Text = String.Format ("Today is day {0}. There is one day remaining in the year.", dayOfYear);
    } else {
        TodayMessage.Text = String.Format ("Today is day {0}. There are {1} days remaining in the year.", dayOfYear, daysRemaining);
    }
}

코드를 사용 하 여 사용자 인터페이스 메서드를 기반 하는 경우 대체는 // Insert code to power extension here... 위에서 새 코드를 사용 하 여 주석을 합니다.If using the code based User Interface method, replace the // Insert code to power extension here... comment with the new code from above. 후 기본 구현을 호출 (및 코드 기반 버전에 대 한 레이블을 삽입)이이 코드는 연도 및 남은 기간 (일)을 가져오려고 간단한 계산을 수행 합니다.After calling the base implementation (and inserting a Label for the code based version), this code does a simple calculation to get the day of the year and how many days are remaining. 레이블에 메시지를 표시 한 다음 (TodayMessage)는 UI 디자인에서 생성 합니다.Then it displays the message in the Label (TodayMessage) that you created in the UI design.

앱을 작성 하는 일반적인 프로세스는이 프로세스는 얼마나 유사한 지 note 합니다.Note how similar this process is to the normal process of writing an app. 확장의 UIViewController 백그라운드 모드에 있지 않은 확장과 사용자 완료 되 면 일시 중단 되지 않습니다 점을 제외 하 고 뷰 컨트롤러를 동일한 수명 주기, 앱에 사용 합니다.An Extension's UIViewController has the same lifecycle as a View Controller in an app, except Extensions do not have background modes and are not suspended when the user is finished using them. 대신 확장 반복적으로 초기화 되 고 필요에 따라 할당을 취소 합니다.Instead, Extensions are repeatedly initialized and de-allocated as required.

컨테이너 앱 사용자 인터페이스 만들기Creating the container app user interface

이 연습에서는 컨테이너 앱 제공 및 확장을 설치 하는 방법으로 단순히 사용 됩니다 하 고 자체의 기능을 제공 합니다.For this walkthrough, the container app is simply used as a method to ship and install the Extension and provides no functionality of its own. TodayContainer의 편집 Main.storyboard 파일을 설치 하는 방법 및 확장의 함수를 정의 하는 일부 텍스트를 추가 합니다.Edit the TodayContainer's Main.storyboard file and add some text defining the Extension's function and how to install it:

스토리 보드에 변경 내용을 저장 합니다.Save the changes to the Storyboard.

테스트 확장Testing the extension

IOS 시뮬레이터에서에서 확장 프로그램을 테스트 하려면 다음을 실행 합니다 TodayContainer 앱.To test your Extension in the iOS Simulator, run the TodayContainer app. 컨테이너의 기본 보기 표시 됩니다.The container's main view will be displayed:

다음으로, 적중를 를 열려면 화면 맨 위에서 아래쪽으로 살짝 밀어서 시뮬레이터에서 단추를 알림 센터를 선택 합니다 지금 탭을 클릭 합니다 편집 단추:Next, hit the Home button in the Simulator, swipe down from the top of the screen to open the Notification Center, select the Today tab and click the Edit button:

추가 DaysRemaining 확장을는 지금 를 클릭 합니다 수행 단추:Add the DaysRemaining Extension to the Today view and click the Done button:

새 위젯을 추가할 수는 오늘 보기 및 결과가 표시 됩니다.The new widget will be added to the Today view and the results will be displayed:

호스트 응용 프로그램을 사용 하 여 통신Communicating with the host app

이 예제에서는 위에서 만든 확장 현재 해당 호스트 앱와 통신 하지 않습니다 (합니다 오늘 화면).The example Today Extension you created above does not communicate with its host app (the Today screen). 사용 하는 경우는 ExtensionContext 의 속성을 TodayViewController 또는 CodeBasedViewController 클래스입니다.If it did, it would use the ExtensionContext property of the TodayViewController or CodeBasedViewController classes.

해당 호스트 응용 프로그램에서 데이터를 받을 확장에 대 한 데이터가의 배열의 형태로 NSExtensionItem 에 저장 된 개체를 InputItems 속성을 ExtensionContext 확장의 UIViewController합니다.For Extensions that will receive data from their host apps, the data is in the form of an array of NSExtensionItem objects stored in the InputItems property of the ExtensionContext of the Extension's UIViewController.

사진 편집 확장 등의 다른 확장을 완료 하거나 취소 사용 사용자 구분 될 수 있습니다.Other Extension, such as Photo Editing extensions, may distinguish between the user completing or cancelling usage. 이 신호를 받을 통해 호스트 앱으로 다시 합니다 CompleteRequest 하 고 CancelRequest 의 메서드 ExtensionContext 속성입니다.This will be signaled back to the host app via the CompleteRequest and CancelRequest methods of ExtensionContext property.

자세한 내용은 Apple의를 참조 하세요 앱 확장의 프로그래밍 가이드합니다.For more information, please see Apple's App Extension Programming Guide.

부모 앱을 사용 하 여 통신Communicating with the parent app

앱 그룹을 사용하면 서로 다른 애플리케이션(또는 애플리케이션과 해당 확장 프로그램)이 공유 파일 저장소 위치에 액세스할 수 있습니다.An App Group allows different applications (or an application and its extensions) to access a shared file storage location. 앱 그룹은 다음과 같은 데이터에 사용할 수 있습니다.App Groups can be used for data like:

자세한 내용은 참조 하십시오는 앱 그룹 부분 우리의 기능을 사용 하 여 작업 설명서.For more information, please see the App Groups section of our Working with Capabilities documentation.

MobileCoreServicesMobileCoreServices

확장을 사용 하는 경우 일정 한 형식 식별자 (UTI)를 사용 하 여 만들고 앱, 다른 앱 및 서비스 간에 교환 되는 데이터를 조작 합니다.When working with extensions, use a Uniform Type Identifier (UTI) to create and manipulate data that is exchanged between the app, other apps and/or services.

합니다 MobileCoreServices.UTType Apple의 관련 된 다음 도우미 속성을 정의 하는 정적 클래스 kUTType... 정의:The MobileCoreServices.UTType static class defines the following helper properties that relate to Apple's kUTType... definitions:

  • kUTTypeAlembic - Alembic
  • kUTTypeAliasFile - AliasFile
  • kUTTypeAliasRecord - AliasRecord
  • kUTTypeAppleICNS - AppleICNS
  • kUTTypeAppleProtectedMPEG4Audio - AppleProtectedMPEG4Audio
  • kUTTypeAppleProtectedMPEG4Video - AppleProtectedMPEG4Video
  • kUTTypeAppleScript - AppleScript
  • kUTTypeApplication - Application
  • kUTTypeApplicationBundle - ApplicationBundle
  • kUTTypeApplicationFile - ApplicationFile
  • kUTTypeArchive - Archive
  • kUTTypeAssemblyLanguageSource - AssemblyLanguageSource
  • kUTTypeAudio - Audio
  • kUTTypeAudioInterchangeFileFormat - AudioInterchangeFileFormat
  • kUTTypeAudiovisualContent - AudiovisualContent
  • kUTTypeAVIMovie - AVIMovie
  • kUTTypeBinaryPropertyList - BinaryPropertyList
  • kUTTypeBMP - BMP
  • kUTTypeBookmark - Bookmark
  • kUTTypeBundle - Bundle
  • kUTTypeBzip2Archive - Bzip2Archive
  • kUTTypeCalendarEvent - CalendarEvent
  • kUTTypeCHeader - CHeader
  • kUTTypeCommaSeparatedText - CommaSeparatedText
  • kUTTypeCompositeContent - CompositeContent
  • kUTTypeConformsToKey - ConformsToKey
  • kUTTypeContact - Contact
  • kUTTypeContent - Content
  • kUTTypeCPlusPlusHeader - CPlusPlusHeader
  • kUTTypeCPlusPlusSource - CPlusPlusSource
  • kUTTypeCSource - CSource
  • kUTTypeData - Database
  • kUTTypeDelimitedText - DelimitedText
  • kUTTypeDescriptionKey - DescriptionKey
  • kUTTypeDirectory - Directory
  • kUTTypeDiskImage - DiskImage
  • kUTTypeElectronicPublication - ElectronicPublication
  • kUTTypeEmailMessage - EmailMessage
  • kUTTypeExecutable - Executable
  • kUTExportedTypeDeclarationsKey - ExportedTypeDeclarationsKey
  • kUTTypeFileURL - FileURL
  • kUTTypeFlatRTFD - FlatRTFD
  • kUTTypeFolder - Folder
  • kUTTypeFont - Font
  • kUTTypeFramework - Framework
  • kUTTypeGIF - GIF
  • kUTTypeGNUZipArchive - GNUZipArchive
  • kUTTypeHTML - HTML
  • kUTTypeICO - ICO
  • kUTTypeIconFileKey - IconFileKey
  • kUTTypeIdentifierKey - IdentifierKey
  • kUTTypeImage - Image
  • kUTImportedTypeDeclarationsKey - ImportedTypeDeclarationsKey
  • kUTTypeInkText - InkText
  • kUTTypeInternetLocation - InternetLocation
  • kUTTypeItem - Item
  • kUTTypeJavaArchive - JavaArchive
  • kUTTypeJavaClass - JavaClass
  • kUTTypeJavaScript - JavaScript
  • kUTTypeJavaSource - JavaSource
  • kUTTypeJPEG - JPEG
  • kUTTypeJPEG2000 - JPEG2000
  • kUTTypeJSON - JSON
  • kUTType3dObject - k3dObject
  • kUTTypeLivePhoto - LivePhoto
  • kUTTypeLog - Log
  • kUTTypeM3UPlaylist - M3UPlaylist
  • kUTTypeMessage - Message
  • kUTTypeMIDIAudio - MIDIAudio
  • kUTTypeMountPoint - MountPoint
  • kUTTypeMovie - Movie
  • kUTTypeMP3 - MP3
  • kUTTypeMPEG - MPEG
  • kUTTypeMPEG2TransportStream - MPEG2TransportStream
  • kUTTypeMPEG2Video - MPEG2Video
  • kUTTypeMPEG4 - MPEG4
  • kUTTypeMPEG4Audio - MPEG4Audio
  • kUTTypeObjectiveCPlusPlusSource - ObjectiveCPlusPlusSource
  • kUTTypeObjectiveCSource - ObjectiveCSource
  • kUTTypeOSAScript - OSAScript
  • kUTTypeOSAScriptBundle - OSAScriptBundle
  • kUTTypePackage - Package
  • kUTTypePDF - PDF
  • kUTTypePerlScript - PerlScript
  • kUTTypePHPScript - PHPScript
  • kUTTypePICT - PICT
  • kUTTypePKCS12 - PKCS12
  • kUTTypePlainText - PlainText
  • kUTTypePlaylist - Playlist
  • kUTTypePluginBundle - PluginBundle
  • kUTTypePNG - PNG
  • kUTTypePolygon - Polygon
  • kUTTypePresentation - Presentation
  • kUTTypePropertyList - PropertyList
  • kUTTypePythonScript - PythonScript
  • kUTTypeQuickLookGenerator - QuickLookGenerator
  • kUTTypeQuickTimeImage - QuickTimeImage
  • kUTTypeQuickTimeMovie - QuickTimeMovie
  • kUTTypeRawImage - RawImage
  • kUTTypeReferenceURLKey - ReferenceURLKey
  • kUTTypeResolvable - Resolvable
  • kUTTypeRTF - RTF
  • kUTTypeRTFD - RTFD
  • kUTTypeRubyScript - RubyScript
  • kUTTypeScalableVectorGraphics - ScalableVectorGraphics
  • kUTTypeScript - Script
  • kUTTypeShellScript - ShellScript
  • kUTTypeSourceCode - SourceCode
  • kUTTypeSpotlightImporter - SpotlightImporter
  • kUTTypeSpreadsheet - Spreadsheet
  • kUTTypeStereolithography - Stereolithography
  • kUTTypeSwiftSource - SwiftSource
  • kUTTypeSymLink - SymLink
  • kUTTypeSystemPreferencesPane - SystemPreferencesPane
  • kUTTypeTabSeparatedText - TabSeparatedText
  • kUTTagClassFilenameExtension - TagClassFilenameExtension
  • kUTTagClassMIMEType - TagClassMIMEType
  • kUTTypeTagSpecificationKey - TagSpecificationKey
  • kUTTypeText - Text
  • kUTType3DContent - ThreeDContent
  • kUTTypeTIFF - TIFF
  • kUTTypeToDoItem - ToDoItem
  • kUTTypeTXNTextAndMultimediaData - TXNTextAndMultimediaData
  • kUTTypeUniversalSceneDescription - UniversalSceneDescription
  • kUTTypeUnixExecutable - UnixExecutable
  • kUTTypeURL - URL
  • kUTTypeURLBookmarkData - URLBookmarkData
  • kUTTypeUTF16ExternalPlainText - UTF16ExternalPlainText
  • kUTTypeUTF16PlainText - UTF16PlainText
  • kUTTypeUTF8PlainText - UTF8PlainText
  • kUTTypeUTF8TabSeparatedText - UTF8TabSeparatedText
  • kUTTypeVCard - VCard
  • kUTTypeVersionKey - VersionKey
  • kUTTypeVideo - Video
  • kUTTypeVolume - Volume
  • kUTTypeWaveformAudio - WaveformAudio
  • kUTTypeWebArchive - WebArchive
  • kUTTypeWindowsExecutable - WindowsExecutable
  • kUTTypeX509Certificate - X509Certificate
  • kUTTypeXML - XML
  • kUTTypeXMLPropertyList - XMLPropertyList
  • kUTTypeXPCService - XPCService
  • kUTTypeZipArchive - ZipArchive

다음 예제를 참조하십시오.See the following example:

using MobileCoreServices;
...

NSItemProvider itemProvider = new NSItemProvider ();
itemProvider.LoadItem(UTType.PropertyList ,null, (item, err) => {
    if (err == null) {
        NSDictionary results = (NSDictionary )item;
        NSString baseURI =
results.ObjectForKey("NSExtensionJavaScriptPreprocessingResultsKey");
    }
});

자세한 내용은 참조 하십시오는 앱 그룹 부분 우리의 기능을 사용 하 여 작업 설명서.For more information, please see the App Groups section of our Working with Capabilities documentation.

주의 사항 및 고려 사항Precautions and considerations

확장 앱 보다에 사용 가능한 메모리를 훨씬 적은 경우Extensions have significantly less memory available to them than apps do. 이러한 신속 하 고 사용자를 앱에서 호스팅되는 최소한의 침입을 사용 하 여 수행 해야 합니다.They are expected to perform rapidly and with minimal intrusion to the user and the app they are hosted in. 그러나 확장 브랜드 확장의 개발자를 식별할 수 있도록 UI 사용 하 여 사용 중인 앱에 속하는 컨테이너 앱을 눈에 띄는 유용한 함수를 제공 해야 합니다.However, an Extension should also provide a distinctive, useful function to the consuming app with a branded UI that allow the user to identify the Extension's developer or Container app they belong to.

긴밀 하 게 이러한 요구 사항이 들어 있습니다 철저 하 게 테스트 및 성능 및 메모리 사용에 대 한 최적화 된 확장을만 배포 해야 합니다.Given these tight requirement, you should only deploy Extensions that have been thoroughly tested and optimized for performance and memory consumption.

요약Summary

이 문서에서는 이러한 부분이 무엇 인지, 확장 지점 및 ios 확장에 적용 되는 알려진된 제한 사항이 형식의 확장 합니다.This document has covered Extensions, what they are, the type of Extension Points and the known limitations imposed on an Extension by iOS. 이 설명 만들고, 배포 하 고, 설치 하 고 확장 및 확장 수명 주기를 실행 합니다.It discussed creating, distributing, installing and running Extensions and the Extension lifecycle. 만드는 간단한 연습을 제공 하지 않습니다 오늘 위젯: 스토리 보드 또는 코드를 사용 하 여 위젯의 UI를 만드는 두 가지 방법을 표시 합니다.It provided a walkthrough of creating a simple Today widget showing two ways to create the widget's UI using either Storyboards or code. IOS 시뮬레이터에서에서 확장을 테스트 하는 방법에 알아보았습니다.It showed how to test an extension in the iOS Simulator. 마지막으로, 해당 간단히 설명한 것 처럼 호스트 앱 및 확장을 개발 하는 경우 수행 해야 하는 고려 사항 몇 가지 예방 조치 디렉터리와 통신 합니다.Finally, it briefly discussed communicating with the Host App and a few precautions and considerations that should be taken when developing an extension.