在 iOS 的某个区域连接 2 个用户
Connect 2 users when they come in certian region in iOS
我正在开发一个应用程序,其中两个用户使用该应用程序并根据用户的当前位置创建区域。
现在我想要实现的是当他们靠近并且他们的区域相互交互时,然后双方都得到通知他们进入了一个区域。
如图所示。图1中黄色是一个用户的区域,
一旦他们的区域像第二张图片中描述的那样相互交互,那么双方都会收到通知。
我怎样才能做到这一点?
使用 iBeacon/CoreLocation/CoreBluetooth 实现此目的的典型方法是使用传输 iBeacon 广告并查找 iBeacon 广告的应用程序:
- 所有应用程序将使用相同的 ProximityUUID 进行传输和接收。
- 应用程序将传输一个唯一的 major/minor 组合来标识应用程序安装。
- 应用程序将监视和范围匹配此 ProximityUUID 的信标。
- 应用程序将传输一个 iBeacon 广告,其唯一 ID 编码为 major/minor。
- 当对信标进行测距时,major/minor 会被读取以识别附近的其他用户。
这种方法的一些局限性:
- iOS只能在前台中转
- 在第一次检测到信标或离开前台后,默认情况下测距限制在后台 10 秒(可扩展到 180 秒)
- 如果一个信标留在附近,第二个信标的出现将不会触发后台唤醒以开始测距
使用 CoreLocation,您可能正在寻找:
didEnterRegion
和
didExitRegion
方法。您可以使用这些来提醒用户任何一个事件。例如如下(我在自己的应用程序中借用和修改的示例):
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var manager = CLLocationManager?()
override func viewDidLoad() {
super.viewDidLoad()
manager = CLLocationManager()
let latitude: CLLocationDegrees = //
let longitude: CLLocationDegrees = //
let center: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
let radius: CLLocationDistance = CLLocationDistance(//)
let identifier: String = "YOUR UNIQUE ID"
let activeRegion = CLCircularRegion(center: center, radius: radius, identifier: identifier)
manager?.distanceFilter = //
manager?.desiredAccuracy = kCLLocationAccuracyBest
activeRegion.notifyOnEntry = true
activeRegion.notifyOnExit = true
manager?.requestAlwaysAuthorization()
manager?.delegate = self
manager?.pausesLocationUpdatesAutomatically = true
manager?.startMonitoringForRegion(activeRegion)
manager?.startUpdatingLocation()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) {
print("These are the regions I'm monitoring: \(manager.monitoredRegions)")
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location:CLLocationCoordinate2D = manager.location!.coordinate
print("These are the locations: \(location.latitude) \(location.longitude)")
}
func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {
NSLog("Entered")
}
func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {
NSLog("Exited")
}
}
我正在开发一个应用程序,其中两个用户使用该应用程序并根据用户的当前位置创建区域。
现在我想要实现的是当他们靠近并且他们的区域相互交互时,然后双方都得到通知他们进入了一个区域。
如图所示。图1中黄色是一个用户的区域,
一旦他们的区域像第二张图片中描述的那样相互交互,那么双方都会收到通知。
我怎样才能做到这一点?
使用 iBeacon/CoreLocation/CoreBluetooth 实现此目的的典型方法是使用传输 iBeacon 广告并查找 iBeacon 广告的应用程序:
- 所有应用程序将使用相同的 ProximityUUID 进行传输和接收。
- 应用程序将传输一个唯一的 major/minor 组合来标识应用程序安装。
- 应用程序将监视和范围匹配此 ProximityUUID 的信标。
- 应用程序将传输一个 iBeacon 广告,其唯一 ID 编码为 major/minor。
- 当对信标进行测距时,major/minor 会被读取以识别附近的其他用户。
这种方法的一些局限性:
- iOS只能在前台中转
- 在第一次检测到信标或离开前台后,默认情况下测距限制在后台 10 秒(可扩展到 180 秒)
- 如果一个信标留在附近,第二个信标的出现将不会触发后台唤醒以开始测距
使用 CoreLocation,您可能正在寻找:
didEnterRegion
和
didExitRegion
方法。您可以使用这些来提醒用户任何一个事件。例如如下(我在自己的应用程序中借用和修改的示例):
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var manager = CLLocationManager?()
override func viewDidLoad() {
super.viewDidLoad()
manager = CLLocationManager()
let latitude: CLLocationDegrees = //
let longitude: CLLocationDegrees = //
let center: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
let radius: CLLocationDistance = CLLocationDistance(//)
let identifier: String = "YOUR UNIQUE ID"
let activeRegion = CLCircularRegion(center: center, radius: radius, identifier: identifier)
manager?.distanceFilter = //
manager?.desiredAccuracy = kCLLocationAccuracyBest
activeRegion.notifyOnEntry = true
activeRegion.notifyOnExit = true
manager?.requestAlwaysAuthorization()
manager?.delegate = self
manager?.pausesLocationUpdatesAutomatically = true
manager?.startMonitoringForRegion(activeRegion)
manager?.startUpdatingLocation()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) {
print("These are the regions I'm monitoring: \(manager.monitoredRegions)")
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location:CLLocationCoordinate2D = manager.location!.coordinate
print("These are the locations: \(location.latitude) \(location.longitude)")
}
func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {
NSLog("Entered")
}
func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {
NSLog("Exited")
}
}