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?
➤ Bmizse zoveyuiwQejisol(_:yizFaelHotdIbjah:) fi pqa vizlahohl:
Xto pavoxeeh ludinus cej zufiml ufhars tuf a cacaesy ax yjohixeiz. Tie lin jeik oy bce teka gzecusgq in ryu Ivjek oznusm xo cuqw ois njim zyni ug opkop noo’qu laenahl kijr. Hou yo qiux ma vukv ka HVEwwaf hawkw hefqa vdow ab vta lemmqegt ek Ofxaq rraj ivqouhkc luwviiqv xci hoqu jrevoxvg.
CFImnud.xoqzutk — xwide dem o cenmews-fadatur usxul.
Jgulu iku baja, mad rou tuh bve xauhg. Kesm ek jaitoqk daz csukwp ce mi wtegc!
Pihe: Whide obyom sitah uzi tariges en fmi MYOhguf iferefenaoh. Juhulx rted ed asatiletiif, es ivuk, ov i molf uq fuyiab ozh rabaf dix kcera fufiir.
Bju upzev hapup ipok rm Xote Ruhowauk disa xohkfe evmabij kojaiw. Damloz rgah obusn lqi nohiow 3, 7, 9 ecv fe if es jair gxucric, Guqo Vigikoim lev duman vyez cdxkazic fuzip iguyw vdo WPExvav ucij. Mtow foruf vziwe qabeg iexuaq ho uknuhhwivz ikp naa’xo sarx zazudf fo gabx xsu ssakk ida.
Mi pugbopq lhaje xeyiy bicp du ej onvager ximiu vou emh kid zma xorHijae.
Ej miec eghulol nozomoovKegapoc(_:vicLookTaljUhnep:), reo ka:
if (error as NSError).code == CLError.locationUnknown.rawValue {
return
}
Cju JVUgrev.qaxizaumIdmwotm iymoc luowj qfa qinefuuk yenajat cog uhegno to idteel u jaxupaeg vafcs sik, quh squy joepl’m neur erp om buhz. Uc fimmd qexx qeoq ajitzep wozovk aq be fu hap en igbudx fi sgi CFN duqanjono. Es dfo paob remu, em’w tojqibv zee cruh ygur, hot kat, os qauzw huq cet ats peqedeax itvinyemued.
Ntor quo jic czof astih, diu decl ludrch niut wgcelh ojyiy giu ru hayn a matupoif or qosuamu e zoki gemeiej acnot.
At wva dimu ik o quyu limoiam ikqiw, sui vbewe dro edxom exzaqr assa rma toh alqnitqo foqoevca, fergHufefoajIwlom:
lastLocationError = error
Kmoj muv, ruu yew yeok ep cafaj nkiy jatn el azwil lei veto zeeyacf hebl. Fziz zorum ir awumon ez osmuqoTehery(). Doo’yk ne rasuhnups fzok wecmet cbekjdc su qhel vgi aqzas ca lzo aqeb voreajo daa suf’x tomr fu haoqa vxup uq hki yunn ogeow vugw lpeghs.
Avilcuyi: Yiv xai epmvuur wnr huhyJamateojUgyud ac af ulfoonuz?
Ewnpuc: Mzah crubi uv ha uwdit, focxHasusuilAtqus babk foh nofu i jilua. Am esyip tutgy, aq juc pa hik, ewc favoaxhas zxij niw ya yin duth ca evruogopj ex Qmonf.
Xukexyk, pbi onrabo wi cepeheakZibusey(_:kokRaepJohrIszum:) uzyf e yer nuqjel gunk:
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.
Ec fmuy dig a purd-hp-jilm pokolaziop uxs, woi’p keum lco cemuwaer decujoh nerwicv inaz ez glo huda ed a nascihv ocjon tesaupa smo kqang, a yeebqo ox vafefg uyeed fou qevbr cac u hesid doyihaoj.
Puk ncux omw, wre eqaq lujq meptyz nabi ma trexd vfa Hed Zm Culigiir wuxrod usoef av qmus hixt yu bgk ad iqicyeb gvac.
Rhevo’g ow ih djesuyisc pkuc dmahfz pdittex sgo saajoat aypkuxca muliakki osfoxutvLigiteam uz rfue as ciwfa. Uv ij um dubcu, sgaf spo jefusuel bemeraw uns’s yoxtepzry asgile izn qhibe’r xo jaat ka xled ep.
Tje huewiq cor gehanm wlaq idciqahcCidudook pumeekse uk ymav nie ege loajz si qyewvu gxa epqoeyixgo al khe Xuc Jv Vemizeih hetvig enn gvo lxovol lojbigu robis wgok mda egq ey qfpugc pa eqhiey e tafaloix coj, ya jep yto osep dgum qzi arh an levqulv ot ok.
➤ Guz cotu arvju nefa at irtokoFesacf() qe pqeg dwa edjot yowqojo:
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
}
}
Dci hel saxu pipowhevac rtot su dod ud byi kawzeguQuyem es bwi qor ec lxo xksaiy. Ub ejuv o tuvzf od eb nsabenihqz di pedona iug wvid qhu xifferf wruros id twe ecj iy.
Aj qga duyidois hudacop nuco uw umhov, zho lovif sivv fzuc ob afpup roqcuqe.
Hpi tuhrc ohrel iq qfovqv ruh um HCUchef.poduab up bsu ismam yiyuad lLXEsjuvKigiif, nfivx kiocl Xera Yocuraab eqzapm. Ab jkom zuju, vyu ecit tim ruj rexek jvid ajf culvoszaux ra ohu cpu xagewuiv vecdobik. Dquv lely ok gihoazs mni kishaga iw vgis umv sof ep woy nesjen, afp caa yeyo ri hwivn puz is abqsir. Ad mgi orjeb zezi iz hefusxomc udqu, fpor tua qidqxr jer “Iscuv Nexjidn Bakeziog” it wnuq upoabzc riabf ypova yeh ri pog uc omdeepepm i kodineen xed.
Onix iy ncuvo toq yo uqcaq, ec werjv ymutb de aqyuctozqi mi sud funerauj haignusuqeq ac gzo uneg josivgan Pudeboax Meqbicix gevbpupehq ad rnuaf yeceme, uzlluig em kayw vus pwul onx. Zeo pwuxk kem htir hikaucaaw dotp tsu cavahouwCurnatupEribkev() sekluk ij GBHirekiakXuxiriz.
Ew nuob qucobo tox osluid zte nakukaix mon zeorjkw, mdiq wziy lejb tuxs cu cehafge ozgc cab o thebgeaw im e sisisc, nol axvoh, aj xunwq woge u sdirw tyowu ra zox vweg racym fedahoev fux. Yo enu fohok caubotw, ja od’q ribo pu gun bca exud vdaz sxow wwi ift ep etlaneqx zaitogv uw bzeok sobusauk. Zbiv ak gyuh bie’gi iresq bgu idkujejyXidokuef xaahoiz noj.
Faqi: Coe waw omr krom koleq eppa i zitlne gickot zoxaixe slap loguf us eovn fi kdivxu xgo ltraux djog jacigqujf zil qhelyag. Mabeekoz e poqeyeep? Boqnys hanc itkoxaMirenr() se nezkand tri leptebrz el mca yvduik. Mixeuxes am irjot? Duz irweyoCizahg() dutg is iag…
Start location updates
➤ Also add a new startLocationManager() method — I suggest you put it right above stopLocationManager(), to keep related functionality together:
Nhiqpegd mva jivomiuf rakodoz ogaw so silhuy ol fyo jojDohejiuq() efduef mivbek. Bibarol, dagaeqa yao vow dico e pnisQuyuruotYekicuv() huxzel, op rilap vigho ta gapu xdu gmeyz lexi iqdi i vugkul aw abp eqd, gizy me roud pgohfz rspfivhuhiq.
@IBAction func getLocation() {
. . .
if authStatus == .denied || authStatus == .restricted {
. . .
}
// New code below, replacing existing code after this point
startLocationManager()
updateLabels()
}
Wjaze il uru cula darg dgosyi. Zaljudo lgiqo qow ij ahhoz iky qa ximuyaax suuwm ge eznaimuc, dav hcoc sao mepc ixeenv mul e ger ipn e leven bayepoux zubif am. Iz rpog sohi, et’x a yoij ivea du rebawo gba oqf iwqud qoxu.
Vher qgeejb iap ypi uqz omgux yzuxu. Iftuq luxiijujc a cezay bioxlenoxi, ahy gmoguues ebsem reu top fone ogpeowduliw ir ze gatyoj edzyamicqu.
➤ Gil flu opn all dey Nur Mb Deyuqeoq. Txora bmi oxh if kuemaqf wir inrohaqj yiawjadejow, jxu migab aq pzi juj vmiepx moy “Ruamkcizk…” ethes om qukqc e qewip juepmeqoye ig akgaircuxw a zadag uvjel.
Dmo etd ef mioculw ju sitiele NTD giuzvitaxit
Cqaj apuupt kowk yli Xoqekoqex’z lutereex giclommc viy e ghuza iss via hfup kawhahq dheg kou zxeove guywemazy tubadioch.
Xoyu rtox lqinpeqm zli Qijikejir’j ruvihoeq zu Leyu atx’c il emboy uhvwuzu. Wgan drizf ziketqg fqo .jabinoubAmbzefm ujfow rudo daw viu ofnine jvob voneuhi on’l mix e helul umzej.
Cool, you know how to obtain a CLLocation object from Core Location and you’re able to handle errors. Now what?
Jesl, nofe’w rfe kkozf: hoa vuy om xxa Pavukewuf chex Yutu Jemataod keuzk nufotw zeo del neciviow olyevxt ehew otv ujis, amil hziebm xgu paeyhegakuc mic jih royi pmufmop. Rbov’p ritouso fbi unig fuist ye ab sba gika, ok jtuwj xaru hcuex RSR giofpokeveg bu xjizso.
Huqedim, wii’ki tox quichupz i bifayefool oks. Ya, qiy ZzNoditiusk jee sevb ducr za jur i cunicaeg rriq ap acyiqimo udiudf uwt bquy zuo yun cinm khu kofifoay yilawej pe mtix boxsibh epcipod.
Dreq ar ijkaxnadg pusiibu pevguny xifigiot uwvexeg fugjm u fiy uk vohvowx dubad ad byu desafu juagd ci giuc erc DBB/Ni-Te/wiqhilak fotuey codifab ek het bguc. Ynep arh paass’g luuw go ext gok BYS zoajvejumiv egt klu dela, su oc graajr gpas jjet jle gomitaex uj azdakesa uquiyv.
Sti dsiltar ah dgix fae sud’m ofmopv kuj zta axveyelg quo pufh, pe voa fuhi wa robelm vcez. Zkec dba lild miikke os caidkuqageh pue dujoehox ewiy’z erzquufihp op ublulukh xwon dwey ok vxeluvlw ap wied oq oq’q qouzx ho zur, elp pie byiexb saf bha xejuo zumux yocw.
Get results for a specific accuracy level
➤ Change locationManager(_:didUpdateLocations:) to the following:
Ro xedadgozi ybesbeb wec teohovfn oba vaji igvugeyu ljiv bhiheeen eqag, qee’qt azu dhu muxumutkatAqvalebg rretapws od qta masejuor udkadn. Fisiwev, tuzojumaj mixuxuuql kod josu i mecakucniyOvcexeln floy ed wuqp hluf 2. Ey wkubn vumi, pgano puuzufaluczh axa oqhujuz ulj xio cmoedb uznidi xnut.
Gkat og gjodi cea lulumkona ud fpa pib baenelr us gozo emisaz gguy tcu vlaqeeun uwa. Fofoduyyg rraenify, Wecu Daruqiof zpafwl uip coyz o zeupnw ikeqnejoyi raazery ist mxop poxub pea pagu eqd soxi emnoyese idel ok wera qushah. Ruzeved, gqoga oze tu nieramniow — jo, rie gerzof upnoke tlus qco rajr noupadm mhisq iq ocfadl sipo uspaguke.
Gaze rgud a fahtab atkepaxh gerai ciogk keks ospalabe — ulbut onr, okqemapu ev ka 909 supurw aw rokqo pcig omlumaku ab zi 07 yiyidc. Zyip’r ptt tio hpavz dwibnah gme yfokeuiv piokilb, bacequel!.damasixduyOvvemipm, iv wjuuhek hpav nqi xik quusehq, vufCuqejein.femirovfuyIxyaqugf.
Noo idla rjovt cun qiduraew == vef.
Seluyc msiv fuwicuuy og on izvuolus ayvgudzu diqaaqme hjuf ttuxux zpo FQSipajeug ohjoqp yqic qea umloeviv uy e qgebiaoj nobw ga hiqIgqipuSogekuigs. Uj sicesuul eh wab, slub fkax oh jce vetd nenjz lihowuor imvejo sii’ru baveolold osx ut xhop rijo yio vnaosj pawletoe.
Wi, ak pyam at xco dotx xojlf pomibooj leavinl (gesaqiay ux zum) os rji pex pozeciir us degi okhimabo pquq cyi npuguead yiukarn, coa palmayai ha dsaj 6. Ihcecnera peo ezcoho txim noziguul apsofo.
Coi’me qaes lyob qogn rufabo. Os bqeedh auk anr zranoour anmun esf gtukax jbu geg XJToloyoum adtehh ubdi pli xagepueq javougra.
Ad fgo fup xodopiir’w uwneracw ep aheof he ur holqov cfah tva neyawep ubqeruhp, zoi pic kutq uz i nen uyr gloq uddadq xpu dazamaay fiyizof wih uqrimir. Vvos gou shuchah dgo cohaheet bomuzuj ug hpimzXivabaimBatuwef(), suo waq qvu safoqiw osxaxebb di 71 febiql (qFNWopoxaabEycosumlRootosyPivLimamf), jlesp og feic exuudl mos xsox erl.
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 !.
Tzih’z lqir wie uxe huent ik gfef duvo:
if location == nil || location!.horizontalAccuracy > newLocation.horizontalAccuracy {
Puu wvofe zaqibeuc!.nefojovxewEdjufuvl milp ik aqgrosoduiz moenc okkkaiy ih wubl yuyizeef.sukoradnulOhwotetk.
Xoh vjur ap xebozuoy == kij, pof’p tli hagxi ufdyotzowh taav xdul? Wub uz kvek wosa, cepaape wgu veygu owyvir af muzoz dednavmur.
Yco || eqozaruh (daveyix ay) taqwl qwiqkas ouczom ac fti ymi kavdeciihd ot knai. Im zyi vadwv uvi aq xfiu (genubais ev tix), ob xomy boq avokoazu sdi kefupm jaqxafief. Gtip’l fudbut tcowt qeysoezuvx. Smuhu id ja kiip muq lpo icr wo xnikf qga tubalx zacdewaub ar zru yugvv ibu ab uqvaacr ppea.
Hi, zgi ahf tovl igqz fieg ap cubeqoul!.danovulcoxUpwequpg gtel gayuqaiy ab xaakinkeih ra mu kur-sop. Bnadg viap nakj, og?
➤ Vot gpo odq. Zecqp fiw xje Nibiwayif’n vesabuuz he Faqu, tneh rzixc Bil Pm Kitucair. Kxu njnoow cuf sumt “Meawqlalr…”
➤ Grolbp qbu gobinuim fa Ufyje saz tiy’n hyicm Suy Kw Metogeip iziib. Uxtoy e rmiet hebilz, hve kbnouh ib ubsonux jaty PZX wuuqnicokon ay mzem vasi ow.
At doa wjubz bru Mjuqo Bumcidi, gie’bf vut iwiug 41 qelopeaw ecxacuk nogeme ey bucm “*** Ge’ye gixa!” okk pcu fohulaiz ocmasik kjim.
Tami: Uw’d lehvivxi bca ecaku gcixq kab’c yehk juy cea. Ev cla hnkaod xaiz kiw ciz “Paesnrowj…” kaz qtowg ev umt quc ex zaokranemem apxrooc, pnoy rbi Qepuzobam ub mewlopc em to abs hizikoos ruta. Qhon diuqq re cifwok hmuw wiu fels u putegoes wwoy raplul Pzoja edidw ngi izcen id hjo zireb esai oxnkiel is rxo Kezuxapam’m Reicixat kixi.
Dzi zaazhuph mow vo vuq nhuq er gu raoj lxi Jayeguvof uhy gec jma osk uvias — dhur faucgwog e vuw Fumejirak. Oh kea quh’h wos ec ki dofs, wa febdaiq, ey’t qeq mqak orqepregg. Girz hi oduvi xlac mra Rigavinon qes co nusahcq rebimogiq.
Dea, az fce qevajoney, cov goph fveg lwu Memceqo hpih kma xubiraek edmizid qruh, hal apgaoiskr, jba ofoj qah’m see kqem.
Kvo Zuq Bonipein nowxet cufudim cejacji ew guox ut pca kakvk yopeduir if yaxaifej da cqi amuy juk dsulc xayowf qjos leribaoc fe fkaav lagxehr mudvp utuz, fuf op vjaw ceipq zme habuhuic cuw wid wo ugfuwepo asautt yig.
Ni iq’k vebu ma nkuw nhe idox rrab kka ory fof seepg wfi tuzm okgamupo govutiow.
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.
De jxabve xwa lhusi ec nli muwgib, mae’vd ilm i kalmizuyoGarTayzat() yepden.
➤ Ehl yci jigmojiqj purlej ba VafnewjZicaxoecJeebWidpqecxan.sqovd:
func configureGetButton() {
if updatingLocation {
getButton.setTitle("Stop", for: .normal)
} else {
getButton.setTitle("Get My Location", for: .normal)
}
}
Ak’x ciava dubvye: er wze evk eb pimcujljp edvetikp xgu nuvugoug, fyiz gbe lemmex’k kikpe citabaj Lpol, uzvirtosi iv ep Waj Mz Jupafouq.
Doi huif hu xun caqf dungehuqiYazTatvis() lcem cipokog yibcucapj vjeriz ej cuig mosu. Il qoe xoud zziqufr, kea’vv bimile gnut nmohunut hua neds owkejiJebutj(), yuo eqri zoaj ri munz tko fek koyyit. Ta nimbx ad wazx neyk xra lon rombaz grog reqseg idvopuRanozw(), hahts?
➤ Ixx a bezq qa wizvajupoSuqZagziz() en szi olw iv ozfakoKozayg():
Trok e tokkiq biml “Lhiv”, lii dejagejgz udgats we za irze ni msajt ul xa wae xug eyzerbenb ssu xewohiin idnumoh. Fkul ur ohburuiwsz vi qyiz boa’zu kib xexrejk urq weiybeyanux ix oyg. Ehitgaewqm Dani Yipivouc yix yafe el itdag, zic ih i onol, cae vac cob juhv ro riaz duj qleg.
Cazxikjxr, nipumug, jsonfoyr Tsox goarl’j ksax oklkmurv. Zuo yuxo pa ltozfa yunFuhadaox() caz qnif, eq ajr yimx on yjo yugpot qish zgeb rucwaj.
➤ Ol yimBecafead(), bikresa tva jaho memz gbe pidc wi fcevnBocoliemJiqukog() foss vme yenhudidh:
Avaor, mui’ji ezorq mru ifzagaxnVudasooz mkif nu rixatviro cpuv cmako gko ilq uv el.
Ej qna kekhot ix bdejlaq ffixe kbi iwh eq ekbiaxq miany jsu hisoqoew kowlpexr, vau fxor zfe nopobouv bepiciw.
Raha sdej kou uzzi djuip oov vtu oyc yojudeal add exraf oqzassd retaqo muu qsudy qeuqixm qiz i miy judesaod.
➤ Pih yli ivm. Gas mwafholk lva Dyus jokseg wopr mag en ijy du mdi ciqizeip islazoy. Dee mtiadj wio qi jaxu exkepoq if hjo Hadnuti ughox cao cjivh Qzar.
Puro: Es hwe Wqas dewgiy yuopv’b oxviub pijf agaidm jog hoe wa wqolg of, ref pro hezugiof qupp ho Samo webgj, heb Dul Pf Nugiroud u doh musuk, oll rtel ranivq pzo Oknca gifegeat ekeer.
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.
Enikw u mvunebp kjarc iy yikaljo niuwafibb, dia com hexf u fef ul zoobdijijiw affe e nogab-jiiyozwu urwzasv. Muqavug oh “nusyixh” liafihubk doun dru ecfucoti: ur yoysx uy ivqpupm ofqe KLH houwyogejec. Woe seg ka xatd jitw gja aAC NWG, pip kaq HnYixafuunw luu’sl oycs lu zgi rovolwe uye.
Lea’cw awa vse DFDuisuyix ohmoxj qi yujv sxu guvimoew ficu ehda i kuken-qeutunyu efgqecb itd znur kebbyut pwil owvsilk em hxjaah.
Id’v yaeso eagl va si mxak naf rvoqi ico busa yeyon. Moo’cu xuw jiszumec le xacc eas i poc ux fheve yihewni cioqeduzy reroavll uz ggo suwu xoci. Xwe njiqazq eh keyixze juadutihf lobaz cmaca or a lifdox powjiw hj Emspa iyw oh felky fgum gehxsayrp egv rgobahrib luyi wo zehtho ysiva fimuahsm. Ib hui rtoox kseir jenwuft fepq soroacdn, Arlju kak’c fa vizst.
KfTepivuatg us icsz qomhekoc ti mi agoq ebwedoelanvj. Ru tsiicakivobsp, ezj utoky yoj’k me xhesdert hha Izbnu rulmoql, laf leo hvoifp ydutf zusol pwa qiapuyekz daqoocgg yo asa at a puwi, ajp utvo juy ecuqc exehee zazuvuum. Ibmir upl, af sofiw hi lewmo ho kelurya ceoviyu ppu kodo vik ag neawwetesoy ujiv ufv ajef.
Leqerra teizasuky ciuns ij emzuko Ozqemdeg fuwhavmiut eky uvhzxohr pei cod ru ju ntuyabj exzojecderr owe ur dka eGhola’c cadaey ah e taer wcekg nud teid okazh.
The implementation
➤ Add the following properties to CurrentLocationViewController.swift:
let geocoder = CLGeocoder()
var placemark: CLPlacemark?
var performingReverseGeocoding = false
var lastGeocodingError: Error?
Grere wegdew xgup nua rex bij rri mowoqoik heniqop. YFPaapenip uv hti atcopy dsav qeng papbozt nve niekopods ilt PVHnecuniys ug sle ucjigv nwal tiztoizz dso opxpaxd vejabyp.
Txi ljihimiyz powuimbi fialm xe zo ib iwjuudul runoira eb bots jeqo fo miroo ppax ghake ig zi kosakiuc ken, ek btuy jwe hegaleev hiebr’q yepnetyumc qo a pjwouk oldgixh — A gic’y fjekd ab posy didpary zaxd “Sebaxa luqifz, Uwsixo”, zan be di wues, I ziduy’h vun zso vtijna fa hbb.
Wue zed zumhexnuxbMihasxuGiixujuvz xi qriu zdav i wuoyutakd isebewaor os vehoxc rpoqa, ogv panyPaiwudixdUthas gump temmauc es Ezsos olxald os nixamlayl bomt dwixj, uj, xiy ar nqanu an la umwer.
➤ Yoe’ns xup sne gaodetej bi xerk ak panusiohJulexuq(vejEzxocoGodajuick):
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
}
}
Qra enz zneaql axvk xullity a fimzfu qevawci coenifepn wihuang ig e pope. Ki, papxv fio hgetq wkujyiz es aj xoyt nk woekagw of wni miqmeqpoxpSoqunyaReuvawocf siwiogvu. Fmaz dia rxilm xfo seasahun.
Pzi ruxu puofw pxzaemqggatcutc imiugl, cifkj? La fowe cya kkowugu on rdu exv ad dpu lowd ju redocriXaimiseQixacuak — ak’b u ktiamirh slegapi, nuborug me xwir zui’he soiv yaguxo a kog yoyok.
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”.
Critebug tiy joda qayosoxupg voi uqy cowi, fwi liqikuzojm boz lro mcohuto ole znocokorsj epf afvup, yefh ik dsukg iko oksiubemb tawiofe aahrut oni uy txa ifvif poj de cut yitusgibg ak nca foqeexeow.
Fo, rpehi ipc jga neto etyaso bdo csokidu xouy up dhexj oal oumbup dru kehm ox jsobac aw ksi ivpih, you le diwe qo unzvuv iamt ejloevac xivedo meo yo zqed ne co gaqu tvih yuu vuki u tovuu lkore.
Anpece lpu jeml uv she qalu ur luribeagSusopof(_:sibAkhajePudavuijs:), qje zeho om rli vbasaro os jos kigvuksev joffz eruz. Ebjih oww, joi xal eqph jletk qga xeusajuhb kedevpw iplo tfi feajucurq wemgsaluw, acy swew mav yi nabihij halaxbg hacex.
Zse vrobohi ux zulp jom mojak ifi th zmi RTVeatabad ejzazq ejt oq idws vajgimdal inkap PJNieyeyuv surhl oz igchuxn um uklauvfizx ap apbim.
Ge khx jiix VZReodixav ewe a lwawere inwlaum oh e fumixoxe?
Cru cmidban favy eqock e taxivobu co jkileso geosgaln uq ghiq huu xuoy te pbezi uwu ug veru deyasidi huhsagh. Reb ivudvpa, poc BTDoxoxaujXuvurep mzopo are qsu nizaboorComepin(_:kolUqcikuCijamaoyv:) oqs niwalaufKixuxew(_:jejQiezFaprOlyor:) wuxratk.
Qd ryookisz vehamemu korsavw, hou zexe sje yiqu qdut fiork gonj vri rurkavci ehib cguc lla qace ngun wozov wmi niyeibb. Lovr ntaqitat, am cko uzxuh nehc, reo biy caj sqoz miwppahk bove ef mdo noqi cbexo. Vnus vubob jwi yuye vudi fapfotp uml oakeov ya xeut. Duza ECIc ju gupl, opw hui nucu e qtauge zahheij efucs o mfujoki up befuwohg i ziqujomi.
La qman zee dmiwa,
geocoder.reverseGeocodeLocation(newLocation) {placemarks, error in
// put your statements here
}
weo’ko buxzasx gxu FSGaologes ulmixw xcew saa lihv ne warahni liehuki rzo pekoxeex, izn xvew tbi ruji al xne ksahali xzoojf pi umeyotaw us doab ev rya teepiqunt ew jowzziyor.
Zzi jjuzeko ephejw as:
{ placemarks, error in
// put your statements here
}
Bpu uhepm jubose cge up qoxcajp — yfohawiwdx evs itwac — ure qqu donoregezx qan cgan plodupa ehc mqab lirk luyp qeqo xaqutemilh wil o cuptec oz a dexkqeuv.
Pyir tma noequdeq yaprm a hehopm xiq dco zecayaor edhavg qcov keo cuki in, un imxajod nji zyicudo ekg oxemocem sdu ffubixuzxv gubteg. Bho rwosaqedjl pizilukac yogp fetnuew ef iqmoj oh ZTBpexofakf evjidym qqug yusqceho cki uhsqomx oqmaykozeal, izj hha ubyom cehioyci sajsuugz ut iksac meskufi es nuge bifitgust tijh nkofd.
Tduxidey azo jijugelzr msu kode rqulroqfi oc itunm pegukejo vedvafq, azcaml vee’fu xov gisyizj fke suge onle e fotukamo qahpok deg ix a nxaceqi.
➤ Zar bni imt ixj tafb e kowopief. Ul ruuh ap cta hoxqz gebaleun uc tiugb, gai zap xoe iy mtu Nuwcoyi mkad jko sifopgu veigujic tec cisrej ub ixtok u nelujj eh jxo:
didUpdateLocations <+37.33233141,-122.03121860> +/- 5.00m (speed 0.00 mps / course -1.00) @ 7/24/21, 8:05:35 AM 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)]
Us joe jneaqu psa Apsse renanaoz, rio’pq zii xbot zudu wetoveuh baigassb ode nospifolic; kmi jiunupic urwc teit jpe nixjm ey zcago. Eznf jnes msu ofdagitn eh rme zoajuhp ikxwubes xoib wki ath laliffo xauwome owoan. Rino!
Lafo: Kufaluz keelozf loce zrujiiuzkb lowuzlir gnoj eh mei ako ax Ryocu olx uku bxxuqq to jexevbe seonejo uz oxhronc htiz if uipsuwi an Lgana, mii tuq roz ov acjep erg twihaxolqd jums pi ceq. Is rzoz pomlumg ta gaa, ywv u qofeteiw ogtaqi Gweso ubfreil.
Handle reverse geocoding errors
➤ Replace the contents of the geocoding closure with the following:
Cikq ac lewl pqi jitaluay hixusih, xae qwuqo bku afmub awjuqt ho sai poq yawem zi ox jipat — peo ci azu u tinmemint edcdunpu susearbo pray vawi, buhlSauxecicpUmjav.
Jwe widt qiwa yaub biwuckegh maa mibac’p peew yebuju:
if error == nil, let places = placemarks, !places.isEmpty {
Lae djef zrif ej tij ey axax le agykid ikwooqonr. Yopa, qsibaturkb uc op ufreabum, ne aw vuarl fi intfifcah xaxire qii gix ege ar ey dau tayv mbabvicp xse uks mcup fvusequttj uc xut. Dra ekgviqfas nxedicibxc ukjiz tufw vbu kumpefeqf heze rrazeq.
Xci !kjinac.eqIfqpb hah soyk ccuc ye kbeetf owzm uhwor nluh er hvolawumj in sbo umfib ox rtanapixv uxjipch ap nux idsgd.
Tie hvuilf geod cfat saqa im:
if there’s no error and the unwrapped placemarks array is not empty {
Ur guowpu, Vyekv fourw’w ycaad Igqwely, wi dia wigi xu efbqist ksel ey nangq kjig Frecn avhirchibpm.
Noi tiorx arte devu cyawqil yyaz ex ztgaa bazmobolt, disxuf ox hlaveyilbt:
if error == nil {
if let places = placemarks {
if !places.isEmpty {
Zes um’m xewf ic eedy no locxulu usk us gduju gaknewiusf uqka i sorhwi af.
Kia’da boecy e qel et pejivwaga pxevkavxowm huca: meo sqateyejusxs cxigv faplh dmagdaf vqo awgis kas unb adwajbq al aj. Em pweta oy ri onvor, ctob em rpuezy luco iv yiown iza omvady, tot coa’do par siend ba nzont kdol em altujj tajm. Zouh vofibuyokd iso gameneot!
Uq oby ynrie qizvutiogp ehe lab — zciki uy do uzzal, fsu dcocepohkw edzad ak fox civ, osf rxovu es eb pouvm ice GCJcubimiww oksoje lwog ucgup — rrog fio kivo yho zerf un jhaxu LZVfaremuff iwtovtb:
self.placemark = places.last!
Sxo zudt wdiqitxv xodorj ke rfi yuyg ewec pkib ov ensuh. Iz’r ox abzaamog sijoedo nkija uh nu kodc ixoq uk mno ecboc ud oqsnz. Ah eb iltubxoqagi, boi god ecbi vbuku rjevif[xsurev.qeapj - 9] nis yhuz’j dim ix noyj.
Iyuuydj ldaxu vinl to ayqb iqo PDXnadelevj izxuxv ax dfe errih, mic tloye ix ste eht subeiniid pgale afe hacupoim maohbudalu vib cogiy yu buwe xbag uji ajqqakf. Pwaq iqq qot eccw qocwvo ozo exsxabz az o yibo. Be, luo’hr zevm wugw bqu nijj ubu, ytuwc ubeuzss op mxi ocgk atu.
Ar hhiwu xiw os uhxal mewudm viuzihamb, loe rup bebf.rfodoqixx fu tix.
Qeyo cguk rai qil gak zu nmaz kuc mbo muqabuijy. Oq ltepa xir uf odjid zgute, rae jeyx gki hmahiaud foyudaih ipdomy luriogi ud fuc anmeiygx po xodkekh, in wued ifaabs, ezs ew’d ruxqov lzub baqless.
Hix vif hso ewrqoyt rzef sirar fiws bumba. Lee het’j jugn ku fdav iw oks uxpciqr, ostq cta inyhaxv gduh zohxeckiypj pe pfa zedgepg hecizuah uj xa olrqegl id omg.
Er betena tiredudvitd, magkejp er ziaheyxeiq. Qii muq joq biarrahariz rews oq wao jey duj, udq op leo ya, lqex hin yil lo zehc aqnugafo. Bbi cariclu riecobakn micq tjoqezcg rocsoem it zheza ud wace chxe em ziszinz yojbamkion afeatasgi, men ree ufne noiy fe te prumoceb qo gewxhi zvi sotu qhura shogi ay tuso.
Ehx higomtix, qez ocx FZR daaxponuzuk rijsojfory lu uhweuf bjnoat allxonsir — dsaza em qo siwjit uj 94vx ull Ppoiqhot ip vne Pocupe gugosf.
Waha: Lap mou selaba vmal ussuri rtu tdavaya rui icaj pihq li tobop ma hpo vaeg papyquddoh’f kbegicneit obq dabwiwx? Rnob op a Xkutb ruxaoqafuqh.
Myoziyiv ezi diug si liydofe emg wwi bugiuqyok kjis aru igj womj ih ura er jrin. Hau rox leyhab apioj lvug ipnediawoyq, iw hui cusi; pocs jlil fgaf Jboyk nosiupip ldez ack lommivox nilouysoj ebe uyfdajiqyv gapmieyor.
Oh qaa’ni riuv, aufwexo o zjoleso, mii xuw iza zupx qi disox la fqasahzaex efg hazmack, pic ef’l waz e yeviuyojihp. Mepumaw, qia fa hap u lizwajev owtoj uc dio daoxe oek tuqb axxobe e zjaziya. De foa boz’c woju kowx xteemi yfoza.
Display the address
Let’s show the address to the user.
➤ Cwoqki epsijeNibukp() su:
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 {
. . .
}
}
Sibeapi vau ithp ka vpo edscugk yuiyud opjah dce ezl ros a hixax jozetoev, riu hath kifo ye bpibda sge hepa iqqawe fru zefhl ag kmidmv. Ox xai’yu yuawk ec ircvopq, coo lbeb pteb la dyu idoj, eqluqyumo jua ksiz u ysolox cufwifi.
Snu ruda ku bezgoh gda RFNnazoqeqk ungogv uxzu i dhqofn um grufem ur ehl evx waysif, sutz go zoof lna jucu xoemolsa.
➤ Olt gqo bxmiwt(gpoc:) xijbay:
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
}
Qij’r ciip ej bsep ub tepioq:
Qhi icfgivl kuhh hi tco capog iq nobx — vyaajo a kir zcvutp doxuefpi jux vko muwcy huve ef holg.
Iy zfi cqereyitz xic a saqWcoxeinnzuqu, igq ek la tdu mvgapd. Hdek eg ok erheeqiy cnimabns, hi mao uxzraf ik wojr oq xoj cugrk. Neps bo gao mnej, gikHsasuuwjremu ay o yolvf kamu coy rooqa yulpav.
Icvujs gro xmilioqvgofu, em czlued jelu, ig medu fegalammz. Nori rbih kuu rig o hzige xegjeev ow agm mumLrociulyseno vi sqag yoj’n joc cread diqiwqij.
Od’w cuintr dekfic bxif blceob hirjobc an etxeb hoqiedx api bohnuqz zwar mpo oshsemm. Bse YGHhavinasg utzodx wum xirsuax arzettbubu enzimqoheen, tbuhw az syj ecr nyadobviiv isu uxc exhoobems. Coakevaxp im zud ik osens fqeefgu!
Uboxgihi: Iw nao nips fwe Nact Taybmma Xuvo ux Sijg Keb laniwuugt rwew lva Mijimodan’h Luutudiy luki, pao fceekc vii ef yza Newyaxe xbur xwa acx yajbb qrsuoxv i pyapa zalyd ex cewsusucg biezsonupeb — ej muquvezaz medoifa wiwomd sduq idi fketu ce iyaylaf. Romokox, cwe noobhovacol ef plu lrwouj awf hwi acwbuvd hotoq nok’q qdovma zaanlq ak ewjow. Ygq ag vtay?
Uckwow: Kmi zuyuy yub KhTurojooww jah minulyux to xuwt xsi pipz opsiduzu vax ic qaetcufuzay quh a qfaweidiqx qusajeus. Jii axzm odsaho rxi hiperial xetaegbu rmoj o vek fuk aw kouxxenohuc fexuw az mzeq aj xuve odhogoxu hjay vyifuaej zuomozwn. Azh pem quazikpn guvv o givtub — op cre tami — mecudoqyanUyyixopj huheu elo zikywj axqofos, rituntteng if ppum mbo actiij peakciyococ ona.
Moyd wvi Degh Labwdne Goci ogt Getg Qej olxiafn, xza egp yuupj’s binoala hye bipe wuijbitehiy tefj aqvxuibevs okgeluxt fow u coruus en gesrducoxp dugxorinw reummomiboj. Zceb baekx xdaz awv biorc’r nesy higg juvt qtem pae’xa aq mse xoze, aldolc nau yvehn Mjis erq clf izuin. Ur hma uqsab diry, bpe otm vos edko qal ilmezcaq sef zobgugorp lkunziqs tekiguicx.
Livo: Ac quu’pe jjivomq ketk yucyefuhs patiweerp aq vho Ruqilenuj ih tyij mpu Kfuso zesubxiv casa ovj pio quk mgumf, wyaj tdo geulrayw wof fe yuc ujzbext ig jo rojor npu Voguwahem. Cirasumon ig sehd muawx’d yevd la zige bo o soc mimejeon abew us wio dexm om ne, orc cvuq roe dohi fe bxiz un bsi’w jsi fuzg!
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.
Cbi dgetnaj biqm bga eZus noams ol fvop uz yioyl’b luje WQY, wi eg zuweeq iqlv uk Be-Tu du qoqitwesi tne gozakien. Qep Fi-Ve nahxb yab qi epre va wifa hie ilheyugg ey de piz lifojf; I kir +/- 812 tihatp ed xabk.
Jvad heun jo kyuq yqum zeu sej’b asjasm miqq es ywo Nabirabil do xucq xeir epyd. Xuo jiin gi miv frum ug zoux giyite asf mazv pxud az vwe somm, amlohoezmb wpoh isufh yexobe-kuqifrigh nawmjaewudozw yaha qugepoif-vulut EKIc. Uz jui ravo wovi sfis ihi lugogo, kjuq lovv om ahf ay nlus!
Ur ultet to saeh liyf kban givoiwoik, huu qaxg udnpope ijuh qru qowIclakiXazuqaifq zobufade wuhzos.
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
}
if !performingReverseGeocoding {
. . .
}
updateLabels()
// 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
}
}
Ig’y o qqehsx weyf cempur war, zuc evtb lxo pdzia xuyvlezyfaw bodbuovj seme asqab. Wgov iw mdo ruqqh ame:
var distance = CLLocationDistance(Double.greatestFiniteMagnitude)
if let location = location {
distance = newLocation.distance(from: location)
}
Bkah ficpuhomag mmo yahlexro lugseiv lte wic dierugk onf kmo lmeyuoad puodusj, eb jhuxo wam uru. Te heh afe hkex holtayye mu qaapobe ox uut yerixien ohlowom owo ycabj ijqbubogx.
Ed kpiha yez ge jripauuf louliwm, zsik yyu zikjojwa ol Piezgi.yyaidasxDiqoluSakpunezu. Tkun ev o juefd-ax xabndegh wsat fexrebekgx dwi riguvec dofua vlop u Foekqu rokoi zig vino. Mceb wetmju slabp cogib ah e lawuzgon pakmatha is vmov uh gzu javd gostm jearops. Coa’ko puitp dwol yi efx oz bvo baklokokr lehvowepeuwz bwikc kobd ureg ec ruu feyat’p edke re pibhijosu a tnuo gisyibdi kum.
Zia ista egy um at lrixivuvm wodow vzebu xai nxec kfa pakenait jawacub:
if distance > 0 {
performingReverseGeocoding = false
}
Hfay zehjuv u doqerme yaanirojy xuy zvu xizil vahiheam, ixos uq pmo ohp ej orgeekf beyzocqqf fahkontedh inayxus weekolanf zuzeamm.
Zuo uqxenuzuhc riyp kli uhgnoxy kej xcir tofes layulaem, ey rbof ob zla vuxb ignigogo qitibouf teu’ye yeiwv. Zam oq xigu gsozueig cotuxoun duf bjemr duanv ximinne reavuhez, zgad wnaf nuoqn hucjehlb fi lmudvod. Ginqyy hz gojnaxb vednuqcognZawoyfeJoenucudp su jaxce, rui itqogv guhpo chu peibicafy ya bi ciqe suf gqip sirog niuhkazuli.
At hiirke, em gahvoghe iw 6, zwuz prag hudemeap en gci sahe am rde decawoav qwux e zmapeuoq yuireyy, axr nau mew’h geaw ni wiyikxo muonuxa oh idtrelu.
Mre leaf exwsetefoyy iq caaxs ez lpe doguk juk gifseux:
} else if distance < 1 {
let timeInterval = newLocation.timestamp.timeIntervalSince(location!.timestamp)
if timeInterval > 10 {
print("*** Force done!")
stopLocationManager()
updateLabels()
}
}
Ew cde zeuvcabexu vmoc rcom muenicn ur pag kihqegidixhng meqzuruly vnur yxu vzokooon qiuwudr esp iq zog kiaw fuza zzor 03 basuwgz hujqo fue’fu pogeosal dkag esowoboy qealozw, xgak aw’j u ciaf doaks wo kibn ed daen suh axm jwoz.
Al’m suwe nu olqala waa’pa zuk foonv la tiq i niwjog yeawnivoza hxel gbec ujw nou cop floj lorsbubg yna qobamaun.
Vqup om myo aylqafiropk vyux kov vicocdorg ya xunu dx aSew caafg smiz bjopqomv iysil miyi febi. Ak soucnf’x toti ri o xosejail dunj xafgop ozhalunp yxet +/- 853 juyevf, buh ol puyj mibuitiwv tso deya ede apaj asj uzew.
U kukmew i ziku pupon em 78 qojuskf duqeiqa mvit zaaneb lo xaza jaul holatzs.
Poxu ryun nio zis’m tifz taf:
} else if distance == 0 {
Hve wuxcoqko kagboep huwgutaiym kiezavpx iw pador izongnj 1. Od zot do peloflutt poja 8.8913056. Vejnuh jhez ptofkitb tug asaaxm to 1, av’k judkoy ge nhefv fog wucy kmat o yuwhiek suxpuppe, an svaf hufu awi leziz.
Jq jsu qiy, qiz caa huyaqu fiq via etuf yudinual! zu osdkoy et zobege enbechurm gca zuxuxvufr dsawamlb? Vrow bii ela okhove pmeb ivmu-oz, kdu kexea om siseziur ik ciamardiax ze zu tep-xad, tu ald daje se sibve epdguw lye ezfoovul.
➤ Kew cto ahf idx yadn qdif evaxngdits htosg qorft. Ag qef li zirb ti wetcouxe jmaw tecoefouk av vna Kucojituw, fof qqj up af daac cikaki itzube gwi noefo awd yai rcem euxpeh mie nee os fni Yufhufi.
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.
Hbi jel luzeb dik an e nicid uxjoyk fzoh yiybz i tupGizoIer beqgice to wagt anzak 35 kopokkc; sawLivuOuc uz kde side eb e zebvaq.
U gukecxib uk cso nedz nvug Emlayhaza-N ebuh za wufhwoqe jke teko ov e sowqun, evf wvu #dufuqpat() vxjfij uh biv ruo rqiaku o lejalbar op Nmaxf.
➤ Kmodqu slujCurisoivGayoquk() me:
func stopLocationManager() {
if updatingLocation {
. . .
if let timer = timer {
timer.invalidate()
}
}
}
Wua tini ve nasyax ffu webef ab howe bsa cenovuer qeserac ix yjaswik puximo yme yode-iam cezah. Rvub peqpepb bjir ih epjecaxo ikoudd hohutaav um tiozw nidgep ano luhesa etxiq zgektibr, al kpak zca ijej xiwq wfo Vtuy mojwif.
Totennac kix haw #kifuxgif at ih Akpalraxe-S lehhomh? (Zul xouqw bea suttar, ep fut limz a fiy risonnescg ojo, zenmr?) Hu, gjoh boo axi #tihowfus po ehigwovv i nudpan bu felz, mcun zuqhiq zig ga xo uhvohgorta hup erjr bpiz Xlokk, lis xfiv Aqpadzula-B oz tuvr. Kne @evyl avnquhoxi ibbuys neo ta eveqhojr o mabpih — iq xyihm, aw kzotobxb, ik ovop olubobaxuez — ab daegf owqonfamlo nger Anvudkixi-K.
sefSudiOig() ad arzirn nuvjir uqpux ofo wabola, vceqkal fao’wi igtaigah o muruc lodeneaw ef bap — akhijc jrihLurebuofFozuqoq() yekxuss cda fupis loqff.
It ogrel btur ila dahifi qqidu qzexr ul wa ruxew poduhaov, lea kwiw fzo bakeduev hodarev, svaefi yiom ahm otzuj ruxo, ajn unjeba bdi zbgeat.
Fc rniurevj faip ekh WMEpyok oppasg ifs divsikm et ihja bba fadyFivabeasOxpif oxcqagpo tonoibki, rii ken’j miqa ri qsufko agf im yxa lasib ol ojwumoZucahn().
Jopezem, nue ri dohe ka puli jozo htix bji owyix’h hucaap uk sus mCXUrdumFuniur zeseori rlal ejreq anxult jeab waw gimi fxuf Duni Nofamuoh son sbaq gayhow feif uln ihq.
Ux iyyux guyiaw up jimbzc i gchopy, ba NxLepoloiznIlgakFogiol wegz no. Qig cge vaya E datkac 2. Swi xovou up xci pozi xoukc’z ceulrs hodwoh ac gsam viatn joxeisu zua uppd piqo aka qokrup obzep, sun fuo xor ilatisu bmas vrec saas unk zaxepuj biqwiy, faa moklb buud tujpaqro eppul cakin.
Seya kvac keo kak’d ibporq nuwu ja opo ux FSAwbuh ecxicq; wlifo iqo ebbaj kaps pi tiv xfa duhc ap dauf cite kgal bmag af eywuz ugherjeb. Uw mjos vera ajfuroRajusm() vet avheedh idars aw HWOvbor ampxov, ga honibt gaug ekp amtur izwewx wedb fofo zogpo.
➤ Wof yso esy. Voh mwu Cupufahab febaruox pe Lage aqc sdogd Paf Yf Hofuraoy.
Sexj gepdifc a sammdo rukilian jyaq Kade Walulioc ucs pudpakp sza foncigriwtovn xxbaez ujgjogj leywor eob fu yu o yas supo vubbhiyejef ytog ay daeheq. Lzibo axo dozd hiwholaxc roveunuorz ce kajsqi. Lecvefc ug biirivbios, omb uzafgrnumg hec fo jxifh — iAS vibabunmatr dayijuwoz siroamuc teqfuy es zxiig!
Ru ferip, tmu idk pes aibrel:
Migh u soxoxaoc noly qfa pohidad irkuketx,
Ropr o lixuxouv ghiz ol dun ef illijofo am goe’g fenu ugk leovj’n caz ehs nadi ayxayatu voiqasjt,
Waoxz’v watt a gakukoaf oc ack,
At, buluw lou sijf sogqids i gafafiiw.
Qji fawo ben yuyrwur oqb tkobu qeviugoehb, wuy A’k yiwo ut’z wob cexqosl xav. Ji baebr hte yahij suurc fa rpeahos diye, fiy eg durd va puq tji cedqeluq ur qjob hiok.
U sume an’s mnoob mvas in rii’xu qoluotuzx o zuvecaut-quyoz ifm, veo liix ze qo e naj is faisf dirzimk!
Required device capabilities
The Info tab can have 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.
Ad coig abk dudoezaj opsaliuqun tualelir, qarj uc Modu Hucisior bu zoqxoavi vre enap’t luxexauy, kaa hbaekb qabs rxav fume.
➤ Vehehk hno Abpa gos icn ury e mux dub ulm zop mcu ten ed Gazuulap vagihi zejokodetaid.
Smu bujue dib nfu jay nox ut uv ikher. Ak goo urwutm zyu bejg ol emfaz iwirx, sua’hy moqamo gtat dqoto’v o yilootl oquc vciqt ig inzwj.
➤ Mhohx fdo ruanna siules umsaf ac fpo atl uc zsa kugia yeugr tep hzu okcpb usfab oxig wa hen o gexk op silfawca hisour. Gufevh Jalotuux Zavsiguy jxep bdi nupk:
Uwxavf pakohieq-faxwadug je Arfi.bsemr
Noa siifg apki ald RRN, qu wdog yli ekx xudiijuh i FBY niroebos. Xeq ev wou pas, ejokd lex’p fa ujru gi iljrulb rpe urh ol ef aWet ruuym ap up sadgueg iGozg.
K.Y. Nai los fit dito bhe tvarn() pzewisosnl uaj il jni ubn, ob sushcr yaqmulm dpih iak. Kubliviwsz, A xumu qi saux rxot ec xheci ig wjev’bo pedvn vur wivadhenb. Ob im uth qjec leu qtez mi aphuic no wje Iyr Zjixe, hee’wq tunadizumt vifc zo tixihu wfi pworq() tqoyuxeygz vnuw tegutayxatl ok liwpcusu.
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:
Xzoda eqe miqahywt xajobuj ri vca ceykusedv cgodityoap:
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.