资讯专栏INFORMATION COLUMN

iOS 发送位置消息

leanote / 1501人阅读

摘要:发送地理位置在社交应用里面是很常用的需求。如果想看源码可以点击传送门源码在分支作者极光为极光团队账号,欢迎关注原文发送位置消息知乎专栏极光日报

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

首先我们需要获取自己的地理位置,这里用到 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 - 极光( JPush 为极光团队账号,欢迎关注)

原文:iOS 发送位置消息

知乎专栏:极光日报

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16733.html

相关文章

  • 基于Bmob的Android即时通讯应用源码解析

    摘要:今天给大家分享系列干货基于的即时通讯应用源码,以后每周都会更新和最新的应用源码。因为百度地图官网上的目前最新的和我之前用过的很不一样,新版百度地图进行了重构和优化,很多之前熟知的都改掉了。 今天给大家分享系列干货:基于Bmob的Android即时通讯应用源码,以后每周都会更新sdk和最新的应用源码。目前Android版已更新到V1.0.5版本。IOS端已推出V1.0.0版本。(由于有图...

    hiyayiji 评论0 收藏0
  • kafka核心概念讲解

    摘要:具体方式就是给所有发送请求创建请求。一旦有挂掉了,可立即感知并为受影响分区选举新的除了崩溃,还能优雅地退出。二相当于传统消息系统中的一个队列,可以把当成是消息的分类。四消息数据生产者生产者负责消息的发送,生产者需要指定消息的来区分不同消息。 一、borker broker可以理解成一个kafka服务node,是一个运行的kafka服务。broker与broker之间是平等的关系,任意b...

    dailybird 评论0 收藏0
  • RocketMQ高性能之底层存储设计

    摘要:说在前面在底层存储上借鉴了,但是也有它独到的设计,本文主要关注深刻影响着性能的底层文件存储结构,中间会穿插一点点的东西以作为对比。对比文章开头就说到,是借鉴了的想法,同时也打破了在底层存储的设计。 说在前面 RocketMQ在底层存储上借鉴了Kafka,但是也有它独到的设计,本文主要关注深刻影响着RocketMQ性能的底层文件存储结构,中间会穿插一点点Kafka的东西以作为对比。 例子...

    宠来也 评论0 收藏0
  • RabbitMq 最全的性能调优笔记

    摘要:性能调优笔记避免雷区要避免流控机制触发服务端默认配置是当内存使用达到,磁盘空闲空间小于,即启动内存报警,磁盘报警报警后服务端触发流控机制。最佳线程生产者使用多线程发送数据到三到五个线程性能发送最佳,超过它也不能提高生产的发送速率。 RabbitMq 性能调优笔记 [TOC] 避免雷区 要避免流控机制触发 服务端默认配置是当内存使用达到40%,磁盘空闲空间小于50M,即启动内存报警,磁...

    Tony 评论0 收藏0
  • BIO、伪异步 IO、AIO和NIO

    摘要:采用通信模型的服务端通常由一个独立的线程负责监听客户端的连接它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理处理完成之后通过输出流返回应答给客户端线程销毁这就是典型的一请求一应答通信模型该模型最大的问题就是缺乏弹性伸缩能力 BIO 采用 BIO 通信模型的服务端, 通常由一个独立的 Acceptor 线程负责监听客户端的连接, 它接收到客户端连接请求之后为每个客户端创...

    ideaa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<