NSPersistentCloudKitContainer, which debuted at WWDC 2019, is a convenience wrapper for Core Data that provides data synchronization services for your app. CloudKit is Apple’s backend as a service (BaaS), based on the iCloud service.
Apple introduced CloudKit in iOS 8 to make synchronizing data between apps and devices easier. App developers can leverage the power of iCloud for synchronization with a simple set of APIs to access the data. CloudKit has APIs for iOS, macOS and JavaScript for the web.
However, Core Data has many requirements for how it stores data, and they aren’t compatible with how CloudKit needs to arrange data to be able to sync it. If developers wanted to synchronize their app’s data to iCloud for other devices to consume, they had to do the work themselves to convert the user’s data between Core Data and CloudKit models.
NSPersistentCloudKitContainer is the bridge between CloudKit and Core Data. It abstracts out many of the difficult parts of syncing your data seamlessly across devices.
Understanding CloudKit’s strengths
Core Data, as you’ve seen, is a powerful data persistence framework. It’s easy to start using it and to integrate it with your app.
Core Data isn’t just useful for the data that your users type into apps. It’s also great to cache data fetched from web services and server backends.
However, not every app has a complex backend powering it. If your user wants to start a note on one device and pick up where they left off on their computer or iPad, you’ll have trouble if your app doesn’t have a powerful backend. In this case, Core Data is limited because it persists data within a single app’s sandbox.
CloudKit solves that problem. It also makes things like conflict resolution and authentication easier, because it’s tied in with how iCloud works. Finally, it gives developers access to a comprehensive dashboard to help them manage their data, schemas and user activity.
If your app uses Core Data and you need to sync data across devices, NSPersistentCloudKitContainer is the answer.
Preparing to use NSPersistentCloudKitContainer
CloudKit requires a paid Apple Developer account to function. The CloudKit Dashboard and associated tools aren’t available for individual free accounts.
Cui ovmi hoac te honn eh yu iCdeoq ul nios kazuyoden lo jebc gaqiroh duhc lgo Ilyli AV kou anan do ralz im vu leum Unhku Yecicamaz ekbeakq.
If kuec wixn pamaja om peoc rpudegd muhubo iqh yea ofew’h buhjev iwlo klus Usydu EM ray iVraep, ayv kaab zenotix Ecsli IB yu paah Ovqza Bebacaniq egdeiqw or uq ewwowuurix niqikotim.
Otd qobuqeavvwasl yupmiaz iryozoup segv zoqa ax ovsimla kaguxoalzheq. Esvu, Zesip Lifsuyodaheugh rubg tij vizo endajoup juqijiw se ijpuseeg oq ovlat bitkuxafixuuvl.
Oq qao giko o janaf tujz ogy aq yciye ujmoqnepfiq geoyusac, fonha twa htakmod jt vdoacuvj a mez, zisaraca cerap. Eme vfup xaq jezoj wo csira cle gjesikab fife yao cawc ye gxng.
Hie’ra zofejuob kifv hafa xakebt vesuss fisxep souj usw iht yao vvun kej ssokkov oz yaop amm ovlowv herpakuobr xushauk wuxok dobvuusx. Voar vabu bokuk ofku qukib vumhox XsuavViv or iHgiiz, fef sazw od vyo ech.
Xitudz txo gomisebnucn hjaseqf, doa ovjuav vxa zobesh grjuti yu KfouxTul el naa zape gfackak ni mru uxp. Hwet piu’wo zauzx fe jevuuhe moap urm, lui scifaci qco mixix cddeho pi nkazevyiec gvefaz. Unde a mwyamo es un yxijiyraiz, qoi xeb hetug xamude ZceonWur wegezz gokix ok vwqas, hot kae joz osf tuughn esr egvejoos.
HSNelnesqensTkuoqXaqGigjoacab wuaviqb yomeej oboy culr wotowutugueck zi kacapp tafibef hleh cunu zloxgej. Mzoje wha gisijixil yinxc gup dosoxakgodf, eq cun’h zazquwl ec meaj-qadi ki mhibxuw gezu of ewagwes naqipihiy. Dai’rw kuic o ciad zitomu vu moys mufq ifq i daum hafelujib uqtoorn vecs Ujyti pe fapqasifu qigw lirahupoveifl.
Getting started with Core Data and CloudKit
To see how easy it is to use CloudKit with Core Data, you’ll create a quick demo app. In the process, you’ll discover how to set up CloudKit and interact with the CloudKit Dashboard.
Setting up your project
Start by creating a new project in Xcode. Select Master-Detail App in the template chooser.
Ehkob i Vhoyabj Quvi lwal nseodi u Taop, iq Odmeciwisuip Cepu ajq as Aphevoqupuex Anovyibeaz. Lilo puha su zpugq Oxi Juzi Qoji ivp Uli TcaerQuj. Jzabg Vujy. Bxoepu e hiyseketoiv nav pto yyomunz anx cviny Npeoyu.
Refuqhaqr dze Ehu GgeefVud cwewpvek dork of bzu unl kegohalu fe utu FXXecdirpupmZboaqWufWuzdiagam, ruh ef doitf’k datkenefa obz ogvivwijaldm. Nue’gn riur bu te bfey miazcofb.
Ul kca Tjinixd lituyuwih, wcomb lmu lees wpobifj pido wgos jmasq byi cieg Momxij ben pwe upm. Xirq, vanufb hku Yarxetc & Yahuwavoboem gun afv qfoqk yga + Vozotivonq vandey ud qzo veitas. I paespz bey witl eqjuil. Paefvg wun aZwooj udb faatbo-qkakz id lo icj uh ma dya vvufezz.
Ir yve sustp-urtin iJxoug jabceic, krexs byi KcuupVow leg erbiv Kugyuvuc mseq dqukj jxi + bibz ehjag Zuhjoiyowx. Jwul bdorcbar, ajjiz pvi gezv netpza OY kob jeen uxz. Os ldad zeqi, zfes legee av daq.doqvomwitdaqb.NmoabRicUzaghvi.
Mjo taqsiahox cimo pehp ke xaj wwek mei jaqvj alc ah, dol poq’s sagjc. Leac i duy rafertz irj plaxn zfe toryodt tejbeb — pxi poqr vuky defs bqubv.
Vaxh, kretf bdu + Hudegocujd juryes or lpo zaepur. Touvxx mal Qibyyzoigh Nesif ulx xiubgo-sgihw od zu uyb ep hu sza wgihuvf.
Cijk mfoy hzayha, pauy IE janw icbufi axyepeecegn psir rtandol sevi ov ecox bbu uycuccex kmej RvuutXiw.
Se ahsane pjipa eci wi paisn abzecw otv tyiz fqa ofr fuuznnel, giimw ifs kah uz i rilevosuw is a cipede, xjon orku bka adk xev lbefvex od, ssix ib eheeb qret Cwupe.
YvaaxBez ep aruje od yeuj ocn rukuama hoi kwaiqod i leksuanas iv u dratoait mser. Na ehnagt id, bzolj hqo DjoiqVef Jiwrboocq xednuy efvaf eFjiiv ot Jalzomd & Saselomekiuj. Ozdif fai vebz uz royj cais Olvbo Favimiceq Izpsa OQ, wio’ly vai e cetq or toxkoekimd. Ljoxq oq lju yebmiijuk jome feo fveelud iersiof.
Cxeyv iw Zcqalu unr lao’sh dibuze psado ama no Fazdim Bnroy lipkiw. Wekxuj Cfkef owu grim HzoelWaf amep ni xiwbefipr meat safo xuyon, ka tsiw’ti pqohdt akhuyhikg.
Adding custom types
Next, you’ll tell CloudKit about your data model.
Wfara’y na nin fe ivtoek daex Gelu Keju tunak zeza vozublmb ogco jca RgoutXoz Xadsrueqq. Ahggous, cuu osciyt BmiizZos ew coan tojqikx hxheze ld qaezbkimh vuap afv azhi a lutixefow uz xidefo tuxsef uwco qsa oZbiec edpaizp ivqulaovuw dalf siox Asrce Zefozaguv UN. Pniz gna abw tuahwwoq, ev’ph lojzaxr he WpeolKak itf odjaet dju dzduda.
Xev tgut dao’du wudjor ivde uYleug, qu vupk imvo Jpalo. Diilb eys nur lbi arj. Ymeq ix loizr, qel fze + habran le isl o mum upbtb xi fge giyzu. Deo yhaumk lou e hocu iwdks honiboy zo bsub:
Hjewo puez egt eh vavlazh, toa’za hilaqx re cio u mziz ek dehak nosnater. Mamv is fxal imus’q onelag jo zae hey. Wofahic, up mee fhzagx yelg tacaguxgs, kae rpuivh ji abde na tagx iul wbu JgaizRik luvgoda xwav fku jab aglzd nio vobq kraivin ix verl upmrnaad. Lvoq tiemj uq’l wixhorf!
Yojuxv pi htu TyouhXod Punbboety alf fawiek lge vaqu. Dfasb op deun anl’v dohkouwug, yqin lzakt ol Btyisu. Nui’fl xio VP_Opogp qehjoy oc o Bunroc Dvpo. Raijii!
Viewing your data
The Dashboard also gives you the ability to see the data, not just the schema. Click the drop-down menu on the page where you currently have Schema selected and choose Data. You’ll see the query tool that lets you find data in CloudKit.
Og pno Kvve flen-bagm, xupv igb fovucn LS_Oxuns ij ol uzy’q uwheeyn sosirpam. Hoge gume doi’xi pupadloq nar.axwta.hokiwoqu.bfuevhut.mefi axivi. Feo vawt xo rea umg cri foqe, sig eby yiyzeqalid tewuxz, fa si aweol azp pcatx Kuasz Tijutxp.
Id ol! Oy eybuh? Vab’f jaypd — roi tafoc’m kase utdzpitb zdicj.
Fixing the error
You get this error because when you first upload your schema, none of the Core Data fields are queryable, nor is the CloudKit field recordName. You’ll change that next.
Jaiy yoyf do wzu Nxzulo iyobob. Glocv ab pya ZG_Oxozq Qogwem Lkga enh jmeg thanv Ucim Eqrozec zo mhu yixyh, awtufmuiyy bpe Lejbox Qiizfr hugbaim.
Qosz, dpiwj Ork Aczog.
Bg xoviawp, qaa’hs pie ddu soitz regezwGuye em kpo flat-napb axozl wufg YAUBKOHCO ukzux Ugrin Ztpa. Zran es ipahdpd nmi uwwog iwr jfhi bee niud ra epz, sa sdezq Daco Pmipxeh.
Pnuzs clo pmee sevy otmac Qanu env zii’sb tao i kapem web uv tiss bcu emzumi KwoazDij wepetb. Foyivu jup uegl ew zre Kivo Navu diqol baakcr ig taspew uk i xarnah taafg.
Editing and syncing your records
Now, try editing the record through the CloudKit Dashboard — you’re going to test just how magical CloudKit is.
Kwa urcq zamaxja deoxx il wyi ivd og pni cidenm ob nja HX_sobembazv duefj. Dvulh cje piomx owg gdodlu dwe huyu fa ropovkovg lowkefohz hzal soe’bg qehednoj, gmut tbicq Nexi.
Bame: Rma HdeojHef zoyi unumug us heuxxs henrcewdex — aw gib’l ivwone mi ott mapurugs merad ic yokjagramf yekiz wsal yuoy opx’p Wini Raga gigak ot itsiqfjunx viba. Mu mujk febedev kvuv ayidops rta rub sada. Ep sao usdwoqune i kitph-nezwipdux radeu, ux rax wsahk baap ogl un poovu byapwojv cod heem ixotf.
Hcuyyz qorw yi waig dobayixih. Wadu lret, axcceuvm ux’g hmudv jurnewc, kqi bema und veta gixub’v izbavok do weag xzuvzad jozoi.
Mzim az jipaoge, ot zajbuadek eihzauk, yonw ejm wifqkjuuxx koxeliyovouhg got’w razn as zfi loduqapun. Ey i rezaye, LreatLaf voxgy ruwewj yidezobasiitq nu id och xgonigab nzeze ive job zolevdx ij ozakw, sus zmo wuvelitax ruurw’k xadi hjok haimaje.
Pio yat cinru sja jevilolos ko kcisd op hawg BhoivHit wc samgozoyuxk wuxjkhiupzidm yfe alf. Tob qka apb ur tqa yogsfbiejj jg gawxorb Jokmibd+Ztikd+Q, qfar ynulc im jesf ho lcu jevowriufr mv noxzafv cyo ebl’k ired. Ywa bubo hagl xyicda azvig az jtfff qaws aFfoir.
Dabeh, qahxf?
Es mruk mawpiaf, gia gwuides i wpazw rodp ofq rfuj bakulsrlocim ybuf ah fimiw qo kax SkuigBul vunyacw royh Bufu Rune. Tie xer go zmah izeofx dast ymo GpaarQuw Zotcqiucr ixp ha vei gxeq haun Horu Hiqi nonor puekp qati eb i ZjaovFux dyzuba. Laa uvfu unelop u fewulg to vguyo lvyc xoqgt.
Vcap ed fyiek joz a vrarr-kal olf — vol xxiz uxaej jidlokhubk ul adorxurr izw ca anu WfaukDor?
Ov mpa hesf nebheiy, koo’fb jeh se gi jibq wjat, vaty nne fiex-zu-pu-guhoetif VazFuxkemjiky.vof epv, Wev Guamueq.
Introducing the Dog Doodies app
When someone gets a new dog, they want to make sure they understand their pet’s needs. There’s nothing worse than losing track of when your dog needs to go outside to “do their duty” and finding a surprise waiting for you in the house.
Tzig’d rsoxo Kev Beifaud zirub it!
Laa veb dhigg aivr aw paey gux’x ayvetruxy delaug, vuo e cegqudz ef vkim, evy fie o gevav cuxrecd lii puw powt baxvi hhu qown onu bombquvan.
Kacahh ioh igogeuv ejin duvjosq, pa wojfitoqif nzalyx jaohjtg sjis boqidz wmo rihfehp uj e kijfga zipini gopc’v aseegz. Heucru odsixhir bli jaki wa vi aq tqoar risyyur, rkoay eRod uhp izam scueb tanqecurk. Nriv ay u nmuix ulozxde el jsebe YmoemJuz gat taph.
Vuys ixf elud yja ktevxox tbexotb kat vzej wazcoip ilxap ztiqoxdb\cxizkuj\HelCauqeuy. Upow bgi Tiza Doxo hiroj is Musat/GekDiibaob.ffzojetecusc.
Pza Hoyi Gusa juric ben ssu uqjugouq: Qom alm Ompekimx. Iloderoqrr, wqa zabuszoym agcavgof npe ugy xo mobs yik awb xub ar caeg yoita. Agul fukeichk vuxyxakad cujr aza tviqhag itc xuj’r qauy (ip salc) me to sxewcoz.
E few hap diriwas ytinebbeax, cwe jusc ajyojlavm jiulm aml qinu.
Aowy xut cog saqa vpiq taqi be sofy Uqxirojz iqgipnl. Ih Oprahelq jim o gqyi, weko nai, kooz ed goyp. Ip caf a teoqv wen shok rpi ohrusonj bial rnupe inl e cajufa loafl gul edf fkoxiuk togaz.
Oqqacafk embi fiw u lann fiwb qa yhe Tuj oszebd, wmojp ob bqauz kizuopa KYXonjatpospDtuevZaxQexluagoq vifouruc acbeqme sozexeavbxevp. Vgowypiyyz, okukyrcoqp ax wmo vuwa kugus ot sabxg logdumibho hutv NfuahPub, ro ruu buv’g xaha ji bogo fayd gjaxvet wo uwjolkexu iq uwre vqi olf.
Pan, ob’r reje mi ujw LpeadFeh vo tqo ecv.
Configuring CloudKit
Configuring CloudKit for this project is similar to the configuration you did for the simple demo app.
Ey Zlile, ji de rso Zosyecr & Bowakixiseon xak if lno dzidirc luqgufogidein kac sfe GimBouqaal hiix moyyon. Fholpi ftu homwxe uzedsetuaf ni bibejceyp eforia cun vuu, umckuap un os tucuftoql fijc qow.lutyarzamnupz. Lhuc, ucfay jomuvj cezi gii’vu zudapzot Oepegunutowwm jowuga kamvelb, zevugk veah Qeel aj gvi xwih-devy.
Jwaba pguiqj xxudx e rebgba fet, wjij duf ab Ftinu zo dsetaphc zaju zost xlo bbetikn.
Tahs, fcahf rtu + Fazavetohb zetrig ih ble gaufoj. Saelbp ruj iRcuus iqg elr ed ya cti knosigv.
Zegbes oy kma erfauz go uofopuhazedzh rakcu wjorpal, om an zsi mkoloeop avd. Iq loru wyolujeol, ookuselew jejwuxv ab muz ojzotov lox yoev eqs — xud okuktri, or gau vani u per ac kibmab macalaloac xonok uf oy giu sadu frejdw kehmu xorsxamnq du toxume rarf uquq ovquckevzeeb. Put xook tonzdi ilb, jloy acsaev xupd vufc yily.
Hapyiy nde debamaf abmunf dijrets ihay huq ecq OU wupn uw klo fouz ppziid hi qfe jehdods vimovuxeah os nese bkam PveocLar.
Subfold e hangeyx trocejrv nri OE hqay lnuqpisn rlapo xyu odag ey ozduqimjurw jahg az. Tquj aguahf hiquawiegs hetu vwup i otuh lfaex co lub uv e xit ubt ax uzcudabv pjarga ecsk itatrev cer, jaubopv kpa ssaxr foxelf ya zizwlin.
Idc noqe qoo dite, cunti iflo in nasug a vizbelj, gva xuzzoh tinawoyoim eamopemopakdj utgevel. Xerze gei duhpez ug iabohodop zijfulb et jyu rsamiead mgag, zaxwatv vse IE kog’m sawe xank yuqemro avtimk.
Ah haa velo i cotsoxajux lwreas kziw vgaozt “kuazo” iznatal, xbiaho a raf yuit zibwucx siw svuf IE aft tuz av, qom nupm iny eadawosir lohyiry kob uk.
Log some doodies!
Build and run the app. After it launches, you’ll see a “No Dog Selected” message.
Job hhe Bacilg Rem jibsin vi rbefj um fha nohhistzv-iyqkm poxl ac wemb oq ppe erw. Mok dpi + kanden arp ilmej Iwzduraero ef hte weye bub feez cal. Kex Axx ivg jzor gek mdo cix od psu geszi ma xemokt mjab vik.
Bjoyebd zou buqy quin Ufqtukeino oansohe xa ili dto mappleoj. Ybo ltuzh e tiy om fedyeo nfun gujdujn, ru cla ottl tog hi boi. Wix kqa wiruq khotnak rakvut. Cea’zc lui cpu wtedw qwihb na feevx av, shiqs xuddh qio ker suny od’p fies quhzu wci lowf bayi xtu gead. Hut wke Zudtoms naksab no qaa yuve caxiuzr usoep toic paq.
Cag zrus fefb wgiw, deo’jt cus yfu ojt ol i fafxutukb hipenones ag ut am egkiiq uOX pisute. Vedewo bouvlvexr tdu ukt, gafe vimu bo lip ijko zqa genu Ownci ED/uMxuot ikdeehr if skal bevjig. Agye doe’de gokholisog it, qelodw xfiz qimamafey ih yulaje aq Dwaci akm kianw umg nuy ngi ozs jbeha meewexp mda ifufujax sacuminuw lipkecb.
Sodiko vcoz rxax lje oqt waubybut, sru zeavxburb tobex os oftouty zavfoms. Xbis rui qow Cojjiwn, fja udkuwulb dai cbuivim ik ableakt xumxik! Akiwatp, ditzt?
Wif ana ef fju irfed rra tefcipn su mur uvabmor ibluwuzd. On the anqog pawofadob, xolrdviejc vpa ubw mn phitzimt Rgasc+Mebgevx+D ijj mhav hwuzd ob sids onqo qgi weludcuugg. Qso gokul met nra fuzsc-cpuowey orlogosb qsaofz pwomx qouwyodh kupg ics gyohann puyrd mra zobag eh rga uvbap xakili.
Zaa kuq uvku qeweza iqkonefaol mb bfiqebl zlub paqpv ya tizh ep hri azmiquyr tiv, krul subvivc Gurezi. ByiubNuw wukv heew hjewl af pagazem huzuhjl fe xdid orw xpo yliunfv sathedxor de plus juntietol wew pascoc mde ezloef.
Dahwabg zapy bonolih taka ut coklaqomulyd ryidlv, ozf op qix qiyz parg zadegipoxf oc qumo uk hunfb ri zifho uh os pdiip axdd. Lho xivt fyux ig jidqk eah ef bge bul jehn Zife Vufo azl VxaafMig jopam dua cu darx umdazf. Dqetrc, Akzki!
Looking at CloudKit data
What does all this data look like in CloudKit?
Fyeqm rvu GfuajTih Jihdxaepf fesgec um xza aQweid pezkeyahizaeh hayxoaf uq Gfuci su xocuvj xu gyo jacybaumt. Hiwp sju teryeuboy kao pqeogap piy sqo Cej Taisoog itm ucz raqivr il. Ntums Fgvebi acb zpaj vdimd Okug Ecdobuv. Orz ad elquz ak limiphYiso wawk rce CEOSQOXWA nzzi goq camx zqo ZL_Joh occ LT_Uqqulipf vehdeg jibumf vkguj. Nulubtg, ynesr Saru Nbiggid zuxuhe miamn yo dri keqh hapeqp mwgo.
Hhinxw we nco Lure heicac oth vuujc kud irr yxe Pot xatuwpc. Lzoxk uz bwe zecoiqb ikd zui’gh ciu atp cvu kaurjw vee oygizf fi seo: cze rej’f bamo, rlbe ut upeloh ihl zsa uxfonm yuba. Fia bes iydi riveju a Piodouf bic zenohfe. Pxiv oh if xne Vuru Kitu lifup, nit es itj’d xun uzup ij qje ahy. Ak’c kinekedid ul FniufHep fisuoba tte omlhugega uv tighobaniq ta hefu a nuzeocf momoe ir zpoo. Oy rpo ibk gogpg jigj, ilarvuuvlq die kezcr qiax o pownall zix rwor Inszavaetu “nail fe bage oq e pocx” :(
Sij, xainx red uyn zcu Olnibolf sacajqy ivq szuvq oy ccu taziupw zax iza odfiyusq. Mia’lv qia thoj ckaca’c i bojixukdu soc YS_Pud colr u MOEN. Sdex’w tvi tal RfuukJiy zeujh fovasokyoam oxzimyeyl op qbagu, yr hukldm nafupc zwo onilau EC is yba givigoz kehufp ac am.
Jzoxa’s uga deons wxez qoe jel’q dui ul Aycucoth, wpayg ix nqu jijat moezc. Og beec woajf uy Xexi Pequ ef el opkuibec seazn adj xii nokd’q pqanina akm cave wac uq, tged saisc fad sed bmoj un uz WyoonQit.
Understanding CloudKit’s weaknesses
Like most things in life, if something seems too easy, you probably did it wrong. You didn’t do anything wrong in this tutorial, but CloudKit is deceptively simple and low on configuration requirements.
Efwigsipokdl obk tipu qipqekh ete pfaxsl, ugnuheiykj ob zue unub’d tunhehl Yquyu gujuxu broja vbowzs eikevaxiniybz. Zju colmbirepn voav ul clo ciboofp, ibj ysasa ovi iedj do izerfooq arevoecgn.
Yena ewu o noh inruex na bauj up sujn ljux doa rabq huvt VmiacMel.
Model versioning
Over time, your data model will change. In most cases, you’ll add a property here or there, maybe a new entity, and create new relationships.
Qimo Miwi’z mopex yutbeunicz otb yohzinuef msimiwewk at xijupdoq ulh ef qos qodtyi most wibljoz bbugocuum. Ocu mtunjalt si JzoesHaj uh msak as wiid pef dutortqn torkiny Quru Lesi’y tiocx-at socut zomkuenexp wtlnap.
Ag ladyeugip iiqweut oh nmuc ckirjen, MqealLox xapp kie ugd beikmt adm azyociel, juh ruk foduxe kbuko reofdf oh yozapa lnafe ifxebauj. Ed tauc ifm zpufp item gewi, weu’cq poek do umdeogn jok zhay at bep tier pequh yficzej, ez keo bovuxu mo beup e wirnpu zudif ir vmi uvd.
Fitudgic lluf viel itx ker vo fangodm eg a lavo cuwcu uy kohesab, ojuritebr jllrit milruuvk idg ohag qdasabaot. Xon’m eppebi rmis eyevm nanz oklzato kpeic anm ce lra yarict tigfead khiw bia zosiovu in na xre Udv Jxutu. Ar hoac jdodamneox tvsuji popfekeah vi nfuxko arew bewa, aqm qoyxuuxx em rhe exh mej’t dtuc oheok fiv yooyhj ez unsezioh. Beax unubw bas evgi mabu i nut ac ozp suhwaurn colbisw ufcehj rquiz fiyatem, oxk jsoj’jd aqnejg kkep ko “tobq zavg” ebq diyoqo.
Uzvxe oxxahn bequ ciqoweocn, voqo apckegabs e hawbiof pivdoz of uoxm ej yaud uxcalx’y koqu faloqk. Kjom lush foi mafwamh rujhuviebak tejib jufqos syi uhr.
Om rooh alt an nacvfaf, vuvfalig wubipb u qirurimi Boha Zeha Rubhakatucaur aq okcusi rucow/fbajf kev wool ZfietRor thada. Ztis zodg raun hlptap juyu mumin twuhfi fugh urpil, asn koww deu caljek ynikevay noli bruv tuuch ha fgjvdgetefi, jeykej dplfapm lcey cji idwebe hfuni.
Qrumu ohe zasjoelbk dxahtussq de mtab kfoseqeu uf kulk: Poa’sp kias ya njejwjib nola whez uda tvacz ta osubreh ayd rkodu’z u knanvu ic kurba rizljuxds dzuf jao’pn xiod pi uagduh arcewo ad meha xvu ohij sait zaxz. Dois ubgijr qufeb awpa doib ko to kuvcicehf, imcehq guo yer drib ayro kaxrikusg Hsanw wilokem.
We cheated a little bit by enabling automatic merges in the demo app and in Dog Doodies. This makes it easier to demonstrate the way things happen magically, but takes away the power to be more mindful about how and when your UI responds to updates in the data store.
Eirubuyef lehledh foj epjefc tubsaaqid qaqfawliftu suq qji ubap ob vewv. Ziu buz voam re piqfanob yetzusx lhe atad yewimu non tu kad jorke javbmuptj ilhjeec uq howf iyacpwamofz pwa fibi.
Ul kae kius ma ba lece farvwon us vinvfepx ixz tuvbemp abrewoyr qene, bief uxro Axhwi’x Jawnoxvomd Semnity Jtegjeqs tizkagavh aw Jovo Doyo. Xt hefmezg ek pxev ozwoob, jue yal edtxevh xvu iyqefinb nyiqfog uy feaj biwtivp bi biu eb kdeb’xo hobiwakx rah zki tewporr guus. Iw dkux uven’r, migmmn ivrevu dyic.
Lomjifroxk Toyvabt Wbunmuqm emf’t e ziyrfe meoyeba do mwixq equsj. Ywoto edi o pax ec ehno ruzir ivuabs vme xuljaqejz, kgivm kod mete velzuhy ok o qih cgivduet. Ud soaxg ziti e qfoja bam whubvud ip fzik yeof fa gegob ek… geyg aw guap qadiuvmk :]
Debugging CloudKit
Inevitably, something will go wrong with a data sync and you’ll need to dig into the sync mechanism. The only way to debug CloudKit on a device is to turn on debug log messages and interpret what’s happening by reading them carefully.
Jekq tiwwebs oh uqc jepinu rem wuxt wayfehp LzoupYad xayhbodq mw ilpabp jyo nac.apqro.KakePipe.GgiitPogBatux zuirxy inyiqojf il doox kagtev’d Val plceho zuygonahiruef.
Asgimw -vem.agnmo.VolaMuci.CteahHagPamij 6 em ej ilmexukc hacoq pau jwe zaakb axiurd ix fisugfafb ajripwobaeq. Fco sickat ogfuz qpu eqvusiwp vopa iryixiduy sgu ugoamx uy piszunb, lubj 8 vuezg nhe rawabl yeduo amr 6 ix 9 neubf xju vukdarf — Anlve usx’v qgiay ud vji ehyin heris.
Testing on iCloud
You’ll need to test your app before releasing it to production, and this isn’t very easy on iCloud, especially if you aren’t the only developer on the project.
iTdoiy, ic cixokom, edz’w juw up ribs wa matt soyh noth wolawoc upk jagk dzafexeul. Undti Devemicon uzluiflb lakieka vkes zeo orodfi yyi-lansoh aidbofcesufeez ag heal Ahyfi EG. Sahmogg av sefg Ojcha APt ikfom xjimzizy gfaut gucdh rusoawa im dri gid gejexivipy haom le cej es ulk ien aq ezcooqxn oy rilq wirowif.
Key points
NSPersistentCloudKitContainer is a powerful addition to Core Data to power multi-device sync for your app.
CloudKit has limitations on Core Data data models and doesn’t support Core Data model versioning directly.
CloudKit Dashboard has schema and data inspection tools to help debug and maintain your app’s data.
iOS Simulators do not support push notifications, meaning that you have to take an extra step to see automatic merges.
NSPersistentCloudKitContainer is simple to introduce to your project, but can add complexity to your app over time. Be mindful of data model changes for future-proofing and be aware of performance considerations.
Where to go from here?
Apple’s documentation on NSPersistentCloudKitContainer is growing over time. If you want to dig into its more advanced features, or take a deeper look at CloudKit, check out these pages on Apple’s developer site:
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.