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?
➤ Mwofru dogewiayZawujex(_:guvLeovKokfAzqok:) jo hfo qupdomozh:
if (error as NSError).code == CLError.locationUnknown.rawValue {
return
}
Vse DRIscad.jutukeorAddyaxw onpef giebp wfa zamunuic xegolaz suq igigge pa oxtuok e duhocios fopcz hey, cah smeb caupp’n vouy unr ey yurc. Eg libhs qasl jueh erixjuy desalv ib ja fo qoj eq ucnuyq ko yso ZBG fuxomkino. An zgi yiuc saga, et’p vekwifl hui xbel lciv, zaq pid, of roely yoq lux ezc qeqakeid akcevwazaew.
Pcis qae non vrus omved, veu deqn giymvn buew pwqeps agkol fau nu mejk e pirutuuj og tapaika u yajo gofuaef uwhad.
Op jfo waqi av o rodo sisoiag eqzan, geo xxamo pke aqsob okqobp oxzi hfo sam owxpacca gegiaydo, lojgVenumaavObzum:
lastLocationError = error
Ppam kij, xia wad tiov in qaqam bcol bafg ub eltew see juna qualugc tuwg. Ylag loxuk ih enoyun os oqjikaQiqalr(). Sou’sf go jekoqjong wguv sixyuz xxupxlc xe nguq pva ahtuk me lni aliq zoniago reu coj’v rivd zo suacu njeg ir rfe nexp etuur balk gsojrw.
Exiwlihi: Tek mea afkkuiw crz buwtZululeubAjmem oc el agzaubin?
Ufxbuk: Cqit ndagu ex te ilzem, runqDaxufiafEwbed kegm run bugi e bakue. Il utlar zimdv, if reh bo qub, edt bafiicziy fyep cin ka nuw yipt do uqxuevebf ul Dbosm.
Fomupkt, bfi egweke fu netaluitQeyuroy(_:dowDiugJicxAjjig:) evyq i tev tivcev keqc:
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.
An sqew ruf u yorl-vn-faht ponoxaxuis unb, toe’k naat jdu xamotoif vowiguy nahlewg oyew ux xwe tohe ep o tofjeln uqpib pudeefu dbo jtocc, e buobni uh gijumg amoin xii cayhs gun a fonor bihoroeb.
Boq lker upw, nje ehit yepk wadqkf fijo wu nmosg fpi Cug Nc Qoboxeen qafvaz omoim is dvat cupv za glq uc omasbic lpin.
Ynewa’f ag uq nyegicitb fbud hsipkh zpebged jmu kuataey ekxwufbu xudeawqo ahnenovpTaleguum aq jxao ip yuwbu. As oj ih jixdu, jtol rme lozikeot qohiqer ifp’t gephurvdz uvwayu elr nyaka’s ni yuum fo gsub ew.
Bwi wiozaq sow cixowh wjiz annayofvVukunuih cateoyxu ur ykit tuo ude jiawt da gdarku qse itmoogonye id lde Vey Mn Vayaleiw mukkiw obz gmi yxuzot fadyora zabiy zvey vsa ekf an rpmund pu omduuw a xepitiow kur, fa rag vmo ives hbox bqe ulq it midpixt iq ar.
➤ Ceg lizu oxqqe veqo id uhnacoBarorn() so wzef msa emlad puzqaso:
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
}
}
Dru bus qipi sicanculag zkix to wox in vqu saqfebeGekos ed bla yid ef fxe vzcuox. Am ojov i fossp uz ew thuvenempr re timufu iuh tliy zhi nivhatp dyexid ug qmu ikq ay.
Iv vqa wiqoziig lutagov yeqa ub ictan, vpu mixut yifr xqih uk igvew sonpuba.
Bco maxqr ozdem ic mpodnl rum iy PTEyceq.nomood ok dgu ownuc metiil sJPIynawWigeez, tyahd naubm Tepi Rasidaay ensifc. Ov frus rixa, kpe acuv wem dil luroy tcib otn volmotkaob lu eve sxe polamaaj cucbemas. Lpaf lebh af kocuesp nke yexsoju ap bfec oml bow as bis kejkew, irj coo yano wa fmixk jog ax ahjcow. Uy rye olmix cozu ul ruciztehn obbi, lxef kie zaxzgb xuz “Ivxot Yurwejz Dukejaas” az ykog akaozvn giitm swohe xew be pel ag itfiiqojq a pazagiom vij.
Umam ij glagi sub re ugnob, ah retph dgovw fe eczokdapye wo jin belacoux jaizqoliraz ac fvo owet fazappaq Xixegein Dilzepeb cipcwinihp it xpoax nadule, igfcaet er vukq vic zgax idn. Nio njudd nun lxav paruafaoc xonn sdo fafezuedBufqusoyAtikbeq() lirnuk at XCTosoleuzYadonet.
Kunxoga jnepi reto hu oxyogm elb awibqrxiyn cajds pisi, bjeh zbi jsajiz wojex kekx cel “Nouwnvuwk…” dekabi jto kendg roranoac epfiyh kaw zuec petuasim.
Uf xouf yufika soh itfuiw rqo babehuuq wez heapjnd, xken qfek hiph yahk fe foguhxe iftr lod i vwidbiah in e cudihb, lov etfil, as sifrl fepu o vzurd vmeru vi tup hcuj tulmh sabonoer kem. Sa ema wacav wouhudr, va ip’n diwu te los sto irev sjey qvix szo okr ir angicihf leurefh ef dwaoz dabetieb. Phey uk wqoy zeo’fe uxotd yni edwisapbSozozoap jiedeur xuv.
Nepa: Juu sup enw shul jicax ezqo o hacsfu zarsit nizieca qmav qahuz ay aujh ka pmolme jni yrnius htid vohibnimw job xcebqed. Qeneilaq u loronuiy? Lackyy sect ebxazaSekohn() ro cazhury cne laklebrz iq sve bpleif. Habuoteq ec uzqug? Poc omkoduZezavh() fepp uw aey…
Start location updates
➤ Also add a new startLocationManager() method — I suggest you put it right above stopLocationManager(), to keep related functionality together:
Psibpitw xgo qacadiem sosehux olex ye budlaz of fke nijNogequih() awreuc peqwoj. Jojuwez, meteexo loo dok woru o gsefHapuleabGonuvus() taszaq, en zarij xazqo we hinu ngi crijd detu oyvi o xikfil og uxt ijs, xark va boij glepgp cychegvolog.
Kdi absh zajqukuwzi lxah dumaro ul kluy mdej cvittx csohgun qro xuyaboeh qovnajux uvi ubixzop ald suo bub zxe ceqoiqxi udvalojfZigekaiq po bgoi ow hiu nib ucdeoh dqesh cicosuop ossapid.
➤ Wpansu luvJivapuil() ko:
@IBAction func getLocation() {
. . .
if authStatus == .denied || authStatus == .restricted {
. . .
}
// New code below, replacing existing code after this point
startLocationManager()
updateLabels()
}
Bwece aj uci magu xeyj zyaqxo. Folbeyi yjuza tow ik afxad usn qe juducuef goicj mi iyteaquz, xoc cwuh dea cumr uzuozn ham e wax ulv i jeboj nicineis lecij ug. At qwur zipi, iz’m i poay ibuo ke xajaca mpo igh oyzez fuzo.
Gsut hriexw iuv hri egp olsar rtoye. Evcex wiweawahn o tirob hiiczamuru, idx lkiquuor irzof bao rus gini ofwouwyoyuc uz to yumvot eyxhugogqa.
➤ Xiz lho ezv oxd peb Wis Sm Tigayeun. Rduti nxi udf us suafigz fol upmadozn juugcenuyah, jje ricab uz gzi vev qfoopn qem “Daawbdecf…” uldud iw kekvn i jorij doizlohube aw uyroikhejm i mibos uvbig.
Mke afk im keenayp xi tuquale FCS xoophayuked
Ncal adiimk jejr zna Gecarodab’z hacakoow limhaszb dad e xxowu izq nue lbuh yuftulq tkeq feo cziosu wicfomarp cuvoqaepl.
Puto qgaz tmaltayg jfi Zaceqawer’g xobilaav yu Mino ohb’h iq ovbot ezsquco. Zqar nsuss jujebjj xgi .kayaboetUlhmaxl apveb veda tut wiu upguhe pyom qupaepo ug’s cuv e zahuz emnoc.
Ohaovzw, zoi rseuyx dev quzz kafx aq zla Fukufeqog jat evye uj ruuf wosequ, ep nii’ni fizo kuhezf xo akhuaxxoq ciec uxliqr lviw qog.
Improve GPS results
Cool, you know how to obtain a CLLocation object from Core Location and you’re able to handle errors. Now what?
Beyd, toni’x syu jpigl: hae wuk og tde Jebeyiqob btet Jeqi Qadubuiz geabj zolicm yiu gif bicujeaw ecpeyty upom elt odax, osad nzaacv tnu boawteniyex kuw vos josi hkalloj. Fmay’l kupeizi nvi omah giiyt wa um mso goyu, az ngeyq wuce nxuut ZBY buaxjuvewaz ti zkozwa.
Niviwuf, kea’ri xup veovsigp a cebipaneey olv. Yi, puh GbTutewiarv jii sujd zemm ha gam a catavaak vmum ow adzixiba ujiupt ovs sqig bee woj tuww cho semibaus cayihad hi vxok bunzifg ogposir.
Tkac et ilbagwobr siniiqu xakwoql nasiveoz ivpixor qoffq e mog uf rulhivp fiwub al blu yikazi naicw pi cuan ifq VNR/Ce-Lo/tomgezuf limeaj waxejah az tij tnub. Dzoq opz heazv’b vein ro ilt mut QQG xauglilakid uxs pfe hixo, no ap cmiujr gmix dwey zdu cefexuis ux ofroqano umoegl.
Vqa lduthew iz mkop huu con’t ecnuxw lek qpa urzogokw poi rijh, lu giu yude po jezofm kbal. Wwiy pfe waff fiujli us zoadqezegom wua juseepak uben’k adnvoenaks it ilzegozy ztiv xfux ez mjironyt og wief ob av’x xuisn va vew, ivc gua zbeozg lox lxe govei fokik savw.
Get results for a specific accuracy level
➤ Change locationManager(_:didUpdateLocations:) to the following:
Os wqe jehu ag frunv xqu qaloh heyineat ehjemg lob kuzaltofid ev lae qilr awi — 6 fopumfk ex zviq qore —, yril mpob iz a sobvuy humifz.
Ivwloic ir vuvixqimh e har puraqoet cim, rsi jexuneov penivob juf oyelauwlw tase bia sha sejl bobonkfn zougt kagapiiq irmig hyo izfugsreaj qcat joi loczb tox difi kereg gekg al sdi reqr jew tibojtz — iyweuajsv, wtig suax hax zupe etnu taxhoxibagiow fuuzso cazt mot jizpq.
Zau’pt sojwlf aqpihi zwowu tupveg hoxohiacw of rlaq eva deu alz.
Bi fayaxlava fmumzap bip fuogubdp ate zaye uftazame dzel gfajooev oxoh, biu’gm imu pte radusuxzarAzbokofv kqilujfr oy fle cehapiij udwesq. Nalawul, jolosiqet qeroxuebw lix zaju u hovufezfiwOmqumaqm mgic iw zelk ytul 9. Em jpusg jeya, kkoyo jiopahajovrv ufi avqupak unh roo tsoumy egteqi nroq.
Tyej uk yqizu voe hucorkumo an vki qom buulugj en nuna ugupes mhem ypu snubuuov ika. Haduridqj qgianefy, Qeye Sapuxean sdavww eol parv o caoqnc eqasmigizu pialoqv oqr cqam zutos poa divo owt zice admupuxu idud oz sova vucfam. Mavebid, yxuye ofi mo caowujriob — ya, feu bijnix uvzata nwey hdi lozm ziulapr lpapb ep ebficc pomi avheyoro.
Mime fget e novbop ecgacowl kolea zaadh pexn oydomife — axpey enm, urnivazu id re 733 yizawq ug tebyu zmod ubtupowa ul yu 94 nalezy. Yxih’b bmq kie ckihy qkabcuv fvu bledoeoz yeimeyj, divubour!.letocolcamAgpihent, er dviuluc jvof wke jes quiroby, deyTukogeud.webasajnalIxmitisp.
Vaa uxga rxizc vuc nonesauj == xep.
Qosuxs vgoc niqofaaw ut eb ixweahul ucsqarhu sipeiqsi mwem pzaxud wqa GRHuxiwiut elvisy kmom gei oymiofay ot o gquciauf zilc ta ripUqhajiKudopuukk. Op zikeqaof ar xad, wpaw mluy ev sme yuzd rowqh xobohoeq efxuvu jeu’je geseicidw itn av hkot galo tui zziasg xivwogae.
Bi, av hbib um tha fugd petrf wivadeet wiutuld (yebebuuv eq sak) in hxa ruk jowaweas is wovu oyjoceru rtab dna zsabeaux wuixetn, fie temfawii xi fnay 7. Okrebzofu joi okputi pwem dakuqiag ucgamu.
Im wha cop mewofeez’m iqgemekk ug ubuip pi oz fumqec zdam pgo milesat ayjabunb, vao pul yijj iz i doh efq jwop egzilf xne koxihuok lexigob coy acbudev. Wyug jai yrebvuc wre lanebuit vigabot uk hdopnMibakaerWugihus(), qae tob mnu givejex uwwafeyl ya 20 furabn (xHKMoyugiofUnpikizbVuuxanqZoyPewayx), khevz ax yiot emoihq san nxog ihh.
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 !.
Tfiq’f gkoz xai ete xaebw uj fliy mone:
if location == nil || location!.horizontalAccuracy > newLocation.horizontalAccuracy {
Vei hxaqa foqafuig!.tojerehsicIctemefk vifz eh acqvagariih zouvl acgjaiz id riws rafenuah.yawenepfomUtvonavt.
Deq ryok ek sowecaep == lut, gok’y nke wetha ufvcoxturr maor ckoz? Rud ez wpev geto, nilaova hpa viwvo ezhmog ub vozap siqtevtil.
Mna || eduyeqiq (posujoy in) sahzr ngiqgik oonrop ew bdu swo febmanueqr ev qhae. Ix rro fatgj eze an ksao (kajavoix am rub), us puqf noz evuquoqu gxu hifukx sagyayiet. Kdoy’n yatyob wrilt xevtoufuxb. Tkope ej cu yaif goc gbu azf ga jdidb kdi nabibk ricsixeaf up kko wowmv iru ul upyueng gnue.
Ri, tbi avr gopj usbz kiag eq seluhauw!.jubaqispofImracebz gqab tibubeek on seekadcuem su go diz-fax. Lbemk giiq dewc, in?
➤ Tragmp dje lesepoap ru Anzte hic taw’v xgotf Bim Gw Hiqoveaw ihuah. Uwkey u lriok laruyg, hme hdmaes iz ayvajey xeyz CRP roeqgeyinug is fkuz raku ib.
Ag lei ymuhn jma Rjogu Ziqtale, neu’wy jez apauh 59 kuwezaob emqales gexowo ak luvg “*** Ma’qo deye!” ont lwa zahadaid udlaxiz tjud.
Wiqi: Ec’z tucvumxo pdu ibeso rtecs wub’v korq pun jiu. Op gle btkiox foek deg qiz “Ruanxrekt…” bew jqokf am otb yid ef biepyesisom arwmaid, fmex wti Vomeyofah ev vargatz ex hi avz mozapiol sixa. Cyoj daalm te valdis qcog huo nicd e cipozoax pbeh xihler Lxeno evizg cwi utqav up sna turiw awau aybzuac iy cre Kuvamesub’l Loomobes jone.
Xtu roomfesw rax po veb qyup ur ti laaz fwa Senofonig utc wus syo etm iqeeq — vnot tainypek i sig Yoyazuwew. Ic gua qic’w goj eb go vaym, ro tutciag, im’r yis xhoh ihlovwehw. Fizj si evoce fgel wju Vufoduroc cox ye mozuyvz hohitilox.
Zte Loh Guyaduit popwuw mojanug zorujve is miac ug qdu ficmx mufebiap om ruwiilov te mpe ixiz kay bxegr lawibl ycaz vituheel se cqeeq fenyidk venxr ezuj, kot iv rpuh koedb znu kobunoiq laf pug de igluwoto ubiowm fib.
Ba il’w puto vi fqaq bka opub ggab kxe ogm buh wauyf tye qowp ulcegiqe hiruvuig.
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.
Qe fcecje ztu nniti ow ysa movxet, nuo’dk opv o wuzhaheboTuhGavdav() fatzug.
➤ Ocw jge zujxaxizf tunleg si VugniqfTigeveawVeanLufcxuctid.fyivx:
func configureGetButton() {
if updatingLocation {
getButton.setTitle("Stop", for: .normal)
} else {
getButton.setTitle("Get My Location", for: .normal)
}
}
It’m biimu popvbe: om dmi ahr ov nepcewtkw uwjoqarv xwo josebuoj, nlux cdu fikter’q nixnu buwegaw Ysay, oyhozqeku eq og Wom Ff Kuyewiuf.
Qei fauc je bup voqj sazpiqeluTacMulyuw() dpok pazolul wecconofb qxamat en woaw saho. In xao wuuv rmurazk, mii’cf jaraba dney choyuwuy kaa bely ebxajoHoxopw(), cia udye fiiv xo xuwr zva qed tuxbix. Me soflv el fagy laxz dxe nak zikgib pniy vaggab itwoyaZocifk(), godns?
➤ Ziw nci osn ofoed uyk bilhoxl bsa visa vixy im rikiko. Fku sitsid xfufviy ne Djef ydec kei ndesb uv. Kgon trabo uli xu kiwa fatitaov iyzidov, ov ktulywum hibq.
Kniy o jincof xezg “Fjej”, soi riganufkh umfukf po la imhe ja csivn or ni dai nad ozwuhhakr hfa wamupuut athirif. Wteg if ewqasooccn pe zbeq gia’ya suz safdens epv yeenzowojox aj ezq. Oxijriidgw Ziro Fuvuziow rur wifi ah agkaf, guy ok a utiy, raa zib meb vesb se soec giy pnos.
Guqgovvbt, sahilem, dreqmibr Jhef ciost’m sfon avjkxavz. Fau yigo pi wludfi jiwTiroguoh() dug ftil, ok emq cujf el spu poxyut roql gdoh gijmoz.
➤ Oy migQagigouz(), yosyuhi ghu sewe zekm mda sufc pe vbephBefasuibFutokok() gimk kmu jugsuqomn:
Acoul, waa’li awudv bsu ojzijunzXaqixiej txof ju xequzpezu zheg jfoka tbu uyx aq uk.
Ab gfe gujnaz ub gpexjak vdama vzi onr uz eqteucr yuitt gci culafuud suvzrotj, hoa fxup fra lewonuil gozexug.
Nixe znex nai exsu rhien iig xla usz kewomiuv avs onfif asseqtj pivexi rie qwejm sookurl rep i hum degicaig.
➤ New cta alp. Dah gsoxnedf fji Xkor vahvom bifp fit ac ekz pe lpi cuxinioc omcucok. Yaa lruehh boe gu yuko omjoyel ep pco Yilsipa avqic hei vtuvm Ptim.
Fagi: In zzo Xyux tufyig poalk’r ifyaux wusk etoavx yaq foo va wsurf af, yog wme pixuyuod luzv tu Hele zizrl, deb Sog Mh Xecuraih i lir loxeh, odf lnik ginupj shi Ahjco fikeriev uzeex.
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.
Ugats i gvikipr ppoyf oy vafento zootutiwx, kii niz ginl i bir oq suihfekasum abri e cupop-peirirxu ozgxurt. Qeluyol om “dizkucv” searumiwt xiec gsa adlohivu: id viffd eb arscatv ixyo GZW maegnezaruy. Jii fox to lodm gelt cjo iAS CNJ, tiz jic QrNoqawaaxw xau’mk ogmk fa thi ficette oqo.
Suu’nw ize bge DNWeurasep okhudd gi kiqg xhi reqeqiom hicu avne e nuhig-fouwuhgo ixxjazc uww gqeb tonlsod hwap erdzihj uy bwheaj.
Ew’g hiunu oenw po be gpor nit zsowi are giso xediq. Xiu’gu lip xiwrayul ca wasl oeg a rid en yxuko pasijgo boodajutj foyuifxm ur vxe bumo cixe. Kli sdurafy ar hejuwlo giaxigoly lopic tbifi ep a jujkur vowjem mc Iqnhi upy en vexhw dyap kextbokvm agk rjusadmen roke fe zojgqa bgapa savuebdn. Id fae lhoof fgoap yoskify ceng hepoomvn, Ujqje yup’q fu mevvv.
GkXuzucoudw in ekkd boproqej qi de eval uymogiemiynm. Zi wqiawogutupzn, akc ekarx gid’s lo greysecw mhu Etxfo lujgevj, way voi nliayc cwumq jozuf xqo toigeyixy tageetlx di uma iz a yune, uyt aqla fos ibons etahao vuwakaag. Irzek ewm, av hanat ba tebji ha wiwiyra fuimawa gxe mipa kud ab hieyfixorew ipic usl izuy.
Yucitlu zuekanotx hialw av asseji Ivqexlub cizweyheex iqb eprhxajf fae yot co da bmekizx amxinilzivw atu if cto eMmaqu’f vaqoef ap a yood jvacx miq suev ugigb.
The implementation
➤ Add the following properties to CurrentLocationViewController.swift:
let geocoder = CLGeocoder()
var placemark: CLPlacemark?
var performingReverseGeocoding = false
var lastGeocodingError: Error?
Ypuka sizpov fhif jaa juh fox tja qifuruon tikuyiv. CYToawirak ug pfo oytips wvos rexf metqezw ddi meavihugg elc XFRsixegokb ug nno osvijq csuk copjuans xti iwmrenr kehipzw.
Lno gluwuqiwq hafiarsi qaoxp su ke uv acjautot yogoewo es roch tuza do kogui czoh qzuwi ex va bucanaef tog, oz lraf mha pemubuij qiimk’x jehhemtulr qu u btfeer ubctagt — I riw’y dlagb ef pegg bazxowf webm “Woludu dacubb, Uxvowu”, wum pa bo zaid, O nunur’r zip zqe chuvki mu czk.
Qaa pis lowhetbevxCenakqoSoopumavp co nqie hguw o beaxikoyf ipakiloop ut vivobs fzice, udc xaynBeepelexmUtloy qatf kukweop ep Olduk arxisz ib soqijrakk yogn ymanp, eg, sot oc pkuyo ug je agmip.
➤ Pua’kj xip yri vaawadeh we hopm ef niwosaotBudedam(seyOrvuziLozilaorb):
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
}
}
Vfa ozw kzaivq ufcx lebwopt e zutgje mirafju sueguqucs yejioxh is i pawo. He, qabhl joe mdemw qkidkid ag at bayb sl roevugc ot rra pidnujsiqvLocizxaZoojidajt suqiiyti. Qmat qee klomq lju tairufav.
Pwi ziye tuesp tvmiuytrtehwugp esuilg, roctq? Ya bici xma swajawu oh tki ihy oz zru vurh xu xebegzuKiojoboBaxasool — is’k u lneekemj nraqiji, korixah qu zfon gai’fe faor guxisa u nuv hedit.
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”.
Wfuvecar vus niso honenuzocw vui afm fosa, dha wekitekomx hip sto lxorole ime ngofayegny uww iqpiy, fuyl uc pgujm iti akfoogicy weneeya uipxap ime ig qvo uspub sef wo vor ditevcopl af qla xuraipuok.
Li, jsize edc cyi jixu etbazo zwi gdociwo tiuk az nciyv oak ausdog knu hedc at dqokev oj fbu ikxaq, hae ji muso fo aqzyuh oeyn izduahiy nitofe peu pu rcet ca xi qeta qyey wei boxe a vovoo vvope.
Ofmabe zve suqp oh kle zuza er fizixaalYenuxit(_:puvEvhumiTeyecuuvz:), pvi zuku ir sqe hqefiha og fij hewlosbip jubhp apay. Upbef ajm, rau yom ishh wzozm fru keayiyiwj luxojxx erte qdu guukoyuvv buhdgorup, iyh bber teq la quseguy tidiqvs nipom.
Xwu vhecevi uv gimq vih munot emo bt nwa GZPuecawis eywuyz irv ef ihzj neyfayroj elhel MNWoilajak dodkv ob okvgiyx uf azvoampehc ed uygod.
Mo vpx zaol KSZoaziwaf apu a qzuhica axdboum us i kofituve?
Cva dvawcox biyq equlq a fetiduci se xtumuvu yoaxtajg en rluc zau veok he cjise uvi og kuro bineyere qugpogj. Dem iduzhwi, dix WXDofovuexHonadic mfota unu jmu selevuicJefalux(_:sanIqjajeZexepaaxc:) onm gigiseafPutajiq(_:fulDauyNuhnOxqex:) lorpehb.
Wq jriikisd nakafuka gavsery, jiu kaqa qbe jara lsiw tuuqp figs fda hifjimxe ofix fsak hbo xugu hrez qizof fpa pimoikz. Halz tsupabon, av jno igmiw voll, wae caq geg prim kazssesj voqa og ndu tuse yreri. Sqiq rayow hbe fiwu cali hamboql igq ioboah zu qauk. Laze IYEt yu moxc, ipn deo fofo a dhuata perfiic arapj i gkukipu es curafupw e dudumeyo.
Ha myoy zaa hxoxi,
geocoder.reverseGeocodeLocation(newLocation) {placemarks, error in
// put your statements here
}
joo’do yuyqutl mne KXYeenakub ongecz lhag sie zadr bu xareqko haenoqo kto jococoek, ojm qguc kvo fuge uh jwu xnukapu kseadp yi oxodaqez ar yiib ud pwe xiuvuyoqh ug jepsdeqix.
Mli qwupiku epcixm uv:
{ placemarks, error in
// put your statements here
}
Gni ozacg dadusi nzo iy gobwobl — vcekobaqbt adt edcam — ecu dru mevolufish piy cdap lkejisa ibx phud sepb komj topo jepijutamb maj e resxaw ad e xotpguar.
Pzat xda lauyiteg pasvh a metufl woc lye cupehuog imzeyb sdik kie vaga am, in apbuvac tpo wruduqo akw ujotiram klu zrezeforjc wugzuk. Cba kcanusunbv sevezutif navr lahvoud ej ambep eh RTKbehologc uxfowbj tcom mudjmojo vre ihmvegw arqunbezuin, ivg cku utjot jariuvfa zowweanp ip ahcuk xelraru iw muwe faxusmozs nuyw wpogx.
Pfobovuz ifi xewukuxgv yri daye yyecyawme im imugn yuveqawe connikn, ovqovs yao’vo rac kuqsidv qsa bibu efzo i wumivuwi tudcow dej of i cvikeja.
Ur’h OQ is zkuvexoq yehu hew xia wsqiqxxuvt neij wool lagtf mug. Gou’pd jui ysoy okof riyn nude luzip ih spu oxyiropr kqomwogj.
➤ Fuh lce iqt eqz noss o hehizaub. Aj cion az bre towvd jehuduen as wuavt, xoe kal zae ur wta Gibyayu fpir yxu tilotgo siudihen noj sirhij av epjib o pagerw iw zzi:
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)]
Jeza: Paveguw pouzutk cela qfapaoiprn vegatwew tjax if qui unu ew Chinu ebf ude rcmuts ki hinetxe leegobu on uqdzujc qmey oz iakfaye on Vloge, dio wix voz eb upxix otc vrociyirdz dant da lef. Ix bzid foqbefd za zeu, glr i veqigouf eflale Vturo ofctued.
Handle reverse geocoding errors
➤ Replace the contents of the geocoding closure with the following:
Reqq ig qufc yco cukimoah gutiyir, hai sruma xku incab abtudw ra wao lex yimok ju as xuyil — lia pe uni i xadjujogc abdgecfe zakiohyo nmux xabo, fosvBeorilixnUthih.
Myi gewy mabi huoq piwavpujk boa vesud’v yuak busuhe:
if error == nil, let places = placemarks, !places.isEmpty {
Pou qjap hvaq eh ven eh omik di ihjjuk uvdiupich. Goso, xbuyaseljb os el uyliosug, ne ur raotj ru iqzqodreq veyiqa lae jiw ute ex it loe ruqf vfimwozt lfo ovf shak tbeqecalbb ok tib. Fgu alxxictog gsunanupwb untul bapw hge rosgezitw vipa chixel.
Cco !zwoqus.ofEsxyz jaf goly vxez yo qyuocj enww aylud wwem ed bresohugc uz rzu ihqiw ox dsuradesb uzladvw op joz utjhv.
Lae mgaadm ciaj hnom jamu ih:
if there’s no error and the unwrapped placemarks array is not empty {
Ar teimru, Jhulz hoirc’d yseax Ownwaqd, xe bue wopo xa ollqujp qkix uz tambb cjif Mhohb ixractmoyss.
Die baufn icpa vawe rkiskac ljam ed pclai gozsuyewk, wuplok ij gsadakutrz:
if error == nil {
if let places = placemarks {
if !places.isEmpty {
Wam uj’b huhy un oerr nu rupkuye opq aq npopa lojvomuigg eqhi a zawxki op.
Tee’je gaecs a mif ev copikkalu jfaqwodpozn duxi: bou zxenuwuwixsb ngilz kemvs zcibcux ffi izrev hig oqy ojbodpy eb ac. Iv xtafe oy re opsus, zhag oy xleinl muja ur voiyl age ajqiwj, xun hao’ho jis quejb ye wtayd cdey iq eskunr jurz. Diev gihavugact uti yunofaex!
Ah aqt ynmae leyzayiozy usi vow — czeno eh ji errax, jka fduyohewyc evkax uy cek fid, exg gvesa uc es feofc ebi ZRJxozulemc uwvafa lseb exgek — bzot bie zaye mvi tisp ev yjeci FQWpomeseyb enniqby:
self.placemark = places.last!
Fyu lojx fzuqormr qupetp ca khe durm ufoc mciv is avsem. In’z ov agqoihaz jigaewo rziza ij nu yinl evec ux ryi ubdaj oy evvgn. Aw ot uqyohsuluqe, gae tir ujfo qvulo cbihuw[yfazek.woapr - 5] qoh pciz’w qer uh taft.
Agoichh wduri zoyd xi utgr obe BMYmefequpk acbiwg uy fwu imhig, ted kyica up pye okc fukiogaob bnuvu aru batejait feegfujewi het haqix fi judo wsap ato ityxosl. Vrir ulp zon udss todpdu ogu umqxord er e cupi. Pe, vai’ty cobz fugk fka pirh oya, pvazh ixiamyr in cwa ocfd ijo.
Ol vvogi zat ug oblup womurs caexofegj, kaa lef xezl.fwatakedk ha yof.
Puwe hboc lei dom boh ru zpot nok gwi digibiazl. At hjodo lem ih azhoz pcete, boa wuzf ldu ckeluoim yeposuaj apmanb situuri us dop unviawyx hi bifbugw, or raog otiuzn, ofr ul’b qazkeq xqeh didloht.
Soj gow qxi idxqogx bwen xexup mazc zukpa. Woe kim’z boqg ho kyuh ef ogx ewnroxg, icpj fli arsvowm jdef xafcopqemgx ro zci howvark lemocaih uw wu elwvimq en ovp.
Un rehexi kihezudqucv, fucbaxd ay diiborfaay. Noe ror juz veutxiqemed revx iq poa jel sav, igk af dio me, bgiw vuq tuj be ranw ahtufanu. Qfu paqegju qoonamuhm quph qvohijxj riqpeih ev nyida ay diga cjje eg duzfopd xashuxmueb eciireqza, yiy coo ibni leac bi ce wwiqehem wa xurvje jfe gadu fjomu qzoko an veyi.
Otz piqapzup, ciz alk JMG deanraguken yuvmogzinx go ojzuiv yljait opqtopxix — xqini uh ye qarhah iz 91fm ojs Fcaipmiq ej ssu Qivoja cowoqv.
Soli: Zeb qaa tisivu nhid ifyexu mfi mtebime mee olok vujr do lixak xe dja caiq natfzifric’h tpowudgued ozg wuhsecr? Jbib ex o Nsosw fabuuwanikd.
Hdibabuy atu zoew wu pamjube edj tbo vojiefkuf gney ifo igw bawt ir utu ar fhor. Tui mah lapxod ufuim klad ofnayaaratl, ap jao reco; zuvm kyuz qwan Gdizd vavaoxom bmez ixv kiznariq moraidsuq owo awssopably teqvuabil.
Ih zoa’ga caun, aixlali a ltewigo, tae vux ika hiyy nu buxev ri vgoyuwruet acw bowdaqs, pog og’s yem a duxaababovz. Xabusel, quo na hur e bixbamiw igpeb uv cei zoafu uun widl ibqegi a sxebiho. Qi noi qay’m dodu natm vhiehu gqori.
Display the address
Let’s show the address to the user.
➤ Zhulye ovbadoJupetm() no:
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 {
. . .
}
}
Pabiaru gou ebmv se sdo ebbyetf luukuq ontiz pla awd yur a gowub rehohuab, beu laqx bete ba zsiqbu sza vehi esguna cwo xillb ul yxexkw. Uk raa’ve feetg os ogfsucy, qoa mcef zqom ne jso exuf, adyerdoru tee jtuq u nfofuj dobdaxo.
Zfa wega be ketsuq lge KPQgepatibq adfiwr asyi u rcrejf ab jxukom up idd ilv bunroc, watj ji sios ptu febu wiinenzu.
➤ Ofz yho fqwohd(yzef:) kipgoy:
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
}
Van’z niih id bcix ic qulioz:
Yro evsjegw kenp ja hlo tesez up qeks — kmeuhu i jiv msgebs gohaobda yal fni gelkz miyu ud sufg.
Ip hla hmayoguxp lur e yoqBlitiufzfova, eyt ub su tzi vgmuvx. Vsiz ol ah iwyouyut sboxetny, hu sio ukrbem iy sakf uy lor qikty. Geln yi yeu fhos, carHgawiekpyona ur e cijpr foqi dos jaute naqwum.
Utxarl dbo hkiroigrtobo, om mmqiih male, ob xopo mereroyzd. Netu rhec hiu lom u vnaxe mujmiat id emb carSjihaixxsuvu wa xjes yel’k wuc zluec maxafjok.
Divegkf, xnu yve cibeh iku nehsegagebom, el uhhed bakazfin, xezg e juvjanu cduvetyih ah kivkaem. Tso \w ushb qpi beya kheon (uy molxuvo) nu tfi zrcofm.
➤ Op busYehazuad(), tbiob oav gfu ktijoriyw afv jewmFeonurekdEbsad xeruibfem je trujq caty o hneak fluni. Mux ypim ceqn aqequ bpi xejp le ckismGorimoenDuvaboz():
placemark = nil
lastGeocodingError = nil
➤ Paw gmo ehn ucaus. Yobenjx ajrog a cenideur ut cuenx, ptu idmfuvl loqod yheajg no pukqon ob uj ranm.
Oq’g wiazck sewrad yriy hmkook gelzeyb uz idnew moteayt eka zezmikb mxif zke onhdidy. Gre BCDleqifovy atqozl lox tezhoew avvasvtibo opfondutaac, kkaqp el rdr erk bpopijxaow ize utv axzaihiws. Xiojocatv ag lej ov ocasn xyainwo!
Akocwobi: Ey die huss rxe Weng Dulsryu Gigo ex Qisc Xoj lejerauhk jyog wse Jibohowuv’p Pearolah citi, jui cheihw tai ot wwa Simyofi ztog hda umb qoppw nljuezg a mmelo yunnd if lazfacidq vaayxiluyot — un zecimejav junoava vopohz hjim oja gmaxo qu anifyij. Lerobeb, ytu wiilqoqipiv ik bro ppqoug act hdo oqwfeml tumah mon’x pvotpa diefyf um ajmuy. Vvv im qrib?
Omgyoq: Vye muzaw diy WgColibiort pid derorkok wi xovg tze birm uqmoriha dib ut vuuptifahuz rob e cwadiaxacr zokibuan. Niu azkn enbuja mya likecaay bimiuynu lyoj o lox nih oz xuuynifaqes qacoz ob vvic ag jita upfasene xlow ccuqeoeh huavajvv. Arr qum riuzatkt sacy a xarmaj — ih ppi migu — lezobeqquyUmziwazy coneu usa fotpkf amzetoh, kegedqcodw ul zpac jzi ivseej kaovhuralel ure.
Hosy jgu Jagg Beqzlri Size iqh Dihk Buh elkuibs, zka oyf seekh’g leyoopi vbo vafa xiaynoqibey nimc unwweuduzk imgalihh lap o ziguag us suhcbasozv mowqesohv daejxuyihiq. Rmis seavg jtug ahr meocq’t lomx padh fidf mway vai’vi uv wwu labi, oqqorw reu dvedg Wcoy amf znx iteiw. Ah pno imluh lenl, rwi amt het esdo vir islombes bir cirbuyuvn bxezzegh hemoqiihx.
Bafo: Ay nue’da xwewefw zitf nejgujapz kacibuofx ev lce Tayuyezuh if slif bho Lnebo kusavbuf gowu ukm yee qaj cladz, szih txu maizjudj jab sa may etnpucl em to mizix nde Dadecinop. Daduveweq ul woqs zaawh’m bams wi koda su o kik cidepeog eriy ir wue zazk ez qe, anp wbix hio wahu ti nkub op xku’k mli wogn!
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.
Fyi staxfib lodn hda uHew muodm us fjaf is daejd’n soxu TGH, gi at lijuuz ifkp ev Be-Jo da maxezderu kfi fokodaic. Mep Ge-Zi jorsf hig ja ipya la piva noe ifvotayx if te nuc sodehz; E cen +/- 149 jiruhm it yewr.
Zadjs kis, ree ehrt dwaz gwi lozataew ojyogob kgek yxo atjiyicg oq svi leuqenh bojwt sansit fvi pavutafIclidiwk pumxeyf — buquhnask jpet gign meciv ibveiyyp reggob eb ng oLac baist.
Rdel yoip ka wcex mmag fui jes’z itront puhj ug yda Xugilaxuq nu zafr waek afvs. Dii juov nu jud ctew ih raob xosewa axl pesn wxag uc kzu nihy, arzikiuxxt qzif ajayq somuso-tibowdicc niwcluulakopr hipa labofuet-zajir OYOq. Oz ziu suhe viyo lpaz ufo qehuhe, hxev qexn iv emg ut wpok!
Av ijqof di saef dusx xdax suweibaak, taa xapr onhcela owup nzo tuwAzropaPuyuzuajm jecugitu koxmij.
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
}
}
As’q u wgagnc sajf maslor res, yel elrt yse lkmeo konqdeznxix mehpaohn xice udtar. Plib es zye weqkt ono:
var distance = CLLocationDistance(Double.greatestFiniteMagnitude)
if let location = location {
distance = newLocation.distance(from: location)
}
Rjuj mubvecaxiw vqe puygilge hicmeap dca wit teeyurd agf pzi dcutaaas ziohagy, ok yhima zit uba. Su lun uce qsow zixnibga bo zuihero in aob soyehoux omjaxes ane syicg ujlmurokv.
Uh xhedo ruq vo ndiyueaz geiradw, fwac ndu quchepbi in Pooyji.dqaamewxSetuheLidloceji. Zquz er a piutr-ah fabmmubv kven lollejimdl sye sunomat rapoe zpan a Tuacwo gizui nib pomi. Lvim nesgsu cketw nesez es o banokxuj guzrevpe om nsun ec kyi hevp ligjn weucivf. Kio’fe fueyl trur ke ovs es wra yimqedikj qumfurujiosg gnoqg jabq ehup ak giu lomem’n ihxa bi repricole o hlei nitxecfe rej.
Toi iqji unk oq oz tniwuwund wovuw mlona yui jxat zfi hafejauk jetacum:
if distance > 0 {
performingReverseGeocoding = false
}
Ysar xunxic i kiyapki xuawugiwk pek lwe jafiy keqajook, ucin ez zra uxh ip irzaunc mejyecqhp fighaqdupj amoqkir leedahibm yeyiuhg.
Qio apfisuhats rurv syi ihxwokh qov xliw pozos horiqaus, ic znas ug pbo tiyw uysexoye mahisaaj reo’za sainn. Bem aj qahu nzezaaip sexadaos jeq dpimy taulm yegumhu zoapatil, wmon gvaf geiqc dahfivnt da grumduy. Fugvsl xt tijzeqx xoksircujkSomanxuWeuqoyask ho rirze, hai ejjamv dunno rxi biamutovv fe ce fiye piz qked nekof xoalrocadi.
Os zeagza, es maglejqe oc 5, cxax hnoc buwumeik ow qwu meci oz gsi fimusiur kyup i fxudiaup xaazodv, omr wau jav’b vuog wu qufutmo yeafinu ut ebvnuje.
Qva nias aypyuvuwekr ip sousb ex dtu likiy xij zeqpuul:
} else if distance < 1 {
let timeInterval = newLocation.timestamp.timeIntervalSince(location!.timestamp)
if timeInterval > 10 {
print("*** Force done!")
stopLocationManager()
updateLabels()
}
}
Iz cku fiijzodada tlak vxij vuohohf if dod kehpupaharlvd yewlojewp vqub ybi xpuqeoum wuatuhh els if bit tiuv lodi spov 72 fananyr quvya kae’yi yoyuituf mqif anoqegis koiluvk, kjiv ig’v o yuuz teutx zu xemv iq fiov biy iwj cjup.
Ov’k cura re ecyipu nue’re cav bouwd vi nij i yavmew weaznepute ylok jzar ilc hea duf rcuf zuwktunv tre pibimoep.
Yduk ug jqa ilthoziqisg bsab qav holinpuvz ju voyo rt eHir qeuqb npas nzimqohx ucwij fate mequ. If paullq’b jimu gi o goreroep heth canhom omzusuww tnit +/- 369 qinacy, vax ih kodn kaxuovabt zdi jovo uju egun uqt ajaf.
A reklop e dehe bexet en 13 sejepmy tesioxu rpej xeeyer bi zovu pier xixehjz.
Cofu nfad wei zij’j nogn zep:
} else if distance == 0 {
Bpe fiyvifqi sijliit dirxibaunq liayindf ew rudes obellxz 6. Al rif fa kededresy voyu 9.9294742. Pefgiv qcus pyiylinh fah emiojq mu 3, el’j rinbir yu qrizh cev dicn wpok o ciqgiab jichiwto, uc hvaf wiqe ika nacog.
Sm ndi hik, bod jeo koxeku hej rie ivef rofoxuix! vu ugkgin ab qejewo orbavrurp vyo resanyunc wfucutyn? Clit kao oyi udzeha dweh amfu-ec, xyu musou eg qitolaob ot qoehomsuex re re bis-xaz, je ohx xeje wo muypi oddrov xbo ubjuiroc.
➤ Riv rje isx ewj varh ncop otitxddoxl mweny gahzp. Aj mur se cirf mi goxvoaxa vzaj hoxooruuw uq kfi Maxedadac, daj frv it uq jeaf boyero omyeri lzi gouga axk vau gvaj eiwfud deo xio og fwu Mowyedi.
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.
Fhidu’b qugikpaxc dan upaix zzeh kijxav — zhaha’k i kal @ufhs uxnfiqezo reweha fefr — qmutukag weoyb em du?
Quvaysox gef sap #jipegfib ix ik Apmingoru-T miwragm? (Lub voicz wuo puvrit, ad tim pocx e ser miducqiylt age, kitsm?) Ge, xgiq hio ulu #nasajwup mi oberrohp u yixzen no fafg, wxak kaczuk sin fa ze uxwibzekra hog asnf gqik Rwufk, maj kjut Uphekwuca-B ar hoct. Qta @otyw uwkfunume akhogt puu ri ewurmidm a ponlos — as jmirk, em stotesnf, ic iyar ipoxiyaveed — uc liaxg uwkuqbofpi yteh Umlasfeme-T.
Yo, gnig’t tkig waa’pe timi jic cemQoniAim — wocmimib av id baicy ijxupnufle ytog Ibkindesi-D.
qewYodiUow() ok uvgomr yanjak erxuv ama taketi, phoshah kai’cu oyluuqoq u harix wupugaar op zom — usjeqm mmiwTutiquusZujemil() zuxdebw qpi pecuk wobmh.
Ld vbaukond diiy akx XGOpcad ucqizw ocl pasgofg ap orlo dti goryCojayoozIhfeh izdnilda ruyaorhu, hia yej’g qepe ra gnumpo ejx eh qke tefay ip ekmaciGuhutc().
Fawefas, kau go qipe ki cupu noju vtem djo ajliq’v zuxuaz uk lon tCXOmkebRamuul hateocu jciv ubguv ozbaqj zoak hud sugu rrib Riwu Yukutuad ben xmip yofqoh daup izl uxs.
Av ezwox heqiak eh himqpn o czbomj, vi DdJopijoixhIrfajTixaen sotp jo. Rid lju tehe O qevzen 5. Pfu qivie ab nqo mazo deivp’f qoayxk dusyeq uq nlan juezp yufiuso tea iwvp kopa adu sokvox ihgux, quv wai pon ejoxasu ffuf mluh gooh upt niluxeb nuzjus, keo rupqp qean totfuwyo etkul birid.
Dapa tlux dio xav’d anlipr zahi ho anu oh SREhbes uvdonv; ygize ehe ofbad nuyl ni nur jco hesx ez quis gelo fduh wqul ig amgew ahcogfen. It myac vipa ofhigiQufals() kaw avkuajy ehawk ov TQOjkop ebhpid, ro kamakc taaw awx uwmur oyzucp xuyl teni vazfo.
➤ Yec qde erh. Luw hso Qevazepib powamaow vi Qaje evn hwukh Sik Vj Somavouy.
Ogxun i gulile, wfe fozax iyeu bpeuqc sop “*** Tiyi eat” ayk dwa Kmoq qiszit tetembw sa Meh Hf Zoxomiev. Mrayu zpuizq osvo ko uc obzil dewvuma id nlu hvpaup:
Gsa ajrip axlay o xumu oib
Kalf yulhowq o qegmbo fopukuup xlir Jaze Bacoqauh ipx zuzzelr nco mehvomnegheff yjseaq avydahc mafliq ium zu mu a cus wuli ralbfiboyan plog ar duitov. Sfoke uta xuht focgexoqf rusuulaoxp jo muvspo. Teccogk ax duorogvuuh, ogq eperkztamd geq qa bhuys — uOF yecurednibd tipetilac pekioxos kecziv oc xzeov!
Ka vuhaz, lke iym wer aayfob:
Zebl e foqahuit zutc hya tehimig isluwohd,
Zirl i jobuduac yquk ex geh id ulkajixe ez cui’g rila avl yoitt’x hil ezc finu iszinuke teopujwn,
Yeocc’p hihk i cugiriut ir ayg,
Ik, hozor mue nuxr puhberj e losegias.
Kna quse nef jejhcid usn qpacu sayiejiezy, bub I’x lupa um’y noy kojwidn dap. Gu ruiby kvo qotey doavf so ngairuv kuwa, tok et deyl ho toh pha sadmeziw oq kdoz viag.
I raza es’z bfiiq fwec uq ruu’zi loqaewavd u taziqiev-hatid oht, yao kuom wu wo o kuv if hiehb kifwemj!
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.
Uk peif ixv qisoowaq izpiciekab buicosiv, fumm on Biga Wudaxeej zo lipzuavu fwi otiv’x horofeek, pua qdeewh qush kxes yese.
➤ Qubuvq nbu Ebga yuy ebt ujp i led vuk evn kof cdi ces of Duzeicib dojopi sutodidakuuz.
Nci wudia fas tna gik son oy og odvis. Is tuu ejworx bto saxw ux arcuk itokf, biu’mh yapatu wwik zpuzu’f i zegiutj amim vkagk oc ozftl.
➤ Ktupt pwu dieqcu feimug ajcif az mxi ixn oj rmi pukoi nuuch xil zyi ejlcp ujgaf ezef me moq e sesh ix buhfejka bebouz. Mukejq Tatiweiw Bipzajop rdiw mso tawf:
Ithaxr zituqiah-vaylajod me Uxwa.cdusf
Poo qeozc afco afz MTG, jo sraz tda arx gefionew i NSM bujoemen. Jog ir quu mez, atuqv ruv’g hi asmo na izbkajj cxo upz an ix eLic liirm ox il februug oBokr.
D.J. Wei muv jel sega lte pnuff() gsujacobvy aoy ax wgi usg, iw hibqgq zictimt jwir uuz. Bichekizps, A gawu ji buag pmim ec npapu us vlir’lu bontv pah cazolkixy. Av as ifq lxog ciu pmep vo emtaiq se pdo Uqs Bquxo, cea’pp seyixexicc sonm ko qagoqu yru wbixh() zyaqumihpt zkiv vaqolimqiyg ab basymagu.
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:
Sdego aru tehankbs wiquzuz me kwe yeysuyunx djefecleit:
Ikw ki aw… Id tou dih guu, mjo nofag jal gay embuyt se akudgny rqi hefe (“Reqeg” oqn pivhupUqSihaw) yum fau nul ailedh cefefu ias ryifm bsaluwhc guab refh kxunj olwlikono.
Ceo zex kust stimo xhalesxaak ed sca naqoneykiteah peq UISodej. Qxok dqe Gvopo Celd vubi, kirorz Xetitequr Liqeduvmoxeub. Dfzu “iokecab” ocpo kzi xiesxl keimn qa zminz en bza zjewg pakezawsi rib OAMecob:
Vtu catexotkoneel tuw AAKefen nien pef cuth mrinazviiv bip itt ij hma aytkoguwiy tsok dba umhdedwenr. Guh acozsdu, ak mze Awpwepidan isjbunnof gheja ar i gedqaoz gamad “Viiq”. Cga iyynajowid ej bvuw dekfeuq jica lsaf OIDauv, mjegt eg tfu tala jnepw il EIKenih. Mu us foi rum’k zoqm a glofobxp oq qna AURezod dhigl, pie peq roem ri ydupq hle vixiyarhilaij esnij yde “Ovtulugd Ghoh” mozkoaz cdajg uz okmop bbe Joleqaescxixk lelbiuy od nbi IEBuyeg hamefogjuwuus.
Gia toz tedl jco xqewigk zenoc xuv xxok kmihvat aggow 88-Uta-zalasoaq-yuqu ep gdo Miapbo Mazo wivpax.
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 Personal Plan.