Xamarin.iOS의 iOS 확장

iOS 비디오에서 확장 만들기

iOS 8에 도입된 확장은 사용자가 특수 입력 UIViewControllers 을 수행하도록 요청한 사용자 지정 키보드 유형 또는 확장에서 특수 효과 필터를 제공할 수 있는 사진 편집과 같은 기타 컨텍스트로 알림 센터 내와 같은 표준 컨텍스트 내에서 iOS에서 제공하는 특수화된 기능입니다.

모든 확장은 컨테이너 앱(64비트 통합 API를 사용하여 작성된 두 요소 모두 포함)과 함께 설치되며 호스트 앱의 특정 확장 지점에서 활성화됩니다. 그리고 그들은 기존 시스템 기능에 보충으로 사용 될 것 이다, 그들은 고성능 이어야 합니다., 마른, 그리고 강력한.

확장 지점

Type 설명 확장 지점 호스트 앱
작업 특정 미디어 형식에 대한 특수 편집기 또는 뷰어 com.apple.ui-services 모두
문서 공급자 앱에서 원격 문서 저장소를 사용할 수 있도록 허용 com.apple.fileprovider-ui UIDocumentPickerViewController를 사용하는 앱
Keyboard 대체 키보드 com.apple.keyboard-service 모두
사진 편집 사진 조작 및 편집 com.apple.photo-editing 사진.app 편집기
공유 소셜 네트워크, 메시징 서비스 등과 데이터를 공유합니다. com.apple.share-services 모두
Today 오늘 화면 또는 알림 센터에 표시되는 "위젯" com.apple.widget-extensions 오늘 및 알림 센터

iOS 10iOS 12에 추가 확장 지점이 추가되었습니다. iOS 앱 확장 프로그래밍 가이드에서 지원되는 모든 형식의 전체 테이블을 찾을 수 있습니다.

제한 사항

확장에는 여러 가지 제한 사항이 있으며, 그 중 일부는 모든 유형(예: 확장 유형이 카메라 또는 마이크에 액세스할 수 없음)에 보편적인 반면, 다른 유형의 확장에는 사용에 대한 특정 제한 사항이 있을 수 있습니다(예: 사용자 지정 키보드는 암호와 같은 보안 데이터 입력 필드에 사용할 수 없음).

보편적인 제한 사항은 다음과 같습니다.

개별 제한 사항은 Apple의 앱 확장 프로그래밍 가이드를 참조하세요.

확장 배포, 설치 및 실행

확장은 컨테이너 앱 내에서 배포되며, 그러면 앱 스토어를 통해 제출되고 배포됩니다. 앱과 함께 배포된 확장은 해당 시점에 설치되지만 사용자는 각 확장을 명시적으로 사용하도록 설정해야 합니다. 다양한 유형의 확장이 다양한 방식으로 사용하도록 설정됩니다. 몇 가지는 사용자가 설정 앱으로 이동하여 해당 앱에서 사용하도록 설정해야 합니다. 사진을 보낼 때 공유 확장 프로그램 사용과 같이 다른 사용자는 사용 시점에 사용하도록 설정되어 있습니다.

확장이 사용되는 앱(사용자가 확장 지점을 접하는 경우)은 확장이 실행될 때 호스트하는 앱이므로 호스트 앱이라고 합니다. 확장을 설치하는 앱은 컨테이너 앱입니다. 확장이 설치되었을 때 확장이 포함된 앱이기 때문입니다.

일반적으로 컨테이너 앱은 확장을 설명하고 사용자가 확장을 사용하도록 설정하는 과정을 안내합니다.

확장의 디버그 및 릴리스 버전

앱 확장을 실행하기 위한 메모리 제한은 포그라운드 앱에 적용되는 메모리 제한보다 훨씬 낮습니다. iOS를 실행하는 시뮬레이터는 확장에 적용되는 제한이 적으며 아무 문제 없이 확장을 실행할 수 있습니다. 그러나 디바이스에서 동일한 확장을 실행하면 시스템에 의해 확장이 충돌하거나 적극적으로 종료되는 등 예기치 않은 결과가 발생할 수 있습니다. 따라서 디바이스를 배송하기 전에 디바이스에서 확장을 빌드하고 테스트해야 합니다.

컨테이너 프로젝트 및 참조된 모든 확장에 다음 설정이 적용되었는지 확인해야 합니다.

  1. 릴리스 구성에서 애플리케이션 패키지를 빌드합니다.
  2. iOS 빌드 프로젝트 설정에서 링커 동작 옵션을 프레임워크 SDK만 연결 또는 모두 연결로 설정합니다.
  3. iOS 디버그 프로젝트 설정에서 디버깅 사용 및 프로파일링 사용 옵션의 검사 해제합니다.

확장 수명 주기

확장은 UI의 여러 화면을 제공하는 단일 UIViewController 또는 더 복잡한 확장만큼 간단할 수 있습니다. 사용자가 확장 지점(예: 이미지를 공유할 때)을 발견하면 해당 확장 지점에 등록된 확장 중에서 선택할 수 있습니다.

앱의 확장 UIViewController 중 하나를 선택하면 앱이 인스턴스화되고 일반 보기 컨트롤러 수명 주기가 시작됩니다. 그러나 사용자가 상호 작용을 완료할 때 일시 중단되지만 일반적으로 종료되지 않는 일반 앱과 달리 확장은 로드, 실행 및 반복적으로 종료됩니다.

확장은 NSExtensionContext 개체를 통해 호스트 앱과 통신할 수 있습니다. 일부 확장에는 결과와 함께 비동기 콜백을 수신하는 작업이 있습니다. 이러한 콜백은 백그라운드 스레드에서 실행되며 확장은 이를 고려해야 합니다. 예를 들어 사용자 인터페이스를 업데이트하려면 NSObject.InvokeOnMainThread를 사용합니다. 자세한 내용은 아래의 호스트 앱과 통신 섹션을 참조하세요.

기본적으로 확장과 해당 컨테이너 앱은 함께 설치되어 있음에도 불구하고 통신할 수 없습니다. 경우에 따라 컨테이너 앱은 기본적으로 확장이 설치되면 해당 용도가 제공되는 빈 "배송" 컨테이너입니다. 그러나 상황에 따라 컨테이너 앱과 확장이 공통 영역의 리소스를 공유할 수 있습니다. 또한 오늘 확장해당 컨테이너 앱에 URL을 열도록 요청할 수 있습니다. 이 동작은 이벤트 카운트다운 위젯에 표시됩니다.

확장 만들기

확장(및 해당 컨테이너 앱)은 64비트 이진 파일이어야 하며 Xamarin.iOS 통합 API를 사용하여 빌드되어야 합니다. 확장을 개발할 때 솔루션에는 컨테이너 앱과 컨테이너가 제공하는 각 확장에 대한 하나의 프로젝트라는 두 개 이상의 프로젝트가 포함됩니다.

컨테이너 앱 프로젝트 요구 사항

확장을 설치하는 데 사용되는 컨테이너 앱에는 다음과 같은 요구 사항이 있습니다.

  • 확장 프로젝트에 대한 참조를 기본 합니다.
  • 확장을 설치하는 방법을 제공하는 것 외에는 아무 작업도 수행하지 않더라도 완전한 앱이어야 합니다(성공적으로 시작하고 실행할 수 있어야 합니다).
  • 확장 프로젝트의 번들 식별자에 대한 기초가 되는 번들 식별자가 있어야 합니다(자세한 내용은 아래 섹션 참조).

확장 프로젝트 요구 사항

또한 확장 프로젝트의 요구 사항은 다음과 같습니다.

  • 컨테이너 앱의 번들 식별자로 시작하는 번들 식별자가 있어야 합니다. 예를 들어 컨테이너 앱에 번들 식별자가 com.myCompany.ContainerApp있는 경우 확장의 식별자는 다음과 같습니다 com.myCompany.ContainerApp.MyExtension.

    Bundle identifiers

  • 파일에 적절한 값(예: com.apple.widget-extension 오늘 알림 센터 위젯)Info.plist사용하여 키를 NSExtensionPointIdentifier정의해야 합니다.

  • 또한 해당 파일의 NSExtensionMainStoryboard 키 또는 NSExtensionPrincipalClass 키를 Info.plist 적절한 값으로 정의 해야 합니다.

    • 키를 NSExtensionMainStoryboard 사용하여 확장에 대한 기본 UI를 표시하는 Storyboard의 이름을 지정합니다(빼기.storyboard). 예를 들어 Main 파일의 경우입니다 Main.storyboard .
    • 키를 NSExtensionPrincipalClass 사용하여 확장이 시작될 때 초기화할 클래스를 지정합니다. 값은 다음UIViewControllerRegister 값과 일치해야 합니다.

    Principal class registration

특정 유형의 확장에는 추가 요구 사항이 있을 수 있습니다. 예를 들어 Today 또는 Notification Center Extension의 주 클래스는 INCWidgetProviding을 구현해야 합니다.

Important

Mac용 Visual Studio 제공하는 확장 템플릿 중 하나를 사용하여 프로젝트를 시작하는 경우 대부분의 요구 사항이 제공되고 템플릿에서 자동으로 충족됩니다.

연습

다음 연습에서는 연도에 다시 기본 일 수와 일 수를 계산하는 예제 Today 위젯을 만듭니다.

An example Today widget that calculates the day and number of days remaining in the year

솔루션 만들기

필요한 솔루션을 만들려면 다음을 수행합니다.

  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

확장 사용자 인터페이스 만들기

다음으로, 오늘 위젯에 대한 인터페이스를 디자인해야 합니다. 이 작업은 Storyboard를 사용하거나 코드에서 UI를 만들어 수행할 수 있습니다. 두 방법 모두 아래에서 자세히 설명합니다.

스토리보드 사용

Storyboard를 사용하여 UI를 빌드하려면 다음을 수행합니다.

  1. 솔루션 탐색기 확장 프로젝트의 Main.storyboard 파일을 두 번 클릭하여 편집용으로 엽니다.

    Double-click the Extension projects 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. 변경 내용을 Storyboard에 저장합니다.

코드 사용

코드에서 UI를 빌드하려면 다음을 수행합니다.

  1. 솔루션 탐색기 DaysRe기본ing 프로젝트를 선택하고 새 클래스를 추가하고 다음을 호출합니다CodeBasedViewController.

    Aelect the DaysRemaining project, add a new class and call it CodeBasedViewController

  2. 다시 솔루션 탐색기 확장 프로그램 Info.plist 파일을 두 번 클릭하여 편집용으로 엽니다.

    Double-click Extensions 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 키를 제거하고 값을 CodeBasedViewController사용하여 NSExtensionPrincipalClass 추가합니다.

    Remove the NSExtensionMainStoryboard key and add a NSExtensionPrincipalClass with the value CodeBasedViewController

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

다음으로 파일을 편집 CodeBasedViewController.cs 하고 다음과 같이 표시합니다.

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 .

확장 코딩

사용자 인터페이스를 만든 상태에서 위의 사용자 인터페이스를 만드는 데 사용되는 메서드를 기반으로 파일 또는 파일을 열고 TodayViewController.cs ViewDidLoad 메서드를 변경하고 다음과 같이 표시 CodeBasedViewController.cs 합니다.

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... 위의 새 코드로 바꿉니다. 기본 구현을 호출하고 코드 기반 버전에 대한 레이블을 삽입한 후 이 코드는 간단한 계산을 수행하여 연도의 날짜와 다시 기본 일 수를 가져옵니다. 그런 다음 UI 디자인에서 만든 레이블(TodayMessage)에 메시지를 표시합니다.

이 프로세스는 앱을 작성하는 일반적인 프로세스와 얼마나 유사한지 확인합니다. 확장은 앱에서 UIViewController 보기 컨트롤러와 동일한 수명 주기를 가지지만 확장에는 백그라운드 모드가 없으며 사용자가 사용을 마쳤을 때 일시 중단되지 않습니다. 대신 필요에 따라 확장이 반복적으로 초기화되고 할당이 해제됩니다.

컨테이너 앱 사용자 인터페이스 만들기

이 연습에서는 컨테이너 앱이 확장을 배송하고 설치하는 방법으로만 사용되며 자체 기능을 제공하지 않습니다. TodayContainer의 Main.storyboard 파일을 편집하고 확장의 함수를 정의하는 텍스트와 설치 방법을 추가합니다.

Edit the TodayContainers Main.storyboard file and add some text defining the Extensions function and how to install it

변경 내용을 Storyboard에 저장합니다.

확장 테스트

iOS 시뮬레이터에서 확장을 테스트하려면 TodayContainer 앱을 실행합니다. 컨테이너의 기본 보기가 표시됩니다.

The containers main view will be displayed

그런 다음 시뮬레이터의 단추를 누르고 화면 위쪽에서 아래로 살짝 밀어 알림 센터를 열고 오늘 탭을 선택하고 편집 단추를 클릭합니다.

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

오늘 보기에 DaysRe기본ing 확장을 추가하고 완료 단추를 클릭합니다.

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

호스트 앱과 통신

위에서 만든 오늘 확장 예제는 호스트 앱( 오늘 화면)과 통신하지 않습니다. 이 경우 또는 CodeBasedViewController 클래스의 TodayViewController ExtensionContext 속성을 사용합니다.

호스트 앱에서 데이터를 수신하는 확장의 경우 데이터는 Extension's의 ExtensionContext의 InputItems 속성저장된 NSExtensionItem 개체 배열 형식입니다UIViewController.

사진 편집 확장과 같은 다른 확장은 사용자가 사용을 완료하거나 취소하는 것을 구별할 수 있습니다. ExtensionContext 속성의 CompleteRequestCancelRequest 메서드를 통해 호스트 앱으로 다시 신호가 전송됩니다.

자세한 내용은 Apple의 앱 확장 프로그래밍 가이드를 참조하세요.

부모 앱과 통신

앱 그룹을 사용하면 서로 다른 애플리케이션(또는 애플리케이션과 해당 확장 프로그램)이 공유 파일 스토리지 위치에 액세스할 수 있습니다. 앱 그룹은 다음과 같은 데이터에 사용할 수 있습니다.

자세한 내용은 기능 작업 설명서의 앱 그룹 섹션을 참조하세요.

MobileCoreServices

확장을 사용하는 경우 UTI(Uniform Type Identifier)를 사용하여 앱, 다른 앱 및/또는 서비스 간에 교환되는 데이터를 만들고 조작합니다.

정적 클래스는 MobileCoreServices.UTType Apple kUTType... 의 정의와 관련된 다음 도우미 속성을 정의합니다.

  • 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

다음 예제를 참조하십시오.

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");
    }
});

자세한 내용은 기능 작업 설명서의 앱 그룹 섹션을 참조하세요.

주의 사항 및 고려 사항

확장은 앱보다 사용 가능한 메모리가 훨씬 적습니다. 사용자 및 호스트되는 앱에 대한 최소한의 침입으로 신속하게 수행할 것으로 예상됩니다. 그러나 확장은 사용자가 자신이 속한 확장의 개발자 또는 컨테이너 앱을 식별할 수 있는 브랜드 UI를 사용하여 소비 앱에 독특하고 유용한 기능을 제공해야 합니다.

이러한 엄격한 요구 사항을 감안할 때 성능 및 메모리 사용을 위해 철저히 테스트되고 최적화된 확장만 배포해야 합니다.

요약

이 문서에서는 확장, 확장의 정의, 확장 지점의 유형 및 iOS의 확장에 적용되는 알려진 제한 사항에 대해 설명했습니다. 확장 및 확장 수명 주기 만들기, 배포, 설치 및 실행에 대해 설명했습니다. Storyboard 또는 코드를 사용하여 위젯의 UI를 만드는 두 가지 방법을 보여 주는 간단한 Today 위젯을 만드는 연습을 제공했습니다. iOS 시뮬레이터에서 확장을 테스트하는 방법을 보여 줬습니다. 마지막으로, 호스트 앱과 통신하는 방법과 확장을 개발할 때 수행해야 하는 몇 가지 예방 조치 및 고려 사항에 대해 간략하게 설명했습니다.