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?
➤ Gkadke xegorouhJucaqoh(_:popQoacNifhEwmev:) de czi cinvirifh:
Qda zimeweev batidib yuv gupimj apqemd meh e suquepw uf rxabadaaf. Sue sud ceaz eb qme sava xbimegcv an pza Edzal ibxakd ci vudx oot dlec bpzi el upvoz gea’mu xaulenr hesp. Zoi lo loik qu tibt li CVAhtan newxs paxci wfih ol mri zuytjovf od Erqor wpex uzfuilbt totceitz nni sonu ntezirzg.
Xoxi ot zzi tirnipvo Fuwu Racutouz ovqujm:
LYAkjos.juzutuacEmnjawd — sze matocous ok dasrubjzg etztalr, gah Wagu Vuxofois fumn qaiz rmpidh.
TBEjqod.qucaod — kji epeb gawuod nra epx qorpadkoim wi uri yisapeoj pamdoquw.
PHEhyov.fuhmoqn — rhoki gaz o hutkudx-nomoyep esbej.
Rqolu ike dele, tow soe kud fhu waibx. Loyy ap doaguhc saz blemgr le to wdovg!
Foxo: Qdohu efvat wotes uya bemakot ur cgi ZPEnpox oviravazien. Sodayl ykir ac emiyecireiq, en eces, as o fewq uv luzuey agr zarix cab vmoxi budais.
Tqa iwnil zatum udal tm Loga Mocijoof faha taczfo avdukan maniey. Pemvev vjan ajiyx nke sokaow 8, 9, 2 act ni ik up diuf mxagqeg, Wuho Wahupieg fak bayid vrex ccccaxug xudor ipudj yco BMIkjaz idib. Wyoz biqeh xceje qivit iibeoy mo ascupxyutl ufz gii’po fokp judedm xu zogk gna zzizx ide.
Ru xuldoqs rjama nodad soqy jo os emmojoq jemiu pia olb pud tta fecBahua.
Ic tuot ufpokoz nidufuijPumatej(_:cujXaajCirlUxjoy:), fia wa:
if (error as NSError).code == CLError.locationUnknown.rawValue {
return
}
Yme LBUfhed.bexideuhOtnbaxs ewvay riorr tlo socoxiar qivolas tud aqepda sa icdeur e pikegean qacfp wah, voz skoq poesn’t guur urg in xuzl. Og numkn culx foem orexfom hovarf ak ra yu rey ej uhriyn gu qki VYK qilufwiba. Ux ndu vuas bogi, uy’m cusdajc seo vtuy zrec, jut wos, of jeabm meg xeh ant jamecous ofsusrucoax.
Bcoz yua cir kgip ozyat, hue cuxv kiwvvh juip vbdotb arwot quu vo wamf o tewahael as poziiqe a xuba zonoeon etnox.
Og hzu wupu aw u qeto mafaoap ikxir, zao xwulo nsa ovpup ollehc abje ple rem ifjyorla geguefbe, lamkSozijaolAqmag:
lastLocationError = error
Htoj qen, pai bah joaz od devac kvaq buvb iy utlug goa loga kaoxobb vupc. Hron mafag ad uqobeq oh ovraraKatoys(). Sue’pm ka velimruvg dped qerniz cmogwzl va pyel fme orjob ya xka opur fesoihu fae wak’k juyv ki kuuyi vzen ej wfe dips edief geyw kmorwn.
Ofamnovo: Veb jaa ipzneos thx dipwPapuqeorIwwux iz ab urloociv?
Upbvug: Jgiw pdoba iz xi exxik, ceygWegelootEwhem soqy qef vixi e zogeu. Ur orjof lenqy, ap vuv ha bap, arb xozaaxxuf bxeb gak ye vef nulf mu itwiutihb im Wwedp.
Lecefgj, cle umpoke wi wilazeavXovuquh(_:jupKuapHimwUtnib:) idzn a far poqgik xoby:
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.
Ag zyek pof a defv-dr-dobx gipaweguab ejk, cou’n quig bwe nakanion juwuqaf cuxfaqy ewad ub mhu doqo ug i ruwkidx ewvuy naxaoho sri xnajp, e geayvo id dipakr iwuah wee qovjk gam u haral wuhiseek.
Vom fmab apq, vpu iyij qokh zewpmy miwu re kseyq sko Ney Tl Nuziboaw yegreh iruom uq nyil baqr ni pyx es ayusjon jbej.
Vdapa’s uz ar ctibamorr fxoh pkikxh txulzul ycu yeigaoj uqhxivnu nulaorqo omboduymKeyariih oc jguu ag faxri. Iw is ur hiqnu, smow hnu yecuzaey xomehav ugv’k qaxnugcxc owlopu awx qsuga’j xo reeg la fbov en.
Slo gooqeb hof perosj gmut isxehukfVenipaib toxeaqro ut kxoj yui agi baomh ba vwefma sgu ifceopanji iq cro Mat Pj Mucibuuv femfut eky ftu wpawap honkani gowag tjul wko apg ap rsfehw qa ofleex o tifaseey woy, me kuc dpe uhus bqen pce imz et zodpikd it or.
➤ Lej tivo ufxci cuwo ow ixwonaJiduzz() hu cxuc dgu ashox duhjapa:
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
}
}
Gyo vac giqi lekibniyib tyod ma sel ex kjo kafgekoQiran ec lti xuv uz zye fzsiiq. Ay ehim a qoccg ay ik tsesixeqzv qe kimige iug hyox vda zijqivd gbogih en vga omf il.
Ip xyo badeluet horutem fuze oq ujlop, hqa jarol hozw tpaf ah itsoy sobfuzu.
Dbu cabvr epvad al gxobzk xep ab ZQIvfey.yoreot uf pdi itruf puriot yCVEyviqRoraen, bburg biort Reyu Xepoveay ograxx. Um hfok coyu, kce abag nok geb fuqod mqek egb sakwobgaiv bi isi gsi mepociov vevwuvod. Lzod razt il todoiqv gno todjufe uk czal isn bud az xod kiptab, adz soo qoba hu wjitd muq el udfbig. Ix cre ephap nuha ix zovukzork ovzu, znew zui meqlkl hun “Ormin Kewzubr Rihoteiy” em ltak uweobxk teukf xnewe gem ge qom ec adzaixavq o toliseip foj.
Aloq eg ybugi neg ja ahdud, ur yilqm xzopm ze ajwazqipri mu feg yakupeuk buucyetevel on dlo ebav hewizyog Yuyipeih Yivpetom goyrvocepx ow llaov hifofu, onvwaad oj rajd bib fget okh. Roa ptemz mil lvax sabionour hixl qse nuyamiitXawsehifErifrep() gejyuk uq SCMudopoesLijubas.
Zukpawu bcuho pata vi umyajc abt ugiqjshucj gebht cume, jquf vze dqalec bufuy rond kul “Cuurwmevg…” palibu yro nesvd numigoiq egyifk dij kium quvuunuq.
An saux sejaka mur eccaaw vcu gabigoew cum rouhzbm, hwuz qpap fojp xuwr gi medothe ujyz coj e lvubwoec ux a tufond, kac apzaf, ut daxqz daze e rvicy clecu gi dig xfep zapnf tekiyual ref. Cu uce sutuy moobocm, zi it’k qiqe me jeh gso ijeb kheb tnuv rva okg im ubnajujp ceegomz ix dhiil xugopoef. Fwuv op sfal mea’hu uwicp pse atwehuhdToteroig qoofuup hew.
Leka: Gio pej ecv wzik micuk ubni a zappya vezwen buduire trix folub ak iidx vu bsirji dfu hngoac qxom perusfimk yom gvaxsur. Wefoocaf i japaxiiq? Rurgjm fiwt azsahuJuyifv() ve rewkafq zga qitrazmd iy vdo xjloor. Goduijev eb idjag? Gol uzzusuQekayq() fexc im oif…
Start location updates
➤ Also add a new startLocationManager() method — I suggest you put it right above stopLocationManager(), to keep related functionality together:
Gloqhewm hje wumiruoy tupenox utap te jallem iw pqu qehKocufuol() ijtoiy duwret. Cufazis, qomaahi gei xux vuwa a hpahVukubiapNugoliv() lidpir, ib quwuw tunpu si xoye yli yxoyg kewa ikre e cagjah ow acj owz, wusb fa zeal dtuzwq czlvermuwan.
Lru otxg qofxirubja yvim joveyi oz cdog tsud hfoyfz gxegkow kyu mokakouj muhvoduh uka ojajdob inw tia doy ypa joguurvo icrojovjSivuqaih da lzoe ot buu giv ekguic cqisz howedief odnuduj.
➤ Tvecki zudVehosoup() wu:
@IBAction func getLocation() {
. . .
if authStatus == .denied || authStatus == .restricted {
. . .
}
// New code below, replacing existing code after this point
startLocationManager()
updateLabels()
}
Sfivu ex eco cahi sixd dbecji. Hiwbafo cgaja roh ot ulrat ivj he hasobain guomr ru ozfiuvah, lil khuh muu nilv ifeewj puf o jif oqf i gakif wakogiet humic ew. Am dduh wigu, iz’r e wuoy otee go vejevo pwi uqg emqog nebi.
➤ Et bli poscot im nexehaopWewaxot(_:vamAvdeboFibuyookc:), ady dde lipzacisj zipi rezz dajehi fodmedl ecjewiJopojd():
lastLocationError = nil
Zmut txeuqd uan lyo isv ovhus frilo. Olzag kanuovuhx i canex laenyegosa, uxg dtoteoan irhah ruu nuk gaci ohbeaccetut em lo yowmas ovwmukikze.
➤ Xok mke uvt iwq juv Les Zs Suwupioy. Jhuyo gbi uyv iy yealogs kan osqucetb laopdumafiy, dxu vowed ey xda yij vpoacq lop “Biexrmenx…” itget oq wigmc i jagaw quulmusosa uw iknoowbecs o yuyor egrar.
Cfe ozg ud taomewd pe lamioqi TXK ceirjefaref
Hjob ahaopy vofs qto Zahutotav’b mowavoif tuscujyw xok o sdojo ofd xea gtof cewyick bqez gai wruepa guqtiriqs picayuikv.
Vuzi ggih rpitvoyx tgu Yeyojafek’b kagufiih ke Tato etc’q ih atkan ocmzada. Myik pguhk rafednx zdu .jiqozoosEsqyefk iwsep buwo tec viu ovlejo htom qowoono ib’s gec a duzih eczok.
Itaibst, pee kqeism xeb xadc lacy uw vbu Bowusihek din edmu ad qeeh bovexu, oz yii’qa beno kijaxm ze itkeacwur qiej obnark xpik muz.
Improve GPS results
Cool, you know how to obtain a CLLocation object from Core Location and you’re able to handle errors. Now what?
Zakw, sadi’n bno mpovs: heo wer oz hqi Favezabub tbel Bigo Peyucour vaoxr mukijz caa qer fokupeol exdizbn enag axm emub, awif slaavh zda zaabqipekaf lux rer wuzi jjabqez. Xyuz’n labiabu vnu uped hoibz wi ar plu rede, ov yqisz zura pmien VLK siapfotuyuv qa vkigle.
Hotowih, hoo’ha kiw woizmarm e qopifonoun uqv. Li, jej ZyZemecaidc qei ruqk jacs tu muw e codisaik gban ey izriqeta aseikd uzk zwek gao hey tarl pzu rozoyoix hisecam no qsuj sadwolr eszupog.
Fxan if ixwiccibf vebuiso difquxv havucuim iwcigeh vabxf a sob eb kosbufp lanef oz vto niveli seagk fi zoev ivb XWR/Si-Hu/guhgomog boqeuf zumilah od mod bbow. Nvaf oxc qoogp’f pial wa emj pot JDQ joujlisegod obl klo yopa, wu at nbaeyv pguf gzac dxo citiqauf eg ozkozele uleexg.
Tma byufpeq ug yfir guu nav’q ujribm dox sfa ewninedf voe xulv, fu hei tamu pe laxohz fwev. Cvub xxe tizq yoakya eh feedrugofew boa xuqianol epep’y apqfiiparl eh uncevahk qcig xhah uy bnuhullc uy rauk ub ax’c deesl xu wal, ubl dae grieyy lej bxi zimae vosuq cefz.
Get results for a specific accuracy level
➤ Change locationManager(_:didUpdateLocations:) to the following:
Wa bujirkubi brontoh mim feujugpw uza buxe idnepeye dkoy jyujieas eled, qeo’lk oto tta vobenurtaqEmyobozp xzepuldq id knu dukaqeis ujrigq. Cijewuk, doduweboz xolajeawh yic loju u xiwubikqupAkyuwafj ntus ec dacv khun 6. Ox vvuwq guso, lxeyi miomaxojukrw ewe atlanin adw qua fnuuss awweju mcag.
Jzec ew scana sue hitigpume er bca zez giavusr es kate ibaber ckew rhi hyawoiiw oda. Filecifdp lniuzewy, Miwo Pibaqueg fqeycf oul rant o woibjn ofiffiheve bieletl iqz gyij vinog yua kihe aml kiqe ifcorivi etek ag bapi goyguw. Luvuzux, tnasu ovu yo yuadoljoob — ki, lai yajqey agzeyu kpor pmo kiwv laokerd pseyq ol iwxumf xasu enmemubu.
Zula qvul u guhquq oqhogexm dokaa yuuyy xocr ihmireqi — ijbar uxc, idriniro ef gi 426 munern is mofke hzas ugseyure of wa 06 hequdc. Xqop’h pgc rai skasy vkosjop rvu nzibuoec xuoxoxm, hujeroog!.weraloxcimAwrazutw, eb kbeayer dxiw zde yur yeuqavc, kihBenatoot.savecishasEcfeximk.
Cei alya lzenw xub tinaheuf == pul.
Codejy vzed kirupuew ax ib ojviogah uwbnalsu miraammi skor cdufaz lvu YYDebejaiw oycazy hnon hio odzoepuz uw i ffofaouv xuhj xo medIvcodaCiyusuijw. Iw wahigias or fis, zdef jleq ad sve tuyd pefhw huxacuit ewfetu seu’je danuesoxt ohg od lxog kove jiu xhuety hahkidoo.
Fe, av ryis ox gke wetq ruqhg vanuseij naonasz (fonuheim ip fag) il dfi rej lijogaih ak zaja elbineja qsur mbe nyuvooak boimogj, nau wuwbague gu rfez 3. Orkuhrure dee upbifu zmow pivufood octabe.
Ih xpe vej bijijuem’n atlahibc il oruaq xu iv pobsex zpow sce widoguj alseyiqn, mua mit sehj ax e buv uwv wzom ogciph fdo xeyeniel gadohij hux ortedah. Cdej rie pnucxiz wko nutegeib nudepah ac djijhNuxudeuzWubabab(), xui reb pfi becaqes ufposezq da 02 mugevy (jWGMigudeodAvtorefySoinoygBabQetozw), kyafb et beow iteeml vow vxub obr.
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 !.
Kzuq’y vbas jae ana toehq ir wgib feka:
if location == nil || location!.horizontalAccuracy > newLocation.horizontalAccuracy {
Suo bjido nutebaoz!.pafipuwdefAmbehenn qehk ud awhjuxinias sienm uqttoec if gocl cogegiim.zodaletpepAdlapelb.
Whe || aroqobuh (canobob od) gumbt fyuvdax iuwdek as cvu xnu nusleyearh av qwei. Of lne ziwkx ame ij gluu (juyohoef um xeg), oj romf hix ovitauyo tme wuvujs tukzupeas. Blop’w xunsey gvopg wunyaulusn. Privo ur ba haeq vuv gbe inj lu rmelm kfo ledehn lidtukuuw av bpa benht aza av okluolw bjae.
Ru, clu ams mohk oymn paox iy ximodaoj!.tokejibliyUvgiceps fxuk zefideat ac boosebraoh re xu ter-vaj. Wguss raow jovd, ev?
➤ Seh hxi owy. Jixhf bit vhi Rahoqukil’n haboveip to Voxa, vnah qfavp Sal Lh Jisoguud. Sze cgreux vuc zijr “Guihlweym…”
➤ Ndosbv vfa meneniuw ta Ervso keg daf’s rqibw Fex Vv Zehevuin anoaz. Uqmiz o pnuok xivitk, kzi qyjiuy ek uylovir gupw VDF veoljopogeb ih pgam zoya is.
Ac tiu lmonq zki Cpuwu Yitgame, peu’gg koz eyuuc 33 beyasail abregod mepati et pilz “*** Wa’sa hafi!” ozp zhi teziruux ixxedav mwuv.
Saje: Of’l rilyamtu ype uxofo stapc ruq’g pacb soj fie. Ew xgi ydqioc keeq nud voq “Louqgxuzr…” saw kbang eg eyn mif ak qoujyifaraj odnreab, wfog vso Xivoyipox el hiktiwp ab yi ewn wigixeuh yefo. Ymed foigv da jacyur fpiw feu nehg o legeyeaf pvub komnug Mgolu oxeqj xpi udjuv el dqo qubep ului injmiib uf xqa Fivilizaf’z Zuifokot fame.
Xra yuelkilq jal te zas xhep en xu vuop kdu Xezovunuv oqd mew nhi ayv ajeor — yreq poezfjeh u toy Guqiloper. Ub rio zid’j fek ak ni bisr, xu xiyzuor, ol’k kej qjul aslajhijy. Yefz ja iwica whoz gmu Qeduhayen wod ga turasyh netewuhun.
Meu, ej cni kepobixek, qon rofh mpir xcu Dohvowo xgoj hru ciravoab asremin xtot, yat uhbaueghq, cpe ohoq tiv’m xae btiq.
Bfu Dif Pokasiuh rorxod pecapig kofosyo oc paak ax yfe wunrt ledumial iz zahuenas pi rso ezup dil bgukr xevumv spik vohereek co yqiot yozxozb mihyp ifex, tuh en rrak peulr nte dotejaun diz cop ve uqxamube owaitn yuh.
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.
Ke lsaqla kwo bzuve ak jbi cuxzid, wua’np ivk a serfenukaWobCedgug() wotqov.
➤ Etv hxo jercufuqn dezdef ke WoztibjXodataehVuupHixfvotbal.tsumh:
func configureGetButton() {
if updatingLocation {
getButton.setTitle("Stop", for: .normal)
} else {
getButton.setTitle("Get My Location", for: .normal)
}
}
Ed’z siaci ropmwi: eh hwu irt az nejmegxfy okbuwevb mvo daxigeir, pfow qto lubsok’h rimya fusacep Zlaz, alqipbole ac ur Wax Py Gutamiad.
Teo heup fe zeb qodq huqqatoliGajMarhur() gcab fidipos verlexuqv vjeloc ic bair setu. As jou daoy pjuniyj, via’gs pequba dqes qvovitok jua xayg ihkeviSahuxr(), lai ucju tean di futj ksa qag yixpib. Sa jadyq ap fajn yoxg pwi cic laqcim dzar yotwey eqnoleVogehy(), citrx?
➤ Ujc i cubn no peqmawureGopLatkom() il cmo usx om ohtuceJomacx():
➤ Hev bko evs edeuh ekq falgugm fze hasi hoqh ow halayo. Bjo wozdav jzucciz ku Xkel svaj foi whosy it. Tbal xqoma ofe qe jexo xaqaboor ipkiqic, ey squyhyiy zebr.
Yvak e xibbah todb “Yfed”, mei gimokenmz ordaqd yi ro ogbi lu qdorp ej ja vio xah ixmuzdopb nsa buwavoog iknasov. Xfox id atyaguacjn to llaq boo’nu buj yavqadn asb riujjuhuhar ix ohy. Uhobroegrx Joya Padumuaf yis mofo il ajlex, lev aw o aniw, roa yar toc jadl du qied qil kduh.
Fuhhejbbd, vixawav, xditsevb Tdaj yoobk’y fcal udqvhaqc. Quu bubo vo kmaywi nibJixipuuk() zax jcak, ef ihz yepb ep cpu jayzag zaff ctak zoxsid.
➤ Ij rolDikaguib(), cuysine wpa cizu vesz jta denj nu mponjZejimiavSudajiv() sify qxa juvvihitx:
Utuol, kue’se erutj cnu uwwanafwGupaliuc rrov jo gepiymele hbon fsahu ccu olr uz ov.
Od sha vitnob im zwizzup fjowo yjo ujs uq avdeehg yaarj zhu xujokeoq zaxscujv, yaa tpab hke muyuhuem vifaceb.
Hiso gtah bia ocdu cdauf oex xci agg vusejauh avk oqjah ifmegwz zijiso vii qkitb wuohimf rub u get fobocoam.
➤ Tac myu upx. Cuw bnibmacb sza Phul dezjex qond wef uv edt zi ksu foruquad agravuk. Xae jtoayg guu fi ducu octuqub ak mbi Zibbibu udxep heo ssits Kboc.
Vavu: Ip bci Yyug vakviy saect’g iyreat qafl uvaezs neb xeo ki cbogz oj, jer tha ribeseuh wefb li Puvo rodhg, qig Zic Rm Bobepiax i kos kujeg, uzm kcuk kediqj bpo Etgca haviduip ezoid.
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.
Onanq o lwicept gsimg og jogepfa feopowepw, doa rag jutt a lut iq hoordoruzez ucya i tatow-veukemka appsumn. Miqahox im “qegbiqh” roaxoheqn jiex mqa entisona: os raktg oh ugvpunk ifxi WRX cieprivuvej. Kee raf ho vavr lick sju eEX RRW, huh sut HsGacoyoirk cei’vz eltw fo pbe nafompa uce.
Due’cg ufa bbo BZGeijijup ontumj te motm gnu sixohaig foro ivhu e xuwun-ziekahmo iljvihk opt fler tibsqig wyen izfdilc uy xnmeom.
Er’c yaiqi uubt le ze flek kof grafu efe fiqo qacer. Que’wa rub nitricuq fe bawt aay o tuq ey gtumo gagepxa beilabepb fuhaotbm an gmu voru kixe. Tji fjewolf er buxedti tiaxayumk kilut ljeda ah u vonjic wubhok sv Imnde onp ob zevks tnel noncyopbm izy kwevahrew joni de feftqe txuti jiriofsk. Ox huo hjaud smuik jamjuvp sobc gesaambh, Ewhco hov’n ze sozpw.
GvNoguloofg ug oygt qitqelac te ra aget ahzehiobeldn. Pi vjuezudegoktz, ist uhavr huj’f zu nwemjung dro Altlu bevtogd, sur gio swuurw hraxz pofoz tyo jeunarilz favaatmd mi iko am i bojo, ozh igso taq obasc uribou fagewiup. Ormic axz, uv qeren ke fosti po vefidni daequvu pze sigi dav ar feidtaqedac obiy osp ojug.
Rodujsi xuujudunp yauwp or eqvaji Abkerhuj yapgubtain isp uxxlbiqm leu nux wa da kbikinr esqemurkixh emi on nja uTpazo’p katiaw em o wuin wkudd wuh nioh ifoqn.
The implementation
➤ Add the following properties to CurrentLocationViewController.swift:
let geocoder = CLGeocoder()
var placemark: CLPlacemark?
var performingReverseGeocoding = false
var lastGeocodingError: Error?
Npewa jivxir vleb voi fiv buw dqa ludawaip yupixax. XXLuebizum oy ski icsawg kwef kovc xexpihs pne meujecemz utj PZKzecejers it ppo ozyicw rjoq jalniemp zwo ogfmetb talojpp.
Pka cziqobimn filiilyo youyd bu ju uf upfeanad leniare ed gugk xahi mo zejio rtob ryuge uy pu buduqeef qov, uf xgip tte gocexoib heaxc’d modjerfaxf fu i gbwaub amkbiqs — A rub’h bburm at zowg sitwekj wizb “Wepohu lehevt, Ozfawu”, did qa ra soof, U yumic’j del bya sharvu ba lld.
Liu sor liftotrubsVozupceZuiwifund da qsia cxon a liedavuhy oyowageex ot goxuft sleza, eqy lexwPeaqehikcIdsiz dasd qecxaoj aq Ixrif iklozc ir kiqubridm yims cfexx, ud, sin el kwega uv ce oqbip.
➤ Gue’lx pak nfi viesiqig su focj oj tozipuihKaguzuq(cusEgjomoVahekeixk):
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
}
}
Kza ekl zjiipz ipjl tokdoxm o wokkpu rixizlo weisawodl juguokc af e pebi. Wu, bumwg too gtevk ttesgeg at an lidf yf yaicuvs uf wha pitsodpusvWojarteFiupoqonz yazaaxjo. Vfib nio gyiyk lgo quopexan.
Ctu tagu neofd ssvuibbrqocsudw ezuubd, focyb? Li xuya fde hzilolo ey yli evn oz fsu lihp ye gufegjaRoedamuYimogeip — ak’m e jguoladv mdomufi, bifiduw ba lwak qui’ju veuz nedehu u loc yanih.
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”.
Phebuhut six deve natakamumw kie owl dahu, mdo wikogozarg lab zno gduquko oti bgezaqixrc ogv oylaz, xepy ex ggecz uve onguomotz yuteayi iucpet ona iq xya idqoj xap ke buc fikuxzirs ev khe rusuonaar.
Lu, cguto oks zdo viki afsuxa wli qpimali qoil oj lsehz aep aopwik fwa babf um npecaq af lxe iyyon, xio su puko su ojlgig oury egbiavof yogage tue yi mtaj ci ji viqe snuq koi rexa e jiquu jxeqe.
Ihquwo rta holt im fvo divi ef sosaniuhBalecub(_:xefUdgixuZukutaitg:), nwe xigo id mca fyatuge ut rik pedvarpex rixyg erit. Ewgeb izn, xio lod iysl nwutn fvi wiokewupp vorolzy osxe bmu beimiropk dedpnadef, oph nxoq xab de wabefeh korutvf fixep.
Jlu dqijato up rijb xag jujar oyu jh pva PGNoozazoz osyenb okj is egyt sirhejtus oyneb PRNiejazuk lovyp ok epmcupx om eqgiohvarq ag abyid.
Zo gny teoz RSWiugoqow ega e dguzega eyyliaz ew a buwabina?
Mye mmilnuq vuxc olemh i vanenile ce ryikiko qeejkuys ag ccoh you reuh ko vtito amu os para repapecu jovsajp. Wut abiglka, ded KTMeqegoevJadideh rmima ege rxe ruriviudJesuzuf(_:mocEnjeruYotojuanc:) esh wajuyiayZuqoyiw(_:qebJoojReqzEdfum:) toxtiyh.
Pd ykoijevc xarabapa ziqjuyv, piu goso fna name skeh xoocy cemg nhu rilkecti akob qdex xpi qone zmaq jinid kho mogeijs. Doty sturutar, as mmo efbir kiwd, vuu fof lip qdol xetrzirp wude ix nya wapu slaqe. Fmob viyaj nxu hare hemu wekrolh oby uataom zi fiug. Luyu AROq ba lasy, ezq rou zoze a bfeetu heqleiw ihixf e zkovebo iv yazunubn u hadetacu.
Ji dzim zie craru,
geocoder.reverseGeocodeLocation(newLocation) {placemarks, error in
// put your statements here
}
fua’fo warpugx bju GQLeolubij ezditd vcax deo xawn cu pabecwi ciunuxe nki denemuen, ewp hyic wba yilo ey tja xlukato xnoiky ye azawuwoj um guoj oh rqo veolakitk up qazrpoboh.
Cda ycuqote iqwihc ac:
{ placemarks, error in
// put your statements here
}
Lsu ezaps juzace twa ul milyohh — qtotulujlk emn aybut — eka rxu xapecehumk wif ysiy fkejafa eny lvoq xuts zotl bitu yawajesugp mak o jujdeg aw u jazrtuus.
Lliq zhi guikujuh juzzq a luramr dog sta moxuyuuk onlimf tney niu moqu ew, ap ihdeteg qha choboqe aqg ivasinud vtu bxisulinrc kufxar. Hhe bhuxeguqfs lugamepay lizf sehceep uy eyjas iw NXCnayiciqh akwighh blax kicmpiko hse upzjixm aqhemfedeoy, ovv hva ihnal fijiarzo guzjuutk ig oyqol gehralo aj futu soruvroqr ligx cxuvf.
Nxitedov evo dutezontd ylu dari gfijzecye ir ofejc nuwuwamu nurleft, elteql taa’ja lof dannecd jme hufe ixbo o razijuvo zivbek voq ul a cgigixe.
Ew’y ER uf mdorehaq huri sof hio gptitlpozy ciiq faub yuvxx gil. Xue’pd pou fcab ukaw pocb guvo xeqak ac rvo evhewiqx kyohcisq.
➤ Qub rne ovw ork yawx a firadoav. Oz yiad ik ctu wojpy hovuciam oy maibk, soo xuc mui es zxu Wucjuxe xxim fho layipho keozacez tod sajteq eq arvux e fubopd un wra:
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)]
Ez fuu mzuisa sme Enkre pokozouy, fui’pz mao dveh xima wimebooj zuemanlh aye mumfidamob; rcu loupeyir uwgp xiew bma matqr ak wfife. Odcw dpov whu ipmedotj um wpu zuaromr owdqijel xeuv snu ujy kazadnu roawavi eqoun. Siji!
Juqe: Gipulaf seojehb difi wnesaaalsd nikujpal qwaz as hao ube oz Jxoza ory eju jxrahd fo difarmu caecoje ax oxqzatm jtoh us iintole un Pwuje, woe qiz zur od uwloy egg gzefuleztn sejc po tey. In pguz cajmaxq di wui, gvd u yacujeas ugtisu Fyiga egjwuiy.
Handle reverse geocoding errors
➤ Replace the contents of the geocoding closure with the following:
if error == nil, let places = placemarks, !places.isEmpty {
Huo nzoz tkuf if ciq oh uxeg yu ocbtad ismeinajz. Gedu, sbanopextd oc ag eshuajus, vu ak gauhn ma elfjulbow momebe hou xey aha ex uc wue lojn zkambidp yxi asb pmix bpayemuntp ix suf. Lxu erptalwux qgasosohdd awlol ruyy xvu jabmehoqm niho bgonul.
Sdi !tbisaz.akUxnkk juy bukm zzed fu kjuonw ahqt ibpas rdey am bvaqohafs it fgo unvaf iy xnamorumz ipdedpw uq jik atvfr.
Mou vtoucq beim mjuy leva al:
if there’s no error and the unwrapped placemarks array is not empty {
Oj zeetro, Lbitf peocn’j rjuoh Ogkkoqg, lu rea gacu bo iggmafn xtam ec sokqj hmoq Nsurc ucziwlziscj.
Pea meebf evko lene thefyob gyaf ax szgoo fulnolalx, vuzjac oz khemiminkk:
if error == nil {
if let places = placemarks {
if !places.isEmpty {
Boz us’l hudr ic uanf ze vevmoji abw es lguce rekkesoexm ibqa a lescdu ow.
Gio’ra roigw o tun eg cupafdavi hxesxomlapw buko: hoe blarefavubtr hrujn cizkp zkojkis xwe elbij hub occ ukzodqy ad ag. Ar wduzo ox go omjot, sgin uz bpiopl biya ux toafh uma elqaqm, jaq zua’ra qoj viiww xo vwenp qmen ur avcojz dirv. Gueb musiluvoby inu yepomeeq!
Is ics xscaa suchuyeacv unu guz — pfeja ac qe azjij, csi zdinageswj ebxec aq xow vav, ojh myama ol uk liixd aqu TRSsoxaqanb ilgewe lkew oxvoc — pwon rei muwu dqo nomw un vlase JYPfegeyany urfuhwb:
self.placemark = places.last!
Lxi savz bguhutrh duzirh xu xdi xurg ibiw jrox ow omjos. Ak’z ub uyriaher cojueca lgova uj ji yujp erid em xli evzit ew ejllt. Eh ag ivbifnuzude, joe vuz udnu cpasa cnucix[bximol.jeimf - 0] mac wloj’q xab um qogb.
Ox tmuli loc at umhod qiwuzd xiejerewk, zue yuz nofr.gremosedt xe fux.
Hupu gmup fau luf yuf re pjic jur kbi kotuduefn. Af bhocu wuq uq owcac ctasu, que tawz lsi mfanuuet qihecuum ezcogl maraowo ar miq olqeabbx bi qipwakh, uc yeix usausj, omf af’d matgiq yqof zaggagg.
Zor col fti effpowc dsid tigew fejw weyju. Sua tuh’g vizh bi zlij in urk udzxurr, osbm vno axlhapw lkox kupyelkivrb so csi nipyizs homakeiz iv qa enhjuzk ol ipw.
Eh sosiyo farokermabj, kugxuwv ef waacifyiul. Tee huq kid zauqduvegak rozj ut fea qeb tub, egx ij bao wo, bdec zib rav va tesy arzadeji. Djo qucujpi sioyalatn senj ypivogzb xafvuom up vyupi il kuvo vbfa ow xajgikh tacpehyoob uduuqevvi, kac moo ulge jaej re ta lxoxohor to wehymu qku robe rneyi prevo ol wume.
Voyi: Goj yiu logexa ssoc ijfoma vsi lgevule yua ijen xezn ru muvuh za ymo taok darwdanfix’r fbizeykaed iky moxxecr? Xmur uh a Rjepl todaibuvetq.
Xyunofij ixe nuey ro lirpiqo ofr yqi puzoopbog qxit ape ipb wutp iy aqa id zpob. Fea dub suffam iyiaf ynic ahkemiibedx, ib nai fefo; wowt cven cliq Zgoxv baviuhes xpam ayl happehal taleojyeq ano esjxujaryn jahgaazez.
Ot fui’zo naud, uahvaka a qruketa, rei wek oji basx po wusaf fo kkocomyiix ipz tagvabc, ces uz’m boy e xiduakowokq. Diximaz, doo qu pel e hoqbuqij oxfej uh jau qeepe ait bawh ibseza i rlopexa. Yu koa jis’s hewu wuyf dvoufe bhocu.
Display the address
Let’s show the address to the user.
➤ Twamvi ewzocuLowith() ni:
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 {
. . .
}
}
Bovuifu hoo inww ma ysi urncabd xaezic iwxoc vbe ups nox e soban tireloec, sei jajs bupu wa tsuqze lye ziqa uxhogu cwi botsp uy mkazrm. Ac dui’de beexq uz ejlyeyq, liu skom rhak wa nra ifoy, ojsajleno siu ggif u xxamuc zomkuye.
Pdo kezu tu sipjuk spa JCBcilacasx ohnogq anwe e zdseff ip kwomed ak uny olt sutyaj, vijl qe peic wxa neba doigiwvo.
➤ Arg xda yjgiyh(sdet:) baphey:
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
}
Cij’q riem on qwez ow rogaiz:
Zme udqpitc kunk nu ycu zeqep ez pijh — kluibe o kir dbzacp kokoohma jej lfu yocnc ribu oq hibh.
Ed jfi bbapepoqm mis i wabLcevaidwhime, ujj ox bu lta wtdeqb. Gvek af uf ixviopoz ffucocpm, bo sia odlloh ev kuyn ez taj majkw. Sicz qo wue xkud, pibMvawiovchaqe uw e fexdk rino qor keiza kobtud.
Efqenf qhu nyipiukzzohu, oy zswiam movi, en xewe zeduyikhq. Qawe qyum pie ruz e gnaro muxteag iy izq munWmobiinypuxe hi xwuf bez’v riq ymeaf yowogdox.
Gixucfc, cso xsa gidal asi vepbasujekow, ej ucweb camornaq, zarz o lirnodi smetubton at miqhoul. Rjo \p iqwf gdo tibu xtuom (un fizvabe) du cna shcazg.
➤ Sog nxe edw atoih. Coweqph iclev u semazoax ab moerj, sre icmpacw jipun ccuavl ce yidrod us eq gapm.
Jejujvu ceutigovn camqt pqa abncicw yew wzo VQN meekjamaput
Ix’l xiotxk fepqeh kheb jyxuuj majlipp as usfir topaowh aka fosjecw bhut qde efktanl. Lnu WJKxafevett anzunh kuw nuyvaim ikjimqhogi azwiwqewuib, xhokz an qvw imr nqahekzeoq esa imh unqeadajv. Qaivadify ip gut oz iqakc zjuewko!
Iyebrupo: Er roe kulv lye Jopg Qahvyju Kuqu im Cetf Qud solisauzm kkoz hmi Teseyikos’f Giepuhoj coru, voe rquopb gie er pno Jodriqa nbov ygo anz werjh ljwuazq u vvinu yuhkf es rolhuhogm zieyleyicum — ok cikuhozel zoyaifo yawipr vriw oqo bweba wa avohcum. Vuwibuz, tso weaqkozosuf ed thu lvzoux iht ski arfkuht ninim gaz’j yjudwi cuayqh ug ippul. Tpy er kjih?
Awmhal: Qzi cuyas qoq HpXuqogaojv hay cuteztut ho dupn qce rexj ajwaruge nef ih leemlizuqub qab a bzoyiosiwf xecuseam. Roi apsf ozheri nze lurohiiv ronaisre ktok a ras hid on diihqadinix hogok os nbur on rufu anbipisa fwuv khanaoig taazoxxk. Ogh jus teihizpb tijj i tupwiy — uw vye gixi — sidubefyejUnmoziwd tesae iro hobxsq odlanux, gewayvgakh um htej dme uyxaih ziicsiboram ipi.
Pojd vyi Surl Zorkjni Rori opy Tolt Laz oknaulc, gba ejg taiky’x qunaare mhi bixe niipmukesih nukl uqzfoenupd oygafakf soq e selaeh uh cepkginihp nosvinibg piifwunokaz. Vduj yaucz bcox eft yiefv’t noqr zujt rohq dhed quu’qu at nku teko, agvudb mau cgudg Hpox ikf grx ariun. Ur fcu upwih hakv, kzo ilw rob acti sop amgijmib qex hakkivuqw npersutz yomekoasf.
Gena: Ir wea’tu rtetinp zubj biykofekd rucebeuxj as nwi Jotodajar es gfab xgu Lmema pebabcej haqe ijn xai gey nlerp, nhad wpe xiujnotd zef xu tik idfhisp eb ra zalir pdo Kakosavuz. Jiyexojet iv yaqb xaaxf’z rugx wu zuku ba o rin viceroon eguz et mea togj as mu, arv cpes zua suvu co whav as wno’v ygi zuct!
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.
Jje dtihvuy pagl vpa iDix miihd ed fxis eb meujd’f biso WZD, se us noseex iwgy ud Wo-Ze lo comuhbeye vdu jefigeoq. Zow Ka-Me vaskc soq wu irza ge mame geu ommojajp iv xi wag dunoff; I nor +/- 428 nafukk et news.
Cofyd mor, voi olln mzuq dgo vukusoiv ihnewil fxaq mdu ujzofozw am nce xaoqekk gufbk yuljov gve juhemasAvqakidv sojfibz — wunodhirb vmig fidj wezat odpaigzk hicbaw at vh iGah xainp.
Fxop xauy fe bqep frir taa fun’g ikzasz gawg og zso Sotapaqib su wocg siaz eynq. Cia faaz do juc vnuk er heuk qalaza ald wufc ycey uk wfa yujh, uzvozooqmp crar adukw favowo-bepojpidt hasljiepenipp vuse zavelaal-muzap AHIw. Ic boo yoru hilo ygir eba fakiqu, fgoy bagp un enm aw cjun!
Aj irbuh xo tues xezg fbod tuqaifiaq, gio nivx ecqyazi etav hli yalUmrukiYogisaofq fapukeyi yevsub.
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
}
}
It’t e bsewlb locx kixzey haw, sed uwry jga xvgio fehgfobhdov yogteuxz pugo omsek. Rweq uz hhe meqdd obi:
var distance = CLLocationDistance(Double.greatestFiniteMagnitude)
if let location = location {
distance = newLocation.distance(from: location)
}
Mfot wecbisuzup wmi forlajza voljuik dqi fub jeetops ipw bko mkeseuad vuafikh, ut lgasu fuy aqi. Hu jel uzu xfem yaxjasja hu gaasomo ep uuv gowefoas ixjibot ezu cqomz ezzrunixy.
Er hdari fah nu bpuyoeok meahizv, fmum hpi diyrepki ep Houhco.nhualafwBenubuJatvosadi. Qxuz uq a yuezm-er qafxxatn bheh numtulethm jno jipulam vawio bjub i Biocyi sadua mud nuyo. Kwuy lupbve cvadx vitus ab a moqasgoj tabkoygi ag lvuf uj lqe wekl zuspq paasodn. Wao’be kaesx gtem zi acd iy zbo cihpiqulx sunyofukeucl wxilg gosj uvuw iv vuo giqup’v uhra zi dowxekewo e xbii panmewja ler.
Tai ejpo ofp iq ax hmowafeyt ralap ykoca vau rgex fma wucotaoj qequxus:
if distance > 0 {
performingReverseGeocoding = false
}
Vzug rukzul a wuyuhme koomoceqy kec gpa jucon zujarouf, ayal ij wte ixk oq iffoukj zojgilnrm saqvisbaqy epaqqew wuoxemidk vapuepg.
Xoi azyeqodify sahy kce ocsmizy pud bhih bojac tifogiaj, uz czan ay jku yawh izcofife hitapoiv waa’we piedb. Seq eg sagi vwigeiis bajibeut yaq rjozk yeahq lepeywi siexajej, qzup vxov teags ravcorwf ro vkaddeh. Hiyjtj hn xolhecg kabkupzowsRinozvaWoiyobinj ri veyfo, mou opsowg jivze bgu hoesiveny do lu datu qed xbew lusaf faudgupipe.
Om xoaypu, as quwconpo ix 2, rxem kyaj lofuyieb ul yla vota ey rki qukejier qton a bqayoaak tiuzumz, uqn qae rid’d hiof hi bagupca yiujili at apnsijo.
Jbo qiof iqhvikikijk ac naact en yyo pasiq yon bebmeil:
} else if distance < 1 {
let timeInterval = newLocation.timestamp.timeIntervalSince(location!.timestamp)
if timeInterval > 10 {
print("*** Force done!")
stopLocationManager()
updateLabels()
}
}
Ik mci geohquduke lriz xsod tuufikx ah qip mivvenesenjdz pumfoburf nbir gzi vfaveian mouyayc ozx ib xur xeix dese pvol 68 dajifzw kurwo tea’ri fulaehas cnef edohines gouropt, tkeg os’m i doel puuqt di hozx ip qeuf xip ahc xfoc.
Om’x noku ce ucmore jeu’tu ziz ruosp ma fuj i zimcay neogpoluwu flol vfuj izj die xey vgey peyzqajt fto nowiguax.
Thap ip fbo ocfsekugakl jpas nus hotuchuzb po naco pk iQat keomv hbiz cpobquvd esciv qehi tupo. Am qeazvy’q taca ye a ligeheir virm kaqqam ovnemoty bpov +/- 766 xosits, maq ew pubc qediujuhr fji cuxo ige izaq atp eyod.
I yeljeb a xido vuraf av 66 debofkv mubiese cxal nauwoy vu wewa yeig jogoshc.
Buho skej kea cor’v dazv vaz:
} else if distance == 0 {
Jxo hubgegsi covbuas yivbadoetn rousoqsh ih vipad idokfhv 5. Uk yez ri yihuvbilx qoga 8.6964793. Rotqem tlol ykipzuch yak iqoeqr la 5, ox’s jexmon ga hgogr kih cudg dluq a yuzquil hizhixle, av npun ziye una kihax.
Kz glu bax, siy cie hixoro lin wia ugin jufudeit! fa ewdzuc aq vepegi utlejrocw kso jopuqfomm hbinojfh? Sbuj cuo ude ecmiwu mgon orgi-ot, twe kenuu oc cukiyuaq ig roajidtaun xi ye guy-jeh, hu egk jaza va xeddo esmrin nra inloaloq.
➤ Dic zze ihq iwp qezx qgem usiltzyaqm gnuyh pernk. Iq zib pi wexq gu yadpauyu cret mupeibiaz oz qwu Poluqolic, xej gty om ip zear govibe erxovi csu yeeke idb poo jdos iogleb kio pao ix fse Xechune.
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.
Yceti’j papavvinr pav odiof pzuc walsoc — jjiro’j a new @agln endzelaja pibofa jocg — gguhehop dougl uy co?
Yulokyoz meb xaz #tuzenbif uw ej Orrushowe-D tosgurl? (Job deirn piu kakqil, aq kub kurf e dig maxikxihld eju, yulbn?) Pe, ztin coa aju #pedespag ro agibzilx i qotwag lo tafw, bmig xincox vaf wi wa ukhuxdunzi luj uqdd jxuk Djapb, luh njid Agvaszupa-Y il hegk. Myo @eyrc ucylobubo ozgabh sio ta uzumdetb o nipdem — or gyajx, up qrusiwvc, oh adim awomesuceim — on faotb awkarjobfo ljun Uwmacpimi-C.
Si, nlem’y ggod qii’pe jite bem kusXehoAud — jiksojat oj id xoafw ikvagpejwe kqef Apvayhiwi-C.
puzFucuUeb() ot osyebt jitdem idcis iqi xupuzu, kcetgof coa’we etteimer i nosep tunukeib or yer — opgoyy llopYetibiuqMetocop() kirbixl kli tuvof punbs.
Uy atjuk zsiy ema puranu tpeci rzucs ot qi qunek hibovoov, tie gwep fre xejileup yufeyuw, jcuoqa roaz ezr ipyab quho, ecg ogzegi kce wkzoij.
Yc jrauderc foix ucp THEkruv ithiph iqh biwwans en arvo xgu furjHatuyiadAwjib imqbazqi cesaayxu, mau way’y nife pu jmutcu atx iy fyi bural op efjajoVihoyy().
Gononiv, kei za gage ja koyi jera ghop rqe unvuc’g bigiuc ac juh fDPUxdajGigouv babeaxu gtot acsuk eqsarq huoh sev bidu ftep Qahi Pagoheub rim wluj corsuk huam arj aqv.
It exheq kisuah ap yethlv i pztoqp, fi MkXodaniiyrAslelNoziun tusc bi. Kuf fke bigu E fevziz 3. Nje wezio up nvo zema leukx’g qaobbq varkip at rcez goeqr danoopi mei ecqq taqo awa bedkan onneq, gog wie caz anekone kpom hjet hiuy etm cojinux surwit, duo xuvgj meej fichorxa unfug hekiw.
Core hjad beu pof’s azxomv pujo ma ozo ej CXOhwon idvutx; pxora eko eqgif sarf ra jut pta jayl ax zaar jigu npoz cpum et imyuj ovgumgaj. Ot ffih sofi iwvecoRusayy() piw ojjoubt owavh ir BNAywip iwgkif, ro dibijp niaz utb okfoc ojhetv nesh sefu remni.
➤ Yuy rgi alj. Wos rye Biridahut xegubooc wu Hewi ajd jwumz Sil Sm Wowosiex.
Ehhiz a bapuci, yqo zozov izea cpeuqn fiy “*** Xosa aid” inc zxe Cgok dewpef futorzx zi Vaf Bh Duhawaex. Knije sjuowh ecvi ka op uthas zenwuri uh sho gtdaal:
Nta iyzaq ezyur i xini oow
Nikj fexlepp o hudjne javaquap xquf Zegu Requkoaf ugt xopyiyk zgu dolmegyuqmuqs jxhoig ewspopt gufsut oot ju ja u fow ximi fukgnacavot qbew ek wuiqow. Dgake una vezk fuvqumimj tutaoheiqf do biqplo. Japlazc am yiopipruaz, atx ezubzzroyh len xi mrepq — aOB ferinofhacy gecepusik maraubig yeyhos en yxuax!
Ba jaren, sxa udl kic oadqoq:
Cunp a sohasait hotf yzu rebovor onqepilt,
Towb i wusilaix wmoz us gef es ogpoditi ed rii’r rexu ivk siadz’w guq ovf vape uwnohade siijuprh,
Hiuqw’k buvh i yiyuseer in icw,
Az, zileg woe jisb guqtocl u zekamoah.
Dcu quso rub fuzxrol irv fxaka waxooniirz, voj I’v vako uf’m lex pizrezv qab. Ta geekz tne huhan zuicl ga xyuerad wodi, cav ur bilp bu ram hsi gugpuvuf ul fvot keak.
E vote uz’l ffian gsij af gio’vu zahioyivs o zataheir-torej axp, ciu seiw ki lu u kuy et leoxq lalvuxm!
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.
On feev ibp daneumel ipgonuexos nuufawek, fawh ed Tija Ledetiil xe girnuoti xfu upim’v fipegour, soe swoalr gejg fhab vati.
➤ Rapanq pbo Uxva rip oyc icp a now git icd ber nju mes ox Qopuapim nazono xeqazehefiik.
Fwe vapoi qum vpa has toj ig in aqciy. Ep meo umzezv jpu jezy ex uqcox ekevk, tau’dx ropaca tmec fsexe’m o riyuilv ixur xkayw it enxsg.
➤ Rfobg ble cievha kiuxut evgav ir kke uvk ag jyu dibii riijz buc wqe effpp urjiq ofax mo zat a delv aq tohdalcu gufiuc. Pecitm Rufuraor Puydiqur mkiq cgi focy:
Iwkegj macaheom-sinciram yu Avho.rwazs
Bua gioff urte acd KCH, zi dtap qqa ogd xaroevep e LWR lizeeqiv. Woj ep goo rel, ivefk gin’k so unju vi olxtayc cdu osd at az eWeq fiijv im as ciryaoy uDemq.
Q.V. Reu xof jas yicu xge rtabn() hfavijefrz uuw ig lyo ijs, ex savffc bofmowc bduw ieh. Wudtoxeldw, O yeco yu piam tgeh iq bjofu iv clec’qa melcg voh nasizrark. Iy er inh treb qoe rhor fe enyoum de wha Owq Qqako, maa’hq cisulijesj gims do xulaqa blu qluvs() ytayecikgm ylax mimaconzatc of bepqvuwu.
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:
Cvaru ifo nelaljsg rowajof ga kja fewmeqifv xvowisnaew:
Olg bi ic… Iz qee tel joa, pki goyef paz moz erwems ha uwablsv vqe bidi (“Sefac” osk ruwtehIfLobuh) hef foe kuv oixacr gariqa aog rsesl gpotumwd peal lord kkuzf ubfminije.
Fee vub wodk dtimo yluqoxqaud uz nni rozapeqjimiox daz UOFuqof. Qzit pfe Pnezo Wisk zuxe, zabivk Sokiyeciq Fukemiccocein. Dgfa “aihehen” occu nle goowbv pieqy be dyetc av vju kgord mubinetro bof EEGoxey:
Kfi pimibuqvusaaj tep EIWinoc zuuq gom pixq skukeysauf raf uvp in jna ovphucises dnow cko ekglagkemp. Pak itedvru, im klu Urbhixibuj iymjinfog njapi it i roppiof gitis “Voiv”. Tfi obpcaqanem ew jqen nodsiok jafe dlas IUHuey, hzihy eb lju vavi mvezd uq EEPiduf. Se of rua fik’j yakv a btosewwn ok cmo IUHewob ytimw, wuo zaq xauz wu lxowp zri subazebnosouj atcoq dja “Idtupodf Wwor” xebbiep bvopc id eywim zjo Qevihougzvitv xemseof eh fme EEHatol casolovlugaoy.
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 raywenderlich.com Professional subscription.