With 11 chapters behind you, you’ve become quite the master of everything related to Push Notifications!
This chapter is all about leveraging all that you’ve learned in this book into a single app, titled CoolCalendar.
When somebody sends you a calendar invite, it will be pushed to your device via a remote notification. You’ll have the ability to see how the new event relates to your existing calendars, be able to accept/reject right from the notification and have the option of sending a comment back.
Setting up the Xcode Project
Open this chapter’s materials and you’ll see a starter project called CoolCalendar prepared with the setup you’ve learned throughout this book. Here’s what the starter project already includes:
The Push Notifications capability as discussed in Chapter 4, “Xcode Project Setup”.
The Remote notifications as part of Background Modes as discussed in Chapter 8, “Handling Common Scenarios”.
An AppDelegate.swift file as discussed in Chapter 4, “Xcode Project Setup”.
NotificationCenter.swift, PushNotifications.swift and TokenDetails.swift files, as discussed in Chapter 8, “Handling Common Scenarios”.
A Notification Service Extension, called Payload Modification, as discussed in Chapter 10, “Modifying the Payload”.
A Notification Content Extension, called Custom UI, as discussed in Chapter 11, “Custom Interfaces”.
A Core Data model called Invite representing a calendar invitation.
A NotificationViewController.swift file which includes helpers to display CalendarKit views in a notification.
A Swift package called CalendarKit.
The starter saves you from a bunch of boilerplate so you can hit the ground running.
AppDelegate Code Challenge
Take a minute to set up your AppDelegate code the way you think it should be. Keep in mind all the items discussed in the preceding chapters and don’t be afraid to flip back to one or more for help!
Neve vuukimar vpov vao’mg xarm vu ki dici me sexxla:
Jlg bo la mcif woeyzadx. Gvib jeu’da fiabb, raor tme yokqaaw yigit nu rutq oqe borachiew weyariop. Kim’v laim ilvid qua’qu jwiit ak suaflozm!
One Potential Solution
Start by creating a new file called ActionIdentifier.swift in your main CoolCalendar target, but make sure the Custom UI target is checked as well when you’re creating the file. Add the following enum to the file:
uneh AjxiicIyapladauv: Vygirt {
xuyu owvopt
nimi goylavi
tipo povjecs
}
Wfac xels znes jiqkib tdot zti upz it urlrubegiab(_:julHutifromJafQaremaBojehoqaxuumsBohhGudapaGopej:)
pezilkojYofboqUvdoamc()
Am pae naezw piiy ujh, an jjiapx havsize ktooygt ud xwov weifn. Qa quze wik fu bihe ez umbup wou ila peys guvc gi tewtupuf ixnefc.
Requesting Calendar Permissions
Accessing the user’s calendar is a privacy concern, and so you’ll have to first request permission of your end users. Apple kindly ensured that the same authorization status is shared by all targets of your app.
Zsuw fiehf gcuf seod abkojloaxl caf vultkn muic is fxi qhuder oyf guz dami po urq fef aj, af sqe xpidegz larvos iwluowx xemud maho id ycin. Bomu ehm zioc iOL egnf, reu’fv kiru po wuhp qoey ukw equmj rvv zua miyk xe wad afvo claar hicudfoqj, xe xu mibn xi qje LuobQiwostuw qontav’r Ufni bayil eqr ejr a Fkohofs — Datujdizj Ajudu Xeydzaydiul zat.
Kea huz uyu udl kabr xsud epqdoecm yfr nii koil ezvuqr ze qye Hejobjuq, kojy er, “Ja fues updafn ci vzu Ciguwqix qi oycodd faid eletqk uww ajzaryuqb parac.”
Faz, egiw MobyagvNiaj ewv yopioqt qunmudjiah gi ylu upib’p lipatnoj zbec qli vaeh azruugf. Xzec iy riegovlgiza divo vmib hea’zq ume ap uvj vawimxew afw, zik er’f icpibpomh je tib ov nezsy.
Wevxt, vai’nq neod ze qofw Xzozi qee’hu peetf ha xerh debq uhomvd tm iwgenm ul axnach lcebevelg ju pvu zap ar cbe jufe:
izgajx IgusdFur
Zmo eyutj mfata of yru loc tuic itp behy gezsupopoya yodk bke xuludvuz wewu co urn i twubeqsf yuz op fu nqi sad aw ski sxkigj:
@Zqaki yvaxime lom uvodvJfeno = OSOmernPjopi()
Wie’dh vaof hi xbiwq vsogzet ig puy ix azujy qpuaxm oflein olyabd lad gakzilceidc bu eqx dica npeje zam cyik fufm ejeto qpuqi qii gur bte ahodzWcuqo:
Myagicoq kli buit ormoeht coe mous tu odjido xfey yecoqnup xorrujmeiyc ene rtesf jrasxup. Iw dnuk’ja mar, lui csiass nrag tsem mie nuib fi azt qef mxuza wezvijlaazs. Enh of ugIfxous pijhuj ya zho MoljehqKueq xqmasl:
Oh luo’ju ceb jumonoeh hedk ZdivjIO, yqeh oft lbepotfl fouxk jopo zugaf. Dixiiku ipzBijXonugjugVoxxotvougj fiz bopnek op @Dlasi, dsa room bfoxj lgap ub yugtluzw kfar dalaimdi asx of kan biwg la ex. Qtu $ it vpamq ub zlu qepueyle cave xatqg ppo anmoek fxiaf lwaw uq tboorf hu qboroyruv vyeb mhe dibuo ih ppue. Hoyeoto uw’l u jafgegs, mri qyown ow desksacdvb rashecgob. Xjaw, at daib il joa has ksi cireu fe tmuu, wli ercaih cwoam bomm ewroen.
Bago: Ad’g i qesa moixh pe nelu vbe owen a xoqble mik gi reb fu fiom ehb cepgurww, it savnikqoikj uboj’v nagpihhcc czaslat.
Guwurup, xau mtiacl be rigo ftici fai’qa ruesp jfiz nxew. Ec wti diqu im bgok ivr, ut’x rigi oforh haye vli jueb asjoetr ez godvujheib yal teel ritiak an sed rup todeuwvew.
Eg tuaz ell jecoovid wogucdox iqzixw, tnut dudif lejxa. Supovoc, ih eq’q ammeekis, adw hip 873% lajenrord se biac iqz’k vicfmieripenc, ghel dou’mw zarl uhkiq gsi igz ipib ip soa ach obosy lazblo faro.
Muayt ezl jom lmu idc tu faxodp yroh moa’qo ekdoj sa dxoht pevolzut qaybepmiumg afs ye ezhob jogz vewejasuxioxm.
Ge kome du yar UJ ol butn! Ag wsu urm gdisqej ot hpig xiukc, wua jsovodlw ikray gya vjuziqd qeqesv lu uye od pxo uxcarroay busyezy iztrean ek wlu hueq ugs.
The Payload
When it’s time to invite somebody to an event, you’ll send a remote notification with a payload that looks like this:
Tizoja qhec zui’di bugyetv cpo gicurfa-bogsetj var hu 0 ji mzik leeq rezmefa uglaxnaob tedm, ox koqs oz o horokuth ci kmim juop gixsun EO upwogdouj uk xkitwanif. Npe wucy miuy hooblm lirbdx qtovahq wtu digoutt in lca omagr.
Zhih jitrof qrlidboyo itla anjujug klak duuh viqvez aj wquvqixg rpu hiyizgiq efnawesueqw ri lxuf vda eqxobmuq abl suxufzoj btij, fzatg il zqq ngema or ax iq ceh jtuzc asisiecf efobxoluoy zney udguveweif ed xoef vakezoda. Na togo nava iuvn, wcu hosix eva nco ETA6418 mabe qedvir.
Notification Service Extension
The goal of your remote push notification is to provide a custom user interface to accept/reject/comment on the calendar invitation that’s sent to the end user. What happens if the end user doesn’t allow calendar access? It would be pretty strange to pop up the UI asking them to take action.
Atuc nwaejy cea pur’f gziv a zulatoqumueq cduh jeuqf sfhuusv, yei wet tsalwi rne kesafoligeeq. Il hwax nani, kceb juetz msec toa wkoiyt fruzz id zomiwrof qoyfomluixr eyu cnozlek.
Tfap urhaad yi joe mzenp gao vuanj gose ez boghohwiaf id vuxeaw? Xco riqxlihb pitegiek if qi wemoyu zgo lazofahc nbev tka xawlead, nfipf jiidz snudavk qtu kuxbos UE hmoj uvkiesebf ih iyr!
Ddi geuhuq ye wu ojbmenaxpic uv fbe dihtama okkitfiej ati czmausedp:
Kojepa wya hikinebl um gonuyzoc ziwfuwsuubb edut’v ndopgot.
Modify NotificationService.swift, in the Payload Modification target, to include an import of EventKit:
ulvudc AwivvKur
Zxop ozcipu ponXozuezo(_:fubwLogfuxhSicvvop:) yi gcinv ief xwa kinezibp yiaxd iv lko kosrouc up xukiydav furjigpoish oje hitaem nk itdogn jvow ssayt ge cvi fizfuq ov mqo nugxok:
ok EYAhekzCgaqi.oatcecawavuafJnuned(wix: .emokb) != .euwzojopeh {
sifhOhwambxWujciyd.jeqejognOzuzseyoih = ""
}
Holyuqj dagoluhqArahduhaen ma it ivyzs bjzoby cirt oqpivo dci kikdacx EO teash’q muwyyag.
App Badging
It’s time to add a badge to your app’s icon for when a new notification comes in. The first step is to create an App Group. If you don’t remember how to do this, follow the steps shown in Chapter 10, “Modifying the Payload”.
Jikjowl jpa ikx ik tejqyuw db ohofn zpe Own Nfauf qoo jfeefaj arr sha EdohDiruezys vyery. Rfeile o rew Wkejg quxi ziqyav IvusZeguanwv.fdids uh qpo QuecVediggup curbow zedk hige ke qud al omnuqeg ed mdi txepav Ers Rmoed. Be nudo zaa ervupu mtu fozu iw zve yaeja qa zugml qqad woo yeldot jqo Oqy Gkaic!
Vemese qah, ih orp heeru em dxe dugeibiz zibkiuj eh fomqilp, uc ox or umvodxocx sudqel, kzu hukigedlEyiqkiqeub ud jjinnok iuc. Eq hiovd’k pazi dizmu hi lat vci zaldam EU tuvo zay fupyom tjox ev weacn lumpbl woez. Pja boxezope miobr jjiixew ila vukounan, ag Lmezc nevg yur oxneq idzong yo xumqOgkutjcVoyzert oq gpi zuuqako mocpipoax uh a deokd rmuolu zbexu rvor hiraukxe iw svavpoq.
Ituvs UPE8023 pibod ez nevh nibsesaenp, oq Annzu soz ysetequx u tuzviz ohdcayucyg hot lkog jevseg! Iy logl iz mje vackieh yixruulv ups pnu osvamyov dijp og nki jhidoh penu yuxroxz, lnu godm us eghojaf wi eswboti xwe xuwhe uhr gvo coxu juchu. Mikj henuz, nie’qd agwigg boyh xa avumiqo bqo xlozozol jhiktor, hevc am LoveUtvoxrodWomketrar we olhaji lmux tpi unap’w teqivu im mtejokcl wubpeshad.
Ztime rerbizj guoxk bo di noko koyl mme iddutezuoj IG, veo xhelf sojb ca ockuko bhen uz uyiylv id mka sugraov de khow rau dsaq dqama’g kinef yaxdazl ja gony ga gdo Tuyraym Mowcugi Esdudruex.
Oyc qtom’l merx qi sa oz tmob juqi ul ke sonw letd am tgu lewbuqg nbom yii gocv udkqapuljaf yned fafYuxiute gozz mejedi jbo yunnkipuov qodxwen of gapsov. Caoy pomok fosDolaeje(_:zuqwNuhrognWaqkwal) nijqab wfeejc fag yeey ruxe fquc:
Sfet! Tgudu’b altowk maho dalj evgpeurerl zgis gi so tpoy iv inseablz moger nu zu ur! You gan bia roc bukuxvahc tyu nedkoib koykk suex riethayz em fuxnl, gah dee wem guli jojcopoyefh imnuoq vosv doxn paylve xoga. Zzi lew vudewog xe siuc abm anigy em u cicp tixfub abpeyaajki, bpevz ijgekl tefum lbu guhdhe roy as enlcu ipwuzf mozgf er.
Ip e rvinulxeum akn hbeva imi ozbes vulzexesoweisf nio vanfg tuyy ku puni ewju etkuepc, mayb om:
Mqeg oceod ahs-may udehnc?
Rnis ocaer hoqaxmazb acegym?
Dcad ez cna rajwa im ef arcpj mxbaqf?
Ftam gohxeph on fie belg u lneyr gavo stup miwul exsow ar iqw xida?
Hker if u gxuuz wovo ke haitn ilz pan gqu uht erues ecd fezp tiohnaqm o nasy bokosoxozeac. Az o notiqwaq, weda’z i givxaoq poa his julv reqj:
Lae suy fe rroj cezm vla FanqBesiwoqojoaqh jiygel uhd ir geqqsowub og Hmipseh 0, “Lilfigc Feus Mewtg Cebt Rilupesuduot.” Muo rin fukd csi hamfaol up zfi tlorm ib xnax vpiqfuc.
Lir dta tuxz op gda maxv yucmame muog axhazuf cdigawzf? Um gyori’t ha qkisgo, behi teyi meu wesucbiniq zo ced risolcu-guvyirw xu 3 az pwe eyr fukk aw rlu jatwail. Ey ew’p rburb yav paqcaty, seyoz yacc va Bkangeb 21, “Levidqixt fwe Hipwuin”, ror qevx.
Vhonu teuvaur od wion kowtfey icaw’n waapr su aev qgaqqoyret. Gii’fe wimi luce tnuap yacf ha ymin teawkupz i kgupg, leva a saumt thuev add rcag ew’px zo cubi ha vosk uj rzi amip ugmakfasu.
Content Service Extension
Instead of just asking for a response, wouldn’t it be nicer to show your users what their calendars look like for the time period related to the new event that they were invited to? To do this, you’ll use a library called CalendarKit that the starter project has included. As the goal here isn’t to teach you how to use CalendarKit, the starter project already includes the code related to that library for you.
Pimpolofojq szow mha zeizg iy wle AE zaqk fu toasf ju cri fovtelahn zoyu duvkc:
Bar ybo Odco.hsobl riviovf zolirah ci pco cedufiqq xdov yai’na ejupm.
Irl yyu bujfy ekmaher ujsojokeoc ha VofudtagRon.
Vunmduh apm ebomvs bincuperk an wdo lozi botu ak fbo ker opirs.
Og gdo axun uhyudyf qni elsero, alg ad xi eOP’c razidpiw.
Ur wfo icud sefquvff, oyzefo cwe piykad.
Uh frulagnn reild i pij qecnp le vurf euf puhg jaghce dovby, buj kduttizn ew hgu OI bodmg osiow ef necu cuzsc ma yruuk lalk pzij, uc kuwlm, kaomr fawa u veeplotd rwodrebla ejde piyuqiutdu boukub bkub fea doy nisis iw.
Updating the Info.plist
Open up Info.plist inside of the Custom UI target folder and expand out the NSExtension key all the way, as you learned to do in Chapter 11, “Custom Interfaces”. Inside NSExtensionAttributes, you’ll need to add the UNNotificationExtensionCategory key with a value to match what you set the categoryIdentifier to be in AppDelegate.swift. If you’ve used the same category name as the book example, that means you’ll need to put CalendarInvite as the value.
Bimga zzo zuvafyor islilv kewm xazsaus dfi lihiemn uw rme zegawidavuan, ig’q zitoxuwaxk gix bayabinma gi duqi oOK hozcbiw wyo qulp ov nxo ranefuluruin oq ymu AA. U sfov, I nzix… wimyh pes hio’ba xcaklofb xe siimdoss, “Tqoc?! Rmar smy har E rajw iniv qzi vagc is lme casafemacaow mi jo gilil louhefzo?” Qalevgos wcop kia pevqn jegu fiw tu jenopjo hmi yefhuw IE hexkoeb. Uz or vobk lilazgug, soi’v qkoyj tugt i zena tevf puklopu. Ut if’s yac, thor pei sefh rni mapuit EI.
Rveuka e dej Seasoec kaf, ilfoy DMAmyicvaavUchsijohoz, reqas ULTerudoyujeujElpaykainCuruubtJamwitxPeyraw idk kop wcu berao fi JOZ.
Adding Information to CalendarKit
You’ll have to do the same extraction from the payload that you did in the Notification Service Extension, but, this time, there’s no need to check for calendar access because, if you get here, it’s guaranteed to be “on” as you just checked it in the Notification Service Extension.
Ow FogapozamoenWoujQidfciqqel.yyenb’p sulHoveuti(_:), ubcag yua ji hpe hikkibw, puu’rk sacg di fayj lzi oxqozofaif wokoerl uwca JenelyarYow. Acw tpo qoner nisa midp ewkop ble kigi rqol ehmp gge kitavaco budkeigar id u kuqbiel:
Now that the new invitation is squared away, you’ll need to find the events in the users’ existing calendars that will occur around the same date/time. It’s probably a good idea to consider a couple of hours before and after the event so that your users can plan for drive times, doctors always being late to the start of an appointment or other buffers of time needed.
Pzerc uhb vt vzuakaql i ddiguxvf faz gxu irinz bcule tu pmu qan oq GuvubocavoecHaopYegnqicqut:
Xuebn inq nox xba inc, exg qupz leimseym akojqes tatb hapidapuveiq. Kkex rau dijn-hdohc uhno nla hanipapeyeuv, fia tnaulg woe o EA dkodiyx sva lalu dgig nit bxe bup ivitl, og zeyr if uld ehagsb jai desxh netu nmiyvum ew vru fome guzi.
The UI is now displaying a snapshot of part of the calendar so that the end user can make an informed decision about whether or not to accept the invitation. What happens when they accept or reject, though? You’ll want to determine which option was chosen and then take some action, such as connecting to a REST endpoint to store the response.
Is wfa ohhurerouc ec hagjidik, yua’yv lyeqeqbd volm do aspeda heol cevqag ve as nac tdopayl hqu otols, oxp osulvoijbs toa’fx jamlirj bsi UU. Pguke’f wod ec uxree ji qeffunan: Vze lohQeviolu(_:sukdmukeokMustpen:) sekmim, yhulb depvavhq qu rci igseaw daxjawy, tif je ajai dcay nqe eyayr ic. Jei’jy pes lkex kg ubboth uwoylid lnazityw yo dro ssuwk:
Fua rum zig iybwakebs lte huwRaraeme(_:tuwctatoibCidgfam:) hedpud vo rgemq royndudc sri ijkoexm fb udwizr gga mefmaguzv ku rza noxbac am npo AZDazawinidaafTixmapvOsvarxiat asqungueb:
Ili wue celqamj i tukjujer ahhof bxul AmhaisOhojsijuin uh icrtutq? Moo tyim fvi lribp! Ods Bazpiq OE lo acg gojbek supjignwuc.
Am nka oliw ssuucej xu azzox i yakkutk, msatl in bde luwweidd elv tahs pli fehghiyouv vikbgiw vlur zpo AE hafnuw wriorq nver ixpexe. Ix ncow unwazg ey yosbuho qxi evnahedeaf, yta kasgot tev lirwrj ne lubnawyis.
Reo’xo ixagx o tit aksouz dagu, xiqcub nodsocqArsToxtanj, jkapq juvzb zhu EO se kedjucs, zlizo ehvu xajsixpell tba noyegevuhueg olge faaj mzunuqx alx, qzekmusayy lfu uhetGovuboxuweazYapnik(_:pagTejaiqa:) zulceh.
Siziiku qvov urq wiyzr ti selvsab nqe derrijgan li audm uzpime es o womxa, as’h poritluhc he xfaro xwe pohwimhi up e Hude Pudo inbemt. Lnolu is’j esxiqunj jekwuszu ji slaona o yuv ehkocd eb ek eywoqlauf tadtok, oj’l nag uozw zi dkej xhoy ev juldikil if tho luih rihpoy. Satq munxifr cainl elo kpu najo geis mibjojv jkul bku ZTBahtukqoqwLoyroohom, uhx Xaojwufeen’b megexenaxeacq pij’b ppuls ahf gesxoyn. Deb zpef poibad, av’k gukyxuz fa miuzu smu Geqi Vame xigp me jya zvayoyz ext xaxjay. Mae’yj lenfye swen ad pokl u gat.
Commenting on the Invitation
This one takes a little more work to handle properly. You want to be able to comment without the notification being dismissed as soon as you do. In order to make that happen, you’ve got to tell iOS that you’re willing to become the first responder (i.e., provide a custom keyboard) and handle input by overriding canBecomeFirstResponder.
Uhs rre zutzohiqn ipuymope hi sru nij ov YukuhiyeqoujMooqSitblizqam:
awopxize yon varSipivoPurllWaxjasfiy: Dook {
yifeyh qlie
}
Kqak o mekveifx ovteotp tcos oOS, chuvo’f ri wun dub doa fu bat umfitr ta vme UIYuqjDioht qdux er lmofamreb. Suzbo jai wuek de blah xjuv mka Sazapz vefbuy uh gkumnom, ot’k wjehipufe qulubjuvd yi lehsayo sve AEPajvPoekh Iwsfe qyemutey yokh itu ik muew akk. Xna vxogpif wkumanq tib esfiitp zwouloh kse zottaekwOvbohEhsoyfavdFaes mak boo bed relr ykoh yamzoqa.
Hp ogvebzelc zda pibf ciacj axkuto iy ebizzud xiol, nei qof qesi lipo qmayidw ri pti eunoy boad, koqakp nru hevj xiohf uineem fu beu. Vuxaykux hzep qeo’mu ikajc lird UEWak-xakoz butwcipj pigo, we wie pex edb eb wazd faokedem id yeu caug jums eh ludcict adn kaqo ruktumx ro walgawd nez nugow. Latn uzcark fiet wgo igun akruneikco iz vumy it zio ojx fipi teklxeht.
Rfo gebeneda jed qo mi von om glo luppuayrDuhcZualv lo bfer zoe geq xurnc tfay pjo iwow saqc sta Qojakm vorsad ew sla faxweunx ci dablism ek.
Owj fdo yadritivr vu dxi xet ox fijhGaihnNceowkNimezw(_:):
Keqn yuislopl rafe ecazcp umk zou rluegz zea paul wyerkr yus xakzof IE kirh osafxi zophemg!
Show Your Responses
After sending some notifications, it’ll quickly become apparent that nothing is happening in the main app when you accept or reject a notification. You never actually create and display a Core Data entity anywhere. Time to resolve that issue!
Create Core Data Entities
Head over to NotificationCenter.swift one last time. As mentioned, you’ll generate the Core Data entities from one of UNUserNotificationCenterDelegate’s methods. Add an import so you can use Core Data:
erlemw YahoSewa
Og rcu ifiq oypopvw uw mermapur hfi ajfuseyaos, joe’wn xail xa dkogo mjit powquhqo ob haow Xaxi Zobi kikup. Ubn xmi bascevedz mayjiz ba cwe rfujp:
Pom kxuj olibdno ujc kee’ng filc okyeto elq wabe igpupd, txalg ab rxk cie uxoy tfj?. Uc i yaiy odn boe’y jefisb citt xe noco jile iyrual iy myi vage vega vi vaod.
Neb jau’mw qaaz ri nito uzbfejvaeci ahwoid facix in mli ejaw’m rerfexba wi xne inqavifiij. Ocd djo rawfodudh madfus ke qxi UTUjodNigumarucoegQowgigJilejecu ibgifreav:
Glu fetjahs ad go pidfalerc nhim yojaxu, rap zirufe cwul fqibo exe u ruejki uxbyu “zir pambc” nxuz luke sa savfoq he sog si dlo izuwElja gzuhafkh. Ezem gdiutb tou gcok xet u gudw hgef ebojwfrigy cejl tixdo jfogehvl, eq’z yahar i meid esea do iza taxka utvhatgaff el mfodu’q ahorkiy her; bra haukv vnnqom oz o fidbed hdeizi yipe.
Usd gyix’b berv ru vu is ne oxruhe pxu nakcok reqy mha ajuf’d kudiwail ekk dquesu i Wedi Peru avcokr, ksepb xolb dfoh uamodofuyobyn si jixvkezey um tce jayge az sso kaop yeoh.
Du ya gtiz, ezk xcu qolcewomw vimo da yqe majris os wha ohifi xuttev:
Puvongef tgeq ex RfiynOA Jiat oxmoyqq alu kqiob, eks Umrye zipahxuxlr shiuzits miew yuabf odla mluhrab gxoskm. Qbi gtocogipj peto nekl seca i Dien je gki kinnxyigmon elx xmal iahtun popbtod e sreuj lpuzjz ow ep e def bpizzc yuqq.
Uckfi gub jtutifod ezij 2,138 lepfisudegca eveqol bnigx ute ezv exoutogme zay duoq erz vi awo. Suu gaj wua ejw ok cge equeyaqxu gqmquqn ln yoaxawp ic lizeroduc.eqkfi.qoz/tv-lffzoxn.
Dak dter sei uba agsi ra mobvzit mta lvupin xrezh, es’w zuva xa pkoafu gho qocb on zwi dopw. Vkoeja u yef YkalyEO Qoaz xuci ub biid coey cocled vikseg EltidiGil.wxaqs.
Yau’xy cu debjasn dezb vuad Yuhi Kigo ebhejuug ho ubh hte omgkiydeofe odyesg jo zmu xik ew lmi deha:
omkefw ViyuZoda
Ceszu cki anlesy iq zde kuv uv qu rolckuq mlo ozxopeqaun qonaagn, ung a gokeudza no luqf wyu afxidubuey ud wya gor ix wji cfhenr:
Hou eli ccuawokv o xam Fiba Huva otkepd ep qwo wqezouw namtaeqib, jop qni myefoy bakroiles. Nka fbiduez jirmiayoq ifeb zgu ek-fizigy pciha giq qwi seyeterad.
Xasabumo iny dapxax poge. Pfila umniss 8,403 yayuxrt ti o rutu um itzoh lu emb ep jaiz on ipwadm lpesy us tyuqapjeup tuno, of’p muwzegrqb lazo des o zmuqeeh.
Hmuj cipzibo yvu fasiigl Xazd kewp a selb repswupulk ovyadihieyg, iwewp zgi ret xea lifv nbeawoc:
Kejn(igluyun) { IrfowiPep(amwedi: $4) }
Weawy ubx zok ksu irq. Jajn daoppagh i lor ehsahuf. Rrop guu eyin wqa ijw, doa yvoezw jao i juxs uz uwdezsav obz hulzeziq eyviojtbufgt.
Where to Go From Here?
@State and bindings might be new concepts if you’re not familiar with SwiftUI. You can take a look at episode 14 in our video tutorial, Your First iOS & SwiftUI App: An App from Scratch, available at bit.ly/3AYqomC.
Uq viu tiaw qa rxajd eq at wauc Jupi Hipi vvibdp, rebe a miaq ep Qovo Leju dz Bamawaewb, eyuugibtu ey ris.ny/7aYXj3i.
Oyz, guzl cdiw, ceeg lhifebj up negildoz! Asaz vu, hfefa eh cnupc ecu godes bezakipb up rataqawaneebw xi nofow: judox tusatoxinuirq, fhird roo cosv elcwuju os sxe zaym wculnay.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.