Bagikan melalui


CloudKit di Xamarin.iOS

Kerangka kerja CloudKit menyederhanakan pengembangan aplikasi yang mengakses iCloud. Ini termasuk pengambilan data aplikasi dan hak aset serta dapat menyimpan informasi aplikasi dengan aman. Kit ini memberi pengguna lapisan anonimitas dengan mengizinkan akses ke aplikasi dengan ID iCloud mereka tanpa berbagi informasi pribadi.

Pengembang dapat fokus pada aplikasi sisi klien mereka dan membiarkan iCloud menghilangkan kebutuhan untuk menulis logika aplikasi sisi server. CloudKit menyediakan autentikasi, database privat dan publik, serta data terstruktur dan layanan penyimpanan aset.

Penting

Apple menyediakan alat untuk membantu pengembang menangani Peraturan Perlindungan Data Umum (GDPR) Uni Eropa dengan benar.

Persyaratan

Berikut ini diperlukan untuk menyelesaikan langkah-langkah yang disajikan dalam artikel ini:

  • Xcode dan iOS SDK – API Xcode dan iOS 8 Apple perlu diinstal dan dikonfigurasi di komputer pengembang.
  • Visual Studio untuk Mac – Versi terbaru Visual Studio untuk Mac harus diinstal dan dikonfigurasi di perangkat pengguna.
  • Perangkat iOS 8 – Perangkat iOS yang menjalankan versi terbaru iOS 8 untuk pengujian.

Apa itu CloudKit?

CloudKit adalah cara untuk memberi pengembang akses ke Server iCloud. Ini menyediakan fondasi untuk iCloud Drive dan Perpustakaan Foto iCloud. CloudKit didukung pada perangkat macOS dan iOS.

Bagaimana CloudKit didukung pada perangkat macOS dan iOS

CloudKit menggunakan infrastruktur Akun iCloud. Jika ada pengguna yang masuk ke Akun iCloud di perangkat, CloudKit akan menggunakan ID mereka untuk mengidentifikasi pengguna. Jika tidak ada akun yang tersedia, akses baca-saja terbatas akan disediakan.

CloudKit mendukung konsep database publik dan privat. Database publik menyediakan "sup" dari semua data yang dapat diakses pengguna. Database privat dimaksudkan untuk menyimpan data privat yang terikat ke pengguna tertentu.

CloudKit mendukung data terstruktur dan massal. Ini mampu menangani transfer file besar dengan mulus. CloudKit mengurus transfer file besar secara efisien ke dan dari Server iCloud di latar belakang, membebaskan pengembang untuk fokus pada tugas lain.

Catatan

Penting untuk dicatat bahwa CloudKit adalah Teknologi Transportasi. Ini tidak memberikan persistensi apa pun; ini hanya memungkinkan aplikasi untuk mengirim dan menerima informasi dari server secara efisien.

Pada penulisan ini, Apple awalnya menyediakan CloudKit secara gratis dengan batas tinggi pada bandwidth dan kapasitas penyimpanan. Untuk proyek atau aplikasi yang lebih besar dengan basis pengguna yang besar, Apple telah mengisyaratkan bahwa skala harga yang terjangkau akan disediakan.

Mengaktifkan CloudKit dalam aplikasi Xamarin

Sebelum aplikasi Xamarin dapat menggunakan kerangka kerja CloudKit, aplikasi harus disediakan dengan benar sebagaimana dirinci dalam panduan Bekerja dengan Kemampuan dan Bekerja dengan Pemberian Izin.

Untuk mengakses CloudKit , file Entitlements.plist harus menyertakan izin Aktifkan iCloud, Penyimpanan nilai kunci, dan CloudKit .

Aplikasi sampel

Aplikasi sampel menunjukkan cara menggunakan CloudKit dengan Xamarin. Langkah-langkah di bawah ini menunjukkan cara mengonfigurasi sampel - ini memerlukan pengaturan tambahan di luar apa yang diperlukan untuk CloudKit saja:

  1. Buka proyek di Visual Studio untuk Mac atau Visual Studio.
  2. Di Penjelajah Solusi, buka file Info.plist dan pastikan Pengidentifikasi Bundel cocok dengan yang didefinisikan dalam ID Aplikasi yang dibuat sebagai bagian dari pengaturan provisi.
  3. Gulir ke bawah ke bagian bawah file Info.plist dan pilih Mode Latar Belakang yang Diaktifkan, Pembaruan Lokasi, dan Pemberitahuan Jarak Jauh.
  4. Klik kanan proyek iOS dalam solusi dan pilih Opsi.
  5. Pilih Penandatanganan Bundel iOS, pilih Identitas Pengembang dan Profil Provisi yang dibuat di atas.
  6. Pastikan Entitlements.plist mencakup Aktifkan iCloud, Penyimpanan nilai kunci, dan CloudKit.
  7. Pastikan Kontainer Ubiquity ada untuk aplikasi. Contoh: iCloud.com.your-company.CloudKitAtlas
  8. Simpan perubahan pada file.

Dengan pengaturan ini di tempat, aplikasi sampel sekarang siap untuk mengakses API CloudKit Framework serta layanan latar belakang, lokasi, dan pemberitahuan.

Gambaran umum API CloudKit

Sebelum menerapkan CloudKit dalam aplikasi Xamarin iOS, artikel ini akan membahas dasar-dasar CloudKit Framework, yang akan menyertakan topik berikut:

  1. Kontainer – Silo terisolasi dari komunikasi iCloud.
  2. Database – Publik dan privat tersedia untuk aplikasi.
  3. Catatan – Mekanisme di mana data terstruktur dipindahkan ke dan dari CloudKit.
  4. Zona Rekaman – Adalah grup Rekaman.
  5. Pengidentifikasi Rekaman – Sepenuhnya dinormalisasi dan mewakili lokasi rekaman tertentu.
  6. Referensi – Berikan hubungan induk-anak antara Rekaman terkait dalam Database tertentu.
  7. Aset – Memungkinkan file data besar dan tidak terstruktur diunggah ke iCloud dan dikaitkan dengan Rekaman tertentu.

Kontainer

Aplikasi tertentu yang berjalan pada perangkat iOS selalu berjalan di samping aplikasi dan layanan lain di perangkat tersebut. Pada perangkat klien, aplikasi akan di-silo atau dikotakpasir dalam beberapa cara. Dalam beberapa kasus, ini adalah kotak pasir harfiah, dan di yang lain, aplikasi hanya berjalan di ruang memorinya sendiri.

Konsep mengambil aplikasi klien dan menjalankannya dipisahkan dari klien lain sangat kuat dan memberikan keuntungan berikut:

  1. Keamanan – Satu aplikasi tidak dapat mengganggu aplikasi klien lain atau OS itu sendiri.
  2. Stabilitas – Jika aplikasi klien mengalami crash, aplikasi klien tidak dapat mengambil aplikasi OS lain.
  3. Privasi – Setiap aplikasi klien memiliki akses terbatas ke informasi pribadi yang disimpan dalam perangkat.

CloudKit dirancang untuk memberikan keuntungan yang sama seperti yang tercantum di atas, dan menerapkannya untuk bekerja dengan informasi berbasis cloud:

Aplikasi CloudKit berkomunikasi menggunakan kontainer

Sama seperti aplikasi yang salah satu dari banyak yang berjalan di perangkat, begitu juga komunikasi aplikasi dengan iCloud satu dari banyak. Masing-masing silo komunikasi yang berbeda ini disebut Kontainer.

Kontainer diekspos dalam CloudKit Framework melalui CKContainer kelas . Secara default, satu aplikasi berbicara dengan satu kontainer dan kontainer ini memisahkan data untuk aplikasi tersebut. Ini berarti bahwa beberapa aplikasi dapat menyimpan informasi ke akun iCloud yang sama, namun informasi ini tidak akan pernah diinterming.

Kontainerisasi data iCloud juga memungkinkan CloudKit untuk merangkum informasi pengguna. Dengan cara ini, aplikasi akan memiliki beberapa akses terbatas ke akun iCloud dan informasi pengguna yang disimpan di dalamnya, sambil tetap melindungi privasi dan keamanan pengguna.

Kontainer dikelola sepenuhnya oleh pengembang aplikasi melalui portal WWDR. Namespace kontainer bersifat global di semua pengembang Apple, sehingga kontainer tidak hanya boleh unik untuk aplikasi pengembang tertentu, tetapi untuk semua pengembang dan aplikasi Apple.

Apple menyarankan untuk menggunakan notasi DNS terbalik saat membuat namespace layanan untuk kontainer aplikasi. Contoh: iCloud.com.company-name.application-name

Meskipun Kontainer, secara default, terikat satu-ke-satu ke aplikasi tertentu, kontainer tersebut dapat dibagikan di seluruh aplikasi. Jadi beberapa aplikasi dapat berkoordinasi pada satu Kontainer. Satu aplikasi juga dapat berbicara dengan beberapa Kontainer.

Database

Salah satu fungsi utama CloudKit adalah mengambil model data aplikasi dan replikasi model tersebut hingga ke server iCloud. Beberapa informasi ditujukan untuk pengguna yang membuatnya, informasi lain adalah data publik yang dapat dibuat oleh pengguna untuk penggunaan publik (seperti ulasan restoran), atau itu bisa menjadi informasi yang telah diterbitkan pengembang untuk aplikasi. Dalam kedua kasus, audiens bukan hanya satu pengguna, tetapi merupakan komunitas orang.

Diagram Kontainer CloudKit

Di dalam Kontainer, pertama dan terdahulu adalah database publik. Di sinilah semua informasi publik hidup dan bergaul. Selain itu, ada beberapa database privat individual untuk setiap pengguna aplikasi.

Saat berjalan di perangkat iOS, aplikasi hanya akan memiliki akses ke informasi untuk pengguna iCloud yang saat ini masuk. Jadi tampilan aplikasi dari kontainer adalah sebagai berikut:

Tampilan aplikasi kontainer

Ini hanya dapat melihat database publik dan database privat yang terkait dengan pengguna iCloud yang saat ini masuk.

Database diekspos di CloudKit Framework melalui CKDatabase kelas . Setiap aplikasi memiliki akses ke dua database: database publik dan yang privat.

Kontainer adalah titik masuk awal ke CloudKit. Kode berikut dapat digunakan untuk mengakses database publik dan privat dari Kontainer default aplikasi:

using CloudKit;
//...

public CKDatabase PublicDatabase { get; set; }
public CKDatabase PrivateDatabase { get; set; }
//...

// Get the default public and private databases for
// the application
PublicDatabase = CKContainer.DefaultContainer.PublicCloudDatabase;
PrivateDatabase = CKContainer.DefaultContainer.PrivateCloudDatabase;

Berikut adalah perbedaan antara jenis database:

Database Publik Database Privat
Tipe Data Data Bersama Data Pengguna Saat Ini
Kuota Diperhitungkan dalam Kuota Pengembang Diperhitungkan dalam Kuota Pengguna
Izin Default World Readable Dapat Dibaca Pengguna
Izin Pengeditan Peran Dasbor iCloud melalui tingkat kelas rekaman T/A

Data

Kontainer menyimpan database, dan di dalam database adalah rekaman. Rekaman adalah mekanisme di mana data terstruktur dipindahkan ke dan dari CloudKit:

Kontainer menyimpan database, dan di dalam database adalah rekaman

Rekaman diekspos dalam CloudKit Framework melalui CKRecord kelas , yang membungkus pasangan kunci-nilai. Instans objek dalam aplikasi setara dengan CKRecord di CloudKit. Selain itu, masing-masing CKRecord memiliki jenis catatan, yang setara dengan kelas objek.

Rekaman memiliki skema just-in-time, sehingga data dijelaskan ke CloudKit sebelum diserahkan untuk diproses. Sejak saat itu, CloudKit akan menginterpretasikan informasi dan menangani logistik penyimpanan dan pengambilan rekaman.

Kelas ini CKRecord juga mendukung berbagai metadata. Misalnya, rekaman berisi informasi tentang kapan dibuat dan pengguna yang membuatnya. Rekaman juga berisi informasi tentang kapan terakhir diubah dan pengguna yang memodifikasinya.

Rekaman berisi gagasan Tag Perubahan. Ini adalah versi sebelumnya dari revisi rekaman tertentu. Tag Perubahan digunakan sebagai cara ringan untuk menentukan apakah klien dan server memiliki versi rekaman tertentu yang sama.

Seperti yang dinyatakan di atas, CKRecords membungkus pasangan kunci-nilai dan dengan demikian, jenis data berikut dapat disimpan dalam rekaman:

  1. NSString
  2. NSNumber
  3. NSData
  4. NSDate
  5. CLLocation
  6. CKReferences
  7. CKAssets

Selain jenis nilai tunggal, rekaman dapat berisi array homogen dari salah satu jenis yang tercantum di atas.

Kode berikut dapat digunakan untuk membuat rekaman baru dan menyimpannya dalam database:

using CloudKit;
//...

private const string ReferenceItemRecordName = "ReferenceItems";
//...

var newRecord = new CKRecord (ReferenceItemRecordName);
newRecord ["name"] = (NSString)nameTextField.Text;
await CloudManager.SaveAsync (newRecord);

Zona rekaman

Rekaman tidak ada sendiri dalam database tertentu – grup rekaman ada bersama di dalam Zona Rekaman. Zona Rekaman dapat dianggap sebagai Tabel dalam database relasional tradisional:

Grup rekaman ada bersama-sama di dalam Zona Rekaman

Mungkin ada beberapa rekaman dalam Zona Rekaman tertentu dan beberapa Zona Rekaman dalam database tertentu. Setiap database berisi Zona Rekaman Default:

Setiap database berisi Zona Rekaman Default dan Zona Kustom

Di sinilah rekaman disimpan secara default. Selain itu, Zona Rekaman Kustom dapat dibuat. Zona Rekaman mewakili granularitas dasar di mana Penerapan Atom dan Pelacakan Perubahan dilakukan.

Pengidentifikasi rekaman

Pengidentifikasi Rekaman direpresentasikan sebagai tuple, yang berisi Nama Rekaman yang disediakan klien dan zona tempat rekaman berada. Pengidentifikasi Rekaman memiliki karakteristik berikut:

  • Mereka dibuat oleh aplikasi klien.
  • Mereka sepenuhnya dinormalisasi dan mewakili lokasi rekaman tertentu.
  • Dengan menetapkan ID Unik rekaman dalam database asing ke nama rekaman, mereka dapat digunakan untuk menjenuhkan database lokal yang tidak disimpan dalam CloudKit.

Saat pengembang membuat rekaman baru, mereka dapat memilih untuk meneruskan Pengidentifikasi Rekaman. Jika Pengidentifikasi Rekaman tidak ditentukan, UUID akan secara otomatis dibuat dan ditetapkan ke rekaman.

Saat pengembang membuat Pengidentifikasi Rekaman baru, mereka dapat memilih untuk menentukan Zona Rekaman tempat setiap rekaman akan berada. Jika tidak ada yang ditentukan, Zona Rekaman Default akan digunakan.

Pengidentifikasi Catatan diekspos di CloudKit Framework melalui CKRecordID kelas . Kode berikut dapat digunakan untuk membuat Pengidentifikasi Rekaman baru:

var recordID =  new CKRecordID("My Record");

Referensi

Referensi menyediakan hubungan antara Rekaman terkait dalam Database tertentu:

Referensi menyediakan hubungan antara Rekaman terkait dalam Database tertentu

Dalam contoh di atas, Orang Tua memiliki Anak sehingga Anak adalah catatan anak dari catatan induk. Hubungan beralih dari rekaman anak ke rekaman induk dan disebut sebagai Referensi Kembali.

Referensi diekspos dalam CloudKit Framework melalui CKReference kelas . Mereka adalah cara untuk membiarkan server iCloud memahami hubungan antara rekaman.

Referensi menyediakan mekanisme di balik Penghapusan Bertingkat. Jika rekaman induk dihapus dari database, rekaman turunan apa pun (seperti yang ditentukan dalam Hubungan) akan secara otomatis dihapus dari database juga.

Catatan

Dangling Pointers adalah kemungkinan saat menggunakan CloudKit. Misalnya, pada saat aplikasi telah mengambil daftar penunjuk rekaman, memilih rekaman lalu meminta rekaman, rekaman mungkin tidak ada lagi dalam database. Aplikasi harus dikodekan untuk menangani situasi ini dengan anggun.

Meskipun tidak diperlukan, Referensi Kembali lebih disukai saat bekerja dengan CloudKit Framework. Apple telah menyempurnakan sistem untuk menjadikan ini sebagai jenis referensi yang paling efisien.

Saat membuat Referensi, pengembang dapat memberikan catatan yang sudah ada dalam memori atau membuat referensi ke Pengidentifikasi Rekaman. Jika menggunakan Pengidentifikasi Rekaman, dan referensi yang ditentukan tidak ada dalam database, Dangling Pointer akan dibuat.

Berikut ini adalah contoh membuat referensi terhadap Rekaman yang diketahui:

var reference = new CKReference(newRecord, new CKReferenceAction());

Aset

Aset memungkinkan file data besar dan tidak terstruktur diunggah ke iCloud dan terkait dengan Rekaman tertentu:

Aset memungkinkan file data besar dan tidak terstruktur diunggah ke iCloud dan terkait dengan Rekaman tertentu

Pada klien, CKRecord dibuat yang menjelaskan file yang akan diunggah ke server iCloud. CKAsset dibuat untuk berisi file dan ditautkan ke rekaman yang menjelaskannya.

Ketika file diunggah ke server, rekaman ditempatkan dalam database dan file disalin ke dalam database Penyimpanan Massal khusus. Tautan dibuat antara penunjuk rekaman dan file yang diunggah.

Aset diekspos dalam CloudKit Framework melalui CKAsset kelas dan digunakan untuk menyimpan data besar dan tidak terstruktur. Karena pengembang tidak pernah ingin memiliki data besar dan tidak terstruktur dalam memori, Aset diimplementasikan menggunakan file pada disk.

Aset dimiliki oleh rekaman, yang memungkinkan aset diambil dari iCloud menggunakan rekaman sebagai penunjuk. Dengan cara ini server dapat Mengumpulkan Aset Sampah saat rekaman yang memiliki Aset dihapus.

Karena CKAssets dimaksudkan untuk menangani file data besar, CloudKit yang dirancang Apple untuk mengunggah dan mengunduh Aset secara efisien.

Kode berikut dapat digunakan untuk membuat Aset dan mengaitkannya dengan Rekaman:

var fileUrl = new NSUrl("LargeFile.mov");
var asset = new CKAsset(fileUrl);
newRecord ["name"] = asset;

Kami sekarang telah membahas semua objek mendasar dalam CloudKit. Kontainer dikaitkan dengan aplikasi dan berisi Database. Database berisi Rekaman yang dikelompokkan ke dalam Zona Rekaman dan ditujukkan oleh Pengidentifikasi Rekaman. Hubungan induk-turunan ditentukan antara Rekaman menggunakan Referensi. Terakhir, file besar dapat diunggah dan dikaitkan dengan Rekaman menggunakan Aset.

API Kenyamanan CloudKit

Apple menawarkan dua set API yang berbeda untuk bekerja dengan CloudKit:

  • API Operasional – Menawarkan setiap fitur CloudKit. Untuk aplikasi yang lebih kompleks, API ini menyediakan kontrol menawan atas CloudKit.
  • Api Kenyamanan – Menawarkan subset umum yang telah dikonfigurasi sebelumnya dari fitur CloudKit. Ini menyediakan solusi akses yang nyaman dan mudah untuk menyertakan fungsionalitas CloudKit dalam aplikasi iOS.

API Kenyamanan biasanya merupakan pilihan terbaik untuk sebagian besar aplikasi iOS dan Apple menyarankan untuk memulainya. Sisa bagian ini akan membahas topik Api Kenyamanan berikut:

  • Menyimpan Rekaman.
  • Mengambil Rekaman.
  • Memperbarui Rekaman.

Kode penyiapan umum

Sebelum memulai CloudKit Convenience API, 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 Foundation;
using UIKit;
using CloudKit;

namespace CloudKitAtlas
{
    [Register ("AppDelegate")]
    public partial class AppDelegate : UIApplicationDelegate
    {
        public override UIWindow Window { get; set;}
        public CKDatabase PublicDatabase { get; set; }
        public CKDatabase PrivateDatabase { get; set; }

        public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
        {
            application.RegisterForRemoteNotifications ();

            // Get the default public and private databases for
            // the application
            PublicDatabase = CKContainer.DefaultContainer.PublicCloudDatabase;
            PrivateDatabase = CKContainer.DefaultContainer.PrivateCloudDatabase;

            return true;
        }

        public override void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken)
        {
            Console.WriteLine ("Registered for Push notifications with token: {0}", deviceToken);
        }

        public override void FailedToRegisterForRemoteNotifications (UIApplication application, NSError error)
        {
            Console.WriteLine ("Push subscription failed");
        }

        public override void ReceivedRemoteNotification (UIApplication application, NSDictionary userInfo)
        {
            Console.WriteLine ("Push received");
        }
    }
}

Kode di atas mengekspos database CloudKit publik dan privat sebagai pintasan untuk membuatnya lebih mudah dikerjakan di sisa aplikasi.

Selanjutnya, tambahkan kode berikut ke tampilan atau kontainer tampilan apa pun yang akan menggunakan CloudKit:

using CloudKit;
//...

public AppDelegate ThisApp {
    get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}

Ini menambahkan pintasan untuk masuk ke AppDelegate dan mengakses pintasan database publik dan privat yang dibuat di atas.

Dengan kode ini, mari kita lihat menerapkan CloudKit Convenience API dalam aplikasi Xamarin iOS 8.

Menyimpan rekaman

Menggunakan pola yang disajikan di atas saat membahas Rekaman, kode berikut akan membuat rekaman baru dan menggunakan API Kenyamanan untuk menyimpannya ke database publik:

private const string ReferenceItemRecordName = "ReferenceItems";
...

// Create a new record
var newRecord = new CKRecord (ReferenceItemRecordName);
newRecord ["name"] = (NSString)nameTextField.Text;

// Save it to the database
ThisApp.PublicDatabase.SaveRecord(newRecord, (record, err) => {
    // Was there an error?
    if (err != null) {
        ...
    }
});

Tiga hal yang perlu diperhatikan tentang kode di atas:

  1. Dengan memanggil SaveRecord metode PublicDatabase, pengembang tidak perlu menentukan bagaimana data dikirim, Zona tempat data ditulis, dll. API Kenyamanan sedang mengurus semua detail itu sendiri.
  2. Panggilan tidak sinkron dan menyediakan rutinitas panggilan balik ketika panggilan selesai, baik dengan keberhasilan atau kegagalan. Jika panggilan gagal, pesan kesalahan akan disediakan.
  3. CloudKit tidak menyediakan penyimpanan/persistensi lokal; ini adalah media transfer saja. Jadi, saat permintaan dibuat untuk menyimpan Rekaman, permintaan akan segera dikirim ke server iCloud.

Catatan

Karena sifat "lossy" dari komunikasi jaringan seluler, di mana koneksi terus terputus atau terganggu, salah satu pertimbangan pertama yang harus dilakukan pengembang saat bekerja dengan CloudKit adalah penanganan kesalahan.

Mengambil rekaman

Dengan Rekaman yang dibuat dan berhasil disimpan di server iCloud, gunakan kode berikut untuk mengambil rekaman:

// Create a record ID and fetch the record from the database
var recordID = new CKRecordID("MyRecordName");
ThisApp.PublicDatabase.FetchRecord(recordID, (record, err) => {
    // Was there an error?
    if (err != null) {
        ...
    }
});

Sama seperti dalam menyimpan Rekaman, kode di atas asinkron, sederhana dan membutuhkan penanganan kesalahan yang hebat.

Memperbarui rekaman

Setelah Rekaman diambil dari server iCloud, kode berikut dapat digunakan untuk memodifikasi Rekaman dan menyimpan perubahan kembali ke database:

// Create a record ID and fetch the record from the database
var recordID = new CKRecordID("MyRecordName");
ThisApp.PublicDatabase.FetchRecord(recordID, (record, err) => {
    // Was there an error?
    if (err != null) {

    } else {
        // Modify the record
        record["name"] = (NSString)"New Name";

        // Save changes to database
        ThisApp.PublicDatabase.SaveRecord(record, (r, e) => {
            // Was there an error?
            if (e != null) {
                 ...
            }
        });
    }
});

Metode FetchRecord mengembalikan PublicDatabaseCKRecord jika panggilan berhasil. Aplikasi kemudian memodifikasi Rekaman dan memanggil SaveRecord lagi untuk menulis perubahan kembali ke database.

Bagian ini telah menunjukkan siklus khas yang akan digunakan aplikasi saat bekerja dengan CloudKit Convenience API. Aplikasi akan menyimpan Rekaman ke iCloud, mengambil rekaman tersebut dari iCloud, memodifikasi Rekaman, dan menyimpan perubahan tersebut kembali ke iCloud.

Merancang untuk skalabilitas

Sejauh ini artikel ini telah melihat penyimpanan dan pengambilan seluruh model objek aplikasi dari server iCloud, setiap kali akan dikerjakan. Meskipun pendekatan ini bekerja dengan baik dengan sejumlah kecil data dan basis pengguna yang sangat kecil, pendekatan ini tidak menskalakan dengan baik ketika jumlah informasi dan/atau basis pengguna meningkat.

Big data, perangkat kecil

Semakin populer aplikasi, semakin banyak data dalam database dan semakin tidak layak untuk memiliki cache dari seluruh data tersebut pada perangkat. Teknik berikut dapat digunakan untuk menyelesaikan masalah ini:

  • Simpan data besar di Cloud – CloudKit dirancang untuk menangani data besar secara efisien.
  • Klien hanya boleh melihat iringan data tersebut - Menurunkan minimum data yang diperlukan untuk menangani tugas apa pun pada waktu tertentu.
  • Tampilan klien dapat berubah - Karena setiap pengguna memiliki preferensi yang berbeda, ikatan data yang ditampilkan dapat berubah dari pengguna ke pengguna dan tampilan individual pengguna dari ikatan tertentu dapat berbeda.
  • Klien menggunakan kueri untuk memfokuskan titik pandang – Kueri memungkinkan pengguna untuk melihat subset kecil himpunan data yang lebih besar yang ada di dalam Cloud.

Kueri

Seperti yang dinyatakan di atas, kueri memungkinkan pengembang untuk memilih subset kecil dari himpunan data yang lebih besar yang ada di Cloud. Kueri diekspos di CloudKit Framework melalui CKQuery kelas .

Kueri menggabungkan tiga hal berbeda: Jenis Catatan ( RecordType), Predikat ( NSPredicate) dan, opsional, Deskriptor Urutkan ( NSSortDescriptors). CloudKit mendukung sebagian NSPredicatebesar .

Predikat yang didukung

CloudKit mendukung jenis NSPredicates berikut saat bekerja dengan Kueri:

  1. Mencocokkan Rekaman di mana nama sama dengan nilai yang disimpan dalam variabel:

    NSPredicate.FromFormat(string.Format("name = '{0}'", recordName))
    
  2. Memungkinkan pencocokan didasarkan pada nilai kunci dinamis, sehingga kunci tidak perlu diketahui pada waktu kompilasi:

    NSPredicate.FromFormat(string.Format("{0} = '{1}'", key, value))
    
  3. Rekaman yang Cocok di mana nilai Rekaman lebih besar dari nilai yang diberikan:

    NSPredicate.FromFormat(string.Format("start > {0}", (NSDate)date))
    
  4. Rekaman yang Cocok di mana lokasi Rekaman berada dalam jarak 100 meter dari lokasi yang diberikan:

    var location = new CLLocation(37.783,-122.404);
    var predicate = NSPredicate.FromFormat(string.Format("distanceToLocation:fromLocation(Location,{0}) < 100", location));
    
  5. CloudKit mendukung pencarian token. Panggilan ini akan membuat dua token, satu untuk after dan satu lagi untuk session. Ini akan mengembalikan Rekaman yang berisi dua token tersebut:

    NSPredicate.FromFormat(string.Format("ALL tokenize({0}, 'Cdl') IN allTokens", "after session"))
    
  6. CloudKit mendukung predikat gabungan yang bergabung menggunakan AND operator.

    NSPredicate.FromFormat(string.Format("start > {0} AND name = '{1}'", (NSDate)date, recordName))
    

Membuat kueri

Kode berikut dapat digunakan untuk membuat CKQuery di aplikasi Xamarin iOS 8:

var recordName = "MyRec";
var predicate = NSPredicate.FromFormat(string.Format("name = '{0}'", recordName));
var query = new CKQuery("CloudRecords", predicate);

Pertama, membuat Predikat untuk memilih hanya rekaman yang cocok dengan nama tertentu. Kemudian membuat kueri yang akan memilih Rekaman dari Tipe Catatan yang diberikan yang cocok dengan Predikat.

Melakukan kueri

Setelah Kueri dibuat, gunakan kode berikut untuk melakukan kueri dan memproses rekaman yang dikembalikan:

var recordName = "MyRec";
var predicate = NSPredicate.FromFormat(string.Format("name = {0}", recordName));
var query = new CKQuery("CloudRecords", predicate);

ThisApp.PublicDatabase.PerformQuery(query, CKRecordZone.DefaultRecordZone().ZoneId, (NSArray results, NSError err) => {
    // Was there an error?
    if (err != null) {
       ...
    } else {
        // Process the returned records
        for(nint i = 0; i < results.Count; ++i) {
            var record = (CKRecord)results[i];
        }
    }
});

Kode di atas mengambil kueri yang dibuat di atas dan menjalankannya terhadap Database Publik. Karena tidak ada Zona Rekaman yang ditentukan, semua zona dicari. Jika tidak ada kesalahan yang terjadi, array CKRecords akan dikembalikan yang cocok dengan parameter kueri.

Cara berpikir tentang Kueri adalah bahwa mereka adalah jajak pendapat, dan hebat dalam mengiris melalui himpunan data besar. Namun, kueri tidak cocok untuk himpunan data statis besar dan sebagian besar karena alasan berikut:

  • Mereka buruk untuk masa pakai baterai perangkat.
  • Mereka buruk untuk lalu lintas jaringan.
  • Mereka buruk untuk pengalaman pengguna karena informasi yang mereka lihat dibatasi oleh seberapa sering aplikasi melakukan polling database. Pengguna hari ini mengharapkan pemberitahuan push ketika sesuatu berubah.

Langganan

Saat berhadapan dengan himpunan data statis yang besar dan sebagian besar, kueri tidak boleh dilakukan pada perangkat klien, kueri harus berjalan di server atas nama klien. Kueri harus berjalan di latar belakang dan harus dijalankan setelah setiap penyimpanan rekaman tunggal, baik oleh perangkat saat ini atau perangkat lain yang menyentuh database yang sama.

Terakhir, pemberitahuan push harus dikirim ke setiap perangkat yang dilampirkan ke database saat kueri sisi server dijalankan.

Langganan diekspos di CloudKit Framework melalui CKSubscription kelas . Mereka menggabungkan Jenis Rekaman ( RecordType), Predikat ( NSPredicate) dan Pemberitahuan Push Apple ( Push).

Catatan

Dorongan CloudKit sedikit tertambah karena berisi payload yang berisi informasi spesifik CloudKit seperti apa yang menyebabkan pendorongan terjadi.

Cara kerja langganan

Sebelum menerapkan Langganan dalam kode C#, mari kita ambil gambaran umum singkat tentang cara kerja langganan:

Gambaran umum cara kerja langganan

Grafik di atas menunjukkan proses langganan umum sebagai berikut:

  1. Perangkat klien membuat Langganan baru yang berisi serangkaian kondisi yang akan memicu langganan dan Pemberitahuan Push yang akan dikirim saat pemicu terjadi.
  2. Langganan dikirim ke Database tempat langganan ditambahkan ke kumpulan langganan yang sudah ada.
  3. Perangkat kedua membuat Rekaman baru dan menyimpan rekaman tersebut ke Database.
  4. Database mencari daftar Langganannya untuk melihat apakah Rekaman baru cocok dengan salah satu kondisinya.
  5. Jika kecocokan ditemukan, Pemberitahuan Push dikirim ke perangkat yang mendaftarkan Langganan dengan informasi tentang Rekaman yang menyebabkannya dipicu.

Dengan pengetahuan ini di tempat, mari kita lihat membuat Langganan dalam aplikasi Xamarin iOS 8.

Membuat langganan

Kode berikut dapat digunakan untuk membuat Langganan:

// Create a new subscription
DateTime date;
var predicate = NSPredicate.FromFormat(string.Format("start > {0}", (NSDate)date));
var subscription = new CKSubscription("RecordType", predicate, CKSubscriptionOptions.FiresOnRecordCreation);

// Describe the type of notification
var notificationInfo = new CKNotificationInfo();
notificationInfo.AlertLocalizationKey = "LOCAL_NOTIFICATION_KEY";
notificationInfo.SoundName = "ping.aiff";
notificationInfo.ShouldBadge = true;

// Attach the notification info to the subscription
subscription.NotificationInfo = notificationInfo;

Pertama, ini membuat Predikat yang menyediakan kondisi untuk memicu Langganan. Selanjutnya, ini membuat langganan terhadap Jenis Catatan tertentu dan mengatur opsi saat pemicu diuji. Terakhir, ini menentukan jenis pemberitahuan yang akan terjadi ketika Langganan dipicu dan melampirkannya langganan.

Menyimpan langganan

Dengan Langganan yang dibuat, kode berikut akan menyimpannya ke Database:

// Save the subscription to the database
ThisApp.PublicDatabase.SaveSubscription(subscription, (s, err) => {
    // Was there an error?
    if (err != null) {

    }
});

Menggunakan API Kenyamanan, panggilan asinkron, sederhana, dan memberikan penanganan kesalahan yang mudah.

Menangani pemberitahuan push

Jika pengembang sebelumnya telah menggunakan Pemberitahuan Push Apple (APS), maka proses menangani Pemberitahuan yang dihasilkan oleh CloudKit harus sudah tidak asing lagi.

AppDelegate.csDi , ambil alih ReceivedRemoteNotification kelas sebagai berikut:

public override void ReceivedRemoteNotification (UIApplication application, NSDictionary userInfo)
{
    // Parse the notification into a CloudKit Notification
    var notification = CKNotification.FromRemoteNotificationDictionary (userInfo);

    // Get the body of the message
    var alertBody = notification.AlertBody;

    // Was this a query?
    if (notification.NotificationType == CKNotificationType.Query) {
        // Yes, convert to a query notification and get the record ID
        var query = notification as CKQueryNotification;
        var recordID = query.RecordId;
    }
}

Kode di atas meminta CloudKit untuk mengurai userInfo ke dalam Pemberitahuan CloudKit. Selanjutnya, informasi diekstrak tentang pemberitahuan. Terakhir, jenis pemberitahuan diuji dan pemberitahuan ditangani dengan sesuai.

Bagian ini telah menunjukkan cara menjawab Big Data, masalah Perangkat Kecil yang disajikan di atas dengan menggunakan Kueri dan Langganan. Aplikasi akan meninggalkan data besarnya di cloud, dan menggunakan teknologi ini untuk memberikan tampilan ke dalam himpunan data ini.

Akun pengguna CloudKit

Seperti yang disebutkan di awal artikel ini, CloudKit dibangun di atas infrastruktur iCloud yang ada. Bagian berikut akan membahas, secara rinci, bagaimana akun diekspos ke pengembang menggunakan CLOUDKit API.

Autentikasi

Saat berhadapan dengan akun pengguna, pertimbangan pertama adalah autentikasi. CloudKit mendukung autentikasi melalui pengguna iCloud yang saat ini masuk di perangkat. Autentikasi berlangsung di belakang layar dan ditangani oleh iOS. Dengan cara ini, pengembang tidak perlu khawatir tentang detail penerapan autentikasi. Mereka hanya menguji untuk melihat apakah pengguna masuk.

Informasi akun pengguna

CloudKit menyediakan informasi pengguna berikut kepada pengembang:

  • Identitas – cara mengidentifikasi pengguna secara unik.
  • Metadata – Kemampuan untuk menyimpan dan mengambil informasi tentang pengguna.
  • Privasi – Semua informasi ditangani dalam cara sadar privasi. Tidak ada yang diekspos kecuali pengguna telah menyetujuinya.
  • Penemuan – Memberi pengguna kemampuan untuk menemukan teman mereka yang menggunakan aplikasi yang sama.

Selanjutnya, kita akan melihat topik-topik ini secara rinci.

Identitas

Seperti yang dinyatakan di atas, CloudKit menyediakan cara bagi aplikasi untuk mengidentifikasi pengguna tertentu secara unik:

Mengidentifikasi pengguna tertentu secara unik

Ada aplikasi klien yang berjalan di perangkat pengguna dan semua Database Privat Pengguna tertentu di dalam Kontainer CloudKit. Aplikasi klien akan ditautkan ke salah satu pengguna tertentu. Ini didasarkan pada pengguna yang masuk ke iCloud secara lokal di perangkat.

Karena ini berasal dari iCloud, ada penyimpanan dukungan informasi pengguna yang kaya. Dan karena iCloud benar-benar menghosting Kontainer, iCloud dapat menghubungkan pengguna. Dalam grafik di atas, pengguna yang akun user@icloud.com iCloud-nya ditautkan ke klien saat ini.

Berdasarkan Kontainer menurut Kontainer, ID Pengguna unik yang dibuat secara acak dibuat dan dikaitkan dengan akun iCloud pengguna (alamat email). ID Pengguna ini dikembalikan ke aplikasi dan dapat digunakan dengan cara apa pun yang sesuai dengan keinginan pengembang.

Catatan

Aplikasi yang berbeda yang berjalan pada perangkat yang sama untuk pengguna iCloud yang sama akan memiliki ID Pengguna yang berbeda karena terhubung ke Kontainer CloudKit yang berbeda.

Kode berikut mendapatkan ID pengguna CloudKit untuk pengguna iCloud yang saat ini masuk di perangkat:

public CKRecordID UserID { get; set; }
...

// Get the CloudKit User ID
CKContainer.DefaultContainer.FetchUserRecordId ((recordID, err) => {
    // Was there an error?
    if (err!=null) {
        Console.WriteLine("Error: {0}", err.LocalizedDescription);
    } else {
        // Save user ID
        UserID = recordID;
    }
});

Kode di atas meminta Kontainer CloudKit untuk memberikan ID pengguna yang saat ini masuk. Karena informasi ini berasal dari iCloud Server, panggilan tersebut tidak sinkron dan diperlukan penanganan kesalahan.

Metadata

Setiap pengguna di CloudKit memiliki Metadata tertentu yang menjelaskannya. Metadata ini direpresentasikan sebagai Catatan CloudKit:

Setiap pengguna di CloudKit memiliki Metadata tertentu yang menjelaskannya

Melihat ke dalam Database Privat untuk pengguna tertentu dari Kontainer ada satu Rekaman yang menentukan pengguna tersebut. Ada banyak Catatan Pengguna di dalam Database Publik, satu untuk setiap pengguna Kontainer. Salah satunya akan memiliki ID rekaman yang cocok dengan ID Rekaman pengguna yang saat ini masuk.

Rekaman Pengguna di Database Publik dapat dibaca di dunia. Mereka diperlakukan, sebagian besar, sebagai Rekaman biasa dan memiliki jenis CKRecordTypeUserRecord. Rekaman ini dicadangkan oleh sistem dan tidak tersedia untuk kueri.

Gunakan kode berikut untuk mengakses Catatan Pengguna:

public CKRecord UserRecord { get; set; }
...

// Get the user's record
PublicDatabase.FetchRecord(UserID, (record ,er) => {
    //was there an error?
    if (er != null) {
        Console.WriteLine("Error: {0}", er.LocalizedDescription);
    } else {
        // Save the user record
        UserRecord = record;
    }
});

Kode di atas meminta Database Publik untuk mengembalikan Catatan Pengguna untuk pengguna yang ID yang kami akses di atas. Karena informasi ini berasal dari iCloud Server, panggilan tersebut tidak sinkron dan diperlukan penanganan kesalahan.

Privasi

CloudKit dirancang, secara default, untuk melindungi privasi pengguna yang saat ini masuk. Tidak ada informasi identifikasi pribadi tentang pengguna yang diekspos secara default. Ada beberapa kasus di mana aplikasi akan memerlukan informasi terbatas tentang pengguna.

Dalam kasus ini, aplikasi dapat meminta agar pengguna mengungkapkan informasi ini. Kotak dialog akan disajikan kepada pengguna yang meminta mereka untuk ikut serta mengekspos informasi akun mereka.

Penemuan

Dengan asumsi bahwa pengguna sebagai ikut serta untuk mengizinkan aplikasi membatasi akses ke informasi akun pengguna mereka, mereka dapat ditemukan oleh pengguna lain dari aplikasi:

Pengguna dapat ditemukan oleh pengguna lain dari aplikasi

Aplikasi klien berbicara dengan Kontainer, dan Kontainer berbicara iCloud untuk mengakses informasi pengguna. Pengguna dapat memberikan alamat email dan Penemuan dapat digunakan untuk mendapatkan informasi kembali tentang pengguna. Secara opsional, ID Pengguna juga dapat digunakan untuk menemukan informasi tentang pengguna.

CloudKit juga menyediakan cara untuk menemukan informasi tentang setiap pengguna yang mungkin menjadi teman pengguna iCloud yang saat ini masuk dengan mengkueri seluruh Buku Alamat. Proses CloudKit akan menarik Buku Kontak pengguna dan menggunakan alamat email untuk melihat apakah dapat menemukan pengguna lain dari aplikasi yang cocok dengan alamat tersebut.

Ini memungkinkan aplikasi untuk memanfaatkan Buku Kontak pengguna tanpa menyediakan akses ke aplikasi atau meminta pengguna untuk menyetujui akses ke kontak. Tidak ada waktu adalah informasi kontak yang tersedia untuk aplikasi, hanya Proses CloudKit yang memiliki akses.

Untuk rekap, ada tiga jenis input berbeda yang tersedia untuk Penemuan Pengguna:

  • ID Rekaman Pengguna – Penemuan dapat dilakukan terhadap ID Pengguna dari pengguna CloudKit yang saat ini masuk.
  • Alamat Email Pengguna – Pengguna dapat memberikan alamat email dan dapat digunakan untuk penemuan.
  • Buku Kontak – Buku alamat pengguna dapat digunakan untuk menemukan pengguna aplikasi yang memiliki alamat email yang sama seperti yang tercantum dalam kontak mereka.

Penemuan Pengguna akan mengembalikan informasi berikut:

  • ID Rekaman Pengguna - ID unik pengguna di Database Publik.
  • Nama Depan dan Belakang - Seperti yang disimpan di Database Publik.

Informasi ini hanya akan dikembalikan untuk pengguna yang telah memilih penemuan.

Kode berikut akan menemukan informasi tentang pengguna yang saat ini masuk ke iCloud di perangkat:

public CKDiscoveredUserInfo UserInfo { get; set; }
//...

// Get the user's metadata
CKContainer.DefaultContainer.DiscoverUserInfo(UserID, (info, e) => {
    // Was there an error?
    if (e != null) {
        Console.WriteLine("Error: {0}", e.LocalizedDescription);
    } else {
        // Save the user info
        UserInfo = info;
    }
});

Gunakan kode berikut untuk mengkueri semua pengguna di Buku Kontak:

// Ask CloudKit for all of the user's friends information
CKContainer.DefaultContainer.DiscoverAllContactUserInfos((info, er) => {
    // Was there an error
    if (er != null) {
        Console.WriteLine("Error: {0}", er.LocalizedDescription);
    } else {
        // Process all returned records
        for(int i = 0; i < info.Count(); ++i) {
            // Grab a user
            var userInfo = info[i];
        }
    }
});

Di bagian ini kami telah membahas empat area utama akses ke akun pengguna yang dapat disediakan CloudKit ke aplikasi. Dari mendapatkan Identitas dan Metadata pengguna, hingga kebijakan Privasi yang dibangun ke cloudKit dan akhirnya, kemampuan untuk Menemukan pengguna lain dari aplikasi.

Lingkungan pengembangan dan produksi

CloudKit menyediakan lingkungan Pengembangan dan Produksi terpisah untuk jenis catatan dan data aplikasi. Lingkungan Pengembangan adalah lingkungan yang lebih fleksibel yang hanya tersedia untuk anggota tim pengembangan. Saat aplikasi menambahkan bidang baru ke rekaman dan menyimpan rekaman tersebut di Lingkungan Pengembangan, server memperbarui informasi skema secara otomatis.

Pengembang dapat menggunakan fitur ini untuk membuat perubahan pada skema selama pengembangan, yang menghemat waktu. Satu peringatan adalah bahwa setelah bidang ditambahkan ke rekaman, tipe data yang terkait dengan bidang tersebut tidak dapat diubah secara terprogram. Untuk mengubah jenis bidang, pengembang harus menghapus bidang di Dasbor CloudKit dan menambahkannya lagi dengan jenis baru.

Sebelum menyebarkan aplikasi, pengembang dapat memigrasikan skema dan data mereka ke lingkungan produksi menggunakan Dasbor CloudKit. Saat berjalan terhadap Lingkungan Produksi, server mencegah aplikasi mengubah skema secara terprogram. Pengembang masih dapat membuat perubahan dengan Dasbor CloudKit tetapi mencoba menambahkan bidang ke rekaman di Lingkungan Produksi mengakibatkan kesalahan.

Catatan

Simulator iOS hanya berfungsi dengan Lingkungan Pengembangan. Ketika pengembang siap untuk menguji aplikasi di Lingkungan Produksi, perangkat iOS fisik diperlukan.

Mengirim aplikasi yang diaktifkan CloudKit

Sebelum mengirim aplikasi yang menggunakan CloudKit, aplikasi perlu dikonfigurasi untuk menargetkan Lingkungan CloudKit Produksi atau aplikasi akan ditolak oleh Apple.

Lakukan:

  1. Di Visual Studio for Ma, kompilasi aplikasi untuk Rilis>Perangkat iOS:

    Mengkompilasi aplikasi untuk Rilis

  2. Dari menu Build , pilih Arsip:

    Pilih Arsip

  3. Arsip akan dibuat dan ditampilkan di Visual Studio untuk Mac:

    Arsip akan dibuat dan ditampilkan

  4. Mulai Xcode.

  5. Dari menu Jendela , pilih Pengatur:

    Pilih Pengatur

  6. Pilih arsip aplikasi dan klik tombol Ekspor... :

    Arsip aplikasi

  7. Pilih metode untuk diekspor dan klik tombol Berikutnya :

    Pilih metode untuk ekspor

  8. Pilih Tim Pengembangan dari daftar dropdown dan klik tombol Pilih:

    Pilih Tim Pengembangan dari daftar dropdown

  9. Pilih Produksi dari daftar dropdown dan klik tombol Berikutnya :

    Pilih Produksi dari daftar dropdown

  10. Tinjau pengaturan dan klik tombol Ekspor :

    Tinjau pengaturan

  11. Pilih lokasi untuk menghasilkan file aplikasi .ipa yang dihasilkan.

Prosesnya mirip untuk mengirimkan aplikasi langsung ke iTunes Koneksi, cukup klik tombol Kirim... alih-alih Ekspor... setelah memilih Arsip di jendela Penyelenggara.

Kapan menggunakan CloudKit

Seperti yang telah kita lihat dalam artikel ini, CloudKit menyediakan cara mudah bagi aplikasi untuk menyimpan dan mengambil informasi dari server iCloud. Meskipun demikian, CloudKit tidak usang atau menghentikan salah satu alat atau kerangka kerja yang ada.

Kasus penggunaan

Kasus penggunaan berikut akan membantu pengembang memutuskan kapan harus menggunakan kerangka kerja atau teknologi iCloud tertentu:

  • Penyimpanan Kunci-Nilai iCloud - Secara asinkron menjaga sejumlah kecil data tetap terbarui dan bagus untuk bekerja dengan preferensi aplikasi. Namun, itu dibatasi untuk sejumlah kecil informasi.
  • iCloud Drive – Dibangun di atas API Dokumen iCloud yang ada dan menyediakan API sederhana untuk menyinkronkan data yang tidak terstruktur dari sistem file. Ini menyediakan cache offline penuh di Mac OS X dan sangat bagus untuk aplikasi sentris dokumen.
  • Data Inti iCloud – Memungkinkan data direplikasi di antara semua perangkat pengguna. Data ini pengguna tunggal dan bagus untuk menjaga data privat dan terstruktur tetap sinkron.
  • CloudKit – Menyediakan data publik baik struktur maupun massal dan mampu menangani himpunan data besar dan file besar yang tidak terstruktur. Terkait dengan akun iCloud pengguna dan menyediakan transfer data yang diarahkan klien.

Mengingat kasus penggunaan ini, pengembang harus memilih teknologi iCloud yang benar untuk menyediakan fungsionalitas aplikasi yang diperlukan saat ini dan memberikan skalabilitas yang baik untuk pertumbuhan di masa mendatang.

Ringkasan

Artikel ini telah membahas pengenalan cepat api CloudKit. Ini telah menunjukkan cara memprovisikan dan mengonfigurasi aplikasi Xamarin iOS untuk menggunakan CloudKit. Ini telah mencakup fitur CloudKit Convenience API. Ini telah menunjukkan cara merancang aplikasi yang diaktifkan CloudKit untuk skalabilitas menggunakan Kueri dan Langganan. Dan akhirnya telah menunjukkan informasi Akun Pengguna yang diekspos ke aplikasi oleh CloudKit.