在 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")
}

}