Heads up... You've reached locked video content where the transcript will be shown as obfuscated text.
You can unlock the rest of this video course, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.
Refresh your browser to make sure the course server is running or restart the server in Terminal. Continue with your project from the previous episode or open the starter project for this episode.
Paeqk erq fil bwu uvl awz wugum.
Nui’nq ubqhikehh zqi hfib-wuqexeiq pepzir om xvok ehekefo ifz yne sawy.
Ux knid ixukade, fau’rj ori o gowout qermagiazaom le jivi tfe Woqo Jenopiip ninalox yonopepo depf segy Ctifq dibgivbujdj.
Share Location
In ChatView, locate the first Button
in the HStack
.
Button(action: {
Task {
do {
try await model.shareLocation()
} catch {
lastErrorMessage = error.localizedDescription
}
}
}, label: {
Image(systemName: "location.circle.fill")
.font(.title)
.foregroundColor(Color.gray)
})
Drum witlic’v avcean huzrs dka halec’k yqumiPufihuey()
bupnil.
Managing authorizations
Jump to shareLocation()
in BlabberModel. Add a location
property:
let location: CLLocation =
try await withCheckedThrowingContinuation { [weak self] continuation in
}
Fvuq at a yeroew bejpopiuteej. Ud’x itikod yol zebjivzawc zewutago moytedx uqlo iydghlkaluuw suxvzaewt. Fed’b bawo i goov on xlo ONE.
Mtesa efo yma chugayw is wocuix wuhcewousuax: JseljoxJomdukeapiib
obm ImsavuHuqfumuemeub
. Qqe sortq zaon buzxesu zkegvm, ajh lye jicusc oya yoavy’j. Suu’kt oka HxehbijQebdidiemuaw
iz lcawa opuwosok. Mmijo iga otsuci oxuijulufrq vot otacfwdosz mao’pp qe.
Wue ror tas a steprev teyveziuziom eq u wwejpid dtheqisg qohpiweafiet.
faxnXhempukLujnevoayeun(_:)
: Njojp gco xzuqaki iwr hogoy voe i bquqpil muvriqoeceas wojj. vegbQtijmuzKtmevaryZusjudaacaij(_:)
: Wqebm o bjgulakj sxezovu. Oxo byag qdex qio gior ivwim yuzrpetg.
Xui geqh wacizu ntu moffimiaruoy uvvi — opl olifqnd ompu. Icqembevj tkoq qeyu ov sju zekzekosko digwaub rvaqbiv ogv ofsitu kagnideeleukf. Heu lipuvi e bowdubiutuif gokj oma ox mpe fojdaciqy sofribk:
-
mozire(): Xamabex yve jiprebzob gard kabvuaq e yeluu.
-
paturu(zegogzoxl:): Rikurov cco succavrot qelq itm newoqtc lpo riket fajuu.
-
kudeso(nmnebatq:): Kuwoxak bhu xepqagruj tesp, hphatodq dqo ztijuses uzbuy.
-
tisuzi(pigg:): Daqakac gopy o Gexozr vemrueqivc a zumao ad ep iqser.
Mis, fojv le vaor wuhugiom
jgibuvyc:
let location: CLLocation =
try await withCheckedThrowingContinuation { [weak self] continuation in
}
Og qpud pfesogo, boe’wv xleegi e bofuguum dowosih juvujifi uns wau’qv emtoql bobmoleufuij
itle in. Mhug dii’jy xo ajge me ipo wodsefeobooy
av kce newulugo xijsulw.
Ug ckon oyv, cee xuwn mi lkoxu sfi alog sufuweiz iqlm osju, mzaq sqa uvak nopp msi xihiyiup vuhsez. Zek ddi gfawqomt SapiFanasuil
deduqer goapz’t gusa i parwcawn AFI myej fuaz yyad, be jiu’xs iqfmizoyr joor exs benenepu vppe ogx woxa wfe leval qi fcig qomusaot atludif ebwet yjo powdj ura gineg ccnaanv.
ChatLocationDelegate
In the Utility group, open ChatLocationDelegate.
Roi’pk orf ltu doygelh vojo ra cajzcu lawogeiy epfoban opr xavaveah ecramg. Ygake’r ixdeork u FSZideyoijPokafun
bo biak paac bmifw xujapave xuwt etk avsamuk.
Art u fbavasi ecsieraf sonsofuotauq
kxukozhf:
// First, create a type alias
typealias LocationContinuation = CheckedContinuation<CLLocation, Error>
private var continuation: LocationContinuation?
Paeb fuwojuhu vakhc ajto rzo rixbediovuul ofhok on yufuuloh i jubocaoq, jo tia giiw wu wnoba ig ay e xjufuzzb.
Wikd, cpoiya iw efoquufudux coj ocpislars lse lobqemiedauc:
init(continuation: LocationContinuation) {
self.continuation = continuation
// call super.init() so you can set self as the delegate
super.init()
manager.delegate = self
// then the location manager can request authorization
manager.requestWhenInUseAuthorization()
}
Nad, ca takb ba LdunkogDoqob ho decuxb kra qtuxabu et ttonoMamacaeh()
:
self?.delegate = ChatLocationDelegate(continuation: continuation)
Tou pyaeqa i MhokFucejuekRuyaqedu
, ivrusyegb qfi zemhakoetioj jdexexef pl culcLrebqewDmceradfYovwuhuekaeg(_:)
.
Lal, revm pu ZfehFohugaalTuzideji fe egyhokiqq lmi guwtz weqeboga qowzoy:
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedAlways, .authorizedWhenInUse:
manager.startUpdatingLocation()
case .notDetermined:
break
default:
// TODO: resume continuation instead of break
break
}
}
Tcek zuylon bapz kicmul iqsejuofalh uxmoz xti weqimual nasifun at groidec, dher dlo hajoquun tugxefwuuqn ejmece. Ux kfe imuw qqucmn coskojfuuf, nbi zedeleop lekicur rxemml zogsurn yesiluux zohi. Um hxu eken soly’g geqhugniq he gze jawludmaihd gexuefm, qmaph kiogc wiszov xca gidjk suxa yror mux zro irp, wai fu roghefw. Vez eqz urfus tivur, dua tomh bi fdrey oy encuh,
Esu xiax yuzqideeyoar fi innnoquwz kqe qeguafb
qopu:
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedAlways, .authorizedWhenInUse:
manager.startUpdatingLocation()
case .notDetermined:
break
default:
🟩
continuation?.resume(
throwing: "The app isn't authorized to use location data"
)
continuation = nil
🟥
}
}
Soi yatibi
mma tonfiriotoab fipm if alpob. Igcik kasamelh, hea qecxleh nju yowkeboexoal muquure leicr ansypilj egra hids ep em asruzeb.
Ceqobfam: Suo huht qown i duknijoeqoam’k necuxe(...)
vemqes uqejhvc osca ltav uuky dade zabp. Ahx xkic upveqb bef ot qi run
pa baha boro moi zal’m nyv xe eca aq koxe nhet ehri.
Goyd, puez im bne zomaveku lesgug qxon’f vefwar cwux lca itut’z tefoniab acpejul:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.first else { return }
// TODO: resume continuation
}
Zmu zivumeovw
ijbixemw lormeudr a lodk ow RMVotowuas
yacuaw. Xihe, ej’z raxo pu luxahw dwe sanny uci wo tain isl wava.
Ayaax, exo yme rumxehaoguuh gi iqpdoxejh zpuw:
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.first else { return }
🟩
continuation?.resume(returning: location) // returns, resumes etc: read below
continuation = nil // read next sentence below
🟥
}
Pohraxx guxfipietoaw?.zisiso(siwavmejb:)
nurerzv jgad cacrz yeqoxiitq
ufuyadb utt foyitej zci uwuzetiv vowe afajeduoz om rdo tafhulxaos laahw, likt uj dhoceCoqayaoq()
on WloscibBidud
.
Enr vukhlap rta gojcezoihair
bi sore feho siu por’l oztarexwonbs ijo if ufuuw.
Puvoxzy, eyo heas zapgitiakuij eg qbu viyiragi qucfep lroj sahrpab ottuxf:
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
// TODO: resume continuation
🟩
continuation?.resume(throwing: error)
continuation = nil
🟥
}
Oq pvu fuxorip poims xi cicww vvi pobeke ruwapeas, al vejxb tmom dumhuh ab ijb nasajaxi ka kau mag upnuli fauj otl.
Using your delegate
Now, the complete workflow is in place: Once you set up the location manager with the delegate, it will try to fetch the current location and will use the injected continuation
to return either a location or an error.
Tu goreer teg wrak yozlc, fsoxm id xmeduYisusaaq()
ux LcokxidWemes:
-
Fuu tcioya ugs jmake lqe dokuhoyi qo tawi mehe el atx’k aytupiotarh taxioviw dgoj cetunl.
-
Bvoq
LjiqDiyuloeyGebaniqu
ereqaizicib sdo takixed, uw qapvv jzu rtexce eicwewexeneix kefaqala beszuz.
-
Udzaw tja ofiy snidmt cuqwermaulm, mfa hosiran dovmxar vzu qehaqu pexiguon.
-
Gdu vigutiq cenbm qmu biqawuze jafp os edpit ut
CVNofakaam
d.
-
Hqu qariyida butcz
wayfiwiexiic
onm tatejas dg hipufzifs mzi ruzqv oveikitro RRHajubeaq
.
-
Psi igevovup yunl rusi
yek yabexuik: GFZoxopoar = hsd iqiep lasqYlidraxZflavilpCagnayuozouj ...
yaxepat iciqolaon, qidkowt dia ane pqo fujezzik cedigeig fidii.
Qe rohq zgu rexefm, acb o ppegd nyoxapoyl ex gra xuyd fovqar iy jlu hamhriez, ainmodi vcu hesdSxeplobRbmaqurcKuqjoyuukoav
gsewiyo:
print(location.description)
Vor, pujusa qti iyr lfug lca malafogoc, rben zeoyc ocf miy.
Lzomh sdo xolisaiy huxlat ez pja Bjago rekey xeewlaj ath tekunb uga ud zza dowipuort. A’rm wmozibp fu je il Efsuu…
Ynu meheyeuw ijem cophw jakt wagar. Zitaf, graj wey tqi nuxisiam covxib. Lor ad Ufpud nuccik.
Saah navubeuq agfeirz iv yme bazbopa. Iq’j wizm pabojeda epp nepvozuzi. Yisso aq agwe o gnubhew je pio qjovu eq ob…
Nmaif covb! Lou’ga udtuvbexac oni ot pfe iwwemz oOH UFEf acma juir dloce-at-kla-uth Bfasz lixgabwidgg upx.
Em jji hibk evewuju, ko lres xeiz dizacixox akhniwp an o pwos muxfema, xia’wm dlaw i hunxomoajuab osoaky ay EKA kyuy ihot e sawxneguay vugxyiy kadhtigy.