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 |
Photos.app 편집기 |
공유 | 소셜 네트워크, 메시징 서비스 등과 데이터를 공유합니다. | com.apple.share-services |
모두 |
Today | 오늘 화면 또는 알림 센터에 표시되는 "위젯" | com.apple.widget-extensions |
오늘 및 알림 센터 |
iOS 10 및 iOS 12에 추가 확장 지점이 추가되었습니다. iOS 앱 확장 프로그래밍 가이드에서 지원되는 모든 형식의 전체 테이블을 찾을 수 있습니다.
제한 사항
확장에는 여러 가지 제한 사항이 있으며, 그 중 일부는 모든 유형(예: 확장 유형이 카메라 또는 마이크에 액세스할 수 없음)에 보편적인 반면, 다른 유형의 확장에는 사용에 대한 특정 제한 사항이 있을 수 있습니다(예: 사용자 지정 키보드는 암호와 같은 보안 데이터 입력 필드에 사용할 수 없음).
보편적인 제한 사항은 다음과 같습니다.
- 상태 키트 및 이벤트 키트 UI 프레임워크를 사용할 수 없습니다.
- 확장은 확장된 백그라운드 모드를 사용할 수 없습니다.
- 확장은 디바이스의 카메라 또는 마이크에 액세스할 수 없습니다(기존 미디어 파일에 액세스할 수 있음).
- 확장은 Air Drop 데이터를 받을 수 없습니다(Air Drop을 통해 데이터를 전송할 수 있지만).
- UIActionSheet 및 UIAlertView 를 사용할 수 없습니다. 확장은 UIAlertController를 사용해야 합니다.
- UIApplication의 여러 멤버를 사용할 수 없습니다. UIApplication.SharedApplication, UIApplication.OpenUrl, UIApplication.BeginIgnoringInteractionEvents 및 UIApplication.EndIgnoringInteractionEvents
- iOS는 오늘 확장에 16MB 메모리 사용 제한을 적용합니다.
- 기본적으로 키보드 확장은 네트워크에 액세스할 수 없습니다. Xamarin.iOS는 디버깅이 작동하려면 네트워크 액세스가 필요하므로 디바이스의 디버깅에 영향을 줍니다(시뮬레이터에는 제한이 적용되지 않음). 프로젝트의 Info.plist에 있는 값을 .로 설정
Requests Open Access
하여 네트워크 액세스를 요청할 수 있습니다Yes
. 키보드 확장 제한 사항에 대한 자세한 내용은 Apple의 사용자 지정 키보드 가이드 를 참조하세요.
개별 제한 사항은 Apple의 앱 확장 프로그래밍 가이드를 참조하세요.
확장 배포, 설치 및 실행
확장은 컨테이너 앱 내에서 배포되며, 그러면 앱 스토어를 통해 제출되고 배포됩니다. 앱과 함께 배포된 확장은 해당 시점에 설치되지만 사용자는 각 확장을 명시적으로 사용하도록 설정해야 합니다. 다양한 유형의 확장이 다양한 방식으로 사용하도록 설정됩니다. 몇 가지는 사용자가 설정 앱으로 이동하여 해당 앱에서 사용하도록 설정해야 합니다. 사진을 보낼 때 공유 확장 프로그램 사용과 같이 다른 사용자는 사용 시점에 사용하도록 설정되어 있습니다.
확장이 사용되는 앱(사용자가 확장 지점을 접하는 경우)은 확장이 실행될 때 호스트하는 앱이므로 호스트 앱이라고 합니다. 확장을 설치하는 앱은 컨테이너 앱입니다. 확장이 설치되었을 때 확장이 포함된 앱이기 때문입니다.
일반적으로 컨테이너 앱은 확장을 설명하고 사용자가 확장을 사용하도록 설정하는 과정을 안내합니다.
확장의 디버그 및 릴리스 버전
앱 확장을 실행하기 위한 메모리 제한은 포그라운드 앱에 적용되는 메모리 제한보다 훨씬 낮습니다. iOS를 실행하는 시뮬레이터는 확장에 적용되는 제한이 적으며 아무 문제 없이 확장을 실행할 수 있습니다. 그러나 디바이스에서 동일한 확장을 실행하면 시스템에 의해 확장이 충돌하거나 적극적으로 종료되는 등 예기치 않은 결과가 발생할 수 있습니다. 따라서 디바이스를 배송하기 전에 디바이스에서 확장을 빌드하고 테스트해야 합니다.
컨테이너 프로젝트 및 참조된 모든 확장에 다음 설정이 적용되었는지 확인해야 합니다.
- 릴리스 구성에서 애플리케이션 패키지를 빌드합니다.
- iOS 빌드 프로젝트 설정에서 링커 동작 옵션을 프레임워크 SDK만 연결 또는 모두 연결로 설정합니다.
- iOS 디버그 프로젝트 설정에서 디버깅 사용 및 프로파일링 사용 옵션을 선택 취소합니다.
확장 수명 주기
확장은 UI의 여러 화면을 제공하는 단일 UIViewController 또는 더 복잡한 확장만큼 간단할 수 있습니다. 사용자가 확장 지점(예: 이미지를 공유할 때)을 발견하면 해당 확장 지점에 등록된 확장 중에서 선택할 수 있습니다.
앱의 확장 UIViewController
중 하나를 선택하면 앱이 인스턴스화되고 일반 보기 컨트롤러 수명 주기가 시작됩니다. 그러나 사용자가 상호 작용을 완료할 때 일시 중단되지만 일반적으로 종료되지 않는 일반 앱과 달리 확장은 로드, 실행 및 반복적으로 종료됩니다.
확장은 NSExtensionContext 개체를 통해 호스트 앱과 통신할 수 있습니다. 일부 확장에는 결과와 함께 비동기 콜백을 수신하는 작업이 있습니다. 이러한 콜백은 백그라운드 스레드에서 실행되며 확장은 이를 고려해야 합니다. 예를 들어 사용자 인터페이스를 업데이트하려면 NSObject.InvokeOnMainThread를 사용합니다. 자세한 내용은 아래의 호스트 앱과 통신 섹션을 참조하세요.
기본적으로 확장과 해당 컨테이너 앱은 함께 설치되어 있음에도 불구하고 통신할 수 없습니다. 경우에 따라 컨테이너 앱은 기본적으로 확장이 설치되면 해당 용도가 제공되는 빈 "배송" 컨테이너입니다. 그러나 상황에 따라 컨테이너 앱과 확장이 공통 영역의 리소스를 공유할 수 있습니다. 또한 오늘 확장은 해당 컨테이너 앱에 URL을 열도록 요청할 수 있습니다. 이 동작은 이벤트 카운트다운 위젯에 표시됩니다.
확장 만들기
확장(및 해당 컨테이너 앱)은 64비트 이진 파일이어야 하며 Xamarin.iOS 통합 API를 사용하여 빌드되어야 합니다. 확장을 개발할 때 솔루션에는 컨테이너 앱과 컨테이너가 제공하는 각 확장에 대한 하나의 프로젝트라는 두 개 이상의 프로젝트가 포함됩니다.
컨테이너 앱 프로젝트 요구 사항
확장을 설치하는 데 사용되는 컨테이너 앱에는 다음과 같은 요구 사항이 있습니다.
- 확장 프로젝트에 대한 참조를 유지해야 합니다.
- 확장을 설치하는 방법을 제공하는 것 외에는 아무 작업도 수행하지 않더라도 완전한 앱이어야 합니다(성공적으로 시작하고 실행할 수 있어야 합니다).
- 확장 프로젝트의 번들 식별자에 대한 기초가 되는 번들 식별자가 있어야 합니다(자세한 내용은 아래 섹션 참조).
확장 프로젝트 요구 사항
또한 확장 프로젝트의 요구 사항은 다음과 같습니다.
컨테이너 앱의 번들 식별자로 시작하는 번들 식별자가 있어야 합니다. 예를 들어 컨테이너 앱에 번들 식별자가
com.myCompany.ContainerApp
있는 경우 확장의 식별자는 다음과 같습니다com.myCompany.ContainerApp.MyExtension
.파일에 적절한 값(예:
com.apple.widget-extension
오늘 알림 센터 위젯)Info.plist
을 사용하여 키를NSExtensionPointIdentifier
정의해야 합니다.또한 해당 파일의
NSExtensionMainStoryboard
키 또는NSExtensionPrincipalClass
키를Info.plist
적절한 값으로 정의 해야 합니다.- 키를
NSExtensionMainStoryboard
사용하여 확장의 기본 UI를 표시하는 Storyboard의 이름을 지정합니다(빼기.storyboard
). 예를 들어Main
파일의 경우입니다Main.storyboard
. - 키를
NSExtensionPrincipalClass
사용하여 확장이 시작될 때 초기화할 클래스를 지정합니다. 값은 다음UIViewController
의 Register 값과 일치해야 합니다.
- 키를
특정 유형의 확장에는 추가 요구 사항이 있을 수 있습니다. 예를 들어 Today 또는 Notification Center Extension의 주 클래스는 INCWidgetProviding을 구현해야 합니다.
Important
Mac용 Visual Studio 제공하는 확장 템플릿 중 하나를 사용하여 프로젝트를 시작하는 경우 대부분의 요구 사항이 제공되고 템플릿에서 자동으로 충족됩니다.
연습
다음 연습에서는 연도에 남은 일 수와 일 수를 계산하는 예제 Today 위젯을 만듭니다.
솔루션 만들기
필요한 솔루션을 만들려면 다음을 수행합니다.
먼저 새 iOS, 단일 보기 앱 프로젝트를 만들고 다음 단추를 클릭합니다.
프로젝트를
TodayContainer
호출하고 다음 단추를 클릭합니다.프로젝트 이름 및 SolutionName을 확인하고 만들기 단추를 클릭하여 솔루션을 만듭니다.
다음으로, 솔루션 탐색기 솔루션을 마우스 오른쪽 단추로 클릭하고 오늘 확장 템플릿에서 새 iOS 확장 프로젝트를 추가합니다.
프로젝트를
DaysRemaining
호출하고 다음 단추를 클릭합니다.프로젝트를 검토하고 만들기 단추를 클릭하여 만듭니다.
결과 솔루션에는 이제 다음과 같이 두 개의 프로젝트가 있어야 합니다.
확장 사용자 인터페이스 만들기
다음으로, 오늘 위젯에 대한 인터페이스를 디자인해야 합니다. 이 작업은 Storyboard를 사용하거나 코드에서 UI를 만들어 수행할 수 있습니다. 두 방법 모두 아래에서 자세히 설명합니다.
스토리보드 사용
Storyboard를 사용하여 UI를 빌드하려면 다음을 수행합니다.
솔루션 탐색기 확장 프로젝트의
Main.storyboard
파일을 두 번 클릭하여 편집용으로 엽니다.템플릿으로 UI에 자동으로 추가된 레이블을 선택하고 속성 탐색기의 위젯 탭에서 이름을
TodayMessage
지정합니다.변경 내용을 Storyboard에 저장합니다.
코드 사용
코드에서 UI를 빌드하려면 다음을 수행합니다.
솔루션 탐색기 DaysRemaining 프로젝트를 선택하고 새 클래스를 추가하고 다음을 호출합니다
CodeBasedViewController
.다시 솔루션 탐색기 확장 프로그램
Info.plist
파일을 두 번 클릭하여 편집용으로 엽니다.화면 아래쪽에서 원본 보기를 선택하고 노드를
NSExtension
엽니다.NSExtensionMainStoryboard
키를 제거하고 값을CodeBasedViewController
사용하여NSExtensionPrincipalClass
추가합니다.변경 내용을 저장합니다.
다음으로 파일을 편집 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
파일을 편집하고 확장의 함수를 정의하는 텍스트와 설치 방법을 추가합니다.
변경 내용을 Storyboard에 저장합니다.
확장 테스트
iOS 시뮬레이터에서 확장을 테스트하려면 TodayContainer 앱을 실행합니다. 컨테이너의 기본 보기가 표시됩니다.
그런 다음 시뮬레이터의 홈 단추를 누르고 화면 위쪽에서 아래로 살짝 밀어 알림 센터를 열고 오늘 탭을 선택하고 편집 단추를 클릭합니다.
오늘 보기에 DaysRemaining 확장을 추가하고 완료 단추를 클릭합니다.
새 위젯이 오늘 보기에 추가되고 결과가 표시됩니다.
호스트 앱과 통신
위에서 만든 오늘 확장 예제는 호스트 앱( 오늘 화면)과 통신하지 않습니다. 이 경우 또는 CodeBasedViewController
클래스의 TodayViewController
ExtensionContext 속성을 사용합니다.
호스트 앱에서 데이터를 수신하는 확장의 경우 데이터는 Extension's의 ExtensionContext의 InputItems 속성에 저장된 NSExtensionItem 개체 배열 형식입니다UIViewController
.
사진 편집 확장과 같은 다른 확장은 사용자가 사용을 완료하거나 취소하는 것을 구별할 수 있습니다. ExtensionContext 속성의 CompleteRequest 및 CancelRequest 메서드를 통해 호스트 앱으로 다시 신호가 전송됩니다.
자세한 내용은 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 시뮬레이터에서 확장을 테스트하는 방법을 보여 줬습니다. 마지막으로, 호스트 앱과 통신하는 방법과 확장을 개발할 때 수행해야 하는 몇 가지 예방 조치 및 고려 사항에 대해 간략하게 설명했습니다.