Pemilih Dokumen di Xamarin.iOS
Pemilih Dokumen memungkinkan dokumen dibagikan antar aplikasi. Dokumen-dokumen ini dapat disimpan di iCloud atau di direktori aplikasi lain. Dokumen dibagikan melalui kumpulan Ekstensi Penyedia Dokumen yang telah diinstal pengguna pada perangkat mereka.
Karena kesulitan menjaga dokumen tetap sinkron di seluruh aplikasi dan cloud, dokumen tersebut memperkenalkan sejumlah kompleksitas yang diperlukan.
Persyaratan
Berikut ini diperlukan untuk menyelesaikan langkah-langkah yang disajikan dalam artikel ini:
- Xcode 7 dan iOS 8 atau yang lebih baru – API Xcode 7 dan iOS 8 apple atau yang lebih baru perlu diinstal dan dikonfigurasi di komputer pengembang.
- Visual Studio atau Visual Studio untuk Mac – Versi terbaru Visual Studio untuk Mac harus diinstal.
- Perangkat iOS – Perangkat iOS yang menjalankan iOS 8 atau lebih tinggi.
Perubahan pada iCloud
Untuk mengimplementasikan fitur baru Pemilih Dokumen, perubahan berikut telah dilakukan pada Layanan iCloud Apple:
- iCloud Daemon telah ditulis ulang sepenuhnya menggunakan CloudKit.
- Fitur iCloud yang ada telah diganti namanya menjadi iCloud Drive.
- Dukungan untuk MICROSOFT Windows OS telah ditambahkan ke iCloud.
- Folder iCloud telah ditambahkan di Mac OS Finder.
- Perangkat iOS dapat mengakses konten folder Mac OS iCloud.
Penting
Apple menyediakan alat untuk membantu pengembang menangani Peraturan Perlindungan Data Umum (GDPR) Uni Eropa dengan benar.
Apa itu Dokumen?
Saat merujuk ke Dokumen di iCloud, dokumen tersebut adalah entitas tunggal yang berdiri sendiri dan harus dirasakan oleh pengguna. Pengguna mungkin ingin mengubah dokumen atau membagikannya dengan pengguna lain (misalnya dengan menggunakan email).
Ada beberapa jenis file yang akan segera dikenali pengguna sebagai Dokumen, seperti file Pages, Keynote, atau Numbers. Namun, iCloud tidak terbatas pada konsep ini. Misalnya, status permainan (seperti pertandingan Catur) dapat diperlakukan sebagai dokumen dan disimpan di iCloud. File ini dapat diteruskan antara perangkat pengguna dan memungkinkan mereka untuk mengambil permainan di mana mereka meninggalkan di perangkat yang berbeda.
Menangani Dokumen
Sebelum menyelami kode yang diperlukan untuk menggunakan Pemilih Dokumen dengan Xamarin, artikel ini akan membahas praktik terbaik untuk bekerja dengan Dokumen iCloud, dan beberapa modifikasi yang dilakukan pada API yang ada yang diperlukan untuk mendukung Pemilih Dokumen.
Menggunakan Koordinasi File
Karena file dapat dimodifikasi dari beberapa lokasi yang berbeda, koordinasi harus digunakan untuk mencegah kehilangan data.
Mari kita lihat ilustrasi di atas:
- Perangkat iOS yang menggunakan koordinasi file membuat Dokumen baru dan menyimpannya ke Folder iCloud.
- iCloud menyimpan file yang dimodifikasi ke cloud untuk didistribusikan ke setiap perangkat.
- Mac terlampir melihat file yang dimodifikasi di Folder iCloud dan menggunakan Koordinasi File untuk menyalin perubahan ke file.
- Perangkat yang tidak menggunakan Koordinasi File membuat perubahan pada file dan menyimpannya ke Folder iCloud. Perubahan ini langsung direplikasi ke perangkat lain.
Asumsikan perangkat iOS asli atau Mac sedang mengedit file, sekarang perubahannya hilang dan ditimpa dengan versi file dari perangkat yang tidak terkoordinasi. Untuk mencegah kehilangan data, Koordinasi File adalah suatu keharusan saat bekerja dengan Dokumen berbasis cloud.
Menggunakan UIDocument
UIDocument
membuat hal-hal sederhana (atau NSDocument
di macOS) dengan melakukan semua lifting berat untuk pengembang. Ini menyediakan Koordinasi File bawaan dengan antrean latar belakang agar tidak memblokir UI aplikasi.
UIDocument
mengekspos beberapa API tingkat tinggi yang memudahkan upaya pengembangan aplikasi Xamarin untuk tujuan apa pun yang diperlukan pengembang.
Kode berikut membuat subkelas UIDocument
untuk mengimplementasikan dokumen berbasis teks generik yang dapat digunakan untuk menyimpan dan mengambil teks dari iCloud:
using System;
using Foundation;
using UIKit;
namespace DocPicker
{
public class GenericTextDocument : UIDocument
{
#region Private Variable Storage
private NSString _dataModel;
#endregion
#region Computed Properties
public string Contents {
get { return _dataModel.ToString (); }
set { _dataModel = new NSString(value); }
}
#endregion
#region Constructors
public GenericTextDocument (NSUrl url) : base (url)
{
// Set the default document text
this.Contents = "";
}
public GenericTextDocument (NSUrl url, string contents) : base (url)
{
// Set the default document text
this.Contents = contents;
}
#endregion
#region Override Methods
public override bool LoadFromContents (NSObject contents, string typeName, out NSError outError)
{
// Clear the error state
outError = null;
// Were any contents passed to the document?
if (contents != null) {
_dataModel = NSString.FromData( (NSData)contents, NSStringEncoding.UTF8 );
}
// Inform caller that the document has been modified
RaiseDocumentModified (this);
// Return success
return true;
}
public override NSObject ContentsForType (string typeName, out NSError outError)
{
// Clear the error state
outError = null;
// Convert the contents to a NSData object and return it
NSData docData = _dataModel.Encode(NSStringEncoding.UTF8);
return docData;
}
#endregion
#region Events
public delegate void DocumentModifiedDelegate(GenericTextDocument document);
public event DocumentModifiedDelegate DocumentModified;
internal void RaiseDocumentModified(GenericTextDocument document) {
// Inform caller
if (this.DocumentModified != null) {
this.DocumentModified (document);
}
}
#endregion
}
}
Kelas GenericTextDocument
yang disajikan di atas akan digunakan di seluruh artikel ini saat bekerja dengan Pemilih Dokumen dan Dokumen eksternal dalam aplikasi Xamarin.iOS 8.
Koordinasi File Asinkron
iOS 8 menyediakan beberapa fitur Koordinasi File Asinkron baru melalui API Koordinasi File baru. Sebelum iOS 8, semua API Koordinasi File yang ada benar-benar sinkron. Ini berarti pengembang bertanggung jawab untuk menerapkan antrean latar belakang mereka sendiri untuk mencegah Koordinasi File memblokir UI aplikasi.
Kelas baru NSFileAccessIntent
berisi URL yang menunjuk ke file dan beberapa opsi untuk mengontrol jenis koordinasi yang diperlukan. Kode berikut menunjukkan pemindahan file dari satu lokasi ke lokasi lain menggunakan niat:
// Get source options
var srcURL = NSUrl.FromFilename ("FromFile.txt");
var srcIntent = NSFileAccessIntent.CreateReadingIntent (srcURL, NSFileCoordinatorReadingOptions.ForUploading);
// Get destination options
var dstURL = NSUrl.FromFilename ("ToFile.txt");
var dstIntent = NSFileAccessIntent.CreateReadingIntent (dstURL, NSFileCoordinatorReadingOptions.ForUploading);
// Create an array
var intents = new NSFileAccessIntent[] {
srcIntent,
dstIntent
};
// Initialize a file coordination with intents
var queue = new NSOperationQueue ();
var fileCoordinator = new NSFileCoordinator ();
fileCoordinator.CoordinateAccess (intents, queue, (err) => {
// Was there an error?
if (err!=null) {
Console.WriteLine("Error: {0}",err.LocalizedDescription);
}
});
Menemukan dan Mencantumkan Dokumen
Cara menemukan dan mencantumkan Dokumen adalah dengan menggunakan API yang NSMetadataQuery
ada. Bagian ini akan mencakup fitur baru yang ditambahkan yang NSMetadataQuery
membuat bekerja dengan Dokumen lebih mudah daripada sebelumnya.
Perilaku yang Ada
Sebelum iOS 8, NSMetadataQuery
lambat untuk mengambil perubahan file lokal seperti: menghapus, membuat, dan mengganti nama.
Dalam diagram di atas:
- Untuk file yang sudah ada di Kontainer Aplikasi,
NSMetadataQuery
memiliki rekaman yang sudah adaNSMetadata
yang telah dibuat sebelumnya dan ditampung sehingga tersedia secara instan untuk aplikasi. - Aplikasi membuat file baru di Kontainer Aplikasi.
- Ada penundaan sebelum
NSMetadataQuery
melihat modifikasi pada Kontainer Aplikasi dan membuat rekaman yang diperlukanNSMetadata
.
Karena keterlambatan NSMetadata
dalam pembuatan rekaman, aplikasi harus membuka dua sumber data: satu untuk perubahan file lokal dan satu untuk perubahan berbasis cloud.
Jahitan
Di iOS 8, NSMetadataQuery
lebih mudah digunakan langsung dengan fitur baru yang disebut Stitching:
Menggunakan Jahitan dalam diagram di atas:
- Seperti sebelumnya, untuk file yang sudah ada di Kontainer Aplikasi,
NSMetadataQuery
memiliki rekaman yang sudah dibuatNSMetadata
sebelumnya dan ditampung. - Aplikasi membuat file baru di Kontainer Aplikasi menggunakan Koordinasi File.
- Kait dalam Kontainer Aplikasi melihat modifikasi dan panggilan
NSMetadataQuery
untuk membuat rekaman yang diperlukanNSMetadata
. - Rekaman
NSMetadata
dibuat langsung setelah file dan tersedia untuk aplikasi.
Dengan menggunakan Stitching, aplikasi tidak lagi harus membuka sumber data untuk memantau perubahan file lokal dan berbasis cloud. Sekarang aplikasi dapat diandalkan NSMetadataQuery
secara langsung.
Penting
Jahitan hanya berfungsi jika Aplikasi menggunakan Koordinasi File seperti yang disajikan di bagian di atas. Jika Koordinasi File tidak digunakan, API default ke perilaku pra iOS 8 yang ada.
Fitur Metadata iOS 8 Baru
Fitur baru berikut telah ditambahkan ke NSMetadataQuery
di iOS 8:
NSMetatadataQuery
sekarang dapat mencantumkan dokumen non-lokal yang disimpan di cloud.- API baru telah ditambahkan untuk mengakses informasi metadata pada dokumen berbasis cloud.
- Ada API baru
NSUrl_PromisedItems
yang akan mengakses atribut file file yang mungkin atau mungkin tidak memiliki kontennya tersedia secara lokal. GetPromisedItemResourceValue
Gunakan metode untuk mendapatkan informasi tentang file tertentu atau gunakanGetPromisedItemResourceValues
metode untuk mendapatkan informasi tentang lebih dari satu file pada satu waktu.
Dua bendera koordinasi file baru telah ditambahkan untuk menangani metadata:
NSFileCoordinatorReadImmediatelyAvailableMetadataOnly
NSFileCoordinatorWriteContentIndependentMetadataOnly
Dengan bendera di atas, konten file Dokumen tidak perlu tersedia secara lokal untuk digunakan.
Segmen kode berikut menunjukkan cara menggunakan NSMetadataQuery
untuk mengkueri keberadaan file tertentu dan membangun file jika tidak ada:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Foundation;
using UIKit;
using ObjCRuntime;
using System.IO;
#region Static Properties
public const string TestFilename = "test.txt";
#endregion
#region Computed Properties
public bool HasiCloud { get; set; }
public bool CheckingForiCloud { get; set; }
public NSUrl iCloudUrl { get; set; }
public GenericTextDocument Document { get; set; }
public NSMetadataQuery Query { get; set; }
#endregion
#region Private Methods
private void FindDocument () {
Console.WriteLine ("Finding Document...");
// Create a new query and set it's scope
Query = new NSMetadataQuery();
Query.SearchScopes = new NSObject [] {
NSMetadataQuery.UbiquitousDocumentsScope,
NSMetadataQuery.UbiquitousDataScope,
NSMetadataQuery.AccessibleUbiquitousExternalDocumentsScope
};
// Build a predicate to locate the file by name and attach it to the query
var pred = NSPredicate.FromFormat ("%K == %@"
, new NSObject[] {
NSMetadataQuery.ItemFSNameKey
, new NSString(TestFilename)});
Query.Predicate = pred;
// Register a notification for when the query returns
NSNotificationCenter.DefaultCenter.AddObserver (this,
new Selector("queryDidFinishGathering:"), NSMetadataQuery.DidFinishGatheringNotification,
Query);
// Start looking for the file
Query.StartQuery ();
Console.WriteLine ("Querying: {0}", Query.IsGathering);
}
[Export("queryDidFinishGathering:")]
public void DidFinishGathering (NSNotification notification) {
Console.WriteLine ("Finish Gathering Documents.");
// Access the query and stop it from running
var query = (NSMetadataQuery)notification.Object;
query.DisableUpdates();
query.StopQuery();
// Release the notification
NSNotificationCenter.DefaultCenter.RemoveObserver (this
, NSMetadataQuery.DidFinishGatheringNotification
, query);
// Load the document that the query returned
LoadDocument(query);
}
private void LoadDocument (NSMetadataQuery query) {
Console.WriteLine ("Loading Document...");
// Take action based on the returned record count
switch (query.ResultCount) {
case 0:
// Create a new document
CreateNewDocument ();
break;
case 1:
// Gain access to the url and create a new document from
// that instance
NSMetadataItem item = (NSMetadataItem)query.ResultAtIndex (0);
var url = (NSUrl)item.ValueForAttribute (NSMetadataQuery.ItemURLKey);
// Load the document
OpenDocument (url);
break;
default:
// There has been an issue
Console.WriteLine ("Issue: More than one document found...");
break;
}
}
#endregion
#region Public Methods
public void OpenDocument(NSUrl url) {
Console.WriteLine ("Attempting to open: {0}", url);
Document = new GenericTextDocument (url);
// Open the document
Document.Open ( (success) => {
if (success) {
Console.WriteLine ("Document Opened");
} else
Console.WriteLine ("Failed to Open Document");
});
// Inform caller
RaiseDocumentLoaded (Document);
}
public void CreateNewDocument() {
// Create path to new file
// var docsFolder = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
var docsFolder = Path.Combine(iCloudUrl.Path, "Documents");
var docPath = Path.Combine (docsFolder, TestFilename);
var ubiq = new NSUrl (docPath, false);
// Create new document at path
Console.WriteLine ("Creating Document at:" + ubiq.AbsoluteString);
Document = new GenericTextDocument (ubiq);
// Set the default value
Document.Contents = "(default value)";
// Save document to path
Document.Save (Document.FileUrl, UIDocumentSaveOperation.ForCreating, (saveSuccess) => {
Console.WriteLine ("Save completion:" + saveSuccess);
if (saveSuccess) {
Console.WriteLine ("Document Saved");
} else {
Console.WriteLine ("Unable to Save Document");
}
});
// Inform caller
RaiseDocumentLoaded (Document);
}
public bool SaveDocument() {
bool successful = false;
// Save document to path
Document.Save (Document.FileUrl, UIDocumentSaveOperation.ForOverwriting, (saveSuccess) => {
Console.WriteLine ("Save completion: " + saveSuccess);
if (saveSuccess) {
Console.WriteLine ("Document Saved");
successful = true;
} else {
Console.WriteLine ("Unable to Save Document");
successful=false;
}
});
// Return results
return successful;
}
#endregion
#region Events
public delegate void DocumentLoadedDelegate(GenericTextDocument document);
public event DocumentLoadedDelegate DocumentLoaded;
internal void RaiseDocumentLoaded(GenericTextDocument document) {
// Inform caller
if (this.DocumentLoaded != null) {
this.DocumentLoaded (document);
}
}
#endregion
Gambar Mini Dokumen
Apple merasa bahwa pengalaman pengguna terbaik saat mencantumkan dokumen untuk aplikasi adalah menggunakan pratinjau. Ini memberikan konteks pengguna akhir, sehingga mereka dapat dengan cepat mengidentifikasi dokumen yang ingin mereka kerjakan.
Sebelum iOS 8, menampilkan pratinjau dokumen memerlukan implementasi kustom. Baru di iOS 8 adalah atribut sistem file yang memungkinkan pengembang untuk bekerja dengan cepat dengan Gambar Mini Dokumen.
Mengambil Gambar Mini Dokumen
Dengan memanggil GetPromisedItemResourceValue
metode atau GetPromisedItemResourceValues
, NSUrl_PromisedItems
API, NSUrlThumbnailDictionary
, dikembalikan. Satu-satunya kunci yang saat ini ada dalam kamus ini adalah NSThumbnial1024X1024SizeKey
dan yang cocok UIImage
.
Menyimpan Gambar Mini Dokumen
Cara term mudah untuk menyimpan gambar mini adalah dengan menggunakan UIDocument
. Dengan memanggil GetFileAttributesToWrite
metode UIDocument
dan mengatur gambar mini, metode tersebut akan secara otomatis disimpan saat file Dokumen berada. iCloud Daemon akan melihat perubahan ini dan menyebarkannya ke iCloud. Di Mac OS X, gambar mini secara otomatis dihasilkan untuk pengembang oleh plugin Quick Look.
Dengan dasar-dasar bekerja dengan Dokumen berbasis iCloud, bersama dengan modifikasi pada API yang ada, kami siap untuk mengimplementasikan Pengontrol Tampilan Pemilih Dokumen di Aplikasi Seluler Xamarin iOS 8.
Mengaktifkan iCloud di Xamarin
Sebelum Pemilih Dokumen dapat digunakan dalam Aplikasi Xamarin.iOS, dukungan iCloud perlu diaktifkan baik di aplikasi Anda maupun melalui Apple.
Langkah-langkah berikut menelusuri proses provisi untuk iCloud.
- Membuat Kontainer iCloud.
- Buat ID Aplikasi yang berisi iCloud App Service.
- Buat profil Provisi yang menyertakan ID Aplikasi ini.
Panduan Bekerja dengan Kemampuan memandu melalui dua langkah pertama. Untuk membuat profil provisi, ikuti langkah-langkah dalam panduan Profil Provisi.
Langkah-langkah berikut menelusuri proses konfigurasi aplikasi Anda untuk iCloud:
Lakukan:
Buka proyek di Visual Studio untuk Mac atau Visual Studio.
Di Penjelajah Solusi, klik kanan proyek dan pilih Opsi.
Dalam Kotak Dialog Opsi pilih Aplikasi iOS, pastikan bahwa Pengidentifikasi Bundel cocok dengan yang ditentukan dalam ID Aplikasi yang dibuat di atas untuk aplikasi.
Pilih Penandatanganan Bundel iOS, pilih Identitas Pengembang dan Profil Provisi yang dibuat di atas.
Klik tombol OK untuk menyimpan perubahan dan menutup kotak dialog.
Entitlements.plist
Klik kanan di Penjelajah Solusi untuk membukanya di editor.Penting
Di Visual Studio Anda mungkin perlu membuka editor Pemberian Hak dengan mengklik kanan, memilih Buka Dengan... dan memilih Editor Daftar Properti
Centang Aktifkan iCloud, Dokumen iCloud, Penyimpanan nilai kunci, dan CloudKit .
Pastikan Kontainer ada untuk aplikasi (seperti yang dibuat di atas). Contoh:
iCloud.com.your-company.AppName
Simpan perubahan pada file.
Untuk informasi selengkapnya tentang Pemberian Izin, lihat panduan Bekerja dengan Pemberian Izin.
Dengan penyiapan di atas, aplikasi sekarang dapat menggunakan dokumen berbasis cloud dan Pengontrol Tampilan Pemilih Dokumen baru.
Kode Penyiapan Umum
Sebelum mulai menggunakan Pengontrol Tampilan Pemilih Dokumen, ada beberapa kode penyiapan standar yang diperlukan. Mulailah dengan memodifikasi file aplikasi AppDelegate.cs
dan membuatnya terlihat seperti berikut:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Foundation;
using UIKit;
using ObjCRuntime;
using System.IO;
namespace DocPicker
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
#region Static Properties
public const string TestFilename = "test.txt";
#endregion
#region Computed Properties
public override UIWindow Window { get; set; }
public bool HasiCloud { get; set; }
public bool CheckingForiCloud { get; set; }
public NSUrl iCloudUrl { get; set; }
public GenericTextDocument Document { get; set; }
public NSMetadataQuery Query { get; set; }
public NSData Bookmark { get; set; }
#endregion
#region Private Methods
private void FindDocument () {
Console.WriteLine ("Finding Document...");
// Create a new query and set it's scope
Query = new NSMetadataQuery();
Query.SearchScopes = new NSObject [] {
NSMetadataQuery.UbiquitousDocumentsScope,
NSMetadataQuery.UbiquitousDataScope,
NSMetadataQuery.AccessibleUbiquitousExternalDocumentsScope
};
// Build a predicate to locate the file by name and attach it to the query
var pred = NSPredicate.FromFormat ("%K == %@",
new NSObject[] {NSMetadataQuery.ItemFSNameKey
, new NSString(TestFilename)});
Query.Predicate = pred;
// Register a notification for when the query returns
NSNotificationCenter.DefaultCenter.AddObserver (this
, new Selector("queryDidFinishGathering:")
, NSMetadataQuery.DidFinishGatheringNotification
, Query);
// Start looking for the file
Query.StartQuery ();
Console.WriteLine ("Querying: {0}", Query.IsGathering);
}
[Export("queryDidFinishGathering:")]
public void DidFinishGathering (NSNotification notification) {
Console.WriteLine ("Finish Gathering Documents.");
// Access the query and stop it from running
var query = (NSMetadataQuery)notification.Object;
query.DisableUpdates();
query.StopQuery();
// Release the notification
NSNotificationCenter.DefaultCenter.RemoveObserver (this
, NSMetadataQuery.DidFinishGatheringNotification
, query);
// Load the document that the query returned
LoadDocument(query);
}
private void LoadDocument (NSMetadataQuery query) {
Console.WriteLine ("Loading Document...");
// Take action based on the returned record count
switch (query.ResultCount) {
case 0:
// Create a new document
CreateNewDocument ();
break;
case 1:
// Gain access to the url and create a new document from
// that instance
NSMetadataItem item = (NSMetadataItem)query.ResultAtIndex (0);
var url = (NSUrl)item.ValueForAttribute (NSMetadataQuery.ItemURLKey);
// Load the document
OpenDocument (url);
break;
default:
// There has been an issue
Console.WriteLine ("Issue: More than one document found...");
break;
}
}
#endregion
#region Public Methods
public void OpenDocument(NSUrl url) {
Console.WriteLine ("Attempting to open: {0}", url);
Document = new GenericTextDocument (url);
// Open the document
Document.Open ( (success) => {
if (success) {
Console.WriteLine ("Document Opened");
} else
Console.WriteLine ("Failed to Open Document");
});
// Inform caller
RaiseDocumentLoaded (Document);
}
public void CreateNewDocument() {
// Create path to new file
// var docsFolder = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
var docsFolder = Path.Combine(iCloudUrl.Path, "Documents");
var docPath = Path.Combine (docsFolder, TestFilename);
var ubiq = new NSUrl (docPath, false);
// Create new document at path
Console.WriteLine ("Creating Document at:" + ubiq.AbsoluteString);
Document = new GenericTextDocument (ubiq);
// Set the default value
Document.Contents = "(default value)";
// Save document to path
Document.Save (Document.FileUrl, UIDocumentSaveOperation.ForCreating, (saveSuccess) => {
Console.WriteLine ("Save completion:" + saveSuccess);
if (saveSuccess) {
Console.WriteLine ("Document Saved");
} else {
Console.WriteLine ("Unable to Save Document");
}
});
// Inform caller
RaiseDocumentLoaded (Document);
}
/// <summary>
/// Saves the document.
/// </summary>
/// <returns><c>true</c>, if document was saved, <c>false</c> otherwise.</returns>
public bool SaveDocument() {
bool successful = false;
// Save document to path
Document.Save (Document.FileUrl, UIDocumentSaveOperation.ForOverwriting, (saveSuccess) => {
Console.WriteLine ("Save completion: " + saveSuccess);
if (saveSuccess) {
Console.WriteLine ("Document Saved");
successful = true;
} else {
Console.WriteLine ("Unable to Save Document");
successful=false;
}
});
// Return results
return successful;
}
#endregion
#region Override Methods
public override void FinishedLaunching (UIApplication application)
{
// Start a new thread to check and see if the user has iCloud
// enabled.
new Thread(new ThreadStart(() => {
// Inform caller that we are checking for iCloud
CheckingForiCloud = true;
// Checks to see if the user of this device has iCloud
// enabled
var uburl = NSFileManager.DefaultManager.GetUrlForUbiquityContainer(null);
// Connected to iCloud?
if (uburl == null)
{
// No, inform caller
HasiCloud = false;
iCloudUrl =null;
Console.WriteLine("Unable to connect to iCloud");
InvokeOnMainThread(()=>{
var okAlertController = UIAlertController.Create ("iCloud Not Available", "Developer, please check your Entitlements.plist, Bundle ID and Provisioning Profiles.", UIAlertControllerStyle.Alert);
okAlertController.AddAction (UIAlertAction.Create ("Ok", UIAlertActionStyle.Default, null));
Window.RootViewController.PresentViewController (okAlertController, true, null);
});
}
else
{
// Yes, inform caller and save location the Application Container
HasiCloud = true;
iCloudUrl = uburl;
Console.WriteLine("Connected to iCloud");
// If we have made the connection with iCloud, start looking for documents
InvokeOnMainThread(()=>{
// Search for the default document
FindDocument ();
});
}
// Inform caller that we are no longer looking for iCloud
CheckingForiCloud = false;
})).Start();
}
// This method is invoked when the application is about to move from active to inactive state.
// OpenGL applications should use this method to pause.
public override void OnResignActivation (UIApplication application)
{
}
// This method should be used to release shared resources and it should store the application state.
// If your application supports background execution this method is called instead of WillTerminate
// when the user quits.
public override void DidEnterBackground (UIApplication application)
{
// Trap all errors
try {
// Values to include in the bookmark packet
var resources = new string[] {
NSUrl.FileSecurityKey,
NSUrl.ContentModificationDateKey,
NSUrl.FileResourceIdentifierKey,
NSUrl.FileResourceTypeKey,
NSUrl.LocalizedNameKey
};
// Create the bookmark
NSError err;
Bookmark = Document.FileUrl.CreateBookmarkData (NSUrlBookmarkCreationOptions.WithSecurityScope, resources, iCloudUrl, out err);
// Was there an error?
if (err != null) {
// Yes, report it
Console.WriteLine ("Error Creating Bookmark: {0}", err.LocalizedDescription);
}
}
catch (Exception e) {
// Report error
Console.WriteLine ("Error: {0}", e.Message);
}
}
// This method is called as part of the transition from background to active state.
public override void WillEnterForeground (UIApplication application)
{
// Is there any bookmark data?
if (Bookmark != null) {
// Trap all errors
try {
// Yes, attempt to restore it
bool isBookmarkStale;
NSError err;
var srcUrl = new NSUrl (Bookmark, NSUrlBookmarkResolutionOptions.WithSecurityScope, iCloudUrl, out isBookmarkStale, out err);
// Was there an error?
if (err != null) {
// Yes, report it
Console.WriteLine ("Error Loading Bookmark: {0}", err.LocalizedDescription);
} else {
// Load document from bookmark
OpenDocument (srcUrl);
}
}
catch (Exception e) {
// Report error
Console.WriteLine ("Error: {0}", e.Message);
}
}
}
// This method is called when the application is about to terminate. Save data, if needed.
public override void WillTerminate (UIApplication application)
{
}
#endregion
#region Events
public delegate void DocumentLoadedDelegate(GenericTextDocument document);
public event DocumentLoadedDelegate DocumentLoaded;
internal void RaiseDocumentLoaded(GenericTextDocument document) {
// Inform caller
if (this.DocumentLoaded != null) {
this.DocumentLoaded (document);
}
}
#endregion
}
}
Penting
Kode di atas mencakup kode dari bagian Menemukan dan Mencantumkan Dokumen di atas. Ini disajikan di sini secara keseluruhan, karena akan muncul dalam aplikasi aktual. Untuk kesederhanaan, contoh ini hanya berfungsi dengan satu file yang dikodekan secara permanen (test.txt
).
Kode di atas mengekspos beberapa pintasan iCloud Drive untuk membuatnya lebih mudah dikerjakan di aplikasi lainnya.
Selanjutnya, tambahkan kode berikut ke tampilan atau kontainer tampilan apa pun yang akan menggunakan Pemilih Dokumen atau bekerja dengan dokumen berbasis cloud:
using CloudKit;
...
#region Computed Properties
/// <summary>
/// Returns the delegate of the current running application
/// </summary>
/// <value>The this app.</value>
public AppDelegate ThisApp {
get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
#endregion
Ini menambahkan pintasan untuk masuk ke AppDelegate
dan mengakses pintasan iCloud yang dibuat di atas.
Dengan kode ini di tempat, mari kita lihat menerapkan Pengontrol Tampilan Pemilih Dokumen dalam aplikasi Xamarin iOS 8.
Menggunakan Pengontrol Tampilan Pemilih Dokumen
Sebelum iOS 8, sangat sulit untuk mengakses Dokumen dari aplikasi lain karena tidak ada cara untuk menemukan dokumen di luar aplikasi dari dalam aplikasi.
Perilaku yang Ada
Mari kita lihat mengakses dokumen eksternal sebelum iOS 8:
- Pertama, pengguna harus membuka aplikasi yang awalnya membuat Dokumen.
- Dokumen dipilih dan
UIDocumentInteractionController
digunakan untuk mengirim Dokumen ke aplikasi baru. - Terakhir, salinan Dokumen asli ditempatkan di Kontainer aplikasi baru.
Dari sana Dokumen tersedia untuk aplikasi kedua untuk dibuka dan diedit.
Menemukan Dokumen di Luar Kontainer Aplikasi
Di iOS 8, aplikasi dapat mengakses Dokumen di luar Kontainer Aplikasinya sendiri dengan mudah:
Menggunakan Pemilih Dokumen iCloud baru ( UIDocumentPickerViewController
), aplikasi iOS dapat langsung menemukan dan mengakses di luar Kontainer Aplikasinya. menyediakan UIDocumentPickerViewController
mekanisme bagi pengguna untuk memberikan akses ke dan mengedit Dokumen yang ditemukan tersebut melalui izin.
Aplikasi harus ikut serta agar Dokumennya muncul di Pemilih Dokumen iCloud dan tersedia bagi aplikasi lain untuk menemukan dan bekerja dengannya. Agar aplikasi Xamarin iOS 8 berbagi Kontainer Aplikasinya, edit filenya Info.plist
di editor teks standar dan tambahkan dua baris berikut ke bagian bawah kamus (di antara <dict>...</dict>
tag):
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
menyediakan UIDocumentPickerViewController
UI baru hebat yang memungkinkan pengguna untuk memilih dokumen. Untuk menampilkan Pengontrol Tampilan Pemilih Dokumen di aplikasi Xamarin iOS 8, lakukan hal berikut:
using MobileCoreServices;
...
// Allow the Document picker to select a range of document types
var allowedUTIs = new string[] {
UTType.UTF8PlainText,
UTType.PlainText,
UTType.RTF,
UTType.PNG,
UTType.Text,
UTType.PDF,
UTType.Image
};
// Display the picker
//var picker = new UIDocumentPickerViewController (allowedUTIs, UIDocumentPickerMode.Open);
var pickerMenu = new UIDocumentMenuViewController(allowedUTIs, UIDocumentPickerMode.Open);
pickerMenu.DidPickDocumentPicker += (sender, args) => {
// Wireup Document Picker
args.DocumentPicker.DidPickDocument += (sndr, pArgs) => {
// IMPORTANT! You must lock the security scope before you can
// access this file
var securityEnabled = pArgs.Url.StartAccessingSecurityScopedResource();
// Open the document
ThisApp.OpenDocument(pArgs.Url);
// IMPORTANT! You must release the security lock established
// above.
pArgs.Url.StopAccessingSecurityScopedResource();
};
// Display the document picker
PresentViewController(args.DocumentPicker,true,null);
};
pickerMenu.ModalPresentationStyle = UIModalPresentationStyle.Popover;
PresentViewController(pickerMenu,true,null);
UIPopoverPresentationController presentationPopover = pickerMenu.PopoverPresentationController;
if (presentationPopover!=null) {
presentationPopover.SourceView = this.View;
presentationPopover.PermittedArrowDirections = UIPopoverArrowDirection.Down;
presentationPopover.SourceRect = ((UIButton)s).Frame;
}
Penting
Pengembang harus memanggil StartAccessingSecurityScopedResource
metode NSUrl
sebelum dokumen eksternal dapat diakses. Metode StopAccessingSecurityScopedResource
harus dipanggil untuk melepaskan kunci keamanan segera setelah dokumen dimuat.
Output sampel
Berikut adalah contoh bagaimana kode di atas akan menampilkan Pemilih Dokumen saat dijalankan pada perangkat i Telepon:
Pengguna memulai aplikasi dan antarmuka utama ditampilkan:
Pengguna mengetuk Tombol Tindakan di bagian atas layar dan diminta untuk memilih Penyedia Dokumen dari daftar penyedia yang tersedia:
Pengontrol Tampilan Pemilih Dokumen ditampilkan untuk Penyedia Dokumen terpilih:
Pengguna mengetuk Folder Dokumen untuk menampilkan kontennya:
Pengguna memilih Dokumen dan Pemilih Dokumen ditutup.
Antarmuka utama diputar ulang, Dokumen dimuat dari Kontainer eksternal dan kontennya ditampilkan.
Tampilan aktual Pengontrol Tampilan Pemilih Dokumen bergantung pada Penyedia Dokumen yang telah diinstal pengguna pada perangkat dan Mode Pemilih Dokumen mana yang telah diterapkan. Contoh di atas menggunakan Mode Terbuka, jenis mode lainnya akan dibahas secara rinci di bawah ini.
Mengelola Dokumen Eksternal
Seperti yang dibahas di atas, sebelum iOS 8, aplikasi hanya dapat mengakses dokumen yang merupakan bagian dari Kontainer Aplikasinya. Di iOS 8 aplikasi dapat mengakses Dokumen dari sumber eksternal:
Saat pengguna memilih Dokumen dari sumber eksternal, Dokumen Referensi ditulis ke Kontainer Aplikasi yang menunjuk ke Dokumen asli.
Untuk membantu menambahkan kemampuan baru ini ke dalam aplikasi yang ada, beberapa fitur baru telah ditambahkan ke NSMetadataQuery
API. Biasanya, aplikasi menggunakan Cakupan Dokumen Ubiquitous untuk mencantumkan dokumen yang hidup dalam Kontainer Aplikasinya. Dengan menggunakan cakupan ini, hanya dokumen dalam Kontainer Aplikasi yang akan terus ditampilkan.
Menggunakan Cakupan Dokumen Eksternal Ubiquitous baru akan mengembalikan Dokumen yang berada di luar Kontainer Aplikasi dan mengembalikan metadata untuk dokumen tersebut. NSMetadataItemUrlKey
Akan menunjuk ke URL tempat Dokumen sebenarnya berada.
Terkadang aplikasi tidak ingin bekerja dengan Dokumen yang ditujukkan oleh referensi ke. Sebagai gantinya, aplikasi ingin bekerja dengan Dokumen Referensi secara langsung. Misalnya, aplikasi mungkin ingin menampilkan dokumen di folder Aplikasi di UI, atau untuk memungkinkan pengguna memindahkan referensi di dalam folder.
Di iOS 8, baru NSMetadataItemUrlInLocalContainerKey
telah disediakan untuk mengakses Dokumen Referensi secara langsung. Kunci ini menunjuk ke referensi aktual ke dokumen eksternal dalam Kontainer Aplikasi.
NSMetadataUbiquitousItemIsExternalDocumentKey
digunakan untuk menguji apakah dokumen berada di luar Kontainer Aplikasi atau tidak. NSMetadataUbiquitousItemContainerDisplayNameKey
digunakan untuk mengakses nama Kontainer yang menampung salinan asli Dokumen eksternal.
Mengapa Referensi Dokumen Diperlukan
Alasan utama iOS 8 menggunakan referensi untuk mengakses Dokumen eksternal adalah keamanan. Tidak ada aplikasi yang diberikan akses ke Kontainer aplikasi lain. Hanya Pemilih Dokumen yang dapat melakukannya, karena kehabisan proses dan memiliki akses luas sistem.
Satu-satunya cara untuk masuk ke dokumen di luar Kontainer Aplikasi adalah dengan menggunakan Pemilih Dokumen, dan jika URL yang dikembalikan oleh pemilih adalah Cakupan Keamanan. URL Cakupan Keamanan hanya berisi informasi yang cukup untuk memilih dokumen bersama dengan hak terlingkup yang diperlukan untuk memberikan akses aplikasi ke dokumen.
Penting untuk dicatat bahwa jika URL Cakupan Keamanan diserialisasikan ke dalam string dan kemudian diserialisasikan, Informasi Keamanan akan hilang dan file tidak akan dapat diakses dari URL. Fitur Referensi Dokumen menyediakan mekanisme untuk kembali ke file yang ditujukkan oleh URL ini.
Jadi jika aplikasi memperoleh NSUrl
dari salah satu Dokumen Referensi, aplikasi tersebut sudah memiliki cakupan keamanan yang terpasang dan dapat digunakan untuk mengakses file. Untuk alasan ini, sangat disarankan agar pengembang menggunakan UIDocument
karena menangani semua informasi dan proses ini untuk mereka.
Menggunakan Marka buku
Tidak selalu layak untuk menghitung Dokumen aplikasi untuk kembali ke Dokumen tertentu, misalnya, saat melakukan pemulihan status. iOS 8 menyediakan mekanisme untuk membuat Bookmark yang secara langsung menargetkan Dokumen tertentu.
Kode berikut akan membuat Bookmark dari UIDocument
properti :FileUrl
// Trap all errors
try {
// Values to include in the bookmark packet
var resources = new string[] {
NSUrl.FileSecurityKey,
NSUrl.ContentModificationDateKey,
NSUrl.FileResourceIdentifierKey,
NSUrl.FileResourceTypeKey,
NSUrl.LocalizedNameKey
};
// Create the bookmark
NSError err;
Bookmark = Document.FileUrl.CreateBookmarkData (NSUrlBookmarkCreationOptions.WithSecurityScope, resources, iCloudUrl, out err);
// Was there an error?
if (err != null) {
// Yes, report it
Console.WriteLine ("Error Creating Bookmark: {0}", err.LocalizedDescription);
}
}
catch (Exception e) {
// Report error
Console.WriteLine ("Error: {0}", e.Message);
}
BOOKMARK API yang ada digunakan untuk membuat Bookmark terhadap bookmark yang ada NSUrl
yang dapat disimpan dan dimuat untuk menyediakan akses langsung ke file eksternal. Kode berikut akan memulihkan bookmark yang dibuat di atas:
if (Bookmark != null) {
// Trap all errors
try {
// Yes, attempt to restore it
bool isBookmarkStale;
NSError err;
var srcUrl = new NSUrl (Bookmark, NSUrlBookmarkResolutionOptions.WithSecurityScope, iCloudUrl, out isBookmarkStale, out err);
// Was there an error?
if (err != null) {
// Yes, report it
Console.WriteLine ("Error Loading Bookmark: {0}", err.LocalizedDescription);
} else {
// Load document from bookmark
OpenDocument (srcUrl);
}
}
catch (Exception e) {
// Report error
Console.WriteLine ("Error: {0}", e.Message);
}
}
Buka vs. Mode Impor dan Pemilih Dokumen
Pengontrol Tampilan Pemilih Dokumen memiliki dua mode operasi yang berbeda:
Mode Buka – Dalam mode ini, ketika pengguna memilih dan Dokumen eksternal, Pemilih Dokumen akan membuat Bookmark Cakupan Keamanan di Kontainer Aplikasi.
Mode Impor – Dalam mode ini, ketika pengguna memilih dan Dokumen eksternal, Pemilih Dokumen tidak akan membuat Marka Buku, tetapi sebaliknya, menyalin file ke Lokasi Sementara dan menyediakan akses aplikasi ke Dokumen di lokasi ini:
Setelah aplikasi dihentikan karena alasan apa pun, Lokasi Sementara dikosongkan dan file dihapus. Jika aplikasi perlu mempertahankan akses ke file, aplikasi harus membuat salinan dan menempatkannya di Kontainer Aplikasinya.
Mode Terbuka berguna ketika aplikasi ingin berkolaborasi dengan aplikasi lain dan berbagi perubahan apa pun yang dilakukan pada dokumen dengan aplikasi tersebut. Mode Impor digunakan ketika aplikasi tidak ingin membagikan modifikasinya ke Dokumen dengan aplikasi lain.
Membuat Dokumen Eksternal
Seperti disebutkan di atas, aplikasi iOS 8 tidak memiliki akses ke kontainer di luar Kontainer Aplikasinya sendiri. Aplikasi dapat menulis ke kontainernya sendiri secara lokal atau ke Lokasi Sementara, lalu menggunakan mode dokumen khusus untuk memindahkan Dokumen yang dihasilkan di luar Kontainer Aplikasi ke lokasi yang dipilih pengguna.
Untuk memindahkan Dokumen ke lokasi eksternal, lakukan hal berikut:
- Pertama-tama buat Dokumen baru di lokasi lokal atau sementara.
NSUrl
Buat yang menunjuk ke Dokumen baru.- Buka Pengontrol Tampilan Pemilih Dokumen baru dan teruskan
NSUrl
dengan ModeMoveToService
. - Setelah pengguna memilih lokasi baru, Dokumen akan dipindahkan dari lokasinya saat ini ke lokasi baru.
- Dokumen Referensi akan ditulis ke Kontainer Aplikasi aplikasi sehingga file masih dapat diakses oleh aplikasi pembuatan.
Kode berikut dapat digunakan untuk memindahkan Dokumen ke lokasi eksternal: var picker = new UIDocumentPickerViewController (srcURL, UIDocumentPickerMode.MoveToService);
Dokumen Referensi yang dikembalikan oleh proses di atas sama persis dengan yang dibuat oleh Mode Terbuka Pemilih Dokumen. Namun, ada kalanya aplikasi mungkin ingin memindahkan Dokumen tanpa menyimpan referensi ke dalamnya.
Untuk memindahkan Dokumen tanpa menghasilkan referensi, gunakan ExportToService
Mode. Contoh: var picker = new UIDocumentPickerViewController (srcURL, UIDocumentPickerMode.ExportToService);
Saat menggunakan ExportToService
mode , Dokumen disalin ke Kontainer eksternal dan salinan yang ada dibiarkan di lokasi aslinya.
Ekstensi Penyedia Dokumen
Dengan iOS 8, Apple ingin pengguna akhir dapat mengakses salah satu dokumen berbasis cloud mereka, di mana pun mereka sebenarnya berada. Untuk mencapai tujuan ini, iOS 8 menyediakan mekanisme Ekstensi Penyedia Dokumen baru.
Apa itu Ekstensi Penyedia Dokumen?
Secara sederhana dinyatakan, Ekstensi Penyedia Dokumen adalah cara bagi pengembang, atau pihak ketiga, untuk menyediakan penyimpanan dokumen alternatif aplikasi yang dapat diakses dengan cara yang sama persis dengan lokasi penyimpanan iCloud yang ada.
Pengguna dapat memilih salah satu lokasi penyimpanan alternatif ini dari Pemilih Dokumen dan mereka dapat menggunakan mode akses yang sama persis (Buka, Impor, Pindahkan, atau Ekspor) untuk bekerja dengan file di lokasi tersebut.
Ini diimplementasikan menggunakan dua ekstensi berbeda:
- Ekstensi Pemilih Dokumen – Menyediakan
UIViewController
subkelas yang menyediakan antarmuka grafis bagi pengguna untuk memilih dokumen dari lokasi penyimpanan alternatif. Subkelas ini akan ditampilkan sebagai bagian dari Pengontrol Tampilan Pemilih Dokumen. - Ekstensi Penyediaan File – Ini adalah ekstensi non-UI yang berkaitan dengan benar-benar menyediakan konten file. Ekstensi ini disediakan melalui Koordinasi File (
NSFileCoordinator
). Ini adalah kasus penting lainnya di mana Koordinasi File diperlukan.
Diagram berikut menunjukkan aliran data umum saat bekerja dengan Ekstensi Penyedia Dokumen:
Proses berikut terjadi:
- Aplikasi ini menyajikan Pengontrol Pemilih Dokumen untuk memungkinkan pengguna memilih file untuk dikerjakan.
- Pengguna memilih lokasi file alternatif dan ekstensi kustom
UIViewController
dipanggil untuk menampilkan antarmuka pengguna. - Pengguna memilih file dari lokasi ini dan URL diteruskan kembali ke Pemilih Dokumen.
- Pemilih Dokumen memilih URL file dan mengembalikannya ke aplikasi untuk dikerjakan pengguna.
- URL diteruskan ke Koordinator File untuk mengembalikan konten file ke aplikasi.
- Koordinator File memanggil Ekstensi Penyedia File kustom untuk mengambil file.
- Konten file dikembalikan ke Koordinator File.
- Konten file dikembalikan ke aplikasi.
Keamanan dan Marka Buku
Bagian ini akan melihat sekilas cara kerja keamanan dan akses file persisten melalui Bookmark dengan Ekstensi Penyedia Dokumen. Tidak seperti Penyedia Dokumen iCloud, yang secara otomatis menyimpan Keamanan dan Bookmark ke Kontainer Aplikasi, Ekstensi Penyedia Dokumen tidak karena bukan bagian dari Sistem Referensi Dokumen.
Misalnya: dalam pengaturan Enterprise yang menyediakan datastore aman di seluruh perusahaannya sendiri, administrator tidak ingin informasi perusahaan rahasia diakses atau diproses oleh Server iCloud publik. Oleh karena itu, Sistem Referensi Dokumen bawaan tidak dapat digunakan.
Sistem Bookmark masih dapat digunakan dan merupakan tanggung jawab Ekstensi Penyedia File untuk memproses URL yang diberi marka buku dengan benar dan mengembalikan konten Dokumen yang ditujukkan olehnya.
Untuk tujuan keamanan, iOS 8 memiliki Lapisan Isolasi yang mempertahankan informasi tentang aplikasi mana yang memiliki akses ke pengidentifikasi mana di dalam Penyedia File mana. Perlu dicatat bahwa semua akses file dikontrol oleh Lapisan Isolasi ini.
Diagram berikut menunjukkan aliran data saat bekerja dengan Bookmark dan Ekstensi Penyedia Dokumen:
Proses berikut terjadi:
- Aplikasi akan memasuki latar belakang dan perlu mempertahankan statusnya. Ini memanggil
NSUrl
untuk membuat bookmark ke file di penyimpanan alternatif. NSUrl
memanggil Ekstensi Penyedia File untuk mendapatkan URL persisten ke Dokumen.- Ekstensi Penyedia File mengembalikan URL sebagai string ke
NSUrl
. - Bundel
NSUrl
URL ke dalam Bookmark dan mengembalikannya ke aplikasi. - Ketika Aplikasi terbangun dari berada di latar belakang dan perlu memulihkan status, aplikasi meneruskan Bookmark ke
NSUrl
. NSUrl
memanggil Ekstensi Penyedia File dengan URL file.- Penyedia Ekstensi File mengakses file dan mengembalikan lokasi file ke
NSUrl
. - Lokasi file dibundel dengan informasi keamanan dan dikembalikan ke aplikasi.
Dari sini, aplikasi dapat mengakses file dan bekerja dengannya seperti biasa.
Menulis File
Bagian ini akan melihat sekilas cara kerja menulis file ke lokasi alternatif dengan Ekstensi Penyedia Dokumen. Aplikasi iOS akan menggunakan Koordinasi File untuk menyimpan informasi ke disk di dalam Kontainer Aplikasi. Tak lama setelah file berhasil ditulis, Ekstensi Penyedia File akan diberi tahu tentang perubahan tersebut.
Pada titik ini, Ekstensi Penyedia File dapat mulai mengunggah file ke lokasi alternatif (atau menandai file sebagai kotor dan memerlukan unggahan).
Membuat Ekstensi Penyedia Dokumen Baru
Membuat Ekstensi Penyedia Dokumen baru berada di luar cakupan artikel pengantar ini. Informasi ini disediakan di sini untuk menunjukkan bahwa, berdasarkan ekstensi yang telah dimuat pengguna di perangkat iOS mereka, aplikasi mungkin memiliki akses ke lokasi penyimpanan Dokumen di luar lokasi iCloud yang disediakan Apple.
Pengembang harus mengetahui fakta ini saat menggunakan Pemilih Dokumen dan bekerja dengan Dokumen eksternal. Mereka tidak boleh menganggap Dokumen tersebut dihosting di iCloud.
Untuk informasi selengkapnya tentang membuat Penyedia Penyimpanan atau Ekstensi Pemilih Dokumen, lihat dokumen Pengenalan Ekstensi Aplikasi.
Migrasi ke iCloud Drive
Di iOS 8, pengguna dapat memilih untuk terus menggunakan Sistem Dokumen iCloud yang ada yang digunakan di iOS 7 (dan sistem sebelumnya) atau mereka dapat memilih untuk memigrasikan Dokumen yang ada ke mekanisme iCloud Drive baru.
Di Mac OS X Yosemite, Apple tidak menyediakan kompatibilitas mundur sehingga semua dokumen harus dimigrasikan ke iCloud Drive atau tidak akan lagi diperbarui di seluruh perangkat.
Setelah akun pengguna dimigrasikan ke iCloud Drive, hanya perangkat yang menggunakan iCloud Drive yang dapat menyebarkan perubahan ke Dokumen di seluruh perangkat tersebut.
Penting
Pengembang harus menyadari bahwa fitur baru yang tercakup dalam artikel ini hanya tersedia jika akun pengguna telah dimigrasikan ke iCloud Drive.
Ringkasan
Artikel ini telah membahas perubahan pada API iCloud yang ada yang diperlukan untuk mendukung iCloud Drive dan Pengontrol Tampilan Pemilih Dokumen baru. Ini telah mencakup Koordinasi File dan mengapa penting saat bekerja dengan dokumen berbasis cloud. Ini telah mencakup penyiapan yang diperlukan untuk mengaktifkan dokumen berbasis cloud dalam Aplikasi Xamarin.iOS dan memberikan tampilan pengantar bekerja dengan dokumen di luar Kontainer Aplikasi aplikasi menggunakan Pengontrol Tampilan Pemilih Dokumen.
Selain itu, artikel ini membahas Ekstensi Penyedia Dokumen secara singkat dan mengapa pengembang harus mengetahuinya saat menulis aplikasi yang dapat menangani dokumen berbasis cloud.