iOS 发送位置消息
iOS 发送位置消息
极光推送 发表于10个月前
iOS 发送位置消息
  • 发表于 10个月前
  • 阅读 17
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

发送地理位置在社交应用里面是很常用的需求。最近也需要在自己的应用里面加入这个功能

首先我们需要获取自己的地理位置,这里用到 CLLocationManager 这个类,调用如下代码

    locationManager = CLLocationManager()
    locationManager.requestAlwaysAuthorization()
    locationManager.delegate = self // 在成功获取位置后,就会把位置回调给 self
    locationManager.distanceFilter = kCLDistanceFilterNone
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.startUpdatingLocation() // 在执行这个方法之后,系统就会不断获取手机所在的位置并且把这个位置回调给应用

我们在回调方法里面获取该这个地理位置

  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    locationManager.stopUpdatingLocation() // 注意这个地方需要关闭定位,不然会不断的回调这个方法
   manager.delegate = nil; // 不加这段代码可能还是会调用几次
    let location = locations[0]  //这个就是我们当前所在的位置   类型为:CLLocation ,里面包含了经度和纬度
  }

如果要达到微信那种预览位置效果的话,我们需要通过位置获取一张截图, 因为我们不可能放一个 mapView 到消息列表上,这样内存肯定受不了。

所以我们使用 MKMapSnapshotter, 这个类可以获取地图上的一小块截图,代码如下

    let mapShoot = MKMapSnapshotter(options: options)
    mapShoot.start { (mapshoot, error) in
      let image = mapshoot!.image  // 这就是我们需要的位置截图
      let finalImageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)

      // 如果想在地图上加入一个大头针,可以直接绘制上去,就像下面一样
      let pin = MKPinAnnotationView()
      let pinImage = pin.image
      UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale)
      image.draw(at: CGPoint(x: 0, y: 0))
      pinImage?.draw(at: CGPoint(x: finalImageRect.size.width/2, y: finalImageRect.size.height/2))
      let finalImage = UIGraphicsGetImageFromCurrentImageContext()
      self.locationDelegate.locationImageCallBack(location: location,image: finalImage)
    }

之后的就只需要处理发送位置和接收位置消息了。 如果想看源码可以点击传送门 源码 在 dev 分支


作者:HuminiOS - 极光

原文:iOS 发送位置消息

知乎专栏:极光日报

标签: iOS 程序员 开源
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 39
博文 66
码字总数 87759
作品 1
×
极光推送
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: