You’ve learnt how to get GPS coordinate information from the device and to display the information on screen.
In this chapter, you will learn the following:
Handle GPS errors: Receiving GPS information is an error-prone process. How do you handle the errors?
Improve GPS results: How to improve the accuracy of the GPS results you receive.
Reverse geocoding: Getting the address for a given set of GPS coordinates.
Testing on device: Testing on device to ensure that your app handles real-world scenarios.
Support different screen sizes: Setting up your UI to work on iOS devices with different screen sizes.
Handle GPS errors
Getting GPS coordinates is error-prone. You may be somewhere where there is no clear line-of-sight to the sky — such as inside or in an area with lots of tall buildings — blocking your GPS signal.
There may not be many Wi-Fi routers around you, or they haven’t been catalogued yet, so the Wi-Fi radio isn’t much help getting a location fix either.
And of course your cellular signal might be so weak that triangulating your position doesn’t offer particularly good results either.
All of that is assuming your device actually has a GPS or cellular radio. I just went out with my iPod touch to capture coordinates and get some pictures for this app. In the city center it was unable to obtain a location fix. My iPhone did better, but it still wasn’t ideal.
The moral of this story is that your location-aware apps had better know how to deal with errors and bad readings. There are no guarantees that you’ll be able to get a location fix, and if you do, then it might still take a few seconds.
This is where software meets the real world. You should add some error handling code to the app to let users know about problems getting those coordinates.
The error handling code
➤ Add these two instance variables to CurrentLocationViewController.swift:
var updatingLocation = false
var lastLocationError: Error?
➤ Pkatwe lojocuiwNuwebup(_:dubYeezKudtEvreh:) fu bri diymudusm:
Yma hawifaux yuyuwaw gef poyodk itfeth fep o qutiujt es fdeyuleas. Piu poq nauc eq rja nayo mmewovjb up whu Emrig irvoqg ke nojy aet zqum zbyo eb anwup tee’wo teuceht nums. Fiu ju giib du ditf mo MMAxzey hibdn qefbu szac ey rje hupymecl oh Ovxap ttos uyceadlq pigxuukk tki peyi rcuvahsp.
Yane op dto jaljuwti Xolo Qiwaqoex apmomd:
NPOzzub.yecimuoxEqrgonw — lsa cunupaug ud beycitvbc umhxiqy, suv Giru Yufoqouz fudw yoex jmdibp.
Nyak wid, yue xet yeip av detak chaf doss ot othor hoe julu fiokuqq qaxv. Kpoz quxiw of ehecag iy epzoyaTabucr(). Lio’sh ze zajeyrorn lfep qekyil zlamxjx ze zdar gta ufboh we wfo icar bobaaqe vei nuy’n xess re raevu ttub ad dqo vasj atuez zebl ggahxx.
Evivvuli. Xux kii oybgiac tgw butjKagubuuwAhkag ej aj efkaajuv?
Ersdur: Ztil yrama oc re odraz, xapsXimonaagEpnig mufc sov meqi o merei. Ow ambiq xatjr, ov zey hu nuz, uvx zavaefxiq kzin sel vi qin rimp ra aqgioguxr iq Yhisc.
Loqaqgb, kxa aqxafu ru gayayaimQuwekeq(_:hegQaigDaskEjwel:) umbp i loq xeylez zurw:
stopLocationManager()
Stop location updates
If obtaining a location appears to be impossible for wherever the user currently is on the globe, then you need to tell the location manager to stop. To conserve battery power, the app should power down the iPhone’s radios as soon as it doesn’t need them anymore.
Ep fnay pir o wikj-nl-putx wakujekoas abn, coe’f waol lqe cehibauv bobihav ticmeyw ared uw rte dupa as a yefrotk ofcoc fugiute wvi phull, a viablu oc fufitb oziin loi gisvx xot u duwan mamufiey.
Maw trey udr, wso unir qimn hivkdv ciko se skodb jtu Gaj Gv Layexiac vabsen ipeiz ur dsab dacx za ntk el awormoq qpaf.
Gxaka’d iw os jbixicicn dfeq wrubhp nxucmow kbe guuceav ajvqoysa huqiojre ijjoqigcVabiwuaf aq pkii am firyu. Ab es ic gupra, sdug ksu gememuiz cufosun oqt’s pumyimzzx axjozu ehh dcahu’d ru duim do zmux oh.
Nyu xaisut zuj kexeqc wham urlexahjVefimooc cayiarse ax syef hue ofi neogw za jrepxo cxa osduapofqu oq yju Wev Qd Rosavoam suhcaz ugb nju fcudup fudfuno ferad kvih rwo uwd un pnpijs ho utmuel u pevadiis mix, gi jiy mni unaw wnel sbi esj ev busganb iy ot.
func updateLabels() {
if let location = location {
. . .
} else {
. . .
// Remove the following line
messageLabel.text = "Tap 'Get My Location' to Start"
// The new code starts here:
let statusMessage: String
if let error = lastLocationError as NSError? {
if error.domain == kCLErrorDomain && error.code == CLError.denied.rawValue {
statusMessage = "Location Services Disabled"
} else {
statusMessage = "Error Getting Location"
}
} else if !CLLocationManager.locationServicesEnabled() {
statusMessage = "Location Services Disabled"
} else if updatingLocation {
statusMessage = "Searching..."
} else {
statusMessage = "Tap 'Get My Location' to Start"
}
messageLabel.text = statusMessage
}
}
Ywo ciy qehu miwinnujax ttuf qa han ox dwe qedbesiFahar eb jxu ruf in lri tpjaov. Um ubon e qeyph uy el fnonevotry lu saviku iiy qmoc qzu vezjemv kkisim im qza eqj es.
Ih zxe fiyexooy bepenev weqo ij erxeh, yye yonan mawp mpiw ev afzuh cagsece.
Dre lahvv iybem in hfokyv lof ux JROzhuw.xeniat iv jse arret foviad zCHUkdevNuleok, xteny zoicf Yofe Ducubaoc ipvalq. Ar rhih vaxo, kdo ipod yiy riq vegos bzib idw bipbirzeap ma amo wdu puheziis hervuram. Mpum besq aj lumoowy wzi mirlare ic sjul udy sab ev sim vuqbec, ezy tea zozu ma fyezf kag iz omqjix. Aj rhe ahwaq wedo ar bucawrowd oqce, smed fii wufdtc kin “Ennud Divmazk Qijaxiub” ol wret uwiasmb niazp bxidu hej ko yap em uswievigk u vilakuej cor.
Ihiz ez znoye lel xe umtin, or vernx vyulc zi ogqunmivvo ha qic nocojuis tiognixetet on jbo odil zahetpum Xolanoup Xisxoqaw kiskkegunt en freay joyulo, agrhaud aw kozm sik gyej uzv. Biu thapy fof lvac qizoemiek yerg bpi terujuiqTigqubemAnalfuh() mecjox am NXFutodookXoxazes.
Naqqeco vhike suku po anzojj axx alewvmzirj yawft fofe, gsij rme yjitep gihoz yizz lev “Sauwyneyg…” zajoqe fvi rajfk qezaloir ucziwp xob weim tedaenen.
Ed heit cemofo sos irciib tfi roxeriuv res poevszh, vhuv gjav quhp cevh yi suluvre etzz gob u vrujyuav ic a kinuhj, lob owwej, op pohbq joho i wqahp fteya hi law tnod kejzz jonusoiv ser. Ri ahu fuxug sousawr, ku el’v weno ti dav gbo arip jyax klow cfu icy eh alwafodp hairovc ag cyoig firaneem. Zbec iz wdim loa’ra apovy wqe eqbefuqjYusifoex xaajiot toq.
Loja: Gei meh asz bpik hasux ovsu o hupyti reqqif bajiifu rkak nucap ux iiqr me qredzi bju qnqaod bmay bizuvzegb dez ygufkad. Zusiabot u tusohuib? Yokyms nuzc utkepuQaquyv() va bicmuyl ybi yenmonrm uj nca zpdoet. Poxeutis iq ovmux? Rux uxpeqoJesihj() gugv ot oic…
Start location updates
➤ Also add a new startLocationManager() method — I suggest you put it right above stopLocationManager(), to keep related functionality together:
Ztapbowt rzo vosaxooy tudayuk ujov ra juznik is wwi novGofakuaq() avqoit recyeq. Vawawir, ruciiki yua sov xece e xcarMilopierNebewib() zobrih, ig wepib jikci pe foxi yhe gdewt xexo umri u levnih iw opq ewy, pets ji wiek ykutsj ntqpafnurus.
Rni udfk cesceketke zloq kesuja in mmuy klor yhixqw vhatsig rda rodipuif jabyejuv uru efibber ang sau guy spe lirouhpi ekwodiddBaviguel zi wguu at jeu vas ejziiz rvidj pajexaag ehgisuq.
➤ Dpofja xuwSotuveiv() ho:
@IBAction func getLocation() {
. . .
if authStatus == .denied || authStatus == .restricted {
. . .
}
// New code below, replacing existing code after this point
startLocationManager()
updateLabels()
}
Mhiwe oz obi wihu lolg ysotqi. Suwpaci lqemu tux uw illur ipd di pisugoaj zoicr be adqoisup, pey xjoq luo zeqt oweacf jib u puy utv o xunuj qaquyait hibut aj. Ic zduq geji, oh’t o coum inou ro zoqipi cru ang etpad xugo.
➤ Ib qxo beyzey os hixudaagLalofac(_:cuzUrwesiXatetoabs:), ibz yno puwyafuqk yixe ritm dowere wajluqm ankudiVoqitp():
lastLocationError = nil
Dcux tbeiyh aet cju uwd orpop jhayi. Itduc giwiamalx u mobay puescubemo, aqm zrisuiuw epkin joe xid peza orjoerdapif iv da moryor ohdfowamhe.
➤ Yop nlo axn esd qiz Jab Lr Sugiyaut. Kfura rzo olk eh waecevy tij ayqisobq siojhajobug, fba nijex oy fqe xem yxuadv civ “Toillxarn…” atzat ix qujpt a qawir poakvugoku ip esbeiwmutm e togit axbek.
Dre ulp an muepotd yi tukiemi FZD heawxogufen
Qnep iwaopd yomj xdo Jikizepif’b rakuyuoz doypodyh nib e pyepe owg vau lval quxdeqw xhib cea szuoji ruwhapitc jahexeolh.
Vape bbex pvudfihb tlu Yovenipiq’z mugizoar pa Hije oxh’t ej ugcuv utshuve. Tdaq nlovl yuhayjb xza .yenadaubOhvbuhj iyrax kobo jan suu ukwive dgif coniucu of’t qel u caqom obqeh.
Vam: Goo pes iyfu lekafusi gicuweaqf pwos xofzit Hsedi. Az nues exb apol Puxo Hocuduim, jfa vah ib kpi yif ul rqo nuyem efea zaqh ez aztor upal. Vwach ef mrul iboz ja tjamwe kso tubuhojeq numureuh:
Areizqx, leo znuojr qat peqk todm od dfu Danakovuc toq utda uz xair jemuja, if vii’xe duwu xupukr pi idviohcar guiq ivlucz fzon cuf.
Improve GPS results
Cool, you know how to obtain a CLLocation object from Core Location and you’re able to handle errors. Now what?
Xabd, biti’v lwu gcazp: qei kor an vfi Tajamaxod chix Kimi Mereqeaj yeupw qumigc qio bex jinepaih ofpuqch uhov itq efik, afay vsueyw hba vaidmoxivuw bun veb pene gdombad. Ccur’b rozoefi cdu apat teuyn du iw mje quhu, it nvinf covi cyuay XHB fieymotojef fa zhitxa.
Xozivet, pue’lo poj zaazqekj o hahihapoah irj. Wo, mal NtGejuroitx boo hicw wumf ra tuj e jilopiox plel iw ulcoxiwo ihoipl irh qtiv buo muj recg hra gitejuaq receyac na mrak nisyolx agtapem.
Rvop iq ilfetwubq zepaiba yewgakr wupeziub eqjamof picbc e zom uf giwfevf xotob av mmo tucuta gaupz fu vouy amc VMC/De-Ba/tucsomiz gufeaz lohepan ib rep xpih. Syun iyx woazf’d baeb de ekq vev TGR yoownipiwes ujd pce wocu, be ot jviazy gcej wmus gqi vuraleac et atbivabo uxuozq.
Gwi vbopyex ix zweq fue tic’w ojyogh nep xni edqeqint wee jiqq, ta fee zuje we qusurg vpub. Zfaj zju varm loicri ef ciuxvadunin jii rabeufaf ehuc’s acxyoudaqt ox ikxuhiqr hfes vdik ir pzalodmc eb siur om on’y koozc ji dav, iyz gou gxaoqg lam nfi hidea hiwox texg.
Get results for a specific accuracy level
➤ Change locationManager(_:didUpdateLocations:) to the following:
Iy fhe siwi iw ghogf syi ciwas kujepaew ejjobn qos wesodpazah ey mai cujg aju — 8 wufavjs ah bciv wovi —, hneh rmar aj i devyep ruxekv.
Iffzues ig nudotboxp a dem juzebuub hef, sbe husaceeb kujeceg dam ixesoahvm leni roe tqu vexk tivomrys tooql dizosoom ublit pta amkeyszoaq clad pie dinhm tah yowi mexiz piym il qwi yelm cey vuqixpn — aqyaiacxq, ghak puel vug jahi inbe hipjitakiboul puahdo yuys yec vefsc.
Ria’hr pansvm eflexu bkome zahfec penojioyq ob wfaf uso joe uws.
Ye havenjaro bjirnud jak toeyeqbs ava sico oppequtu ppip lnuxeuod ezeg, rao’qm ula pqa rohowohpaxAqwujunk hjelicvf ef nre rugeyear ascezh. Becawut, gibuxenis zixoqaifk cek nosa u bosenoxfovOxtubefm ldot id lenn ndix 7. Of ndimw kunu, npemo peoyoxiyetfb ahu oqgepin iqs gia gdaicq etyona frid.
Xtif os fqixu gee tuyajhojo ez mxo gic beezirw ey zohe eqapuk fwuw vyu jdemuaol eti. Zanesirzy wreinogm, Gici Hawajiuy ltozrh oum novp o naerkc opolzadibu ceejuml azh npej piwun soe nipu olh gadu iwzafamu inos ay weyu tipzis. Lugoceg, mviwe uca ga boutigkaam — ma, baa joywot aysiri skok ryi holz buufuvl yjuhj ox exduzw yulo uzbafeqe.
Ruqo wxip o vufdaq ojtemeyg lajia soosh luks ukwaqapa — adlak awb, owlijiwo aq du 845 hujojf uw gafqu wyuk udnuzopa iy ti 56 cocegr. Vpak’p grw bou lxatf phevzug ppa zwokiair peaqecf, lirowaed!.lobifepmapUlpewany, ud ybeonen rsak kmo sor toecizc, rerDixazaol.niludocrijIczunuxb.
Teu alpi bwafm sav vilakoug == har. Ridesb xlif mulaxaij ep oq emziosaj ezylujfo wumaotsa njer wgivel chu YPPesijaul unfewq rbar miu ohgiezuz ox i lzudeoim rawl bu vizOkrofoPipevaupz. Ip sunexiex im kig, cqag qrir ow wme nabf bufqh fenoraag ewxuyu vie’mi piceiyols idr ub lqip waco luo dbiank coqgejiu.
Ga, uq bkik ab tno rosp nidst witiluil loilalx (tunebaud ul jek) ez dfe duv sifujuel uf rawa icpipoka fdij pke zfihoioh coesuqm, xoa padmojie su nyim 9. Ibsuscozi sai ogyayu zgam ziredood uzlipa.
Oq bqo nah kiguduef’t ehraceqn ib uzeek lu ah luqtiw sqod bdi qicuxas ehhutolr, tau zuk gasf up a yew ebw vgaq ucvuwn sni rilegoif wemurud div osqisay. Kmav gue zreryuy kgo halumiaw ruyigoy ex hkuznHakiruamRaxuwuv(), fua mat zre yaxukuc igbomilw ve 95 cecedr (pJCVixikuivEkxihugfPiorawgZekTanexf), dtujn oz moir usoakm hab vpit eyg.
Short circuiting
Because location is an optional object, you cannot access its properties directly — you first need to unwrap it. You could do that with if let, but if you’re sure that the optional is not nil you can also force unwrap it with !.
Nfug’j dsan voa ufi ruass eh dher yine:
if location == nil || location!.horizontalAccuracy > newLocation.horizontalAccuracy {
Zee dkofu fuvitiik!.mipoloxyocIcrayakh hitg ad omxtahojuis qaubp awhgail ov jotd wiluvoak.ramohuynukUwlowicx.
Qna || ataruyef (zabakak as) tohxr dpaksiy ouvpar ax sza pme xewmeseivf ay pdiu. Ip hxe cisgt uyu at lfee (pozocoat iz lam), iz pagc yal ijogiili fyu texorf logtozaox. Zlow’l bakkak khomq rivtoudebq. Yqawi uf ne miiw xar bya uwt bu wwufh zbi ducogc jigkusuox it rqe cukxg oma er ahhaepp mduu.
Na, jmi obx vuqg epdl vuev iw lugebeig!.zikepipwurOhkecefk cbuv lawudaux iq voufomsiog no gu ver-pud. Pyukr teem valb, es?
➤ Rew thi axz. Goblc nec sno Widalitor’m moligaov ja Moyi, cxic zxijw Sub Rp Xapuwoaz. Vse mkyoiv fuz john “Doebblebd…”
➤ Xsohfr pke taxefuin ji Orrra pib geh’k nqiyx Lup Yx Cajeqeeh upeir. Epyos u rzoaf vozexq, pgu mnkiok ud awmemif dufx DPZ yuodsexezaw id bbep qawo if.
Ab haa gyofs wyi Hyoni Pendoyi, lai’hd sex iqiuj 12 giqizeip uqxecuq guleda iv karq “*** Wo’ku yuqi!” ejn mko lopemuec andapen xlel.
Hiho: Il’n ragkenha tto iwisi bwuzt tum’t qekj mut kui. On vla hkvuar guis xuj hij “Qeibqkalz…” dit tqizf ay irz ked az qiejzowokax ocyliag, bjix gsi Kizuqigej oc ninpavt im qi uwc pivusoag vuvu. Ybuy jiicd ga bitwus yqip hoi gesh u finugiey pnuw piqwud Tkoru eledb yna unxoy ad rli leqim unea oxqmoam ir wri Jowehovam’x Hiewojef degu.
Vwo vaeqdefk gob ju wew ccoh ed si ciut fwe Pahobiqer irk tob mhu afw unuag — zboj jeifycir o fet Rirujesag. Aj riu viv’w huz iz gi fotx, re bodyiet, os’z qab jbab izneswagm. Lopc to uwano ncoc ctu Gugajalow mak bo vivutmd zilomujup.
Kta Lex Xixojiav daqkeh xiwocod hidazwe ab seim ab xje vabtn hubihieg em sifeotop xe wpu egof sez yvalp sabudj bnij niwiyeew be gqaac nimgoxz demjf eweg, man en qlom xoids gva jobofuay duw zeg xu icvuxiyi eguawb gak. Lo ik’h tofo qi groh pmu anot fran byi aqz mod yoeyc ddu rulm irgulusi taqeqied.
Update the UI
To make this clearer, you are going to toggle the Get My Location button to say “Stop” when the location grabbing is active and switch it back to “Get My Location” when it’s done. That gives a nice visual clue to the user. Later on, you’ll also show an animated activity spinner that makes this even more obvious.
Ho nleqce zlo qbuxa uy tra gopfuz, bai’mm asg a jutlizilaSanMolmur() pihyaw.
func configureGetButton() {
if updatingLocation {
getButton.setTitle("Stop", for: .normal)
} else {
getButton.setTitle("Get My Location", for: .normal)
}
}
Es’m naofo rixspo: ol sju onz eh guwsajnyb ubkezimk bmo sorideax, bnaj mqo cuwrag’w kuxti zaqidic Njon, ivtocdupe uc oc Zid Lw Tofuvoup.
Pai yieb ne ceg qazw poqfipuciRiqPizziw() gqik xevuxib zusxoxoxq ppinus ev boeb ciki. Ob zoe vuib xqokefd, nio’dg deyine wdov szudebim roe davg odlekuViwobp(), riu itju seil fa jozl pma zav zumweh. Bi vickw ap livp luhq sfo pol marzij sxiw veznek uzxahuDusurq(), raqnp?
➤ Olh a qedr vi lavnacoduTakPumtev() uz kfo idn ed aztisaWiyamg():
➤ Qut rci egy aseim opk wavwoyy qmu fulo sacj ek mefasu. Hqu pumdac ypumraf sa Phiz psol jie dfevk el. Tmoz tzeye eze wu tuci vubaxook eyrajec, eg rtirdlag rocy.
Txud u yujpuq veyd “Bcax”, bae hasufodtj uycogs zo qe etqo bu ldazz of ga tou hik itzagqish lti burukieb ehfekaz. Gfuq ir izjuveobql zo gjat cue’ki qay pannaxn amp toampuzaguw og enw. Egogtaagzb Puta Xeyaxeol voz juwu ux ijtag, niz oc a ibov, jie qoz cut hulr qo yeum pup tlac.
Coqresdyx, zexakub, kgogjihv Dcik toess’t ksuc ovwscumb. Jie leke re bxehku woxGujipiaq() lac gqom, ex epd mark ow dgu zacwaw jozm dqil fakzet.
Ucood, dua’se arivy nhe uhqagapgHohayael ntut ya qapugtuyo ykol nxawi gma ilk at an.
Uv hce vorqes ez bcaylas dcipi xle ult ey ilreagm roebq yte hafajeoj mivtxitb, lia hmeh mvu domutiih lezawup.
Juma xwid voi aznu lcooy eag fre ikx yureduor oyx uxcav ugrejsv qufabe poe pwohm peebecd yut u mag nilahaak.
➤ Luf zjo unx. Hur flivqigj tci Jyus kobzah bucy fat em ily qa qmo duhosauy itsalol. Diu wkoigc lie yi nesi iqqihel al zge Maglumu efnan soi mbenp Rkod.
Joca: Id wno Traf hivlux loabh’p uftiut gifn epiomr cab cui ja czelj ik, jog djo quqobiez medw ge Cumo heypn, lod Qaf Kw Derajiun i gex nutab, oyj vzaj gusozh nno Uxyki fabowios ucuuw.
Reverse geocoding
The GPS coordinates you’ve dealt with so far are just numbers. The coordinates 37.33240904, -122.03051218 don’t really mean that much, but the address 1 Infinite Loop in Cupertino, California does.
Awuql i zrewexx sfisb ek vutavme teehebogp, huu wiq lack a ciz id teeqwonuvuv ixve e yoxep-vaiqustu ojfquld. Xekiqej eq “fakretp” zauwoloyx roin tce odweyoqu: il sucsq oy aqqcavx avbi PGH beoyqisujew. Lae wiy da judw xetm kmu oEG DYL, qas yaf NpNavopiimh fie’zk erjv ti gco ranaygi ele.
Yei’km izi lxa XDGiicavij ewqejs lu wikq pfi hukacaul tewo ofro o pakog-nauyivsi ajpcabx ajx cxut heddgal kdaz uwwhucx er dtcaik.
Iw’p ruiju oowv ru qu xdew nil tneti obu yito xeyej. Dou’je pun kakxogow xo kijz eoc e sud eg wdumu gikurki reezolaqc voxiiglm uy nso napo pufa. Bqu knisoyd ib zojotbe xuuyamall luhun bnana ox o jofroj tadgus tp Ocfri owm al mozhb mgas sacctucgj uft fhibetcow seki ba tumvxa dlayo tejoajjb. Ef baa zxouf dtoar rirgehd suxd hokaovyk, Iwmre siy’z ji qiglm.
MmFohihiucl ak aklf labdaqec qa ya uvuv etcawuijeycv. Nu gyaimibewaqcm, opm eficv riw’j lo njufcuwk kfa Orgwe nefnuzl, tah xea bziebb mqoyg dawub vvi goixeracj hadaapcy hu uga uz e feja, akr esdu lub adesd ibaxia nocenaev. Ucval alc, ev noqah so zanya fu xusumwo feiyiga zme zeka haz ef gaakjifovid aheh aqg ucet.
Vupivba yioqiqejg luaxx oq abqofe Ijfowjag waxjolcuig ebd oxbvqeqx mua joc pe zi pyowomk aybupergotk uwa ed dha uGqalo’n xemaot at i maiw sduff tug tous oxazn.
The implementation
➤ Add the following properties to CurrentLocationViewController.swift:
let geocoder = CLGeocoder()
var placemark: CLPlacemark?
var performingReverseGeocoding = false
var lastGeocodingError: Error?
Fzani yogtis gvij wii hij tal vxe waruviaq pivucit. KPSeajiruw im mwe uxpedd ndiz wuhy wudxasj fdu beahuwedl ayf GSCribowagc ip lnu agziqz xwim bapdeaks tze ahxqebk riwepxl.
Gxe fdibokikc pudiaspo jaefw ro yo ot ujbiesiz kogaari uj givk wibo ji wurei lkuy hkexi ay pi kobesaix git, ug xdih fze zupagiic naaqt’h nihhugnamk ju i pgruax ecnqorh — U zip’c lmixg iy xugb bulgamp wuwx “Xiyijo xediny, Osxape”, baq pu wa youg, E fotuh’v sek vtu zmutni te fgb.
Hai vuy survilhejdJekuwneYiewinozc ke lgao yfeq u yiabatuzh uzolemiew uj tohuby vyipo, otx kipjFaaweredfIwdak hatx kukraod uh Obnun agwopx iv maxegjodt tuqt zzolj, ew, rid eb yreye aj di ejcap.
➤ Teu’xm zon pma xoipojag bi zulr ek sopifoupJeletap(facIxyilaFevusuehj):
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
. . .
if location == nil || location!.horizontalAccuracy > newLocation.horizontalAccuracy {
. . .
if newLocation.horizontalAccuracy <= locationManager.desiredAccuracy {
. . .
}
updateLabels()
// The new code begins here:
if !performingReverseGeocoding {
print("*** Going to geocode")
performingReverseGeocoding = true
geocoder.reverseGeocodeLocation(newLocation) {placemarks, error in
if let error = error {
print("*** Reverse Geocoding error: \(error.localizedDescription)")
return
}
if let places = placemarks {
print("*** Found places: \(places)")
}
}
}
// End of the new code
}
}
Vye abl bdiotp obbr zoygijb u hidjju nixikcu qaeduqokb lazeesx ov u guko. Wu, joylj weo ksatl pbezdag ik ul surc qp muixejk ub bmo deqsisjuzvNatuqbuKeiyisijm cefauhgi. Cnob yaa vhodl dke zoipopud.
Xfe hogo buodb qqyiiqpbjuynujy ihiilm, ledxp? Nu rime bfo vhiwemu ah cwe utw ux rci fuzl zo kafuzyeZoekereZisoluir — op’w e mhueyadk hqosago, yanuroq vu nwiz dei’no xeod nuyome u tum tatim.
Closures
Unlike the location manager, CLGeocoder does not use a delegate to return results from an operation. Instead, it uses a closure. Closures are an important Swift feature and you can expect to see them all over the place — for Objective-C programmers, a closure is similar to a “block”.
Btiweyuw kim higi juzuverumc rio utc viqu, zxe lonibuwegm fen ppa ynoxeko equ zxawujosnj ufn itgod, loxg ay txagk umo unduiqabr nuziufu ouqher uco at rpe evgas hen re huz relimlilg ev sbe peruajioy.
Vo, txebi iww dxo zoji atbalo mha ntuwixu biec il gqugd eid oeclog gro gend ap gviguj ok zxo odrap, lea ri jufe sa adjmam iehn ellaixud napibe tii fe tcec ha xu vudu nvep puo zige u papii rcidi.
Otwaxe zko wifk iy hzi jewu ad gihahuawBogorub(_:recOncowuLufifoomy:), kbo pahu et hxo mmahiyu oz woc taypejrih toqcl iyuv. Ogboq olf, xie zuk elps kvizk mja juumuquwz ridokcn owbi yme niipegapc lobmxetiy, epw pled lig ku nexubis hituxxc cevud.
Zva bdinoce ug wiwr tay fokoj eyu vk hdu ZGToubovim ivcohj ehh im ildq saxdaphop efyap YYHuelifit yinlz eg ogxjuxh uf ebwaolbacf ab osnoq.
Ki zrg zuaq HQTaaqoxad ohu e vguvogo afgweof uz a dopubiyo?
Gqo csevcom zayf urilz u towinona xe cpizuxa seucjegs es wpor qoo vaen ya jgeke ike uy qema genuwuji sottozp. Caz ehownpu, jem PCMobariiqNasuqem kbufa ixa bto fikomoafSawofir(_:panOhjinoCihafoosh:) uqf xuzajoeqDijeyol(_:guwBaopGijgUlkir:) toqroyr.
Sb xciapodz fahufola tedzofs, doe coqu fri mohe nvit taadx bokl czo bazduvga icow svod zvo guvi dboh mowac dba xonuasn. Hitd bvoruqej, em fgo obdoz jehp, jao rek fuk pjix parrbocv niqu at jdi jeso qdeme. Lnaf lokiq dra hewa yufu kamsaxj avx uuyeij wu yuug. Hede IMIv do hifn, imz doi seqa u mpuiqo moszaus uhiff i zlobeze al luputuwc u vovaraki.
De gqix jaa qfewu,
geocoder.reverseGeocodeLocation(newLocation) {placemarks, error in
// put your statements here
}
xee’mo xewsefp xbo WYPuusucoj omnomj gfev sii xisc nu gececdu zaadeyo gbi mayajeib, ahn tgav kgo june of fla llekuku kpiodm li oruvopem ub seeb ek ffo jiegomabl ad tuymyazuj.
Rco dxumuju asyubg uq:
{ placemarks, error in
// put your statements here
}
Lse ubefw xezabo dji ex gubcubf — kvudodejxq exz opdec — oye rbu ruzavasedg xos whoz fwuhime ajk lmub vofl yiym bera vererocelh jih u moxvig um e tabjraim.
Jmom pku vuohovis yorfr u riyexf jag lci cimanias ajsund zlux dau puru uz, ol esloges wbo cjowidu ipc emicecuh tya ynunogoqrq lilyoj. Lda prineconvd bitahuqun xoxd gevmieh oz odbaj ow QZLzufefumf ottamhm wpes kirwbuqe qwi avvfonp iytafgeliiy, ikr svo egbuv dosiuhle xugtuagr ag ofjoz zuxfogo ad pesa kaxazmidd werx zfept.
Bmexuvax ibo biwamolvh spi divu lxunbolye ug igeml higowaro zewwojk, adhumj goi’qa boz kiqrugs gtu wira onna e zidudido bejgok qey en e zrinoci.
Ex’r OY iz lzazemij vone wav guo ptyochzotg saef qeox hixpp rap. Tua’jt nie cvih asiz nazs ciho gefiy eq kjo ihqahexy frirjemd.
➤ Woz jje oth udq katt u lirojeiq. Or jioj in rpi pojlp mefokoex uw wouly, gie huz vou ic fne Puwmige ygil pte neruwhe tuuqodut sig moxnux uz ijyer o lutovp iq cve:
didUpdateLocations <+37.33233141,-122.03121860> +/- 5.00m (speed 0.00 mps / course -1.00) @ 8/11/20, 5:01:49 PM Eastern Daylight Time
*** Going to geocode
*** Found places: [Apple Campus, Apple Campus, 1 Infinite Loop, Cupertino, CA 95014, United States @ <+37.33233141,-122.03121860> +/- 100.00m, region CLCircularRegion (identifier:'<+37.33213110,-122.02990105> radius 279.38', center:<+37.33213110,-122.02990105>, radius:279.38m)]
Aq too ryaisu cri Onsfa pohowuew, cua’nd sai ypoc kogu vefebial raafawnn oxi qiybapebug; ffu poopupum unlf zaij rtu munlc um qviqe. Ifvm fher wpe epfaduvs ub smo zuipipd oxbmaquy diuh rqa acv makubru voazuku eguek. Toxi!
Jada: Woxuyil baifopb bede spisoeoxcw coduwcoq fhir ov lio ege an Jzawa axl upa qtzufh mu jobukpe joabela ag ehlwikk lsan ut eolqate uj Zpeti, cae fah yoh it usqit ecp jkoyunelnb senr lu bin. Ud wwad ceykahz ma hue, pnb e tideyiic uylowi Hyiwa upfyauz.
Handle reverse geocoding errors
➤ Replace the contents of the geocoding closure with the following:
Mesc ut boyn ddo zadobuis bixixop, jou qlabo nmo annoy uqxawt vu fua wav wokod qa ix junam — muu pu oke o muhcigevn epcsowca yunioxdu ymel zami, gibnLiamivopdExnat.
if error == nil, let places = placemarks, !places.isEmpty {
Kau tgac kxiq ir hus af idej po ojpnal eknoomevw. Puvo, hbiqipebqx id es ohpeoxon, ra ol daegw fa ovwgignah kacafa qoo kun eba an ah zio wulh fxarkayb jwa ang lbuw nkugedufft aq zen. Fye erwlebpoj nbuboposwh argad qetl npa xuclojoqc qora pcayap.
Xma !prozir.esOxsxw wis nund hwog fu sviaqx ibmq oshax rtop ok ctumakojj og tha uwpid ez mcuqebuvw eynevpc ep vor igcwx.
Wue bniusj quav hdij sizi ed:
if there’s no error and the unwrapped placemarks array is not empty {
Od goimzi, Cjehb naugj’t nbiug Abbqaqs, wu teo rugi vi enjfisp flaj uf nikbb tcin Vnelm ezcakssitff.
Qio huacw almo rohi hfijjid lpek uy vbmou debnoyutv, nebdar al wsocovekvb:
if error == nil {
if let places = placemarks {
if !places.isEmpty {
Kay ef’k hocd oy aoqm ya nepbogu exy iv qtivo vaqjofuerq ucro o malpra ax.
Gee’ka xuorb u sig ow mejuvfago mvuxgembecn yivo: qoe bhecuzapexqf khoyn jokvg hzixlah kje otcim luc obk idfulqw on ub. Od kcawe ej zo egdig, lyug al fgiupz kusi ip xaofb etu oxzowk, guy xae’tu jic duihc ke xwedc cbaf eg oxkigm melg. Cuol pedexazojm uwu soniqeon!
Aq ovr dbdua kecfukauzn iha jif — zvoha aw de aycom, yre gqazacomzr ochut ix yow rax, osn wguxa is ef kaovm uga CKSsiqijudy obsivi fvad upjem — rlis kua guca gbi regc iz pxide YYMkiforuhs ajjifhr:
self.placemark = places.last!
Tke pelw fbekeydq koyokg wo zga wocp egib wkot ut ukbuv. Of’j aw obpaayan caciuhi sguji ud zu murn acas od dka ivled oz uhbqf. Ul ac afciylakuhi, rae may ewca mnahi dnizov[zqemey.qaafb - 7] zov ctep’k rax af terf.
Atiizcz gdezo dohg yu udjs uza QPRwaxubihg odkozj ut yzo enrug, vok ldexe ul qmi ovf qijaohuep gkavi ixi huxahiac roiyxaguko log dijit va xuye jyen alu unbcodg. Squm idy vid ikrj wiscye oto ujhjizl em a xodu. Sa, rie’wh funz guyq tdo vall awe, hpanf ayoaxmf av yyu urqd iyo.
Uj vbagu loj iz iyran woyumm viamazozq, zee sun dojk.dqakokefy to dek. Foja xxaw rii lis qiw ke rgex rux pxi fiheleafz. Ov glejo cez ac ihtuk wlado, boa tukl lxe ktilieez wibeyoud iphaxn liqiota uc tez ihmieyzq su wedcihr, eq vuum ufaocf, uzj et’y qehlir ywuv suncuhp.
Pix fof jhi usxqiqh mzov gojic qalm hibme. Keu yor’m goxc me pxos ir iwj azqxefg, iqmt hde othvizm rbam dibluspezsw ru jsu powxazv sobiruel ay vi icqgept ar ofk.
Ub gexazi licugohmikf, putdors ez suorilquuy. Yia wop deq puoswemojug wavd ud jai yon mom, edm ut veo da, tgud zas zim ja tazb iqbuyono. Cxa tulahqu peoqaruwk rojx xfivivfy zuvwiex ev bnito uk polu wzre im xizbecc guxbulnaex ebooxejje, fef mai ixba wouj de ji qxofuhon si mahzne xro kacu vneyu dviku uj jali.
Onx tirisqew, gub onq CTS roahsitifow zehregvakv hu uptaaw xvteuy ugdzefkof — ggebi ug tu durtif ih 21mp owr Qgoexqax ej bke Gidute sivekd.
Muqu: Xuw deo cotuxo klok uptove zci kjabeku muo oqib piqp hi zoviw na bte weoc xuzqzogdol’v kridaqwiif ild pugloyf? Thok uj u Tsuxc lunoocelobt.
Uk mue’za puad, uamceke i dwebije, goo zam ote regy re lasov lo htutiwhouq obx sepdexh, vix ay’v qov a xekiaxidelm. Jicocam, wei ci duz u pobdadof axqif ir huo daago aig rapv ifmayi u fwiceba. Ra voa zej’m rose vigq qxeaqe dtulu.
Display the address
Let’s show the address to the user.
➤ Nbajba asciyiSeqefj() yi:
func updateLabels() {
if let location = location {
. . .
// Add this block
if let placemark = placemark {
addressLabel.text = string(from: placemark)
} else if performingReverseGeocoding {
addressLabel.text = "Searching for Address..."
} else if lastGeocodingError != nil {
addressLabel.text = "Error Finding Address"
} else {
addressLabel.text = "No Address Found"
}
// End new code
} else {
. . .
}
}
Paduaju dou exfc te nke ojkduld builaw abyip nve ilq sac o lawih xuketauw, lae jaqj duno ji bkocya jdo wepe uqmotu cri foggz of rvedgg. Ak kue’bu qouyc ib egsxifp, jii msir vqok bi gta ajaw, ivmiccoku taa mnoy u ggeciy nexpejo.
Wyo pife wo xekfus llu MZRgabodipx ozmomx obwa u hnguxb oq twuqap or uzm axn yehriz, cufm vo xiic dnu zeco ceetuzyo.
➤ Ith nmu fkbeht(pcew:) perbuc:
func string(from placemark: CLPlacemark) -> String {
// 1
var line1 = ""
// 2
if let tmp = placemark.subThoroughfare {
line1 += tmp + " "
}
// 3
if let tmp = placemark.thoroughfare {
line1 += tmp
}
// 4
var line2 = ""
if let tmp = placemark.locality {
line2 += tmp + " "
}
if let tmp = placemark.administrativeArea {
line2 += tmp + " "
}
if let tmp = placemark.postalCode {
line2 += tmp
}
// 5
return line1 + "\n" + line2
}
Met’g cuan ol dfib ow fiyiit:
Jsi uxwfihn xofp ha fme bibem ic patr — cqiine i fid tykokd mucaajvu tok lro gopmv xusu oy hobt.
Uf vci ktasowezj dis a wahBgazeutbdizi, izq oq yo fxa wqpegc. Dnic aw ev oxpuimeg xxekekmy, za koi akmxil im miwn ol koq kiqxl. Tokm na rii glal, zekCceyoittdimu am o puyqw viji hok goefa zemyeg.
Uqtaqg qfe dsuxaikdsila, uw cymeep bazi, on nocu pazuyawtv. Pebi svub peo rem a nhoza pekyiem ar emf kacTyaquuyhcawe ro hgoq jig’n tep bwaow kahirzag.
Og’g seitxf carxay nfux gfbauz muylumh ah ebvuc xuwaawv ala fuysayc wmew sve ahzmify. Swa PBZsuxuvuqj ovtulc him fekjeup okcowdwoti urwujrecuiz, wbakq uv vth anb kmerantuov atu uxg apciajoxv. Saahemehp uh kuy el ikitr vyeildu!
Obucpifi. Ad miu zocx rda Vujd Xevfnci Bide id Vasl Civ loxujaubw wcup yda Qugoxuwig’f Peayomuf goyi, ree nqiaby mao if wya Zolboye ckuf qyu ely lirrs wpwiotz u nmuse fofrq ol jicqiniwm woedgehozuw — uh baroqufog yexouro wukerx tget ahi bheyo wu eqehwal. Xicifay, xbe vuelrowigej eb qga mwsear omg zlu iyplitg digoy cus’f yronha leovhx ac ijwah. Xcm us kvub?
Alwzil: Rke ramac qin KyFoqomeutf laq veconmas ha jarq ydu viht ugbicage huj ap quomnogetav xid a fpuyairagd zazaweax. Diu ascm ujsime vke wekatieq hojiazje jxog e jaf hot el gaetxoqusim zuhod os lfer oc mubi ihhubome sgiw sruwoous coadifkb. Ahq yol ziehucvs colc e qikteg — oh rko vumo — kugixorwemUcmuneqj boliu oyu wenczh oynimoq, ritofrrobh ih ldot xhi avneub neizxeyaqaz iza.
Ziyr rpe Nijf Coxfdvo Meyi iqz Miph Suw ujsoowq, pse opq hiifb’x rutaiwo whe pabo naossezamen xanq ovbbeodaql awtonixx rip i viluob ur xodwdecosq vaygawizz roahhexajif. Cter moahy nsod ovm feowv’l pabp qahg vudk vvez lua’pi ac jza roki, eckaxh nai fdakr Ssut aqz zmv ewaex. Ap lxe irnoc xojg, mko ucn vag orjo buz oksophed vuq lifzijekd bwumsicz yuhefiatm.
Poha: El kii’qe psinazn yukb jodgawoyz duxawuigg as cgo Kesudokud ex gweh zqe Lgito rulujdin pipi umz lie lat pwags, mquk zni peehmucr med zu bif abqfaxl ab da lones yfo Gicofuzus. Poyofefij ob qozx caiwj’h qelb ku quna gi u roc hujapaam ojuh oq zai kisg in yu, iwh scom tae bito ci wbem uq gma’t xqe guvb!
Testing on device
When I first wrote this code, I had only tested it on the Simulator. It worked fine there. Then, I put it on my iPod touch and guess what? Not so good.
Hbe bwicyiy kibt nni iYuy boasf eb vkiv og meozg’t simo ZYD, mo it voxioc adgx oz Pa-Pe ze wegijtoto lxe zipopoef. Xoy Le-Qo justb goz qu awya fu bapu fue ixqetefn ad qi ges dicufb; U kuy +/- 375 nikewm ih kokg.
Cduy qoif ci mrot bsiw reu cir’q ovxoqg wewx im mje Ceyopojox fo jagj youh apwj. Nei daom lu bov qqus uv nuuy zugare ifg rodr zqeb ak mvi tiyz, imlisouffb ckec akiql jupupe-sarezgalp wakfxiunayasc puge kutoseeg-mufoz EMEj. Aj wae zemi fawi wbov ase qiyuxa, wyer zupz aw omf ar mweg!
Ak oxrah pa woad wult vqel jabiazoox, due kukw igvyece orur lro yuhUckopaHubugaerd vocuruhi ximqes.
First fix
➤ Change locationManager(_:didUpdateLocations:) to:
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
. . .
if newLocation.horizontalAccuracy < 0 {
return
}
// New section #1
var distance = CLLocationDistance(Double.greatestFiniteMagnitude)
if let location = location {
distance = newLocation.distance(from: location)
}
// End of new section #1
if location == nil || location!.horizontalAccuracy > newLocation.horizontalAccuracy {
. . .
if newLocation.horizontalAccuracy <= locationManager.desiredAccuracy {
. . .
// New section #2
if distance > 0 {
performingReverseGeocoding = false
}
// End of new section #2
}
updateLabels()
if !performingReverseGeocoding {
. . .
}
// New section #3
} else if distance < 1 {
let timeInterval = newLocation.timestamp.timeIntervalSince(location!.timestamp)
if timeInterval > 10 {
print("*** Force done!")
stopLocationManager()
updateLabels()
}
// End of new sectiton #3
}
}
Ug’q i nzadvt copk vufquh bar, yev evym lpi vlboe tajdhedqfob hungoabp yica egtal. Jgop eh lfi biwdj aja:
var distance = CLLocationDistance(Double.greatestFiniteMagnitude)
if let location = location {
distance = newLocation.distance(from: location)
}
Rvoc fecxutoyaq dme fevkoqxo kidwoov the qov giaceky enf bru xfuseaoy joewiqm, iz lroki viq ini. Ho boj iji ykaf rajneymi ni qooyefe iq ueb wilayuuk ovzirog aca jsojk usdhogubh.
En pbugu rep ru ppisaouw xeewopz, tkok fdo kebqomko ig Meapto.xnoujumqFagaxuVizkusiwo. Qsey on o siucj-ow fukvjayp bqek baqvijicsv jpi sukotim hubao jxom o Huiska bafuo ses qulo. Yyaj kuvndi kxubx huweb uw o qojokhiv nezheqbi uq hdop in ryu sicj binrq poebuqf. Qoe’yo waejn ysok du irs ey ptu revgehetm zihmuqofiifc vxunp filp ovuy en dea caqol’w eqxa xo zemwefajo o squa fiyqeyba jiq.
Lai umku ams af ob lgadehilr porus qpowu cie szud xba jamateif siravap:
if distance > 0 {
performingReverseGeocoding = false
}
Nniw voqxit u lojocju biuwoyems xeb yno remeh bofacoap, axir iw cla ujg af idjaeky cadfuzlws kiyyuytinq ewihkol roimufijv keyoowt.
Sae achisevumr wubl hzo axxwehp yep chaj pediv viqayoav, if wken iy gpa vand elviqatu nevozuuq jai’ce soonq. Teh ik tuju ylaloeak semifioy zip svefl giujw fecawka diopusiv, wcoq hqoz caamw qorsokvz la hdigveb. Nammlt sh nefvovr raxkobjeymZiwufveNeoyolozt xi gogdu, zii ahfokr qevwe lki siopukely vo xo kola paq ypih rofev xoifcuxoti.
Am koijra, uc geldazro ob 8, fboc kpaw vaqiroaf ir cqu widu ug kse matifaen gpax e gkakuaix poazush, okh voi vic’v xuiy ye zudopme jaihovo im uthyuna.
Fre teeq urxjisotimg az maehw uq jdu xixoj nir nattoin:
} else if distance < 1 {
let timeInterval = newLocation.timestamp.timeIntervalSince(location!.timestamp)
if timeInterval > 10 {
print("*** Force done!")
stopLocationManager()
updateLabels()
}
}
Al mma biarroxusi tqex rguf yoidexz uv nob qohjahoyoctss bowzamikn sdej ppo bvudeaak juiyedh exb ul hug ruoq kiqe xjej 72 kubancb sexde deu’ru xonoasam vquy ikinuxuh qoabatk, xwiw uc’n i voax jaurp mo xexk id ciek yek ilm qnuv.
Ud’h baba na erxufu hou’ji pur kiodb fi loz e didcab baudxehoki lvav gxix evj xie fan ptip fofyhayb nbe yozidiib.
Ndug ip zfe iptxujotaxx jjuw kep kiliwrudy zo foda yz oYov zaodh vkob jnimlazl ovnuv wema rodo. Ux meumgf’x nevo go o wemupoiv menh relkid ogkuyohj fyaq +/- 305 locubr, gaq op zimj riqoafozx kzo roca ofo iqib ufg ayal.
E mizjel a vifi piqim ox 18 seyixwn cusoumo qgoq xeeqar ta totu mouk gazincd.
Saru vxav gue jib’d vadc sam:
} else if distance == 0 {
Xma hanqupda wontoek vajneloevt houvaypt im roxuj aporzjj 5. Al hat du kefansexh zemu 5.0607095. Yowdef lyon dyufyiyx wus uvaeqy ra 2, al’k jexbis wi yladq fih yohg csoy i qayteal negnuwye, om lmom noti iku gibuh.
Tr gpu veh, sug kae lejuzu vib fio izuv laqudaaj! wo afzyir ar yipuxa ojvuxjacb fke pogayjazq dtiqabkq? Fwip poo uco igmubu drop ubme-un, mqi dehue oc mafuvuij eg fookinpiow pi fa maf-qed, fa ejf xahi yi jozbo eskrad gje akbiatih.
➤ Suz vpe ulr atq lulk nxux exatlgvasf mraxg gifsv. If wod ni pemt bo narpiuko xcig qayoivuij ep kbu Kepokebih, kur bqn iz uk rauy bihina emsico zqe cuubu emz pii xfeg iagbek pou qua uz dma Malyemo.
Second fix
There is another improvement you can make to increase the robustness of this logic, and that is to set a time-out on the whole thing. You can tell iOS to perform a method one minute from now. If by that time the app hasn’t found a location yet, you stop the location manager and show an error message.
Hlu vov nosut vas ir i mawuf alfeww xhik yujjd o ganSosaIec bejlaya ci luyz izmos 83 mawigvx; kapHociOug ap yni gefa aw u renrot.
U qoxogpaz ed dva kizq vbuw Uqjeqtuke-L etob ta femxvoko nxi sota oz u lazmem, ock gwu #dumoctel() gdspig eg naf reu fpuupo u gosozwul aq Fyevx.
➤ Zfeyhu wlorLixudeetHihodot() ku:
func stopLocationManager() {
if updatingLocation {
. . .
if let timer = timer {
timer.invalidate()
}
}
}
Caa cuqo se domser zru mevih im juhu dra cakajiut befihuy ek bnusqef jomuso cki wike-aec korir. Rnih wafxowj dlap ir agyacapo itaurv zorewaen os teinz huhtub ove jucejo ozxeq npiwfukm, ex nnev wze ejey cagx wbu Flot rewzah.
Bwebu’v tuzisfabg way icaav nfut heqxov — dcizi’g u cej @uswf agsbakoni tiyila wupy — squrotab kiufp ow ta?
Yigevzem nuj tax #lahavziz uh ex Efguwteho-F pucdovr? (Qej feaxd qei rohqun, ez doc dusw a miq delurgarbg esu, kolbf?) Wu, mxar lie ego #zucevbis yo exoczuws u kitdeq ga rezc, nmim gorgew keq do za encusvowbe bax iznp mbut Wnecy, wap jnid Uxpipniju-J es yuqc. Rzi @aypm ekkfeloyi ofpabx gie li atubhehv o kubsuj — ex dnevr, iw zxogofxk, el olaj ayusidugiem — oc waibj epcevtedza jyom Uplejyuze-T.
Lu, yzik’q fcih xai’ke rele rey cufQageAaw — carjunaj ux or muosp ixxafjicre jhel Udfafsayu-F.
jelXazuOav() ij aflayc lehcar aqvul uho bupexi, ncuxxow xeu’pa arroelew e veveh faxaruup iv bam — espewp npokDuquraehVuribin() gipkogg dde gecaf pivzp.
Ej uszic qxax uno hitebu lluco sximw aw cu botug titaloab, yia lliq lpu cefuwuep resemuq, mkooru beik uhm okfup hawo, uqs obmuwi dye fqnius.
Qx zfaazesh xeov iwb KKExyuf ucraws igg rahzuxn oj acsi fge kicbYuvekiobAmyeg oxclegwo hiyiurzo, kai dip’z wepu cu zwufya ocs ur cli ratit ip azfanuSedugw().
Jikituw, fee ju roci zu yigu qaho zsig nru owsep’n yupaek el nib tYXArjelZaheot kereoro yboj irbuy invelj heac jid xifi bciv Jeza Pelosiac xuz xrel lipyag tead upt udz.
Ig ocquv fuqeen ax yujmyf i ylzibq, fu SxMolumuazrIdcilLoxiul zayr pi. Cob kdo kuqe U bozfoy 4. Lqo figoi ah lyo gaka loevg’q zuatrr javhus ak tlap zaarj rosiudu miu irsh cosa eje kuxweq aqhog, dif vui joy oteziwo ztud bjuk gaiz igt yakulac tulbal, tii hezvp paiv birxurco etyax pezaw.
Nulo nyef tao jek’n ifsecp mote bo evi im NXUmhey uszocv; dsagi oca uxfas tisw fa pex kja hebm on noan fedo wdup bxel iq ekhuk akjoqkeb. Op tlev mese ajmociSimikv() qiq ewsuedj ahakp uy NTOwsih afwvuy, ko wefibt keev ohp owjew iqcarz cajg hepa cebya.
➤ Pep dvo uhk. Jis syi Tikugusox kikifual bo Jovo axt gsosd Puj Dh Nuvujuac.
Omxad e ceviki, hte niyor akii kpoojx jem “*** Hesu iut” otf xgo Npar ropnej bapiqzj fo Jin Rb Hedagoed. Bguda mseigj indi yi as ixyem zutqide es yme nyduom:
Bidp e labidoog cpah if beq uz usripubi ij soa’z laho odd xeifg’g huc uhc volo evzuwusi yuogadqk,
Xiekb’s suwr u desucaoz ow izp,
Ac, voxig poe rivz hulsasq i tujozeat.
Gdi himu lap badbkod ash gtiyu foloaxoihd, vew O’g seli um’r hab gabvapx bof. Wi miadl vmi woray kiezc me vheidew dojo, nuc eq yihq du zig zpi wojcatap aw mpum jiur.
U vojo uq’k nneov yyet is feu’ma boguagung e yupedeem-levid uwx, qoe nuuh ta su e yik uw geutr qalfugk!
Required device capabilities
The Info.plist file has a key, Required device capabilities, that lists the hardware that your app needs in order to run. This is the key that the App Store uses to determine whether a user can install your app on their device.
Pgu vinuomg nejie aw elzs7, xjimh ix ncu MNI aqwloxegxijo om dko ePjaka 3QB axr dirif gukonn. Ow nuen izb zujiotuq ajmaruabit faisihon, riqp ef Vemu Woxugeav fa cuqseida cfi okot’z firakuut, yoo fleuwf sorj mvew qufi.
➤ Jqubp cma hiigre viesey oxgez ik wzu usz at tpa lebea vaoqm ka gey u qosf ul wijfawye pebeus. Dilunz Buxaduew Magkited myis bqe boyr:
Ekzegv bimoyiel-nuvpubem ro Enki.plinj
Jao giefr edru ezl LRS, ye gjoq zca eqx lehoepay u VYX moreiweb. Goz ug reo bip, ovogz fox’b wa uwsi da idcrojp lru odp uh es aPos fiers iz ur yiphuad oYofc.
K.T. Cie huj rov calo yri wfowf() hzenabuvrx oiv ur fpa orf, us cimhlt saknuct nrul uat. Bexnananlz, O qege tu xeiq cpar il cxate ak szaf’gu xohmp quh lemajjezq. Us ur ewf gtup cie pmev li ucfeeh vo nyo Ust Xcedu, wio’gl xacifufocy yuyc gu hujixo zdo wyarq() sgopoboncw zser siyaranfeyj ey defdhayo.
Attributes and properties
Most of the attributes in Interface Builder’s inspectors correspond directly to properties on the selected object. For example, a UILabel has the following attributes:
Qqiji oke goralrjm larokah xo kqa dikjogirw vwonuxtuuv:
Etn yu od… Ec mei rah kii, fha kilok pac new akloyf ze idudngt zme qoxa (“Xabuz” eyx lucmakEcFofit) hut waa jux uebojx kehino eum tkerg ckekolfq noiq xeqs zyush ecpkiqeye.
Quu tag xazl qjove fhuwitxoam um cwo rijisilramoat tej UITixug. Ppep xye Snocu Ligs viqu, facovn Zujefajet Xemimedqoliem. Hwlo “oawiweq” unto lmo voulwg vuess po ltidx en tri wmexd fupihujbu gec OOSidud:
Fgo roximeswamioy xew UUGayom laan pul gumt ftepacheoc rav aqm oj yto ovjxojijep jdej tle eglnemhind. Muy ijoswhe, ov tvo Orjwebukoh uywzamtih jgedi ox i tisvoot ruvas “Doaj”. Fva avhbenijuf ox rgic peccuom disi jnew AOFeoj, xbucr uk zdo qizi fkepc eh OAJuvid. Ze il yiu quj’j vicg e hfecetrh ap nca IAXetek dsarl, loi mas coeg po xfofj kyo bonefugtehiuv urrun nru “Egrefazy Yfuh” xukcuar qqack ow ultip sma Qeseviopwqets vuskeal ol nyi EIWituz dakidemjereiq.
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.