iOS,多媒体,地图相关

1.本地音频播放

2.本地视频播放

3.使用UIImagePickerController摄像头拍照,录像,照片库浏览

4.使用AVFunction,AVCaptureVideoDataOutput实时获得视频流照片,开关闪光灯

5.高德地图使用和定位

6.高德地图,地理编码定位和反地理编码  

本地音频播放

//ViewController.m文件
//导入头文件
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>

import "ViewController.h"
@interface ViewController ()
//AVAudioPlayer要为全局变量才能播放
@property (strong,nonatomic) AVAudioPlayer *audioPlayer;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor whiteColor]];
    [self.navigationItem setTitle:@"音频"];

    //播放音频;注意:如果点击了stop,那么一定要让播放器重新创建,否则会出现一些莫名其面的问题
   [self.getAudioPlayer play]; 
}

/**
 *创建音频播放器
 *return 音频播放器
 */
-(AVAudioPlayer *)getAudioPlayer{
    NSString *path=[[NSBundle mainBundle] pathForResource:@"爱的太迟"ofType:@"mp3"];
    NSURL *url=[NSURL fileURLWithPath:path];
    //创建一个播放器
    _audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    //音量0.0-1.0之间
    _audioPlayer.volume=0.2;
    //循环次数
    _audioPlayer.numberOfLoops=1;
    //播放位置
    _audioPlayer.currentTime=0.0;
    //声道数
    NSUInteger channels=_audioPlayer.numberOfChannels;//只读属性
    //持续时间
    NSTimeInterval duration=_audioPlayer.duration;//获取持续时间
    //分配播放所需的资源,并将其加入内部播放队列
    [_audioPlayer prepareToPlay];
    return _audioPlayer;
}
@end

本地视频播放

//ViewController.m文件
//导入头文件
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
#import "ViewController.h"
 
@interface ViewController ()
//视频播放控制器
@property (strong,nonatomic) MPMoviePlayerController *moviePlayer;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor whiteColor]];
    [self.navigationItem setTitle:@"视频"];
 
    //播放视频
    [self.getMoviePlayer play];   
}

/**
 *创建视频控制器
 *return 视频控制器
 */
-(MPMoviePlayerController *)getMoviePlayer{
    NSString *path=[[NSBundle mainBundle] pathForResource:@"DotA2官方宣传片"ofType:@"mp4"];
    NSURL *url=[NSURL fileURLWithPath:path];
    _moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:url];
    _moviePlayer.view.frame=self.view.frame;
    //自动调整长宽
 _moviePlayer.view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:_moviePlayer.view];
    return _moviePlayer;
} 
@end

 //AVPlayerLayer播放视频

   NSString *path=[[NSBundle mainBundle] pathForResource:@"DotA2官方宣传片" ofType:@"mp4"];
    NSURL *videoURL=[NSURL fileURLWithPath:path];
    AVPlayer *player=[AVPlayer playerWithURL:videoURL];
    
    AVPlayerLayer *layer=[AVPlayerLayer playerLayerWithPlayer:player];
    
    layer.videoGravity=AVLayerVideoGravityResizeAspect;
    
    layer.frame=CGRectMake(-80, 80, 480, 320);
    
    layer.backgroundColor=[[UIColor redColor]CGColor];
    
    [self.view.layer addSublayer:layer];
    [player play];

 使用UIImagePickerController摄像头拍照,录像,照片库浏览

//ViewController.m文件

//导入头文件,(NSString*)kUTTypeMovie等类型才能引用
#import <MobileCoreServices/MobileCoreServices.h>
#import "ViewController.h"

@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
//UIImagePickerController拍照和视频录制
@property (strong,nonatomic) UIImagePickerController *imagePicker;
//类型1是拍照,2是录像
@property (assign,nonatomic)  int pickerType;
@end
 
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor whiteColor]];
    self.navigationItem.title=@"拍照视频";
    
    _pickerType=2;
   [self presentViewController:self.startImagePicker.view animated:YES completion:nil];
}

/**
 *创建UIImagePickerController
 *return UIImagePickerController
 */
-(UIImagePickerController *)startImagePicker{
    if (!_imagePicker) {
        _imagePicker=[[UIImagePickerController alloc] init];
        //设置imagePicker的来源为摄像头
        _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;
        //设置使用后置摄像头
        _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;
        if(_pickerType==1){
            //设置摄像头模式为拍照
         _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;
        }else if (_pickerType==2){
            //视频带有声音模式
            _imagePicker.mediaTypes=@[(NSString*)kUTTypeMovie];
            //设置视频质量
          _imagePicker.videoQuality=UIImagePickerControllerQualityType640x480;
            //设置摄像头模式为录像模式

          _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;
        }

        //允许编辑
        _imagePicker.allowsEditing=YES;
        //设置代理
        _imagePicker.delegate=self;
    }
    return _imagePicker;
}

 

//UIImagePickerControllerDelegate代理,完成时
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    //获得类型是拍照还是录像
    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
    //如果是拍照
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
        UIImage *image;
        //如果允许编辑则获得编辑后的照片,否则获取原始图片
        if (self.imagePicker.allowsEditing) {
            image=[info objectForKey:UIImagePickerControllerEditedImage];
        }else{
            image=[info objectForKey:UIImagePickerControllerOriginalImage];
        }
        @try {
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
        }
        @catch (NSException *exception) {
            UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"完成"message:@"照片保存失败" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
        }
    }else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]){
        NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum([url path])) {
            //视频保存到相簿
            UISaveVideoAtPathToSavedPhotosAlbum([url path], self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
        }
    }
}

//视频保存后的回调
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    if (error) {
        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"完成"message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK"otherButtonTitles:nil];
        [alert show];
    }else{
        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"完成" message:@"视频保存成功." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    }
}
@end
//ViewController.m文件
//照片库浏览
#import "ViewController.h"
 
@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (nonatomic,strong) UIImagePickerController *imagePicker;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor whiteColor]];
    self.navigationItem.title=@"照片浏览";
    [self presentViewController:[self.getImagePickerLibrary view] animated:YES completion:nil];
}

//创建UIImagePickerController
-(UIImagePickerController *)getImagePickerLibrary{
    _imagePicker=[[UIImagePickerController alloc] init];
    //设置模式为浏览图片库
    _imagePicker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
    //设置代理
    _imagePicker.delegate=self;
    return _imagePicker;
}

//实现完成时代理
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    //获取没更改的照片
    UIImage *img=[info objectForKey:UIImagePickerControllerOriginalImage];
//    将图片装换为base64的data,然后转成UTF-8格式,图片质量 0.0 to 1.0.
    NSString *base64Str=[UIImageJPEGRepresentation(img, 0.5) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSString *utf8Str=[NSString stringWithUTF8String:[base64Str UTF8String]];
    //base64转UIImage
    NSData *data=[[NSData alloc] initWithBase64EncodedString:utf8Str options:NSDataBase64DecodingIgnoreUnknownCharacters];
    UIImage *base64Image=[UIImage imageWithData:data];
    UIImageView *imgView=[[UIImageView alloc] initWithFrame:self.view.bounds];
    imgView.image=base64Image;
    [self.view addSubview:imgView];
}
@end
 

使用AVFunction,AVCaptureVideoDataOutput实时获得视频流照片,开关闪光灯

//IdentifyViewController.m文件

//
//  IdentifyViewController.m
//  
//
//  Created by Vie on 15/11/19.
//
//

#import "TKIdentifyViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface TKIdentifyViewController ()<AVCaptureVideoDataOutputSampleBufferDelegate>
@property(nonatomic,strong)AVCaptureSession *captureSession;//负责输入和输出设备之间的数据传递
@property(nonatomic,strong) AVCaptureDeviceInput*captureDeviceInput;//AVCaptureDevice输入流
@property(nonatomic,strong)AVCaptureVideoPreviewLayer*captureVideoPreviewLayer;//相机拍摄预览图层
@property(nonatomic,strong) AVCaptureVideoDataOutput *dataOutPut;
@property(nonatomic,strong) AVCaptureDevice *captureDevice;//输入设备
@end

@implementation TKIdentifyViewController
- (void)viewDidLoad {
    [super viewDidLoad];
}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    //创建会话
    self.captureSession=[[AVCaptureSession alloc] init];
    //设置分辨率
    if ([ self.captureSessioncanSetSessionPreset:AVCaptureSessionPreset1280x720]) {
      self.captureSession.sessionPreset=AVCaptureSessionPreset1280x720;
    }else{
     self.captureSession.sessionPreset=AVCaptureSessionPresetiFrame960x540;
    }
   //获得输入设备
    self.captureDevice=[self getCameraDeviceWithPosition:AVCaptureDevicePositionBack];//取得后置摄像头
    if (!self.captureDevice) {
        NSLog(@"取得后置摄像头时出现问题.");
        return;
    }
    NSError *error=nil;
    //根据输入设备初始化输入对象,用于获得输入数据
    self.captureDeviceInput=[AVCaptureDeviceInputdeviceInputWithDevice:self.captureDevice error:&error];
    if (error) {
        NSLog(@"取得设备输入对象时出错,错误原因:%@",error.localizedDescription);
        return;
    }
    //videoDataOutput对象
    self.dataOutPut=[[AVCaptureVideoDataOutput alloc] init];
    dispatch_queue_t queue=dispatch_queue_create("myQueue", NULL);
    [self.dataOutPut setSampleBufferDelegate:self queue:queue];
    self.dataOutPut.videoSettings=[NSDictionary dictionaryWithObject:[NSNumbernumberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];

    //将输入设备添加到会话中
    if([self.captureSession canAddInput:self.captureDeviceInput]){
        [self.captureSession addInput:self.captureDeviceInput];
    }
    
    //将设备输出添加到会话中
    if ([self.captureSession canAddOutput:self.dataOutPut]) {
         [self.captureSession addOutput:self.dataOutPut];
    }
    
    //创建视频预览层,用于实时展示摄像头状态
    self.captureVideoPreviewLayer=[[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];
    self.captureVideoPreviewLayer.frame=self.view.layer.bounds;
    //填充模式
 self.captureVideoPreviewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;

    //将视频预览层添加到界面中
    [self.view.layer insertSublayer:self.captureVideoPreviewLayer atIndex:0];
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self.captureSession startRunning];
}

 
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{
    UIImage  *img=[self imageFromSampleBuffer:sampleBuffer];
}

//用AVFoundation捕捉视频帧,很多时候需要把某一帧转换成UIImage,用此函数:
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer {
    // 为媒体数据设置一个CMSampleBuffer的Core Video图像缓存对象
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    // 锁定pixel buffer的基地址
    CVPixelBufferLockBaseAddress(imageBuffer, 0);
    // 得到pixel buffer的基地址
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
    // 得到pixel buffer的行字节数
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    // 得到pixel buffer的宽和高
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);

    // 创建一个依赖于设备的RGB颜色空间
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    // 用抽样缓存的数据创建一个位图格式的图形上下文(graphics context)对象
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    // 根据这个位图context中的像素数据创建一个Quartz image对象
    CGImageRef quartzImage = CGBitmapContextCreateImage(context);
    // 解锁pixel buffer
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    // 释放context和颜色空间
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
   
    // 用Quartz image创建一个UIImage对象image
    UIImage *image = [UIImage imageWithCGImage:quartzImage];
    // 释放Quartz image对象
    CGImageRelease(quartzImage);
    return (image);
}

/**
 *  取得指定位置的摄像头
 *
 *  @param position 摄像头位置
 *
 *  @return 摄像头设备
 */
-(AVCaptureDevice *)getCameraDeviceWithPosition:(AVCaptureDevicePosition)position{
    NSArray *cameras= [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *camera in cameras) {
        if ([camera position]==position) {
            return camera;
        }
    }
    return nil;
}

//开关闪光灯
-(void)openOrCloseTorch:(UIButton *)sender{
    //请求独占设备访问性能,后面打开或关闭闪光灯
    [self.captureDevice lockForConfiguration:nil];
    if(self.captureDevice.torchMode==AVCaptureTorchModeOff){
        //开启闪光灯
        [self.captureDevice setTorchMode:AVCaptureTorchModeOn];
    }else{
        //关闭闪光灯
        [self.captureDevice setTorchMode:AVCaptureTorchModeOff];
    }
    //当打开或关闭闪光灯时,放弃设备独占权
    [self.captureDevice unlockForConfiguration];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

高德地图使用和定位

高德定位失败的原因可能是未对iOS8做适配

解决方法是:

1.工程的info.plist添加NSLocationWhenInUseDescription,NSLocationAlwaysUsageDescription字段,不同的字段对应的方法不同

2.在AppDelegate.m中声明个CLLocationManager私有变量,代码如下:

@interface AppDelegate()
{
    UINavigationController *_navController;
    CLLocationManager      *_locationmanager;
}
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [UIApplication sharedApplication].idleTimerDisabled = TRUE;
    _locationmanager = [[CLLocationManager alloc] init];
    [_locationmanager requestAlwaysAuthorization];        //NSLocationAlwaysUsageDescription
    [_locationmanager requestWhenInUseAuthorization];     //NSLocationWhenInUseDescription
    _locationmanager.delegate = self;
}

//ViewController.h文件

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface ViewController : UIViewController<MKMapViewDelegate,CLLocationManagerDelegate>
@end

//ViewController.m文件

//
//  ViewController.m
//  MapDemo
//
//  Created by Vie on 15/7/27.
//  Copyright (c) 2015年 Vie. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (strong,nonatomic) MKMapView *mapView;
@property (strong,nonatomic) CLLocationManager *locationManager;
@end

@implementation ViewController
@synthesize mapView=_mapView,locationManager=_locationManager;
- (void)viewDidLoad {
    [super viewDidLoad];
   self.navigationItem.title=@"Map";
    [self.view setBackgroundColor:[UIColor whiteColor]];
    
    _mapView=[[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    //显示用户当前的坐标,打开地图有相应的提升
    _mapView.showsUserLocation=YES;
    //设置用户跟踪模式为跟踪用户位置和方向变化
    [_mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];
    //地图类型,混合地图(默认标注地图)
    //_mapView.mapType=MKMapTypeHybrid;
    //设置地图的代理
    _mapView.delegate=self;
    
   
    
    //定位管理器
    _locationManager=[[CLLocationManager alloc] init];
    //设置代理
    _locationManager.delegate=self;
    //设置定位精度
    _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    //定位频率,每隔多少米定位一次
    //十米定位一次
    CLLocationDistance distance=10.0;
    _locationManager.distanceFilter=distance;
    //启动跟踪定位
    [_locationManager startUpdatingLocation];
    
    //启动方向定位
    [_locationManager startUpdatingHeading];

    [self.view addSubview:_mapView];
     //调用地理编码定位方法
    [self positioningName:@"北京市"];
    //调用反地理编码定位方法
    CLLocationCoordinate2D theCoordinate;
    //纬度
    theCoordinate.latitude=22.541832;
    //经度
    theCoordinate.longitude=113.945930;
    [self getNameLocation:theCoordinate];
   }

//地理编码定位(根据名称获取地址坐标)
-(void)positioningName:(NSString *)strName{
     CLGeocoder *geocoder=[[CLGeocoder alloc] init];
    //根据“北京市”进行地理编码
    [geocoder geocodeAddressString:strName completionHandler:^(NSArray *placemarks, NSError *error) {
        //获取第一个地标
        CLPlacemark *clPlacemark=[placemarks firstObject];
        CLLocationCoordinate2D coordinate=clPlacemark.location.coordinate;
         NSLog(@"经度:%f,纬度:%f",coordinate.longitude,coordinate.latitude);
//        //定位地标转化为地图的地标
//        MKPlacemark *mkplacemark=[[MKPlacemark alloc]initWithPlacemark:clPlacemark];
//        NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard)};
//        MKMapItem *mapItem=[[MKMapItem alloc]initWithPlacemark:mkplacemark];
//        [mapItem openInMapsWithLaunchOptions:options];
    }];

}
//反地理编码(根据坐标获取地名)
-(void)getNameLocation:(CLLocationCoordinate2D)theCoordinate{
    CLLocation *location=[[CLLocation alloc] initWithLatitude:theCoordinate.latitude longitude:theCoordinate.longitude];
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        CLPlacemark *placemark=[placemarks firstObject];
         NSDictionary *addressDic=placemark.addressDictionary;
        NSLog(@"详细信息:%@",placemark.addressDictionary);
    }];

}

//方向位置改变代理
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
    CGFloat heading=newHeading.magneticHeading;
    NSLog(@"%f",heading);
}

//响应注解按钮轻击事件
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{
    MKPointAnnotation *annotation=view.annotation;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.baidu.com"]];
}

//添加注解后,一点构建视图并将其添加到地图上就会通知该委托
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views{
    for (MKPinAnnotationView *mkaview in views) {
        if ([mkaview.annotation.title isEqualToString:@"深圳思迪"]) {
            //设置图钉颜色,以及是否显示一个按钮
            mkaview.pinColor=MKPinAnnotationColorRed;
            UIButton *button=[UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            mkaview.rightCalloutAccessoryView=button;
            //设置提示左侧图片
            UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
            imgView.image=[UIImage imageNamed:@"15.jpg"];
            mkaview.leftCalloutAccessoryView=imgView;
        }
    }
}

//位置改变代理
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    CLLocation *location=[locations firstObject];//取出第一个位置
    CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标
    NSLog(@"经度:%f,纬度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
    //定义经纬坐标(标注点)
    CLLocationCoordinate2D theCoordinate;
    //纬度
    theCoordinate.latitude=coordinate.latitude;
    //经度
    theCoordinate.longitude=coordinate.longitude;
    
    //定义地图显示的范围,经纬度
    MKCoordinateSpan theSpan;
    //纬度
    theSpan.latitudeDelta=0.1;
    //经度
    theSpan.longitudeDelta=0.1;
    
    //定义一个区域(用定义的经纬度和范围来定义)
    MKCoordinateRegion theRegion;
    theRegion.center=theCoordinate;
    theRegion.span=theSpan;
    
    //在地图上显示
    [_mapView setRegion:theRegion];
    
    //用户位置注解,点击定位的标识展示
    _mapView.userLocation.title=@"Me";
    _mapView.userLocation.subtitle=[NSString stringWithFormat:@"经度:%f,纬度:%f",coordinate.longitude,coordinate.latitude];
    
    //移除原来的注释(大头针)
    [_mapView removeAnnotations:_mapView.annotations];
    //注释对象位于指定的点(大头针)
    MKPointAnnotation *annotaion=[[MKPointAnnotation alloc]init];
    //注释点得位置
    annotaion.coordinate=theCoordinate;
    //注释点得主标题
    annotaion.title=@"深圳思迪";
    //副标题
    annotaion.subtitle=@"致力于金融服务的IT公司";
    //地图上添加注释
    [_mapView addAnnotation:annotaion];
    
    
    //如果不需要实时定位,使用完即使关闭定位服务
//    [_locationManager stopUpdatingLocation];
}
@end

高德地图,地理编码定位和反地理编码  

//地理编码定位(根据名称获取地址坐标)

-(void)positioningName:(NSString *)strName{
     CLGeocoder *geocoder=[[CLGeocoder alloc] init];
    //根据“北京市”进行地理编码
    [geocoder geocodeAddressString:@"北京市" completionHandler:^(NSArray*placemarks, NSError *error) {
        //获取第一个地标
        CLPlacemark *clPlacemark=[placemarks firstObject];

        //定位地标转化为地图的地标
        MKPlacemark *mkplacemark=[[MKPlacemarkalloc]initWithPlacemark:clPlacemark];
        NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard)};
        MKMapItem *mapItem=[[MKMapItem alloc]initWithPlacemark:mkplacemark];
        [mapItem openInMapsWithLaunchOptions:options];

    }];
}

//反地理编码(根据坐标获取地名)

-(void)getNameLocation:(CLLocationCoordinate2D)theCoordinate{
    CLLocation *location=[[CLLocation alloc] initWithLatitude:theCoordinate.latitude longitude:theCoordinate.longitude];
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray*placemarks, NSError *error) {
        CLPlacemark *placemark=[placemarks firstObject];
         NSDictionary *addressDic=placemark.addressDictionary;
        NSLog(@"详细信息:%@",placemark.addressDictionary);
    }];
}

//调用地理编码定位方法

[self positioningName:@"BEIJING"];

//调用反地理编码定位方法

CLLocationCoordinate2D theCoordinate;

//纬度

theCoordinate.latitude=39.54;

//经度

theCoordinate.longitude=116.28;

[self getNameLocation:theCoordinate];
原文地址:https://www.cnblogs.com/douniwanxia/p/5894980.html