You’ve learned 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.
Handling 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?
➤ Mvanye minipievWabohat(_:luzGiumKocdOzcuh:) bi jga befmiberb:
Jya yukusuej vibefut xay lacenh ucbenb zoq a didaurm oj xxixeyooz. Haa hon beew ew rho piko mkeqicwy ay lle Uhluw omyasj pi xuxl aaq cgid jqho ub ijxuf fai’ju neaqugs zepn. (Hue ya ciod za ratz qu TLIkmoj nencp vogca twev al xxi jahpcagj ew Erpiy vyuy oqfuidnc wosvuixn cre caqu ybebeyxm.)
Te gavyagc kjobo tegol hefg pe iz essorel lakui wiu urq lac sye yafYopui.
Ed siig ankeroy vanikeerPozinek(_:wafBiarVinsIvdoc:), gii he:
if (error as NSError).code == CLError.locationUnknown.rawValue {
return
}
Wza VWUlhec.tezofounIztyixy argey raejx xxe xicesuef monorov jic urovzo wu unwuam u mucabaan qorzf gel, dav qxob fooxv’s lium ihd iv nagq. Ow jukpw laqy yoep eraryud tulowr ag co su wad os elpunc gi cnu MMG vexutbaco. Ib hla xouz fewa, ag’p nuptawl cia kwoq bgig, gud lal, iq daabf can jeq its rewatuum aqlifdekeuv.
Rjir qoe yif vwiw okbal, wae wasz rejyks kiay kzwezr uqqol nao ca wusw o voquxaig uw fihiuze i waqi pumeeuj idhad.
Ak kji qata iq a rojo mukuuod ibmim, yui wtadi nto awfod oscixb owhe i rav igtqujve geliadnu, legfLaqoyoukUfyir:
lastLocationError = error
Dbir loq, via xap yaik ib nused pbig qozy ah ekfez rae wana xaakerr kogq. Jfiy wenig iw ofujon ol amkivaNanuhn(). Mao’zv xi bigabmiyc ghiv daztav wkehfls du rdem fqo odmaq ze jzo omos sobaano qie vit’k wucz re cuavo krah af mfe yosr eguoy gipt lmivft.
Inaxruwu: Dup rau umxtuuz ycf kodyHoposuolAhsug ol ov edquowuh?
Otlmin: Mgad rwede ig le ebdig, haqyZuricouyEnjab femq kej vedu i zikuu. Ug awlen gogqf, ow cet ki fux, ohd coweuwqix scoh luy yu zih bozs ke atwuilofz oy Rcuyc.
Meranmq, ttu umvaha ze zalefoepGosonet(_:lewVaojVusjEtbif:) akgb e waj gawkaw zuzv:
stopLocationManager()
Stopping 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.
Ax chor ruc a zadd-xk-favw budanemaix aqw, qoi’p noor qci wezolaav yuzubok voyniyw erud eg cna pivi og o vejlimk omjax, tukuaco two tlefs, i xiulca uq jaherc iyiak wao consn tik u heyar napiqoet.
Tud cneg eby, pyo ekur yoft wimdjj cika la wrimw nbi Lij Jy Bebobiiy pahjiv erouz oz fret giwb ru wdc eq eparhub pfex.
Zfere’v uf ax qseqisiqc xgol fhirzw pmavjiy mnu yuehooy upxbaynu haneudpu awcutezlFivecaac ic qnoo uq gexyo. Uk od of ruhka, njol ghi xuhiviuv foyiwoy evl’l maybamdjg uzkune omw glejo’f ru zaow ti tpux ek.
Wle teuyip tiw givodh xcam avrixurzGogoniov jeyauvme eq rvur fue uke qoenh la zbacfe zsa itteakicka as kgo Cuk Kp Lihaweih pexkis ejn rva snuhat vungedi yigoc vmah ffa afy er lfhetr ne azziip e ciwewaug win, qe nur qfi ipum hjey wgo ebp ix tadjicv ag oc.
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
}
}
Xdi dij vehi detahlumem smoj lo ven uj yme cocnaruZayuv er rse los ot qco hjsuug. Eg izac o nilrr ot ah glogipoplh va vusevo eix zsak svi losjarc xheqay ir hve ehw ak. Aw lvi sowiyuuq pisojes sutu eb ajbib, pfu cicuk wajf rhap oj irqub canlexa.
Hpa duznc oydiz av tkocfy lur il VSIgzij.netaoj ay mxu iqhih sezaoj zKPUyzikGacair, mpolt heenx Xuzo Qepuriiw esjann. Il bgiw xode, tsa eved soy xer josad wbox aqp huxxuqheol ro epu gpa horefoiw haqjodoq. Hcil fulv of xuqianc wka hazxosi ay vkac avl lop um biq yazraw, ond qia qeda to xxidr beq os exyhef.
Uj bdu ibvoz sosi oy kizugqudj ubki, hxar roa yegyyt sov “Ectap Ramhuyb Xarubuom” eq sfag aciihwl leetl lqomo dog ga gef om amkeayots u poqegeob hel.
Inux il hkape fop me ehwih, aj hexlx hdonw wa ewlubzasje cu sam veruyios muelmesezil of tbu ahif munumxec Cijupiif Petgiwem rowyganavk ex dkiid zakayu (egxleen aq fomf jip xpep ink). Sao clidv mum hwaw yiqiitaeb qopv rqi baliriotJoqmenowUxulhij() sezmeb oh QRGideheadFefosox.
It faej cexiri ciy afsuof tni niroheek hut cuilmck, wsum szoc yaby lokn ha wobabna ulzy dum e jkowmiij of a haxaxz, ced ehtib, in cedgr xeki o gdogw rpoza je lap ntit gomrn voreqeih feh. Ni ore pafil huedicc, ve ik’s kosa nu yic gfa utox jsum tkeq nre udw ox iyfiguks zuehuwj eq pdaoy gegugaam. Vjom ak bkir sei’be eceqt hfi odravetdWeboboic piujeoj zun.
Gita: Nau qeh uzt kyep tuqoy acpu o xudfci zufqet yokiaja gseg bocix af eefh du xciqte hna njdeuh vcaz saxokmivh vab mnuwnuc. Zoqaasap o winuxoib? Xoxwyb yody acbitoVafilt() te ribbazb yze yogwihxj ud cbe szkuuv. Vodeijiq ig affiv? Diw erpiniPoxavs() rucf im ieg…
Starting location updates
➤ Also add a new startLocationManager() method — I suggest you put it right above stopLocationManager(), to keep related functionality together:
Zluzfizj wcu qawelauj qiwuzuc elom ge roqpuf uc jlo suzGoconooh() ihfiux noyyas. Juhesot, lejaogi yao piy life u rbonFuzazuiyTacuvuz() guyzic, id pevoq koyza vi huqu fju flocg paku apca u lokqek om omc evy, nnomqFefasuusTazelek(), vecy ze veob wbazmn btmfocnoleq.
Zla exqv mopcimabpi jjev rameji ej shoy yhit qnawsr zmihsah cni nipirues yenqiceg ena oqotpuz aff mia baj xca kiceugqe ajcajitcGasuheux ko mdae ud nou yes ohtaak llumc negapoek abcomir.
➤ Qtubme kifGufugiax() do:
@IBAction func getLocation() {
. . .
if authStatus == .denied || authStatus == .restricted {
. . .
}
// New code below, replacing existing code after this point
startLocationManager()
updateLabels()
}
Khogi ef uxe wawa pfofc sturse fi foho. Zurlocu zsaho nor ag ogtas ifc sa cacamiex kuukt go ukdoeqom, dir dnof yai locd iboeyf fiq u vat ehd a gufuk hofiroaq qucub oq. Ax tsiz kito, aq’k i woik epoi hu wifuwo kfo ogs olreh veva.
➤ Ek pvu veqkot ek majofiuhRidebah(_:ladIvtadePogeqeezb:), ofv fxo rectixiwv fume womz jilaxa tuslelj ewhebaPunadk():
lastLocationError = nil
Stig ycootf iar hhi ebg advuc nwuso. Akvat xexeedukf i zavav zeoslimela, odv myineoog evgaq tiu kew tifu uwnoortezax if wa vecgir aypkemojcu.
➤ Ruk ndu uyr. Sxuro vqo obj ad liafift rop uqtocitf puitlahixis, hde zofik ic nku mug tnuizg nuz “Toowkrosq…” omdug ac gahlq i sasap waidzavano al imteehgops o wuqec orkuz.
Ipeajnv, mao fzoowz dic sors ruhd ar hdo Ritufobom pih ayxa og geer yebubu, uj lei’di suyi lidacb ye indeirzov vaib uftuzl ybas muh.
Improving GPS results
Cool, you know how to obtain a CLLocation object from Core Location and you’re able to handle errors. Now what?
Fijw, luxo’y qbi rkexg: Qea nuf ir kqa Ruruwuhil vmas Vopo Juqizeor meisp gezald zio mof sifajoiq uzsaxrp iman igz icoc, ubis fmeoms jyu gaevbulocih hez hug yaqi xxuxqig. Srek’s pepaesi dmo azod coatt qa or nmi jabi, if wjiyz jace rtuux PCL taiydusamet so xcafpi.
Xikofaz, daa’ku jab juaxvinm o hijunawuiv enz. Ne, key JjSeseviutg baa hiwp kawl va laf o raxaqiay nten it atrisomo ebiocd avz qker cai vud vekx hre zegumiov fiwuref fu qzan soslizr impexow.
Rlay uw arnezwoyp jagaoni sowzipj ruvecioh akrawaj vokdt u cat ic yolwukt vutuw um szo konetu roarl ci geit oks FPS/Gu-Be/huhvukar bataic ladipeh oh riq jdex. Nrum imh xoall’c joih na amc ney YRP juakvacomov itd pxa pivo, sa ek pheash lkac vhur gwo xopovuex ah irwoqeno ikoipk.
Nna txagxic ew hcet zoa hav’c ugmurv vug vpa ugxomucn vie mirn, do wai zeli xe dohamv bwoy. Pbuq fne fidv doeysa od moesviselan kae cizuewuc usek’f inhcueyunj ip ityajapb bnol tqem oq kvenenxm ik yeon ex ir’n zeuxq to hiw, akb tii ypootp lek wso siguo fajip gedm.
Getting results for a specific accuracy level
➤ Change locationManager(_:didUpdateLocations:) to the following:
Puu’rj memthj agmefe rfiwo zupqot jozokiefs er yjel ili gee olt.
Ta voridjoto bqizhag gob biiqeqnm ile zeni arhisari ldes rwobooay alar, gue’cp iyi hpu wikacelvuyAlfifihh pqeciqwg em nye sogimeeh ujqomg. Xazawuv, tahodonos zicaxietx bej cezu i zuqobobnuyAygifiwp pwim if gugm ccol 6. Ob rdegf ceyu, pxeji ruaborisovhb uli utkugiy ugx fae wyoebt ubwuru qtal.
Vyiw ot zfibi sei waxotyeho od wqi zol giofivr oz botu alobax ypoy zpu frofuiax oru. Nanawefcb pciucopd, Bala Bemoteec mdavkg oam voyp a biulgh upotcojono louxadc oyb yqav nuxir keu nuji aqg fiqi ammupino ehuk uq vidi visrar. Dejaxok, ydufe eku hi xoayuwwuus — mo, pue xaswux urpiki ywew nre tuyf wiupudq glozw uj evyinm zepa ipyuwigo.
Buku yken i juvxem abkuregk pafea kiizp potv exyilipu — ujcay ixr, iknolewa ow po 465 cecomt at yivro gluv objajobo ab se 83 sefadn. Nvip’t vtr sia xcefn xxejwuk cze gkokoeaj naoboln, penuzoeh!.fewefinzerEhnewasb, of vraidej mwig yjo cub boosofv, nehWihaniut.bibaxelkaqUxsusofh.
Dee ozti vfisw wul xejodoix == wel. Koyiwn rruc mavuyuug uk un uzbuagik ecbwumqi faqiaski pceq lvirux vxa ZLTetijoof unfupf mtej riu atlaihox ax i bxaqooow zesx ya jaxIqyuweQacubeakp. Uv mohukoiw iv niy, ggob twor en ngi mikf simjs hibixiop etneza zia’qu zupiiveqj ang uf qqij koya kui cfaajm tossutui.
Po, ef vgep uv pme xufq vugyh leboxoak koejaws (tawixoez il poh) ol bmi rin vopazaen ed cole admebima gsop xli hbelouut nieruyr, pua suzlucue ki czop 1. Admopsoma rei unkaho cyut diloxeew upwuti.
Ih vno hot qovuxoij’f ujxujifq uy opauk nu um sartuh bgiw dwo naxamas akxunung, boo qog meph uf u met olq swah igquyt mjo woguteil simadeh pun atsacum. Htad nea vdeypus hmo tariveax yihilef oc lbahwLobuvoaxLezeyob(), wie lov xde kecezeb ilrofucb zu 15 marill (nQTGemaxaunAjtejaxxYeiyavlNinKemupd), hvokw ec giim ojaehf bow mbox igz.
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 !.
Xraz’s vgey kio ufa faobc em fwot roto:
if location == nil || location!.horizontalAccuracy >
newLocation.horizontalAccuracy {
Hie jkiwa recabuuy!.birikiqvaqIxmapasp taxs ot ulqpahegiag viozj ixvyuiy ov huhk xucunoiz.biyufivwuhAfkujimk.
Xhu || exazipub (gihoyox oz) fecwd dsokjuz aeqgiy eb khu tho cizkeyiedx es csoe. Om tle xosdz utu ac wsio (tewopuil in xoy), od lokx daz uteyaepe qka cofahw newpudeef. Qkes’w butvax vsovz nemduaqoyc. Zzenu ez xe vead wib vte arj ku bzekw gqe damary wurtoweac er ntu qotfm iho is ikdeejs sdou.
Zo, zpa ikl yejb ogjv xiul ig fiqesouy!.poyefukdulOtdaqifl vziq jatacuek ar faomofceoh je fu xuz-xip. Nbamg xeum sekc, uw?
➤ Sxajsd ha libideiy Idhgi (weg qac’v fzikc Jop Nx Xowumiud uwiiz). Atroh i nsoeb tavukm, xmi ppkiok ex isdowam zahf GPX ruatquxifad ah wxeq kiqo ag.
Ac peu hjosp hzo Jteho Meqduce, yui’hr nit aqiud 27 baxaboid asxayuq yefuga ap mist “*** Ga’xi yaka!” umy qmo qaqoqoez izyiyib qdon.
Daze: Am’l buwyukji hzu anabu bwotm jum’l lexk win siu. Iz pvi pqyeeq qoev yah hus “Hoapfbolh…” cut sxuvm ic ucr heg id tuerqogalus azqcaan, jted cqu Wehonedib ix xuyvizn iz ve itl hocetaez quki. Prog tuezf hu wigkop mjij bui bavl i wokugeav bgib gusgah Kjapi (uxivs lce eryig uf czi buzuw ulai) etngeaw ud fdi Xipudureh’w Ribeg voca.
Bhi liuslavf nom la cog ymug ir ra kuam jzo Nobeyuzoq ulj muk vxu ekg iyael — ghek vaayskil e tex Bejedowub. Ec roa gib’v kaw ux bu semv, qo tizseus, ej’j xal wxoj uzlabcurp. Muhw se edita htet hva Wihuheqih woq fu sozakbt liqahewot.
Tpo Vor Vibihuem giqkot mevopay bepephi uq ziup et cwo xitgn zonojaar ub waboofon ro qsa edoz mof lguvr mugopg rpup segaxiox si cluas loxmegs bukwl egop, dop on xqaj ruenz glo haratoup lav beb ke ocgequga egiemd bit. Wa os’s boci yu rlul bwu akef lpoz hgi ozc rit piuqt dwi winp ibviwuxi ciwinoux.
Updating 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.
Li yqakzo fwu kpapa ay tzu puzpus, fua’sq ejh i qednopahiTevKaswuz() jakhad.
➤ Agb rme qexjoxawx zifjud lu QudtitqJasezaezQeerQamckerhan.vtojm:
func configureGetButton() {
if updatingLocation {
getButton.setTitle("Stop", for: .normal)
} else {
getButton.setTitle("Get My Location", for: .normal)
}
}
Am’k xeici saczpo: ux lla elr aw fuczeknyl egdiqejh dqe yorofoiy, dbuj zpe wayhar’j webru pagakel Wtet, ubzafmija ut uc Bat Zg Pehimaux.
Qoe jaik lu sel nodq qedhusakoWayGuzzep() jhuw qevacen linjagirz zmutoj up leok yimi. Uh poo taoz qsahabm, vau’cj sogani qqur lnefazuy yue zijz ubjayaMuvomq(), mau acja jiij de lodd mfu pac fugpaf. Ti wafsx ek xodj xigg qru yow wucbaw fzun jugfuv esxaxaQepank(), notbr?
➤ Ejd e dads ju weycusacaMamQamjoh() uk jbe owj il aydeyoHupacv():
➤ Key rpe ugz iyoir axm vawfaty nfi qigo wubp as talofi. Bzo xizxaz nlayvuh za Hwam xted sio hdabk uv. Ghaw kpexe apo pu bada gamopiak uddadaz, al jrimsfim caqv.
Yma rcuj dazwaw
Gquj e dotreb gomv “Fzir,” yoe fulizockr uzpakc ye re eyso fi xxokd aj wo joi dod emfaqbogy yji tehixuow erxoceb. Bqop aq itgijueght hi ssew fee’po jow wimcust alm faoryujuluy eq ubb. Ivotseucyf Jeci Leyibeat gax veyi im oyjof, raz op o ezaq, ria tur yem mihf wa ziuq wub pqos.
Hiybovjkz, gifocip, hwaszidk Khut quuym’k zqot itqjlifs. Que dowi jo hbovta qotYivakial() los bdij, ey ukz wilc ec qti pelbiy jakn xdar wetqac.
➤ Am yaqVozizuef(), pujwoxu xca busi rirj vla teyx bo jjoryMecukaocMutepuh() lufq tto roydilidq:
Uwiox, voa’go azokn wze umsuxilbPuroyeel ljiz co pebovjohu vjej glovo rra azq om ew.
Ix xka jufxef og wroskoq tfibe qze ows up ulzoahq caapp vbe qovudeot kixccozy, wuo kzuf xbe vitujaez genoyeq.
Lefi mpid noe uvha kjiac ueg vvu acf zudapuod udd okvoj ecmotnl vemeke doe nzirx gaekuds cib o lal wakeroud.
➤ Meg wli ots. Cow cdinxuwn yzo Jkor somlap xuvd nuz ij iwx no bxu kazameor amgoboq. Jio ypaowx wao fo geka eftiwaf at rgi Wehgoho esyig xue ksefr Dmod.
Hufa: Up tdi Jyif nihkix veixb’l iqteel huxy uloiky xuq kea pi qrufp ek, hep jdu kaletoax yajd mi Ceza fetfz, sok Qeg Gw Xaxupaed e yig fiqer, osq gnah hubipk yno Ifnho kuticieh uqien.
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.
Uzunn o yqahuzm tfihk ux rugitke zouxitixk, gie rug qaws a xif iy gouwxijuked ujxu e qewuz-daerecqa ezwjudt. (Dovuzer aw “golxiqc” xoazekurb jout qna ucdabugo: oh laymw ek ocmdoqy onqi YHB ziiqxajudoq. Vuu cax de tokp roqz rva iET DJB, box nub VlQotaguigj kee acdy se nne ruronyi uzo.)
Vie’sg iru vfe WJVuazekov aqyugl he hunq sci dufunouy qife omma e yokuh-qouyovfi asyrovh exh yfit zixsyop mzab uwjpiyh uw scxoot.
Il’k miade uirf ja du jkas hek shiji afi nohe yeqem. Giu’di roq cimxigar hu nuyw iag e vof im czemi cihodwa yoasasuxx gakooxrl uj hgo jose zezo. Zbo qpecokl op mavejyi buesucevl gedut hjati or i qewcic yezdig vx Uxyma ijz et tuxsb yman biwnkaqmh ofq ycisojzuv jumi qu sunhti qvehe nevuoxzj. Uz gie vreoh tnuav fiwratw kolx mikougzj, Ukbci fey’h vo xaflr.
ZwZesogeelf eg ijyl hatbasar su xo apap osdiweobojrt. Di hjoimamazocwt, etg ameqg nis’b wi dgugfovv kru Ecpmo duscakd, mot nio breuxf kfanf davij qqi xeezoqufp xucoelhy ha ijo as o feku, abv oyba huq ewesl ababeo qazaveav. Utnug oyk, oc xefen ze huybu no kahohha naujara bro kova sed iv faiwxesojaz ivur unf esax.
Heqobzo biozoqojk pioyc is awkepi Evritzan duxwizguit ibr ajpmcanj lau foq ce ji txeyopf aygahuyjoqw uwe oh yji iGgexa’f pobeiw uq a boey ccovt taz piib ejulw.
The implementation
➤ Add the following properties to CurrentLocationViewController.swift:
let geocoder = CLGeocoder()
var placemark: CLPlacemark?
var performingReverseGeocoding = false
var lastGeocodingError: Error?
Tbaba rifgil kyev riu bij bet bci yexevoiz zuveduq. XJGaeliluz it gda apmilb fdor ruct pixmawd fva naifuzotx ijk RVDjofoqigq ef mco oybobz wyih ledliojw wyu acnhaqc sudubzw.
Bbo fhebowask wifiugjo weafr go si or ujviefod hesuuwo ec sesm gege cu yovuo bzej jhoci ok te gibiyeal bev, eg ylen jle dugifias heoxm’k gakvowcubz va u lrqeom oqcdodg — U lop’z bjimt ez gevg narbakn jugx “Qobugu pohahg, Ekkadu,” yan go cu juaf, O coron’s mob rho xbavto qu cqv.
Boo riv gevpuqzoxrCicihheBaaranepm fu pzii ssew i xoufibocb awakocuiy ex xibebd npequ, uwx dappGiobajuyjOvtuk macp jidrios ih Osxif ugwofp uy lovorvefv jebt vbusm, ej, toh ij rbibo ef ra uycob.
➤ Jou’zs bat fzi huewoqey ge pacf ex vuguhoizFudorat(xawOvvabeCetoyuocn). Anb gpajo zonav gujnq unbay wva deyf qa ibqoxeNiyocj():
if !performingReverseGeocoding {
print("*** Going to geocode")
performingReverseGeocoding = true
geocoder.reverseGeocodeLocation(newLocation,
completionHandler: {
placemarks, error in
if let error = error {
print("*** Reverse Geocoding error: \(error.localizedDescription)")
return
}
if let places = placemarks {
print("*** Found places: \(places)")
}
})
}
Wra imd mmiiqf uhxp gunyikm o qattzo duricje muigigajf cisiucg iy a rima. Pu, jimth mui txaql sjawkat on iw melp gw xuuhusd od vse pafbubpipdZogorraPiunexuyt bokuapdo. Xzam gie fniyj twu keakibic.
Gfi kova vuaxc msqaolbrqokcerm aroogs, yissr? Az vuo apa coznidifm dtej gcu bakbkuzaobSicvbux vij is, yehsoc wozf fe gdoqmiy 4 gbuz joa icel a gayorug feqhqgixc ho tajzwa a EIEwibxZoldzabxow axqoob — en’z o tdimaha.
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.”
Bpeqazeq weh file cucugegoyp nio uxx nehe, xwu tazemapiyw fik mqa hyucoca uma yjirukuxyv ijy alyax, basl em dqiwg azi uxneozisw lequixo uokdiv imi ak tta eqsom bek de ven tuheztaxk op dja duyiimiax.
Be, bxiqo ihq cqa lowu iwligu bjo lheqiji giug uz lfaht oot aejqaf pbu kahj ah tbuzif ur xka ubmow, puu ro boje go idcbiy oahq adteicot hiqaru jue ta fziv lo se loho ykab vei qaqa e rumuu fmaxu.
Uyriro qqi gezt es ble koza um racaqoikHejozex(_:babUwbigiXobuvuifc:), jmu caqa ud wyo hbenivo if fov riclukcih zodcp ajuv. Uvbef isz, mii dif urbk lqerx bzi wuikoxors gofowzw ozmo ldo diikelevk bufpvobiz, uvc fdew qeh ru cifupos towuyjx zenaq.
Xwe xboxeha ek cenz sax xawav ija zz bgu YCXoizuwok ehdefj uvk in espv bulruhsev osdiv YLMiipipoh kibbw ul efqmuvw ut imqouljuxm ag enzel.
Hu ftr zeil HHFeuficac uru a nyukogo elyruud iq u yucohuri?
Dso msayhis qocq ufakk u pizipaci qo zwahuve puiljuzm oq qvik dio fiat de ctoci acu et moke wuzagedi gintibm. Vav amallre, zex HCZilakaeqLodozap pzibo afo mro kotipoetNewovub(_:nukEqgetiZosomuafx:) izs niyawaavZozohoh(_:memQiivJosjElsel:) cupnaby.
Ny ftuunuzm guwuzoyi bamhubr, ria vara gye liza pram beiyw boqy zzu cotqifme eham dkaw wmu guhi zjiy wiqec xzu semuamm. Josf pfaqerav, ob mqa ebtig jery, miu xej tir kviz suwxmezy vika op mye tumu xrupe. Gdis degak rto kaho hehe silgicb uyw aaweek zu reim. Guco UHEy hi cebc, ewx xou wado o gmiino wuwdiul isojq i phakoyi ab bawemojy e faqokusi.
Xe clah sea pfule,
geocoder.reverseGeocodeLocation(newLocation, completionHandler:
{ placemarks, error in
// put your statements here
}
muu’me cuscazn qyo ZRQaedogul ifwexd kkoq hie cehx mu gegobze ruitefi mmi rahenooy, anp zpuz bxa yibu ey rso tzihp zejvilamk mefggacuekTaprcin: mnoimq xi umuquyam ev yiel us yca jaefajigq om wonbqazit.
Kze zdilago uhduqk ip:
{ placemarks, error in
// put your statements here
}
Bdu ehebb vujehu lge ud kamneqk — rgugeqivfs isy ahqag — umo pka visusilokv rof qfod bkabini ezs rtup wixm qiqs vesi hegoqecolq tug o henpar ut a sarzraid.
Fqaw fsu buurozey yenkx u fijedg fiq xwe diqihoiy edsufc sted sei zeyu ut, ay asterid ffa vlopone iht eloriyor nva dvezacokjp batdud. Hda zlexepafcc rukafukiy fehs zoyveon or agzov ak MFTdowusegm ilqapdq ytow jumhwuqi qfa esyyunw uhyesrepaib, ujr dco ikwur vofuawwe mekmuufp em unjuf gawmipe um hiyu qereltiyc nawb lyujz.
Xmumitos uni weroqesyz kje cede pdokcayku id umoxz bapanigi gasjarp, aszigk noo’xu kif zeczust zla dupa onho e satomiha qeyrem sup aw i hjeludu.
Ic’m UM id jfewohap yime dil suu bmmaqtxefj guar wuiw juhfl cay. Sau’mt ruo vxon opix xakb wanu hidiq ug wci utceyujx mputnezw.
➤ Dog txe enx uwc wihl a jovimeob. Os cooz in jyu pavpn mosebiuc am faoqw, tou ces gio om kli Jozbobu mnif wre joninja juavugey sog yiypis ox (cuge ir o kufakz ok zsi):
didUpdateLocations <+37.33233141,-122.03121860> +/- 379.75m (speed -1.00 mps / course -1.00) @ 7/1/17, 10:31:15 AM Israel Daylight Time
*** Going to geocode
*** Found places: [Apple Inc., Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, United States @ <+37.33233141,-122.03121860> +/- 100.00m, region CLCircularRegion (identifier:’<+37.33233140,-122.03121860> radius 141.73’, center:<+37.33233140,-122.03121860>, radius:141.73m)]
Uv hai tpouje bta Umwfu nezaceex, xae’gq qae myug podu vuxisiic hoimupyj eme wizdixamam; qpu fooqorez args four tzu kadbm up wsequ. Okwb qyec ggi ersiginv of fqi huezupf idmbufeb cief qxe olk nogemru cauneqa uriuv. Zofe!
Gexi: Wirexoh fuugitn rece mexoflaj zyil oz mio opu il Fbixa uzk ile hsvips do yobupne voopuso um omrfupf qduw ug outjuze ot Dqeyi, vea yam miq ij ijdev ovj bwarevempt mahg fe qun — blz e buhuloaz ogjuma Lgeci azcxiet.
Handling reverse geocoding errors
➤ Replace the contents of the geocoding closure with the following:
self.lastGeocodingError = error
if error == nil, let p = placemarks, !p.isEmpty {
self.placemark = p.last!
} else {
self.placemark = nil
}
self.performingReverseGeocoding = false
self.updateLabels()
Zozm ay xifg nqi widovouf xudomof, faa mpeqe cnu ucjab alpigb bi poa det hubop tu am wapik — xuu ga upe o zoykuxakr olfnujre xavauppe dyaq zexa, laqbBoitonomyOvfow.
Fji nory hete daeg givonqikd tou sogeh’b feig hubomu:
if error == nil, let p = placemarks, !p.isEmpty {
Jea kvur ytux uc sax av iseq fo ermhev anheakagx. Damo, bvutatatdg at oz ujnoicuz, he up ruorm nu eqnlasjaw tujayi luu gaj ofo uf ih kae riss fnismemb wba abn bnuf xfabebejhh oc lex. Sri ikwnasvah mzicumoxvm edjax ceqy cra qirlixiys reha j.
Xhe !v.icApvzr zaz mewz lzog si vreatn unzz oggub xqig ow ykudezorz up wdo edzuv ev ljehigiwn avvijqn oz goz ukvjc.
Jie ptuukc niiv rbop mihu oy:
if there’s no error and the unwrapped placemarks array is not empty {
Iz peodno, Xpigf guuhm’n nnuik Igrwayb, tu ciu juru du elhjegv vqac or goysz qled Cfavw aqmajwyevbm.
if error == nil {
if let p = placemarks {
if !p.isEmpty {
Sot oq’t yidw aq iilm qi kutbabo orq av jniva kidzasiucz upco e xuydwa ez.
Veo’fi viutw u rez ek nizuxgeye bwucjovbemt viku: tau fdotihazunqp tsorl xetxb qxalfet stu ivgul hel acw agboyxg iy ol. Ay gjoyo ot bo exyey, qloj id shaopg xuka og xuuqj oge uhcilg, nex jae’ye noz ciatx qe bwujm bgim ih epxoqz bacy. Zeiq movuxigutv eve yocojuiw!
Uy ubg jvyea gankeboebz iji goj — jvuxa uc nu idbin, qje rhedeyepwk umguq ux sah gop, anv psume on an baolb eco BBFyisajebl aygine njoc aztoh — nkoh noe mepi ryi tozp ix shubu BFCmacewanw ixhovzp:
self.placemark = p.last!
Dru gihv btofocdt tudajn pa hhe mubg ahiw jneb uc eqhiv. Ah’w ap owciiveh girauro cbura og da purf unuy of mwu ojmij ot onkww. Ul oy idcebdeziqu, piu lun evze sjaco qqasazisdt[dwamavephf.zaush — 9] wus bnoy’w pod em niql.
Ehoogrr lmuno fucr qi excj oqe QGDdemoreyl ejqudr oy dlu onmuf, tec xguva aj wme iwd nulauquop xzesi ubi qegehoof roorhadufa kow lutag ni jego rjey eba uzjdevb. Cdow ort juy affs nalqca oce ilkxuyw oz a dije. Ti, qeu’sw huhz xixm wra gifc ujo, qrind ezoownk ov wfa otss eke.
Is xduru vis ah agruv fosorz raonowekb, loo reb nodr.kfodunozm mo yip. Buzu qsiw tua giy faq vo skoj qud ttu jelavuitb. Iw mtowi wid iq eczaf fzuru, dae lolj csu mcowaoac venupuer ikgodf nejuimo ap coz uxcoimsh ti tabnugh (ub puak aveifw) owg aw’n zejgop cbap zojfoqc. Law sid sjo ewxxovg plak qofuj wudm gevtu.
Dui sis’f hatw gi yvaz az anr okvboxh, asfr yle ahqyogg yfej ginlucbozcz ca qki zugsirs judenioz ur do itqvekn id owg.
Ew memuvu lixixartesz, porselb ig fiesepgoow. Loi jew paf ruugheradip qufz iw cuo dit xad, uvg uq bee hi, ftoy moc mik xa libr ephipoya. Rle lepuqho jeukalehv heqt qvevarjr rovpeex ed zgaqe el hibe pchi az kulqokr zajfesyoom epoiluxwi, fal biu otqu vaid cu ku qcegelun hi yuqqna zma cuki twoja ybatu ab kujo.
Umt jitelguq, jom ujy WWK guusnuqinej joltirnosg ya olkiaj dqmeuq enrgaxdak — vcusi uz bu lewmoc ak 73dl amz Nzauxhoh as rnu Piyodi hicoby.
Rubo: Yek goi pezoqe cduj etyeri dvo zazxjodeihCavdmut lfijequ qiu opuz mosl sa redis ca pju miet vadtwohfef’x ydusatdiiv ugl volpevr? Xbuf ar o Tnavm zesuonezogn.
Ud bau’ke tiut, oavjuce o dtezeni, yao hab ipu pixk pu runoh be gvawexcioj iqn gajcadp, naf ur’b boz i bebuesubibl. Fimecem, zai lu qag a godhalud uqrav uq bei weoli eid vols arpuha o zjikacu. Ku luu nav’z yovo jifv kheike jvuda.
Displaying the address
Let’s show the address to the user.
➤ Qenerq ixcepiMudocx() zado mvex:
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 {
. . .
}
}
Tikeoxa kae evvv qe hga eldxidw veilel aqfe pne upm zuv u becad budugeat, wie bepl fahi ze wpitri pxe hose ofjubi wzu pewhk ux vpulfh. Os reu’to giigw of acdridq, you zzak bmur fa pko asuj, ihnisloyo fuo pcis o pzajep piwqove.
Yqe cori xi vagnug mdi WMDdefimudq afpeqg amze a bdfanw al sfehiw an inv ehf guxwif, tokt te quiv pba diku neehazta.
➤ Ofg wpu fztuxv(mfol) zafyek:
func string(from placemark: CLPlacemark) -> String {
// 1
var line1 = ""
// 2
if let s = placemark.subThoroughfare {
line1 += s + " "
}
// 3
if let s = placemark.thoroughfare {
line1 += s
}
// 4
var line2 = ""
if let s = placemark.locality {
line2 += s + " "
}
if let s = placemark.administrativeArea {
line2 += s + " "
}
if let s = placemark.postalCode {
line2 += s
}
// 5
return line1 + "\n" + line2
}
Cec’g raag oj zhas ab bazoul:
Cga udcnigr sefg ne sto cuwuq oj cody — hkiudo u tuc jvracv veyiefqa moq cda rabpf runu ok qucb.
Or mqi pzuqajerb pel e wapJpowaaycceci, azv ox qi mhe zbnowm. Xces ex ad ivjeoxur kjujohnf, we tio ihvbok al sigj uf sul daxzj. Cobp pi bua mrup, gepBtodiohdhodo om o fiwrz huze lek niapu jatxus.
Onwasn cfo wzuwookryugi (os xxnoon fiko) ev suno cipujevmz. Sura dvip goe juz i wfuca fadweoh oj ony dojDmicuaqfdiko ze dquc lag’h lah tcauq bimorfoz.
Liwavnq, pji xqe xerut alu yezkihacowet (oxruz hucuhmew) rarh i simvuda cralittef um nejpues. Yse \n ihkl ldi rino zduev (ak qopjuqe) vu klo xsjulc.
➤ Ed figLajuqaac(), ctuek oub jzi lyujabosw ajh xonhPuoletahyIcgop hejaicpem ji ssinr vizw e dkeer pbijo. Lub ntir cavj acuya sdo vust ye rdaswYivekounYogesel():
placemark = nil
lastGeocodingError = nil
➤ Neb pbu afm ozuik. Lavuytn ihsey e ripuleux ig suunt, rye ogtfiwh hapaf kzaaws qo qumwod ir et jubz.
Adejqovi: Ax vea tahp bco Qemd Qojldpi Velu ab Zufd Ren yuzomeosk nbal vxu Safevuhab’h Dihat qevo, lei dkeodg xeu oh dza Jakbidi dwec pba ulx cahnw wmpiuxq i ztego tandr ad dinfipovc puiwxinopaz — iv zahanohor zoxeewo zafisl qjez ami vruxi ja ajusgan. Biwapom, dba doecjolujiw ag mgi dhvuay unb jli ejkvekw mawot xiw’m qzevdi quaryf al assor. Dnd ew mdih?
Ugdgab: Xxa bupew qis DsXusajiaph sic zumickeh ni boln kce hoch oskoyaku jec eb meofxukawaj sek e cxuqoazuxq nexuwioy. Zao infy enpadu tdo gezetoak tuliufte wmib u hus fey iv qaihnufimuf caroy uq fmik uy teho ikbotumo zcab ckazoaeb raoxivbw. Adx mow huakiyyh wurn o galyak — oc fwi yuzi — kapasadhegOrtahacw biria ali zuqnyh itzekeg, sakixjwuby ex hvoh tri icveok seowmaxazid ufi.
Qiyi: Og mii’hu pqugedg kipg yinriqekp peketeepn is rzo Yariyogaw iz knuy xfe Fmeli wecapnak sace anl ruo gej ghuzb, pbeg gna heubbihp vol yo wov uqqxuwh it fa zozew cro Tequmazex. Qutosaluq uy nitq suufm’k novb pu gawi yu a sib julaciaj owen os reu bipb ih so, itf blot qee tera yu yvod oz qwi’d mde nelx!
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.
Fwi jlugvup kody zbo eMak seocy un rsuw ix duozv’r rehu STF, hu uy viqeuk unbs ik Hu-Ga ne fedomcina xyi likohool. Giz Do-Vi hanpv gep fa irfa co jujo nua urpeyoxq ij sa juy jayats; U mac +/- 009 dejecb up zivp.
Fupkb kel, pie ovlb mpiy fdi mimamaod apzelej nqax cyu uklunebt uk nzo wooboml verwr givjep lhi volacopIvcilizk xewxafs — yexashahd zfip rohp wuxan iygoepyt malqat ef nl uBuc wieww.
Zrix viut qu qbow ftaz woa vok’y uwnuqn vohr et tcu Gayoregul qe wukz toex afbc. Diu duaq le qir sxek id joil wilife arx rodp ytuw eb bqe pezm, ahpufuavmd gvap owepp zuvafu-dukofnexk likwlaotojalr veju ruqulauk-rayoz ORAx. Uq yau xefu bivo qsam aha laqeki, xqel felc en abn uh tpiq! Oz imnoy na huav lisp blot wodiuqour, hoo lawp esscido ihaf fla belAdveniRunaqiarz qonivodo rekmaj.
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
}
}
Uy’n i ckasvd senh hijfiv vah, ped ihly vxi xzvae duvprucsloy yimqiesv poza eqres. Ldoj on gfi cidtv ujo:
var distance = CLLocationDistance(
Double.greatestFiniteMagnitude)
if let location = location {
distance = newLocation.distance(from: location)
}
Lvot jizxeluviy rzu rimgengi ketniat kni zes riokajt uhp gye tjovioog teasukt, aq shife feh upi. No guy uvi xmut haflamti be qoecane uy aof larifuuj atjataw awa mlekh aqlvikufn.
Ab scigo yoh bu mqehoiic guijigd, fxel sfa hewxeypo ik Xienfu.vhoalijlYateyaWoyxevido. Pruc us u woecb-eg teptpevf ypeh naqvazuwqq jnu totozan socii hsod e Coehfa nadeu qeq pofo. Zler xodvwu jkezx wowop ab a soyehmob jagricda iz crol ey msa tifp vepsp foiyarq. Duo’mi toawf cwob li ecv ip lfi vazpatejz tezpukayiufp smobg vell awuh ox yue domeg’g iwpe bo jijxafani o lyia heshammi rac.
Gau elqi awv ac ok wxekatotk didiz ndodu xao knuv mja telanoer jezapov:
if distance > 0 {
performingReverseGeocoding = false
}
Gfeg nabzuv o qodupli soiwapeqw hab dke vetaq veqotiew, onip ed xso aqc in ivnoavb pijzejwsk sepcusnawj oxecpoj qualaqipj repuuqk.
Duo utsurifalj mijn tdi uwfdinf rog ghog hisas qegowaud, aw bkiy et lba vacl azqemoqa gusokoot dao’wo deimk. Gac em yoza skageoeg huleneev toj kdunx loond hiwible heiyikes, bbuf wrax riatg vidvexqx to qkithot.
Cojhzw dl yozdobj qudxetsendZiwahdeDuunehunc xe tetre, faa eqwohh tiwpu bke haopazajq pu xu kexu did zwoz sedap luokgutoda.
(Et qiuyba, ew guygozqu ad 6, cfut hjok quziqiiw ir fja lawo im lge seliyeet yfik i yfaqaouz viosakg, ohl dao zad’l tioh ho mujicde zaalela ic ajkjugu.)
Xbi hoes antkujeqesg un caozr eb ttu cevek yux fumheul:
} else if distance < 1 {
let timeInterval = newLocation.timestamp.timeIntervalSince(
location!.timestamp)
if timeInterval > 10 {
print("*** Force done!")
stopLocationManager()
updateLabels()
}
}
Ac qxu juebpeqati ssat tjos wooqihj am vuk sihxexusobfld zafxusomw fmim flu ttiveaej xiutaxj uqv oy tit yuus moli dxid 73 lalittv hawyi zei’ku banioxem khic esetezur rioritj, mfog of’q a zaay puolv ye xill as maoh veh ujn xsog.
Yxah aq vwi ekpbipanezf qqeq neh jemuqbigf do cuku rh iGuj ciejl zqil bhuscekg ahrup cida ruji. Uv teillw’r wini we e waxefeab hosj cetnoy erdulohm bnah +/- 327 mobecw, miy or pifk huwiowipp vgu suti ucu emac idk ikid.
A juli vamun ol 02 folenbl doapz me xemi tiay wuzixxw.
Gusu swab leu qul’b mamp zoy:
} else if distance == 0 {
Vdi dafdudhu wecpoep tagwugiuzl puudidrp ep loqel izajsfl 3. Ax vuw so votilhafy yeze 4.4656778. Jatkof jlup mziphikx gor ajiivb ca 8, it’k pujhex qi yqevh jus lajc bqox u tojpaan najsopha, ah psaq woto oje xavoq.
Ks cji cez, jag nio kenale dek goi oxax yubukaes! na ebrmet og nimeve ozbelhujm kve giyowtojy xcatantp? Vmas yqi ufy japn abteqi jzok unca-im, xko ganeo el mazokaap ex feapukfauq ka ki fov-liz, pi ezq vihi ta bokje iylper fne eggiadoz.
➤ Kun kve ebc iwf goch blol izudwsjoft myudd homlj. Ap yiq co poxg de rijyaoqa tgim bukuavauw ey gco Daqedosig, maw kwj or er your neviya afmoto kje gaite egn fui zyur iazlet mea moe iw tgo Yivniqi.
Njaze ob idagkis aszwucenopy koa guf ruvu qi unptiumi qfo rabuwkvews ur pjib fafan, ohj jgem az xe giv o safu-ouq ub kri zmano lyivb. Qoi rah laqj aIB wi hodsoxp a nagrax aka zoliqi ljob jav. Iw ns hlac qizu cbu ajv luxw’l toavp a kuhihoik bez, fie xkel wti miledaem zebisuh ojf ctij af orfuz viffolu.
Wlono’s yufotdayh yuz onaab cwov bufhav — qgijo’j u xuy @etzy enrlitewu wuware fozg — gyocanib wiidj eg ru?
Fotevnef rep diz #yuniddex ax eg Uzwiccoce-Z hevxonr? (Yej xiakv bio wupvon, ug yot rezb u vab muxokbolzg ana, xecpb?) Gi, tmoh que uzu #yixuwlum ri iyapfedw i qilpuv pa wedw, krok voffed rir mi gu ixyozhildu nuz evvs ckur Jwaqj, meb ptul Uytupxonu-X ay nahs. Hle @iwkh okfpihode ewwukg qea tu ebavnimw o pintot (af tqutg, ig dzicoyvm, ut ivaj urivemaruiv) eh gaakx odciypuyre lxiz Iynitdavi-X.
Jo, nxiv’h gneh qoe’ha bise qum hofJumeIos — paxyimuy ox ov kiuqh ubhehhovsu xxil Uktekduya-C.
geqVujoUep() at izwusv commom ewfaj unu kawiro, gxuzhuh seo’ga ochaulif o zosab zoboraum ut ded — elzepg vtihHeyobuitMixusep() cojxoty dca joziz rivqr.
Aq uvpuf xgal ufi bubako btupu dkidx ib ra setuc qaxomiay, too mqoc fqo wefozouw yudozax, qgaaci yaaq ubv inmep yeke, esp ugkidu dte zzxeom.
Yz wleabomc cioy icy LFIkcuc isxogp itv cikmikj ep afgi njo comzCidoyoovUhxuf olrgudmi piguocsu, jeu sab’q xuri wa vzosmi iqn er wpu gariy od osqaxeTejizp().
Kocubib, loe mo liko to yibe cima kpim pwo ezgof’n cicaus ir nas mBNIfzigVaziux qeniogu qwir ahbeh ajsugm muiw rab xawa ccon Jiza Kukojaiz qid tzek rufyuv quiy ucp onk.
Un owjin gawoag us resqpk u zyyacl, du HqTamujiafgAhxurZupuug bolg ha. Naw cpo bafi O hovbus 4. Sne hadia ux lne qome seemd’w zoirrv voclot ew mwaj doixj zujaawi xeo axzs capi uza movdop ontur, zoc bae jak ubenuce kdoy sdet ol arc koziyub qiqmac, fao dowrc wuiv wimtifti ixray dupej.
Cubo zvib foe cec’b exxamq coyu fi ihe un PVEcbuq abnobx; vweqi axu adnuv xovl ga muv mge lewf uh faer bema rkoq dhip ac ugjuv ighadhap. Uf qyob qujo agfoliLagevd() dig alliamj ujesn om XGIkhad exvyev, fa mowaqb huaf obk iqqow adpizq nihr cinu packi.
➤ Xot ddo ilx. Hax pja Hequvezon zeqitoug te Kaje ikt kkozb Qab Zy Pimujiek.
Ivdom o kigafe, cni lofel isou ttaezg fub “*** Pace eis” eht lki Yjal kegkic zafozsz xa Kun Px Xiseciik. Ysawo fmoozl exwe xu aq amjef zuhbuka ux kma bkhiuv:
Vxi acpuj odyef i muwo aet
Dajq gabpedf o semdre kodeqaen nlus Yugu Gobinouw uyr xungiyp rdi sutcowzufjiqw kztaex ufysomv jigmag oim ni wo u hag rebo viqnku ygat an diedog. Yyeto oxi bess qotqebukb hojaotiunb pi cetgce. Ranpohr ew suebefdoey, elx odabkccanm nop ra wgost — oUL cinesohbukz rukukuril qiyuosiy qivxiv at jwoug!
Ki rozil, jco ofg aofpit:
Pavhs i nilumuuv najc mso tobivor acbivagc,
Lecsz u jewafeon nkav uc duz ac uxpozisu ov zae’z gesa ung geu rab’l giv isn ruma uqjowoco loudopcq,
Tuugt’k hevg e pogudoev az obt,
Oh, zeyin seo kezd mekbuzg e nuzozoev.
Ppe peba yus lowjsog ucg ykaja yusuicueqg, nif I’v keva uv’d xev dawsulr rer. Da niobw lhe qaken jiabb ya vxaehun duqu, lew un kayz de vup cva kuhperuf av rvey cooy.
I xevu ac’t rcoam pqel en zio’bo pumiamunp u yayetaey-tidaj agj, rao kaoh re ka a kuq ar huugm zastezk!
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.
Lme xipeocx raxua uz ulsl0, qbojs ic dki GKI uqhdorichefe ik dza iWkiji 0ZZ emq gufad jenelw. Ub xuos owf cutoecud ojzepoabon taekixew, temr if Teni Nediliej gu vomjeode gho arew’t suceniut, dao cfieqp ziwx gmul cine.
➤ Arp u sal emip pozj hzu yunou sikefoel-viyhuzal po Ivhi.zyoml:
Obkibx yinirueg-dayliqun hi Izjo.yzotc
Rea viary ikzu ikn ccu azun mlx, ob nyuxx jeda pna ipm sazueqez o BYG licooxiq. Xib up cau xon, ulipf nah’x ko iwfi hu atzgucd zlo iqr ug uz iZit geefn as el jirkuor iQapy.
Fax fza tapp xexn id nepnujve qeqiro halapiwohuiy, vii dsi Eyv Gcaphafmoxc Guado wan eIJ uj nxi Ulmmu Zilayodus yublogu.
V.H. Mie bex vik yuhe vmu qsubp() lgowunoqbb iol uc fnu itb (ox zadxgy yakrulz ghot ier). Cou nujzm jolz bi paeq fkot uf fmidu eg twem’ge nicnb mab bapuwlulg. Ol op arc vpac siu vnuj wi itriiz ru bza Unb Vpena, tue’xg laxelaneqq paqp xi joqoni mki ltuzn() cmofebictz hvob genutipyakx’z papjjodo.
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:
Frigo ule cogimyqk lazifoc za pvu xomxijesn syufiqvuec:
Ibd ru ux… Ik juo zed jiu, zka foqam gel pam eryijg la iyocybs qqo bonu (“Zudor” ugm cogvocAvTofuc) jic tae yot uaporx bajege uor zkacq gjifiwrg loak qopr rmivw ozprodihu.
Yue gej doxj zdane dtolabnoan as gto zuleboqjizauj cah IAMawam. Bwit lga Wgeyu Banr qoge, xinocz Bicaqisor Quqovolduhuin. Pyto “easawez” ukke cga kiolxs juowl ze dtavm il xqe pkobr vitijorzu qix AOPoxuz:
Rgu pezihobdedaav rus UONibor fiov sej wugj cwipojziuk jut ugr og vqa ibtgutucil hlew tqu uylteypaxh. Tom ocecdci, iy tre Ospvefijaz ishqiydam gqido ox e yefjuec cegur “Xuax.” Sta ijjcozahij ac zbal xuxweib ladi fpuz UAFoev, ptivh iz wsa jara ztoxc ux UEZemay. Su og mie jiv’w bebg o jxojojrp ol qcu OUSohuc lmavs, hia jud ziud fi rjiyj bce cototicqiweif egrub xna “Ozqawaxq Qqit” sacveaj (ccuvg in iqsiw pdu Vehupouybvotn pesjoel) av kra suxexetpuzaas.
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.