Swift:用户位置附近的Geofencing / geolocations [英] Swift: Geofencing / geolocations near user location
问题描述
我试图让它始终使用用户的位置,并不断检查以查看是否它距离我设置的 CLLocationCoordinate2D
点有5英里。如果是这样,它会在应用程序处于打开状态时发送提醒,或者在应用程序关闭时发出通知。
有用的信息:
在我的项目中,我有4个swift文件:
Locations.swift 包含 CLLocationCoordinate2D
点。
Utilities.swift 包含一个简单的提醒。 b
UserLocation.swift检索并更新用户的位置
$ b $ GeoLocationViewController.swift监视器地点
注意: 有些代码可能不在正确的位置或相关,我正在寻找另一个项目,试图从它提取相关的代码来使用我的项目。请告诉我你是否犯了错误。
代码: em> Locations.swift:
导入UIKit
导入MapKit
class Locations:UIViewController {
override func viewDidLoad(){
super.viewDidLoad()
var radius:CLLocationDistance = 5
let arroyo = CLLocationCoordinate2D(纬度:33.781327997137595 ,经度:-116.46394436519012)
var arroyoCoord:CLLocationCoordinate2D = arroyo
让buddyrogers = CLLocationCoordinate2D(纬度:33.78051204742721,经度:-116.46362250010833)
var buddyCoord:CLLocationCoordinate2D = buddyrogers
让chopsticks = CLLocationCoordinate2D(纬度:33.815995425565184,经度:-116.44107442645873)
让colorfulfountain = CLLocationCoordinate2D(纬度:33.80443304398751,经度:-116.45723923544313)
让diamond = C地理坐标2D(纬度:33.80216859530781,经度:-116.45711048941041)
让dinahshore = CLLocationCoordinate2D(纬度:33.806554795852996,经度:-116.47734507421876)
让fountoflife = CLLocationCoordinate2D(纬度:33.78075282028137,经度:-116.46407847564086)
让fountains = CLLocationCoordinate2D(纬度:33.780141969313235,经度:-116.46346156756744)
let historicphoto = CLLocationCoordinate2D(纬度:33.78130570353292,经度:-116.46389072100982)
让整体= CLLocationCoordinate2D(纬度:33.781338029257775,经度:-116.46408249895438 )
让hollywoodheroes = CLLocationCoordinate2D(纬度:33.78095792254918,经度:-116.45820483068849)
让indiangathering = CLLocationCoordinate2D(纬度:33.78136366689296,经度:-116.46371905963287)
让indianwomen = CLLocationCoordinate2D(纬度:33.78622660767695,经度:-1 16.45820483068849)
让大教堂= CLLocationCoordinate2D(纬度:33.844502990031124,经度:-116.45834321534426)
让firehouse = CLLocationCoordinate2D(纬度:33.78103817982461,经度:-116.46700744788512)
letunionunion = CLLocationCoordinate2D(纬度:33.778193459376865经度:-116.45877843062743)
让lizards = CLLocationCoordinate2D(纬度:33.78104263855992,经度:-116.46340792338714)
让cactus = CLLocationCoordinate2D(纬度:33.782598723009976,经度:-116.46699671904906)
let swisscheese = CLLocationCoordinate2D (纬度:33.78121541437478,经度:-116.46472086469993)
let newbeginning = CLLocationCoordinate2D(纬度:33.78049421237406,经度:-116.46463101069793)
让thunderbolt = CLLocationCoordinate2D(纬度:33.80140187863324,经度:-116.46646603445436)
让tictoc = CLLocationCoordinate2D(纬度:经度:-116.45524367193605)
让wheeloftime = CLLocationCoordinate2D(纬度:33.815987530910135,经度: CLLocationCoordinate2D(纬度:33.78012700000001,经度:-116.46571840000001)
让colinfisher = CLLocationCoordinate2D(纬度:33.7819228,经度:-116.46002010000001)
让garycreative = CLLocationCoordinate2D(纬度:33.782660,经度:-116.462141)
让lesliejean = CLLocationCoordinate2D(纬度:33.78404799999999,经度:-116.4635222)
让rebeccafine = CLLocationCoordinate2D(纬度:33.782487,经度:-116.460564)
让agnes = CLLocationCoordinate2D(纬度:33.77571242620008,经度:-116.46372063254091 )
let willardprice = CLLocationCoordinate2D(纬度: (纬度:33.77479870632753,经度:-116.46673050629039)
让valsamuelson = CLLocationCoordinate2D CLLocationCoordinate2D(纬度:33.7794358,经度:-116.4612692)
让townsquare = CLLocationCoordinate2D(纬度:33.7810365,经度:-116.46464559999998)
let ocotillo = CLLocationCoordinate2D(纬度:33.805963,经度:-116.46349980000002)
让世纪= CLLocationCoordinate2D(纬度:33.8269913,经度:-116.4424588)
让denniskeat = CLLocationCoordinate2D(纬度:33.8304982,经度:-116.45744730000001)
让纪念馆= CLLocationCoordinate2D(纬度:33.78318512716751,经度:-116.46681405767208 )
让爱国者= CLLocationCoordinate2D(纬度:33.8019902897174,longi tude:-116.44000872473146)
let panorama = CLLocationCoordinate2D(纬度:33.83861734636407,经度:-116.46799619895023)
let secondst = CLLocationCoordinate2D(纬度:33.78069442561766,经度:-116.45910418200071)
let dogpark = CLLocationCoordinate2D(纬度:33.7804269,经度:-116.46041309999998)
}
}
Utilities.swift:
import UIKit
import MapKit
func showSimpleAlertWithTitle(title:String !, message:String,viewController:UIViewController){
let alert = UIAlertController(title:title,message:preferredStyle:.Alert)
let action = UIAlertAction(title:OK,style:.Cancel,handler:nil)
alert.addAction(action)
viewController.presentViewController(alert,animated:true,completion:无)
}
UserLocation.swift:
import UIKit
import CoreLocation
$ b $ class UserLocation:UIViewController,CLLocationManagerDelegate {
var locationManager = CLLocationManager()
重写func viewDidLoad(){
super.viewDidLoad()
$ b $ if(CLLocationManager.locationServicesEnabled()){
locationManager = CLLocationManager()
locationManager。 delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
}
}
GeoLocationViewController.swift:
import UIKit
import CoreLocation
class GeoLocationViewController:UIViewController,CLLocationManagerD elegate {
让locationManager = CLLocationManager()
覆盖func viewDidLoad(){
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
//加载视图后执行其他任何设置。
}
重写func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
//处理任何可以重新创建的资源。
}
func regionWithGeotification(geotification:Locations) - > CLCircularRegion {
// 1
let region = CLCircularRegion(center:geotification.coordinate,radius:geotification.radius,identifier:geotification.identifier)
// 2
region.notifyOnEntry =(geotification.eventType == .OnEntry)
region.notifyOnExit =!region.notifyOnEntry
返回区域
}
func startMonitoringGeotification(geotification:Locations){
// 1
if!CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion){
showSimpleAlertWithTitle(Error,message:Geofencing is not supported on this device!,viewController:self)
返回
}
// 2
如果CLLocationManager.authorizationStatus()!= .AuthorizedAlways {
showSimpleAlertWithTitle(Warning,message:您的地理位置已保存,但只会被激活一旦您授予访问设备位置的权限。,viewContr (区域)
$ b $ 3 b
$ b func stopMonitoringGeotification(geotification:Locations){
为locationManager.monitoredRegions中的区域{
如果让circularRegion = region为? CLCircularRegion {
if circularRegion.identifier == geotification.identifier {
locationManager.stopMonitoringForRegion(circularRegion)
}
}
}
}
func locationManager(manager:CLLocationManager,monitoringDidFailForRegion region:CLRegion ?, withError error:NSError){
print(Monitoring for failed with region:\(region!.identifier))
)
func locationManager(manager:CLLocationManager,didFailWithError error:NSError){
print(Location Manager failed with error:\(error))
}
$ / code>
首先,将
startMonitoringGeotification()
, regionWithGeotification()
和 stopMonitoringGeotification() code>取得 Geotification
,例如Ray Wenderlich tu torial。确保你已经将他的起始代码中的文件 Geotification.swift 添加到你的项目中。另外,请确保你的 Main。故事板启动您的 ViewController
。没有这一步,你的代码都不会运行。
$ b $ 1更简单地在 Locations.swift 中重新定义您的 Locations
类: p>
导入UIKit
导入MapKit
类位置{
static让位置:[字符串:CLLocationCoordinate2D] = [
buddyrogers:CLLocationCoordinate2D(纬度:33.815995425565184,经度:-116.44107442645873),
diamond:CLLocationCoordinate2D(纬度:33.802168595307814,经度:-116.45711048941041),
。
。 //添加您的位置
。
]
}
}
像@ hungry-yeti建议
<2>您可以在 GeotificationViewController $ c中定义 showSimpleAlertWithTitle()
$ c>类。尝试在 ViewDidLoad()
中调用它来测试它。您现在可以删除 Utilities.swift 。
3)我认为您可以忽略/删除 UserLocation.swift ,这似乎是不必要的
4)将此代码放入 GeotificationViewController 的 ViewDidLoad
let radius = CLLocationDistance(8046.72)//以英尺计的5英里
Locations.locations {
let g = Geotification(coordinate:location.1,radius:radius,identifier:location.0,note:test,eventType:EventType.OnEntry)
startMonitoringGeotification( g)
}
5)我希望这有助于并简化您的代码。派对上,如果您有任何问题,请在这里回复。
Problem:
I'm trying to make it so that it uses the user's location all the time and constantly checks to see if it is within 5 miles of the CLLocationCoordinate2D
points I have set. If so, it sends a alert if the app is open or a notification if the app is closed.
Useful Information:
In my project I have 4 swift files:
Locations.swift holds the CLLocationCoordinate2D
points.
Utilities.swift holds a simple alert.
UserLocation.swift retrieves and updates the user's location
GeoLocationViewController.swift monitors the locations
Note:
Some code may not be in the right place or relevant, I was looking at another project trying to extract relevant code from it to use in my project. Please tell me if you do catch a mistake.
Code:
Locations.swift:
import UIKit
import MapKit
class Locations: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var radius: CLLocationDistance = 5
let arroyo = CLLocationCoordinate2D (latitude: 33.781327997137595, longitude: -116.46394436519012)
var arroyoCoord: CLLocationCoordinate2D = arroyo
let buddyrogers = CLLocationCoordinate2D (latitude: 33.78051204742721, longitude: -116.46362250010833)
var buddyCoord: CLLocationCoordinate2D = buddyrogers
let chopsticks = CLLocationCoordinate2D (latitude: 33.815995425565184, longitude: -116.44107442645873)
let colorfulfountain = CLLocationCoordinate2D (latitude: 33.80443304398751, longitude: -116.45723923544313)
let diamond = CLLocationCoordinate2D (latitude: 33.80216859530781, longitude: -116.45711048941041)
let dinahshore = CLLocationCoordinate2D (latitude: 33.806554795852996, longitude: -116.47734507421876)
let fountoflife = CLLocationCoordinate2D (latitude: 33.78075282028137, longitude: -116.46407847564086)
let fountains = CLLocationCoordinate2D (latitude: 33.780141969313235, longitude: -116.46346156756744)
let historicphoto = CLLocationCoordinate2D (latitude: 33.78130570353292, longitude: -116.46389072100982)
let holistic = CLLocationCoordinate2D (latitude: 33.781338029257775, longitude: -116.46408249895438)
let hollywoodheroes = CLLocationCoordinate2D (latitude: 33.78095792254918, longitude: -116.45820483068849)
let indiangathering = CLLocationCoordinate2D (latitude: 33.78136366689296, longitude: -116.46371905963287)
let indianwomen = CLLocationCoordinate2D (latitude: 33.78622660767695, longitude: -116.45820483068849)
let cathedrals = CLLocationCoordinate2D (latitude: 33.844502990031124, longitude: -116.45834321534426)
let firehouse = CLLocationCoordinate2D (latitude: 33.78103817982461, longitude: -116.46700744788512)
let perfectunion = CLLocationCoordinate2D (latitude: 33.778193459376865, longitude: -116.45877843062743)
let lizards = CLLocationCoordinate2D (latitude: 33.78104263855992, longitude: -116.46340792338714)
let cactus = CLLocationCoordinate2D (latitude: 33.782598723009976, longitude: -116.46699671904906)
let swisscheese = CLLocationCoordinate2D (latitude: 33.78121541437478, longitude: -116.46472086469993)
let newbeginning = CLLocationCoordinate2D (latitude: 33.78049421237406, longitude: -116.46463101069793)
let thunderbolt = CLLocationCoordinate2D (latitude: 33.80140187863324, longitude: -116.46646603445436)
let tictoc = CLLocationCoordinate2D (latitude: 33.80156235478469, longitude: -116.45524367193605)
let wheeloftime = CLLocationCoordinate2D (latitude: 33.815987530910135, longitude: -116.45892863433227)
let artevita = CLLocationCoordinate2D (latitude: 33.7826633, longitude: -116.46041969999999)
let coachellaart = CLLocationCoordinate2D (latitude: 33.78012700000001, longitude: -116.46571840000001)
let colinfisher = CLLocationCoordinate2D (latitude: 33.7819228, longitude: -116.46002010000001)
let garycreative = CLLocationCoordinate2D (latitude: 33.782660, longitude: -116.462141)
let lesliejean = CLLocationCoordinate2D (latitude: 33.78404799999999, longitude: -116.4635222)
let rebeccafine = CLLocationCoordinate2D (latitude: 33.782487, longitude: -116.460564)
let agnes = CLLocationCoordinate2D (latitude: 33.77571242620008, longitude: -116.46372063254091)
let willardprice = CLLocationCoordinate2D (latitude: 33.77489419346815, longitude: -116.46667910908434)
let adobe = CLLocationCoordinate2D (latitude: 33.77479870632753, longitude: -116.46673050629039)
let valsamuelson = CLLocationCoordinate2D (latitude: 33.76802162366799, longitude: -116.46920998147584)
let gallito = CLLocationCoordinate2D (latitude: 33.7794358, longitude: -116.4612692)
let townsquare = CLLocationCoordinate2D (latitude: 33.7810365, longitude: -116.46464559999998)
let ocotillo = CLLocationCoordinate2D (latitude: 33.805963, longitude: -116.46349980000002)
let century = CLLocationCoordinate2D (latitude: 33.8269913, longitude: -116.4424588)
let denniskeat = CLLocationCoordinate2D (latitude: 33.8304982, longitude: -116.45744730000001)
let memorial = CLLocationCoordinate2D (latitude: 33.78318512716751, longitude: -116.46681405767208)
let patriot = CLLocationCoordinate2D (latitude: 33.8019902897174, longitude: -116.44000872473146)
let panorama = CLLocationCoordinate2D (latitude: 33.83861734636407, longitude: -116.46799619895023)
let secondst = CLLocationCoordinate2D (latitude: 33.78069442561766, longitude: -116.45910418200071)
let dogpark = CLLocationCoordinate2D (latitude: 33.7804269, longitude: -116.46041309999998)
}
}
Utilities.swift:
import UIKit
import MapKit
func showSimpleAlertWithTitle(title: String!, message: String, viewController: UIViewController) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
alert.addAction(action)
viewController.presentViewController(alert, animated: true, completion: nil)
}
UserLocation.swift:
import UIKit
import CoreLocation
class UserLocation: UIViewController, CLLocationManagerDelegate {
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
if (CLLocationManager.locationServicesEnabled()) {
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
}
}
GeoLocationViewController.swift:
import UIKit
import CoreLocation
class GeoLocationViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func regionWithGeotification(geotification: Locations) -> CLCircularRegion {
// 1
let region = CLCircularRegion(center: geotification.coordinate, radius: geotification.radius, identifier: geotification.identifier)
// 2
region.notifyOnEntry = (geotification.eventType == .OnEntry)
region.notifyOnExit = !region.notifyOnEntry
return region
}
func startMonitoringGeotification(geotification: Locations) {
// 1
if !CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion) {
showSimpleAlertWithTitle("Error", message: "Geofencing is not supported on this device!", viewController: self)
return
}
// 2
if CLLocationManager.authorizationStatus() != .AuthorizedAlways {
showSimpleAlertWithTitle("Warning", message: "Your geotification is saved but will only be activated once you grant permission to access the device location.", viewController: self)
}
// 3
let region = regionWithGeotification(geotification)
// 4
locationManager.startMonitoringForRegion(region)
}
func stopMonitoringGeotification(geotification: Locations) {
for region in locationManager.monitoredRegions {
if let circularRegion = region as? CLCircularRegion {
if circularRegion.identifier == geotification.identifier {
locationManager.stopMonitoringForRegion(circularRegion)
}
}
}
}
func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
print("Monitoring failed for region with identifier: \(region!.identifier)")
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("Location Manager failed with the following error: \(error)")
}
}
解决方案 First and foremost, change back startMonitoringGeotification()
, regionWithGeotification()
, and stopMonitoringGeotification()
to take in a Geotification
like the Ray Wenderlich tutorial. Make sure you have added the file Geotification.swift from his starter code to your project.
Also, make sure your Main.storyboard launches your ViewController
. Without this step, none of your code will run.
1) redefine your Locations
class more simply in Locations.swift:
import UIKit
import MapKit
class Locations {
static let locations:[String:CLLocationCoordinate2D] = [
"buddyrogers" : CLLocationCoordinate2D(latitude: 33.815995425565184, longitude: -116.44107442645873),
"diamond" : CLLocationCoordinate2D(latitude: 33.802168595307814, longitude: -116.45711048941041),
.
. // add your locations
.
]
}
}
like the @hungry-yeti suggested
2) You can define showSimpleAlertWithTitle()
in your GeotificationViewController
class. Try calling it in your ViewDidLoad()
to test it. You can now delete Utilities.swift.
3) I think you can ignore/remove UserLocation.swift, this seems unnecessary
4) Put this code inside GeotificationViewController
's ViewDidLoad
:
let radius = CLLocationDistance(8046.72) // 5 miles in meters
for location in Locations.locations {
let g = Geotification(coordinate: location.1, radius: radius, identifier: location.0, note: "test", eventType: EventType.OnEntry)
startMonitoringGeotification(g)
}
5) I hope this helps and simplifies your code. Party on, reply here if you have any issues.
这篇关于Swift:用户位置附近的Geofencing / geolocations的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!