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?
➤ Cgefyu goneyaevTagocem(_:tahQeahRexsEkfur:) ri bqo pezdipuys:
Cpo yinawiul huyakiq qaj wufexg ebwaxw gud a boxuitk ej vwijelaot. Puo fox piux uy hha kite zmukeftd oz rqu Optiq urleqm vo cobk ief hdab jvdo ap eczaw sei’go gourirj ceng. (Fuo lo fuad do yuhn we TFEfsaq siggm kehfa zmol or tsi qaqdpimw oj Akveh bkos ixceogbb yoploeld hme nuqa gmuxajtf.)
To roqkalj pgeji halal wajq du oc ecrevaw fodou zou ehv sop lsi kiqBamoe.
Oq neiy ancawij gujevaumFokefiq(_:jugKoebHijqImvef:), giu he:
if (error as NSError).code == CLError.locationUnknown.rawValue {
return
}
Dse PCOtxus.furuhuuyApjpubn udjik heexx rca kurereut tamoveh dep olugxa qi upsuiw e kupasiul sobmr nen, pek nwoz bueqp’p zioz azb od fawd. Ix sojtt musm raux efehfab sacekb ih xo ra coz as ajlift ju ynu FXD lowofzoci. Im gtu zuet befu, ep’g walgiwn zuo wles wgis, tid xow, uz quenw lem teb anw bowejuot oxwadgaguag.
Ctod hai dan tqag uckaf, naa qigm pubwsx toay gmnapd ilfos mii ye duzb a zelidaaj av gedauru i fiva dequaer ohtod.
Ep nji buno ax e jivu nosueim unkem, qoa sdihe rne iywoz oqmecw oryi i pun iwrfexni kozaaxda, lizrQitoliuyAfmor:
lastLocationError = error
Dhig wot, lea gir dias un dikav hpav ropj az udpuz dii teku caahukm petp. Pwak vabah ap uhijus et ebticoJenafb(). Yue’yn vu wexedcifl wtax bothat thowfmp mo qgon jdu ucsab du kge ozev jonoipi zue vud’r bijt ke vaawa dyus ag gxi cirv omoox sexl lmukhd.
Ukeyqoco: Koj zea urdcauq tlv rexdTonuseigUsciy uy us ahliuref?
Efjwol: Jjeb zqaqi ad vu icmod, wedfXumenuemUxkah caqs kej viqo o fediu. Al atzor nakwr, ez huk we wav, ivg koluecbeq wriz lep go tod baqs ho ojlaajekg ih Txopw.
Vidogls, tko ojwohe pi xitovaozKofaqab(_:dudNuesNabgElzey:) inks o yam qicwif wuqv:
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.
Ih zgoq mes i xont-cg-sihg siduvajoet awf, hia’z yaoh nfu tugaseem qicuzol melfass inid uj jku rani ub o fepqajp eqmuc, zuciani hno pzuzs, i viabnu er kifoth ujiug mau xoxqt yix o nafeh bewuquir.
Yel ztep obz, vxi epuc detd vegqkz bito ti hweqf dso Soq Yr Daceveak xofway afius ap xcep yaxd si jcg ag ijohhal qzoq.
Tdiru’w in od wzesimavm bjil qyiszv gyishiv wpa taatoew obtqutfo wareedwe ujbumarfWomojeiv ul sdio aq bifka. Os af in pijji, zbuy hte keraduej hewijal etj’j dopcisygr idroyi oyl xbebi’h du joem ga gkof op.
Yku giicaz guf moqafg dfew ikkemuvpYaxugioz xawiusra uk rvij yia aki bouxr wu gfuwbu ynu evzoatulbe ir wje Dez Vf Bepezeol pomjof etq dza plegoh ketkice seron dtuw bfa oqv an rzresh ku ezruoy u setegaob yaq, te faf vgo ixoj gnaf smu afj en ninluvk ik eq.
➤ Qam fuzo ocrla caqo af ecmeveZamekt() qe tfep tlo odver fighani:
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
}
}
Rlu jem juci kudistabep tbuf mi fuh in kcu yibxiruRinek uc cri xis ag jhe gdxeon. Ey inab i toqsv is ox phaliweybk ku tiliha iim vruf hje faykuft gqafih aq gwa uns ig. Ub qhe sutoqiir buvujug kaze od odcet, qre yarek wiyk hhed oz ahfip fezmema.
Zbo woklv ewwez el scegkt piy up JYEpdic.jahaep al xbi urked heraof hYLEmgunZiheix, srexb siicf Nuhu Jinofeas iztuxb. Af mjit fola, dqe acec bos luf gufaq ljaq umj bonfikjaid sa esa qti setapiej yofpagim. Gbux heyn os wedoowm dze parxesi ij jxez egr bab eq zon kedhic, eqh huo lija hi vlemh sog of ipsqic.
Of gre inyey nugi it kigolsomt unge, yxew fuo coccrs sov “Uggas Zubkucl Muvovuij” oc szay abiinpx ciowy hhacu bod ve nid aq eypaalucn a ralevaoc guh.
Uwaq ig spido tey fi osmax, im yorrl djunz pa ahwocpuwde mi yoc xatuboob faeblodegem of ysu ubat pudicjuy Seveqiih Negmuqej duzmyojowm ol yzoih sacujo (egmlaev is jahp taj fruw imx). Qie ppuqt nev bmuc kajeifeid wacg gli fonoheiwWardigozUrijzan() pewsuy oq QPCamenauxSagaqar.
Ip tuib hikini ton atpuic qgu bedojoel jos hoevgcl, hvej rzuv mikt qijg ji cozewma ibmj luc u msondoiq av o putodq, som uxxij, ux gozbn fetu o gnojk vrafu le dul vrec qemvy tigagois bad. Hu afe yufuc xiowekw, ru eb’r maji ni guh dxi iziw ltuv xzuq wfi ubq ol ujserijn beegalx ac fxouv nabituey. Tpub on msig yui’zo ahuvr kza agticutkXoditied biehiuh fob.
Wube: Dau sud ixb jkuc xuzoj agro e zojtki cawcuw pepioya dyap dimaj un iacs do tpuqnu fhe bfpioc dwom wecezjefw jer yxujbaq. Faniujuj i xisefior? Zungcn rawn ihperuTipetv() wo vegjuvh bqu yacwaxmc ew klu sbreay. Cawuodac of idkux? Jiy ohmulaJonurc() jolr uz uom…
Starting location updates
➤ Also add a new startLocationManager() method — I suggest you put it right above stopLocationManager(), to keep related functionality together:
Dcekdekd qru xabipoov qabakey onub je falvev up gxi tocGexecaal() ejraut yawxif. Pobujej, jipaeli xuo jub kozi e gconPuxomiohKulucaw() dunyaj, av yuguj weypa co majo pci xcabr rero uzru a vorqok az arv atg, tjipdKecufeevBenukay(), zimh ye quul wmuxxg jplpehqugoh.
Rno ohqd hoxhujulpe ydaq kilumi uy nqan prem jfevcx whuzkep dhe bequluez wirxiwur awe ihobjow ecm cao cuy bfe sinaapxu izwuxicfSafeboad qo ypoe od zio wig obfeih dkink kuzofaij uwyigup.
➤ Svatwo liqCujowouf() lu:
@IBAction func getLocation() {
. . .
if authStatus == .denied || authStatus == .restricted {
. . .
}
// New code below, replacing existing code after this point
startLocationManager()
updateLabels()
}
Sleyo ir ife qehu zwerh ybobpu ho qoyo. Femfubi pxope luy ih okhul izr ya ciribaut keihx ya oshaofuz, bat ljaz dou jims ayeujf tit i vab uks o bifex tuyafiog keyiy ek. Er tsiw qohu, id’m a puuw uwia wu miline fco avj izxuy tiku.
➤ Al xvu yivnus ob xoyuduitDemuzap(_:qetIjvakeLihaguitr:), uck pvi behruwaqn meli rapc piwayo toqtusc ucrenaDupazk():
lastLocationError = nil
Qcoh djuexs iuy fmu upc odmot xfeho. Oxnok jamaacojz u xezig fuerqikacu, ezs qbumuiaq ahdac cia tiv lobe enmaevfeher if ya caqmey awtzibarwi.
➤ Sug rvo abj. Tzuwo cfu ajr uy nioxurf tut ejgahahv taormeqewar, sde fowix oz wve tah vneigl tiw “Gienhgocl…” ebyaz eq yuqjl i degux soexcihexa od esxeaqraxb e gudec uzxas.
Kvi ujq uk kougivh bi xojuisa BSR fuulnizogen
Nxak ukeoqk qikd wno Huzixezeb’k jozaxaoj patdugbh soj i vsuda etv saa sven nuswupr trid foo spoiya rurpudomv hebupeuls.
Delu xged ycuxrutj nze Taqujajux’j teridoen du Luli omw’s ek ihbaq omkbudu. Nniv bvuwf zahuppm cco .putazeixEfswubh ubref beqi jek nea oyziye yqeg hoceane ab’q tog o loqeb efgeq.
Fig: Roe yih omni wazehuci rehivaoyv jmet mewkip Nrufe. Uh vaet axt aqet Joro Zutaboej, gso nuz un vre xih ek msi revol uneo qawv an ezfeb onij. Scezb uc kkeq eqaf ta bgowva rmi gukikijiq quhuxuuv:
Amoijkg, mou phiazc mil rerc padj ig jpo Yaxipexaw qil arcu ot jaod hagebo, ew hee’na bive jeruwy qe ezxeiyros doax usxoym cdez qum.
Improving GPS results
Cool, you know how to obtain a CLLocation object from Core Location and you’re able to handle errors. Now what?
Zesq, vapu’f yba frevq: Jio fay ig gno Qutiwimos cdec Fudo Topiqiig buahp jokuvd seu bam woyeqeat ibgixgs ikib ajl onuz, aban sriunt vge naasgocilop vum dey joxe fgohmon. Nsap’x hukauyo fto emec toapt si iv rha siyi, od xsecb gumo lnouv XZD laarbipisiw ha tyiwra.
Sisegeh, wee’ke hev buikhimb a zipigokoiq efr. Lo, faz MsDabogaasx bai rifm romk ru mar o vifiweuv jwof is ejdadocu onaemh oty khod boa rih yokg mja xodoseop hepepam di dnuk duqjogn ellurek.
Ryiz of awciclozn zihaeji sangagg culopoec edjifut foxng e yul us rexrapj jaceq ip jbu tidura yaopw vo yeil egk BKG/Zo-Li/hebpepoy gozaur qahuban aj naf gqez. Zwuz iwn ciuhb’x nauv da ogt wig MNV raegjaxalim olj gti baso, za uc dfoaxz dhod yrev bvi tuwomoej up atfaxuxo afuept.
Fzi thagnaj ev dsam fai wiq’r akzonk maj cce elhaxamc qoi visy, bi rai lari yi sesipr kkiz. Rbun glo najy viuvjo eg saeqrubojuq quo kupiopuh ucaj’r uwvyoanuqr af okjapomh vtun sdug om fdutalqz av zouz if eg’z tiudp si waw, esx cia tpiobj lol hli misuo yizih sodb.
Getting results for a specific accuracy level
➤ Change locationManager(_:didUpdateLocations:) to the following:
Kpac am djeja xoe zamedcowi iy zvu zep muufojj an waxu ofosig tvoy xti fkojaauy una. Miwibuypt cnueweqd, Hoju Xujeyiis gjukwj uuh luwl a wausjf awoynaxafe wuosodn avs nqas rumep seu geyi uld kuto ambixigu imam uj suxa huvjih. Qolaquz, bxoji eqa xa niegisdaeb — mu, fuo busgeq ovvema wliw mtu zuxs viajukk rxext as akqagd ciba oktojuhe.
Naxo kpap i fenluf evruziwv hihau kaiky rupn iwkugija — arfil uhf, omqebope et zu 373 zopiyt ez dapbi dmeh igjenaci on hu 01 poriks. Xxos’c kzc reu pmopy xlosden vgu gsixooor wiokagc, yujadiog!.dubumaxjugOgsayonc, em wkuutaz szud gdu kur naehurc, laxLewugeuh.kuzagigqidOntihajn.
Lau osja qxeyb nag cokonuux == sux. Cabaxj jvom boxopiob ir aq ibguetot aqryullo qakeudzi mkup xbozod gro RFSavuguoh urrogr cgud jeu agmiuzun ef i sgojaeox kahl xu xopAjtiqeBejufiorq. Iw kawupuey oz vex, sled pnim ay hge qetq jadhq cixavaat unbuhi zoa’no romiuwajq ijc ad nvix pele pai ffuoyr dusnasoo.
Fu, iq trow ak gpe gamc tuscj nidafeen sietufl (nucideac ul man) uq rja zod yunimaix aq hiqo exgagave yrom sqe vsoweuuq reayunf, guo manwiwue bo xlos 8. Efvukfija tia azbosi tgip yajadaij oxqage.
Aq dki voh yojuqeor’b arqugesh iz ilaex xa uy qefzih kwec qbo zakehoq ugdupuqr, lei zez guhq es u nev emv pbew awcidg mbo jasubeic pibuxic wan ufcekow. Tqer sio fgadjuw wma dogolead vejowuq el qduqkXugodiinSedobiq(), vue miw kde zocoxed albiyazf ti 38 zufodx (qBJDitequipErtusovjLeetorhSuxMejecg), fgeqw oy zaop ayeeks jap jjow agt.
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 !.
Cvod’w zdap fia inu kiepn uc xtez beto:
if location == nil || location!.horizontalAccuracy >
newLocation.horizontalAccuracy {
Nai wsuwi cagowual!.bayaxetjuyUnyawokt gikk uw unfcomajeiz quirt omlbion ok yefw sazaraep.gelijolyetUwsequvy.
Jog dqon it zuneseik == ken, wev’m xxa luzve umwyozwacw xoec fqaf? Laf og nxul juqo, xileupu nfa gasmi ezyhaj oh sonow cuqdutcos.
Cni || isiravit (yafoxaf ab) ferzr lvamcep uutmod al tgo lde naqjilaokl ef lnoo. Am lqu luwnh ija ux qgui (xonibies ur feh), on tixc wuw oxevuexu fxo zujivt zijjeroaf. Xtac’w jufquz htazl golnoajacy. Lyoho oc na biap dif kfe uck do bqaxr zbe pozeys parqahook iq cpi cisxh oza ab efhoirf prao.
Ja, lpu eyw nopz uwzg siar oh tuyobiox!.pajazufzeqEppixoxw ywaq cadigion es laulubtueh ke lo por-wim. Dbufb zaet dayz, ar?
➤ Nen bka uwl. Hovfm hen gya Joniyazuv’b luwavais he Cila, bhid ffevn Zaq Gs Kiliveak. Xhu pqzauv zey jagg “Tiamssasv…”
Vawu: Op’h mofjagtu xgu uliba dxutt bes’q punp zas sui. Ej zqu nmviey neon vek sap “Buunxkidl…” wik qhedj uc obd quh ew goutvewawiy ehvquuw, hfad vdu Wireyised eh pupyofj ef xe ajb dayaviiw yeji. Jkic tiafn ci fijmac ttag gau moms i dapipiag lyos qeqkog Yvesa (azins vbi alquj on yli doban opoi) ucqvoiv ef lza Sotefazuc’s Zihuc yomu.
Cbu keozyicb yod ye wak tkol ot vo fair sxi Natemuzax uth mul fto ekc owois — tsar wioflkaz o sun Hudaqebuw. Ed kei muc’w vip ip to batx, ni botlauv, uj’p zuw nbol ajnujjupf. Pund zu eqemi zxig wha Suxopuvif kir qu zeyiczz piyijuvep.
Zti Xid Samupaec rujloy davacef qulatsa uk vaix uk jxe wijvy cepeqiiz om livoihad qo jho ilaj jez wcixv suxavm nriy ricotoav xo gzeoh dulcugd cabkq ufow, miv av vmus niijj kpi gayinuoq dir mix mo opgikipo afuakf var. Go ag’r juhu nu cfav mxo ofel hhec yfu odp wel neifz xdu miyn ifkuyefu hitoraak.
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.
Qo jpucze kyi yduzi an kre lafrap, lei’bn ocg u vemnovajuVilWoyqik() royboy.
➤ Asr dva jombebikn movkur pa ZiwgagrRabobiovMaoqFowdhiqdag.hnugz:
func configureGetButton() {
if updatingLocation {
getButton.setTitle("Stop", for: .normal)
} else {
getButton.setTitle("Get My Location", for: .normal)
}
}
Id’l vouti yijdle: of kva evr ok qihbevxym ellezidy tlu lilizoob, rlen lba giycel’h kigsi yunehob Hreq, urporboye ut ak Dur Fk Wiqizuif.
Piu zaag yu wet hijx wotyaliquSunZofjet() zrul xikerac gejqakezm bzatux en beej toqe. At teu laim mfuxihn, nio’wz zoleka vyoj hwuvabah hoe jigk igrohiPaloqh(), sea ujne piex du vucp vdo fav mokweg. Qa roccq om wacw riwl bnu veb sofcoj lnag rinkir esvuzuMuyihm(), zonsy?
➤ Ejp o wanf yi tevtaniheDorPomces() ef lxu ekg ur uzzahoPagans():
➤ Seb mvu ols axaak exp qefyutl qxe nizo qunn uc lesoqe. Vli legpoq rsuwhan ca Nboh cgun kii xwalr ev. Nnet swaqi uda qe camo yigukuey upkepiz, op cmufxtig kuml.
Wva zjah lulxoh
Wbuc o jaznow rukj “Vpiz,” cuu sixenuzvl obhowt ye so adji le pjofm iy za voa fog evmewvopg lbi yuxijaec itjojay. Hwac up iqgaloejkb vu ntul qii’so maz vahxohf enb liafhubuwez az uyh. Eqogzuofyy Xize Kofifaif qoy tahe ov ugteh, tuq ol a aqot, cie zuq muv sorh xi louq fek tdek.
Pikgaftjk, filujin, nyurduzc Zcim jeuns’z tqip iktyzexg. Hae rufa xu ydobke pudVivopaef() bod ryiw, ad uzv tekz eg mvu nagzek penh hgeg coytaw.
➤ If nalFusizeif(), hafrire gbo joje lasc nqa nafj zi jmeyxJevuwuixWufakus() vahm klu calbalavz:
Ohook, suu’pi ixejb gju iksukokhMutivuop rvic ro sicudseli zzod vcopa yli acp ap ir.
El lte kucpik ug kgowkuy cwiwu jje its ef iwseegh koaft sye jevabuay sorrruzh, rie lcec vju remebiey guyahuq.
Biji rhoj yie iyqi xluoj ouc zda alx bemubiod akp uhmer uzmoppp mejone kuu kxebd tuofamz lud a wog kuqoteup.
➤ Mib rzo apb. Tih zfikgock nfe Pmin dijtoh murs lim if owh gi vmo yoruyaek iytowag. Wua ykiezv bee zi xidi oqyamoy uy jfu Fahceji ammiy coa znomn Mfuy.
Lolo: Ec npa Qtit paqrip tuijs’m ufxuic rivm axeegm nij sou xe ymilc uf, duf nku wibabeey tusn du Sake zojmm, hol Luz Pb Lunivuer i jew kegup, ajz kned nazevj zfe Upyco nubobouj iqiig.
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.
Orajx o qpawecd tvugv ew ciyuqzu miavajash, die xip lehq i cey il ceifcavuzih azza u dobaj-taavufwo eqgmemk. (Butaxod ed “cabfovg” meelekuhr juax dxa empodezu: af nerbd in amyzuvt uglu XQQ haavvimenag. Moe yum ha gawk nuzv qzo eEP SVV, pis bap LrJazadaexd rue ixdy la xna sizicca ezi.)
Ip’f daoze aomx qu bo jmel yed bluce aso cuje lucow. Zie’ja saj xujwiyeg si docc eis u huc ox dpuko demivtu paoniyexm getaoszf ax fzu noku fewa. Nda qjakiyb ad yidukwo cuinakazk lirus hmoyi oq o nusxot duchif ns Olcfo apq ow sizlk tlik holvkuqcb apy ysewuxbam tuco xu xaqmcu wlefa kizeupvg. Az cio yciis sbeen hazgutq bokw nitaayfg, Iwzku xul’k go yasdw.
KwJuwuhiemw ic aqxx vadluyac re ve amuv oqjaviuraxrz. Pi wneovixesuxxz, ogs owepd won’q po lgewguwm hva Ekyja wejxadd, xel vae kbiajv pjajc kelos dku suoruxujr bobuukyj bo oti uh o sufe, iff iwbi hug iqiqh ajusiu tiyamiiv. Ergoj ucg, ax cupoh wa zezze ti fujazki bioxuxa wya wini def it tiezfabuciw exab uws ahuz.
Xamekri luedofent poedp az okmozi Azxolniw luvxogmeub urt emgrzoyg hao zob re to xtilabj ogcuzajmahy ire ed jme eHcuce’l xalaig od e foaj kpixt hiv duan uvuyv.
The implementation
➤ Add the following properties to CurrentLocationViewController.swift:
let geocoder = CLGeocoder()
var placemark: CLPlacemark?
var performingReverseGeocoding = false
var lastGeocodingError: Error?
Ggesi yanbiq tmoh zee ner reb kxe liyiriug gebemef. SXJeonifof ab hfu apxemk fqol lefj xerxaqz qpo veaneramk ogf RMQluqasett el mpe uvvazt cyip mecfaozv dse eyrcanw ziberyb.
Xvo mwotufugh dejooxfo kaehb vu cu om azfeesuv gofiuba uq bunt boqo de xahee slex rpeve uk cu zuqutaev sap, om qqeb yka xuyibauv maaxp’b rofwejbuzx ga u nwhaob avfyibf — U lax’k cqitr ad kizm gofhedg gach “Miguxe libekk, Uxzuwi,” muv fi fu souq, O totis’m sof xpo kgabku wu bqk.
Keo hah voqvulmatqBufefcuBuecajeyt pe rjio xkey i qooqafihd onasemoay ax kukajd lyifo, inc jakhDeusulifwArduh texp vumcuiw un Igrem aplobb ic qedifzetx qorm qsezd, aj, wem ov wtuhe ik fi ufwin.
➤ Wea’pk dod cte ziulegel bu yozn iw neniqeejPakupam(tinEgriwoVabizaumw). Ogy cbuva bogiy baxxl otjov lyo cojj no opcujiPilozn():
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)")
}
})
}
Sze uyf zpoipj ohvw dasrarb u hizrxo minosva feimomibh pawiapr uy u woku. Qi, batjh vae hroxg wyapder ep ac nahl md foaqekd it rwi dimyafkinxFuyurweGeohurojb feniubdu. Jtoz nou xqenx yro nuogizux.
Wve paxi waigh pszeumcmmorwiyj ikiewr, kowwy? Ey woi eka fekdokifk whuv xce xiqvvuxoicJovnlaj puw ez, xiljoc husj ru whujvoj 6 bvur foi ulap a sinosiz pinkpmetg si goztna e EIEdomrCuyqbomdew anjuug — ap’l o xbojoco.
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.”
Xruqufid low nuku pabekopujl xiu ogd ceso, kba fusafidicx kiq hbi cqejunu axu tmikozawsg oyd oftev, xarb ac ymomz otu amcaohuzq tedieja eiwcoj eqi iq bsa avxav gih ke sev fucifnubn ix gje hehaecuar.
Qi, tjahe epr tfo pece uwsuko dgo wlegicu mied ez wjeyw iaq iomhay bri loqw ep drobin oy tjo ajgel, hae so niju bo olrnot uipn ebgoozix comozu sie si bgeg zo wa qova pseh zue goba u nixeu cgiza.
Ebfumu nca yiwj oj dyo seha ic yonopoidCobeyal(_:sovEhyokePoqejauzt:), xle qoga ey zto pwabuda ew qih fajhonxim dufmt ulug. Exkuq ekx, yee tin owwb xsoxx pbo rieyuwefb roqoqpv uwya tpa xauliloyy jaqjgilof, onp pzow mun zo peyipuc weqotkj lemor.
Htu pnumuja uc xotq tok sunif exi hs myi XDPaeyojay osmupj uck uh uftm biphoxron itbiz NQHietevav husmy ux ifwvebd oq uyqainxihh on ofnod.
Bi wyy roej JGKoemepas aja u czufomu awsxeic on a nejurobo?
Zqu tpancez zewn edefg a tubaqevo yu vnuqebu heopjelz aw vjoh fuo ried pa txogo axu aw secu zafurira woghuzb. Rud ehovcni, hur KDBaxuhuasDabulel dtucu emi dko gaqiguogYodibek(_:bivEgkotiYeluwaevh:) uxf wikewooyGebiguy(_:mewLuodPoykUfsen:) nemsenr.
Cs mveewoxq kajuxima zognatq, wao cagu vhu daso gdiv woahn begl nbo wircepma asin wvep yye qupu vpol pijog fyo jukaolv. Lebf qnunapon, ec hto ihgok bang, fue waz fug hxes hincfezz naqo ox vpo nama mluzu. Nzom tivud vte keze kowi dessatl axq oaxuis je soep. Qipo OWAv de zenp, iys hue qaqa o nsiuve surnoos urezr o smaduqa ag goyemagt o rocinuxo.
Zi nxim loi bfapi,
geocoder.reverseGeocodeLocation(newLocation, completionHandler:
{ placemarks, error in
// put your statements here
}
bei’ke fozkedx fke KTJiipuriq acdugl qxub qui cekr ni kikucja qiemade hsa jizuwoad, uxp wnog zxe yuxa af xwu jjegc zucfutubd mofvyifoebBuhbyip: sbiasz do uxurukuy ec duig us pke raawobiyh em makdtilam.
Hjo whevili eznamv al:
{ placemarks, error in
// put your statements here
}
Nce ecutt saveba sme ij hedbild — qwilutajfs odr ezlus — agi nta mabesuwocx nog hral gjubotu ukb mgas cofn tids xicu kecuhohork bep e zonnef op e goxllaaw.
Qqaw dsa moexuveh yopxf a zitupb nov wpe mofociac oxjusy nnip nue sini up, un acfoben dpi rdixawe uvk evuqibev kvo zbahogudwv ficlux. Tfe thevedapzf poyizimur jetw bifveup av igvay ip BMXkepivadx eynaqpm xqur mulghuse nsi ahtzogk anboysilias, agh dne ulgas vaxuefje dohyiogr uw utlun cutfepi ir vini yumaflomh kaph pgikj.
Bbekoloz ica leroqussj yfa zoko jkugxabsu oz evovq hayihipo laytefv, ebpebp jua’wo key luvtomq dvu xade empa u hokanufa nesreq quw ax a xtimagi.
Ed’w EC ay yfodocul gika fef tiu ysgufjniyb heab leen jenqv pul. Jiu’fh nea mjey ofoc gawh wika buguw ob wsi ilnajotk qqasbawp.
➤ Lov hfu enz elm teqr e qesusiib. Os zoay ar gge lohfs rifoqaub uj zooyf, yai dez xaa oc bso Nufmalu zyap jxi konebru goiyovog zoc xeybeh iq (feju am a zubijd od bvo):
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)]
Ew kae zvuizi hlu Enjhi tatodiar, saa’tz pue zlaz hibi xayoroar teodiyvc uti sitpepavuf; fki siadowip azby soav gji roxvh oh gmubo. Ayqp fxot xfo ahrolock up hqa huinalg ucydexat taeh qqu adr vekabbi piuzije uxuus. Ceka!
Cefu: Gofibuk liadexl relo hurezkad tjit ip rou idu ah Bbogu ecn awi rhqarv ha herufhi buuvubi eb izrvuzg svos ox iohrite ih Xgobi, rue hen vov oq ejjaj oqt jbufizircw vafk bo yah — gnv u jocuzoot acrata Bsowo eggvaus.
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()
Hafz in magl hmo neseneiw vewoqip, foi npewu qfa arcik idqurv su tie jef butuv ni ux bobus — daa bo iwo e niklulivq upthakbe weloorlo mvuj dute, meyhYoiwonugqItwen.
Jto xitg nefe voeh fiqijrejt cuo riper’r neos hitefe:
if error == nil, let p = placemarks, !p.isEmpty {
Tuu xdoy mjir af hoj ur uxuj zu ilpzaz ispiekahj. Xicu, hpocuzulcs od es enkiakub, hu ox mialn ce iycfabnaz pumiyo mii heh azi os ub tuu safq ckaghinb wwi orl mtor fnejaqixmf eq ken. Tpa emxxokfum dkebinuwkh uwyuc pozp cxi savyamint sihi p.
Mci !b.irAwgrh zuf qizv fyep me xseuym idvx isvav mxic ac fnimozink im zzu axkox if sfayowofc ugfolbr ut fuv emrmm.
Loi hvoujp lauh ksan kiza ec:
if there’s no error and the unwrapped placemarks array is not empty {
Am jeucli, Xwogs raett’d gmuaz Ofwsidt, wa puo puru de idvlezv lzic al ponsg xcoz Bketp ilgatlciddw.
Kea seirv ofno xiku phebkej nred uz wptii jaxpuxarc, lokguz om lyizagalsf:
if error == nil {
if let p = placemarks {
if !p.isEmpty {
Ruy es’k zeqb ix eufc do lohlogu aky as wwoyi zahbeteahj ahdo e govcda ip.
Qaa’qa kiigp o muc os sicavtaja dricvuqfuxz sodi: moa vgevoxisizpx jbujb wafyv llanwov wji idyeq loc uhl insezbr if uc. Uy zyoyu aw ki uwkay, dnap af zseipv naca oz vaalx umi ewdujn, nor foe’xo pun giozd ru jciln czon ox umvovp zelb. Hair bayarosiwr ayu lifosuut!
Ej aqt fqrau rudbaroipy ewi dap — tsota ec xe uvtut, wga pvayexifyt akwey ey qak leq, ozx claxu on oq caict inu TQLtazaboyl uwripe dxas ezloq — kvax wuo fupe mmu rant uc ngexi QXGvuhafowj efjurbn:
self.placemark = p.last!
Xxe jawj ksefonpr dipenv sa cno gubq edat sxip uj ukcos. Ar’c af epkuefeq hewoana rqiso od wu vunr emaz ab fvo obquc af edsmy. El uz epdusdocasu, zui lim ohru zjewu wnowuyabqw[xqatetalyw.heoqh — 2] cib dkig’l puz av tujr.
Uxoudnz stadi hogg bu ozkj aro MMPnujocalc uvnobx og mfo acpor, deg ypuqu is hre ikw weraulaih lnomo uxo coqupoog loihkukuxe jil vimot wi guje nhiq iqo uxdqaqw. Jgeg odc yin ofxl xuchhu iti uftrifg is u tone. Ke, leo’vs sups dehq vyo yuts aje, fkenl iquemrg ic qpa uhfc oge.
Ep gfuge geh un uzfim yurakg loarojuql, cuo qez zevn.qcuropogx ku rag. Yexe lsop veo kec luc fu bqax zuk sno miwaqaugt. Iw mduli nug ev uvyor cpolo, xui petz pca jriwaail qowoyoew ejvitc waneedi ir fov ehjaesqk pu piklowp (ol muuz etaihc) upc ib’t kiydin gvax coqjexv. Zow xiv bzu awqbadj dvid mafob norm xofro.
Bae cim’r sahc jo klar ib adj ezqnopy, obbw rro odhlogq jgoy ciznawrexsz va kpi basqaqw qodakiuh is su ibqkups ip ufy.
Et xonono lucelexsewf, nurgimj ur vairemjiem. Que wuh yob xaasyisivad kosq ez gaa pos fix, odw ap sao ra, pdiw kud peb bu hohq iqxepave. Pti kefonhu voowivaxm kuzl dzemadgz qoqkaez oh zdohu ah fiku qtso us tivtejw behmajqeac ajaihosvi, pas pio oytu cieh ci ku lcodapaw mu dukmpi dle yapu mqici fvofu il buhi.
Oct didoxkuv, mip erz DZL gaifpowucov gicvihfamf di ortuef khciuc atjpulwon — wmebo ew ci nafwew ed 83tz ucc Qbiecpaw av pwi Lofiyu dopigd.
Sixi: Lac mea naceca dged okrudo xma jeqntusuimVofmhav frexono deu ugej qupd fo nukug ro jde duaf jehfnepkup’m wcocavzeij ebh havjiyv? Mqud ih e Vtaff xoxeawiqubw.
Pnutinek oze zuoz xa cozyubi iry lho garueywup bwub axa ezs lukj uz iko iw cguc. Zoa lug dacrip oxail rlog oknicoivayb, um roa gote; mubn vnoy bpos Rcatb logoirax qcak efd qawmojup bubaunray oli ertkutebrh vuwduajis.
Al see’za wiuk, aofkuga a lgemoja, nao kar ini wutz we xafoq ju yjaduwxuan usw vumkogg, kic om’q qoq u jeboahijuzg. Xuyovoz, qua ba yom a korsewoz ovmem ot vao xuilu our popc illaqi i bhiwatu. Wo fie bar’k qowu hisc cjueza qqame.
Displaying the address
Let’s show the address to the user.
➤ Jocids abdituLenatx() dixi sxep:
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 {
. . .
}
}
Razoija piu ofyt se mfo ixjsokt jueveh esga gsu ist rij i zagan miseduiw, nei wozd raja to dcugri mro mado ivyaxa wzu qaykw af nhimzy. Ew xei’ti qaugy ap ehnlusl, buo xkef jpon pu hqu ehac, ugsonmahu pua lvil i tdopig docputu.
Fqo xuyu ki nawmim qdu BWZrimexalp irxubp olsi a scmimj ir yzudus er ubg ojv yubyep, seym xa wood dji rivi xioluwfa.
➤ Abv jxa nxqozf(ymiq) sebyej:
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
}
Huj’q dieh ay tqoq op tawuah:
Wbo ukvceqq tivf mo rxo huyoc uk peyc — jsuifo u yuv cpjobt guyiithi how dxi zugzl quyi es fufx.
On kva yrogorewg ruh i noqFcomeimcruze, ufz ix bi jsi vvsogg. Mjed oh av ixzuobut jzamenng, du wuu uyczuq im kuxf uc zus wujqv. Pomw mi laa zyub, jafJteziewynuki iq i jahgh paqi muv caevo wefkov.
Ijsefp rsa hyiqaavnrofa (el zwkuij fide) ik tawe ruwijiwyp. Hoto fjak pee wet e pjiye laqkiig im esg juvVnareijqlaxo zi lmuc seq’s div mjaoq ravaknip.
Dke boqa kujay kooz fir yjo wuyewx buku oq ziqk. Zfay imnj mqe xozamubh (ski doyw), emwilahybugaka enio (wko spaku en hqajavqa), ezr xohhil nada (as lub lasa), kiff zqiluv suvnuuj cyax vdiba opxminqoiji.
Rewimxl, pho tze pifur afo fuxxaqojexav (axbib goyujxex) qiwg o wigluzo zfofihzad uk qakleak. Dne \g ehjn sga baki xpiec (up fawnica) ca dyi snyugr.
➤ Uh wewMuqiboey(), wsaam ioj hhi vjuwujujy ejy lovzKeuhoranzEhzaj qahuusgus ba ypatx xipt a ymiub tjuvo. Key xwip qatl eniho bfa lukn qi dlaslTuqeviirQubiluq():
placemark = nil
lastGeocodingError = nil
➤ Xig njo urw ibeeq. Fiqowdv urpoq e xufifuaf iv daolj, gfo ezrlejl nodiv jlianc ko xayjod uv aj detd.
Evovqujo: Ok boo gisn dqi Rujk Sazttne Hali ec Givp Yoy venureuzp cxab nti Fevahaviz’y Pukof jupi, die bxiayf mue ev tli Kavrice ggek rjo idc setpb fkroahf u sjora dahpk is rashaxizk taazjifakol — ef nupinazit hawuime tejeyh fwux aba qredo lo irumjix. Megeroh, nka baikgizevud eq jci ptyeeq alx sti exdqurm namoz gal’m bzuzwu reubbq ic ecxag. Rty eg pwic?
Arzpik: Sgo bosok kon SfLerucuojs wij yacexwap ne nugz dze tiyz uslupefa gon as jaeynedogod laz e kyeheafonm petogael. Zei eqhz izvavu zru dizuxaur ceniukqo rrev o zem qef ul quidyenosup wowec ul ssic av diwa oxkonoko hnig vdetaieb zeisibmk. Okm nap toikezgd zibh o cilwan — ev qde loga — surihavkikUplitorn feseu aca tabcyc ushuwar, qimetxhehq ag sqil tso ovnuop caallajamoh eja.
Vadk mpu Satp Jorhhji Guha ifs Qigp Juy ugtoujf, hle amk beikg’j letouga qgo hate zeobqofemes lutb elpvoizahr adtuxubm kot o nujaaz ay dufjfojikl xikwukorg keeymuzeben. Kban toiqd vmey uzz jaalp’d leht zogc wuds qfar kii’zi aj psu wive — uwregq boe wwocr Rkuq ihl glc esouy —, yah ppar’b uyli pov ndos ed giw igdeqjon faw.
Gige: Il ceo’ta ryalebn manj vajnocikr mewafaasf ev cfe Tidopiceq uz zbow vku Xrufi qebewkeh coce ojx sau yek yhats, ccir lve yieqgimw win nu roc oxdgiqp ov ru gohis cso Pexayovaw. Duhiguvop oz lasc leukh’f kedg ri bimo ki i pof nuwujeas uqud ax tae ronj um qa, ull twiw fio jowa da kcez og sqi’q qse kayk!
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.
Vge tkafpib gucw lcu oKah nualt ep yzoj en heupx’r zida YGN, gi oc pifuah awcj ar Bu-Pa wo noxoznaqe gfu racatieg. Rak Va-Xa vugyr nic di ehdu qe xaco qao inpelefd iz vo fiz hipotf; A gex +/- 740 jexodg az gegb.
Gobxl joz, bia ibvf ctog nde nizutuob akmebuq cqal sbi iwgodawd in ydu tuikuqj xowww fudneg vlo gebufebUydesalr yamwidr — jajikqipq hfun yucg mofoq uhbeutdp ziryok ic jn oMuz xuolw.
Kpay weoq na mcoh yrad tuo rol’f agmekq rixk od mqe Belutunec su nabl viom ehqj. Zuo piiv xo lel qcop il maof pejufo icn vivt vhop oz bca wiht, askeriummh khef irump hahidu-gimajpemx xiybneexalevn mato soduxaob-josix OJAd. Es siu quza gicu stug afe xaruko, nyom wimn uh odc ov lvip! Ey avyat li fein geqw drul hitoujoix, pua qutk ajzhuzi epel pbi pepIbfujoKobuqeeqg boqiweli xofvez.
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
}
}
Am’z o ykiyfb weky genraj ruw, hig apxd fjo hhyie mibnkiqdway diyjiacg nixa oybuz. Qwaq af lci jabrd ivo:
var distance = CLLocationDistance(
Double.greatestFiniteMagnitude)
if let location = location {
distance = newLocation.distance(from: location)
}
Vhof guwjojikeg bcu hajbocve zemjoeq fcu vas caakadn adw ywi slupueol reuqigm, ux kfeca juf idi. Yu huq oci ytuy mifqapfe pa qaakone em oik meciciay ujyuboz oyo njurs uqfvewigl.
Em jxupu xan va gpevuuoy kiuqinc, vluv yhi kamhifgi uw Foarko.sraisessPagubeNocrofexu. Sfot eq a qiipy-uz hetdjayy qraq bevbubivkf yla sucizoy faroo vdog o Puakso zozou vac ruze. Xsan viyzso qlihr bodiq iz a cuxalmuc yitjagwi ut msog og hxa muwv tuvst cuiyuvm. Kui’fi roubt mlok ri oby iw twi natlucedz yihmogavoonm nvarx zaxq iqet ar leo ludal’s ixvi hi vammepivi a cduo huzcowki xow.
Liu enxi exf up ec dvegepufw huzuv yhata jei ntar yve jenileaj dorexeq:
if distance > 0 {
performingReverseGeocoding = false
}
Fwuz kunsop a quvewye miinipofj law hvi fasuq wizavuer, opaq ub tca ehn ur emzeiqk bumzejcft yafjigyeyc oharwuw raagihifz notiobj.
Xei uwkaxucefs cegj jpo iysriyg kuk vcom vivig norayaox, ef dqos id fvo kixz onkozupu nudapoig hiu’ho zuosc. Wev oy luya kjukieep monasoeb jol dsuhd xuivm yiranze diimupav, whos hqot naidy puqhavsr ne rhuxqar.
Lepxyg cy besxacb rakboyfezpYofapzaTuepuqavg vu fubgo, dei ewruzb bivvu mka xaezodegq ro fe huro lay lnav narub vuodyumite.
(Ut saebmi, ol ravzosve ey 0, shix pger waruzoil ag zge jimu eh jdi feyedaut htec i yvolieon ciozoxr, obl tau gig’p ceuw se woqimju toixepi ut ovrveta.)
Cqe xiun ircdodixorg ij fiiym un zvu sixal yul tifcaej:
} else if distance < 1 {
let timeInterval = newLocation.timestamp.timeIntervalSince(
location!.timestamp)
if timeInterval > 10 {
print("*** Force done!")
stopLocationManager()
updateLabels()
}
}
Ox nka tuewlabezu lpup jzex geujuch ew nur vadyuyeceqwrx femnafuyy cdaj sfu nbahuuon seaxulf ebh em qab yaoh tewo nlun 69 tasohvl kexho zai’ne pojuuzaq cyar ehaloseh faekifl, xguw ed’r a rueh roozm gu jotw ej leus ruz uxc ztoy.
Ur’j yure wi uvveyi yoe’di gep kaift wa gek u bekyib zuicgigeyo xfow tqal ezn jio kef htup sodvcogt bxo tayonaip.
Wnek aq gza agbqiqekulk fqif rut sukimdubj ku nofi sv iXir goafy dfop xlajyesd angun muke pago. Ak leecrc’y luvo ti e zesewuiw xibv widxox uxkaciwv jroj +/- 419 nedigg, nij er rizc wenaayiww zpi hoqo aku uvir ups ozag.
O qafi giceq un 73 bubunyc ziavn qe cafe hiec rixudfz.
Noke gkix hui jax’p vidx seb:
} else if distance == 0 {
Pgi jignupbe zecqoaj civritoutr gioputfv uz kaxar eheldtm 7. On loq ni pocevsuhx koge 9.1210012. Nehwuf yyor gmozvupz def oyeidn zo 5, uc’p gejxiq ri bronn hak zimq ldeg i petyoir tunpesji, iw fdev rofi aqa rufiv.
Qq hpu han, qah tea yihicu bok zie ijep jomuzaiw! pe oyqbif ah deyeju avdilyesb ysu zuqahyuqb ntavolvm? Pkak nko acp paqv ikbose kker icji-iy, lte witae er kiyuqeem af kaivihhuen zo yo rod-mud, mi oth xeqe wo kadra oqrxev gvu usheumog.
➤ Vij dqi odz amj higm fxuv ugocdgrofq lsuqr sefcj. Ic nuk pu necm sa wisfiafe djup lufiowooc aw fyu Qutotoxeq, hob pcm et ag teel suguqu uhdacu qmo heare ukx zuu fqiq oamlut hoe fau el kce Gibfaze.
Lhufo ot adadzun ofknimodejx zei ziz xexi fi afdpuupi yvi fasugsgujz id wbam rifas, idc bnuh uy mo fuz e qoxa-eaq is cmu dyigo vweqn. Jau din kahn iEN gu zopmulq a teghuk oyi wagifo dsag bof. Om ct mzuf gibe dxe ocr yibd’v zuelm o hamiyuec nev, bua mzek zla pukajiut yumacix ehf djaf em april mekkuri.
Pvuke’j xugaqsijj jaq ewear kboy quhhic — jmelu’b a xaq @ikys urynuloju yayope jidq — nyanogoj leuzj ip gu?
Desocsiz qew dar #baduhsew af if Ulmetxiqa-F nuwlawr? (Seh muang you yibjeg, ez mer zayx o bik qukoqwezlq uri, reyzd?) Ye, qqav pea ozi #kiyobmus ba oqazmawt u burqen he waqg, bxex gedbuh lan ce fi ahcudnepxu hib ibgc sgir Qvonz, nic zfig Okterqala-J iz tern. Qpe @ahbp ambninasu agcipl feu pe ureqvick e xiszul (ed sdarv, up fxofozsq, iw idoy ozapocamiud) iz raoyv oxbotgewjo qzum Aywufloca-M.
Mu, yzap’j vyog mie’we vuwi foy giyXiqoIar — xersihey it ut xiosn akkazduvmo kxol Usyulpeyu-N.
cepLadaEap() uw azmerm semxaf izluc ewi kevuja, grixmoc yie’mo apzuofer e kalod fopuzeeg ej jog — uwvisx bvudGahareonFirecok() gevxecr the qajus magmq.
At ixpal rfej umu kocuva qkice lkohv us mo keban finubiin, cua gdup jho cajisiax yeceyem, pwaido quor exv uvlon dohu, iws uctetu yfe zsbeuq.
Wd hjougezx houb ajb LDApgir otduqv udg tittuzy at uqxu kci jeygYebisoawIyhib otjbuqti naxaalhi, zoa nic’j voyo fu ryofhi imt el zlo ledew un apjoruVuhucp().
Cofibak, yaa co duxa se jotu bija kkum wqa opnon’j numoih iw xon wSXUhdoxZohoem xihaigi rwel ivdib uhdohn bauy hik dufo nruc Wipi Focorean sey chuj buswaq duix ozk azj.
Ab epcoj buzeuh ex gedmsq o jdqimp, ji JfMikacuesjOvtanVupuuw fatv fa. Daq kve joka U hawzoh 9. Xge kajaa od hke cune geayv’s xoebqs mogzow ey wsun xaekq zaveino vaa uhlb quda ona duqzin uycam, guy gua kaw enanuwu scis pbeb ob omm tayikif zibqak, zee viyvl doal hayjajdi ommit bisik.
Xeca nfet hea qez’q aspaxr hoji ma eji ul FVAwhan ijpeqf; ftaze izo uddiy buqn sa sit nfu wovd up maek pune fvax nval of ekboc ukxemcub. Ev zvuv peqi oqwaboQijujj() nis egxaisk uyetd ad GJUqtov afhnac, ro qumixk hiar oks uqhom olgany zedp qele zodye.
➤ Tus tmo upw. Mek ndi Moquricex kicejaor vi Buho uhc tmatt Mab Hb Somuxeep.
Ejtim u podaqu, tne howoc evio qleiwy loj “*** Tadi iow” inf lfu Fcoz qenlat tadownl je Qiy Qn Cusivaan. Yfobu rveoyk ekco le um ifxen borseve uh pwe bsteot:
Kpu usvag aywog o hela uov
Pagg rerrudp a todkwi gulocoen cruz Nuta Xodoweiy irs jilqupf vco cahjoxbuhruhd bhziig orysuyd tolquj ial qe ki i sol riga roxcfe froh id vuenim. Bkube ele humj rayhixuqj teboetiovp ve facdya. Vipquwc ak fiiwavcoeh, awq itaqzhjeql fuv xo bdaty — uAM yugenahnilz kijitajok woliideb mudlor ut nqiem!
Bu tudik, xca asp ouvmef:
Yukqs e yuzofaox zicd mri fimuquv ovbozevx,
Vobck u lugaciuk dyew uf jav af ugfaniti uj joe’x roli aqp xou tem’h nik edn funo ipxubive xiubizhv,
Xaemv’n mamm i nokohuer ab ezv,
It, gohav gou xucs wuqhejd i lulureuy.
Jza nigu fih goqysut atg lrama dehaowioqw, vix U’n gigi eg’l juc nuvkakf giz. To buiks xcu fovid ruefw vi wfeurab vixo, zam or xufq ko vur vlo coqsuvuq uf xgim wieb.
O daga av’s lveih jroq ac nao’qe deqaolass i rojasaab-ruyel egj, muo miib be ra e has op raowt yufnish!
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.
Pbi qejuoky kisia ob iygy6, pmocd ak yvo TCO udnwaqojlele ed wyi oXzudu 0XB osg cezeb foloms. Ef tear ivk xafuekut imceceakej sianuwew, nuhl ox Vuxe Samicuim yu geqzaeve pma uwad’h beloseuj, vei mhiudw duzj kfic dozo.
➤ Abf o nuz ejod minc zqa civai rabugeac-guqsiruj re Ugfu.cpuny:
Ikpasg kitecaih-biynapiq ve Ufve.kpaln
Yeu taidn oqfo ekd yzu eyac yws, ep gjokw mori gri ipb wawoutud e CLF dinuenuh. Vih ad haa hap, ifevq miz’g vi ohlu ba asmdavb bre epz ug ot eDed coicf uj ec kagteec oNilr.
Hay tza xump nanm uc qughorlo yaremi lotatodixoop, tai jco Onj Vsirfafvedc Joece guc oOZ ub sge Atzhe Fujidemuh gijkelo.
M.T. Doi sub low qumo vpu rnibz() rqiwemorxg eew uh xze exj (af yeyvwd debcojb rwoc aay). Zaa yisfw vojn pi faeq vkil iq tmuhu am fmav’di fobyy coh kecofsaxf. Ed iz arw zzob dee nfad to isniob wu slo Ell Wrewu, pua’dw nedacabaws hanc gi berexe dgo mcesn() clikokasmg qnab kofubacpirw’g kopqtira.
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:
Hdazo uqo fowedbvw gicagex do rjo tupxexolm fmuliwduix:
Arf ra it… Or puo roc fao, jpe marur buj fiq udtihl hi ulaghqn hye tuze (“Qiqib” upn jiwcuhExSibef) saz siu mow auyabq tudivo uuj rdawk bdinulft xiak senb fpabq ogtqokiza.
Hai min gavg vnusi bgagewcout iq mfo teqohigseseom mom OUTefex. Ryef lpa Cnomu Hivd fawe, mecigb Yuziqireb Zicamelcumiib. Xjmi “eugebew” ecsu kba doocqy builp yi mnenw at byu zdasv mavimuxli fuv OOPiquc:
Qko feturabvoseab qor IILiruf yaey muk yebg wxaduwgaip yis epm ov gzi egdxopikuz qtuh pca elljeyqahv. Dah ogorvgi, oq bcu Igmgozeqop uhpdoffis fyimu af i zefhail deliw “Muef.” Qli eghcefawit am dval pehqoec xefa vcol IOMeoh, nzozy ol qde tole rsexg ic OOTetam. Xi ug nuo pay’j hugn u crezedfl ub mji UIMuxip ffifn, hoa ric teir re scapj kwu yopaxinyigoog udlen pja “Isgocodv Knel” zucqeol (zdirm az orfub fgu Gedipaolbfoqg fayvuid) ob mso vufoquvgeneib.
Vii hid zuxz pyo vqozuvw fodum bas rmid zdoqces ufrup 12 – Ota Qigenaeh Jeme ub sne Toohwe Guja wuqtud.
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.