• 基于LBS平台的iOS开发


    LBS,即Location Based Services,基于位置服务,用于定位、导航等功能,比如地图应用、订外卖等的app就需要这个功能。

    在这里我使用的是高德LBS开放平台,地址:http://lbs.amap.com/

    进入网站,首先注册并认证为开发者,然后为你的每个APP申请一个key,其中安全码(Bundle Identifier)通过Xcode切换到General标签,查看Bundle Identifier。

    使用第三方服务,我们可以使用自动配置,这里就要使用到Cocoapods。CocoaPods是一个用来帮助我们管理第三方依赖库的工具。它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我们的工程连接起来,供我们开发使用。使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。

    如果需要升级ruby,使用homebrew安装:brew install ruby

    另外一种方法升级ruby: sudo gem update --system 

    安装Cocoapods教程:

    gem sources -l
    gem sources --remove https://rubygems.org/
    gem sources -a https://ruby.taobao.org/
    gem sources -l
    sudo gem install -n /usr/local/bin cocoapods
    pod setup

    创建Podfile:

    cd /project
    touch Podfile

    或者直接cd到工程目录,然后pod init ,在Podfile里直接添加也行。

    编辑Podfile文件:

    source 'https://github.com/CocoaPods/Specs.git'
    platform:ios,'7.0' #手机系统
    #pod 'AMap3DMap' #3D地图SDK
    pod 'AMap2DMap' #2D地图SDK(2D和3D不能同时使用)
    pod 'AMapSearch' #搜索服务SDK
    
    以下是额外补充
    #platform :ios  
    #pod 'Reachability',  '~> 3.0.0'  
    #pod 'SBJson', '~> 4.0.0'  
    
    #platform :ios, '7.0'  
    #pod 'AFNetworking', '~> 2.0'  

    标准格式:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :ios, '9.0'
    use_frameworks!
    target 'AlamofireDemo' do
    pod 'Alamofire'
    pod 'SwiftyJSON'
    end

    然后到工程目录,输入命令pod  install,如果出现-bash: pod: command not found,输入sudo gem install -n /usr/local/bin cocoapods即可解决。

    如果如果pod update / pod install 卡在:Updating local specs repositories,

    等待即可,或者可以使用 “pod install --verbose --no-repo-update” 进行下载。

    更新:如果你又添加新的三方库,可以在Podfile文件中继续添加,然后再终端输入pod update,然后CocoaPods就会重新帮你导入.

    然后通过打开xcworkspace文件打开安装有cocoapods的工程

    以下是我Controller.m的核心代码,仅供参考:

    #import "ViewController.h"
    #import <MAMapKit/MAMapKit.h>
    #import <AMapSearchKit/AMapSearchAPI.h>
    #define APIKey @"你申请的key"
    
    @interface ViewController ()<MAMapViewDelegate,AMapSearchDelegate>
    {
        MAMapView *_mapView;
        AMapSearchAPI *_search;
        CLLocation *_currentLocation;
        UIButton *_locationButton;
    }
    
    @end
    
    @implementation ViewController
    
    - (void)initControls
    {
        _locationButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _locationButton.frame = CGRectMake(20, CGRectGetHeight(_mapView.bounds)-80,40,40);
        _locationButton.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
        _locationButton.backgroundColor = [UIColor whiteColor];
        _locationButton.layer.cornerRadius = 5;
        [_locationButton addTarget:self action:@selector(locateAction) forControlEvents:UIControlEventTouchUpInside];
        [_locationButton setImage:[UIImage imageNamed:@"location_no"] forState:UIControlStateNormal];
        [_mapView addSubview:_locationButton];
        
    }
    //搜索服务
    - (void)initSearch
    {
        _search = [[AMapSearchAPI alloc]initWithSearchKey:APIKey Delegate:self];
    }
    
    //修改用户定位模式
    - (void)locateAction
    {
        if (_mapView.userTrackingMode != MAUserTrackingModeFollow) {
            [_mapView setUserTrackingMode:MAUserTrackingModeFollow animated:YES];
        }
    }
    //地理编码搜索请求
    - (void)reGeoAction
    {
        if(_currentLocation)
        {
            AMapReGeocodeSearchRequest *request = [[AMapReGeocodeSearchRequest alloc]init];
            request.location = [AMapGeoPoint locationWithLatitude:_currentLocation.coordinate.latitude longitude:_currentLocation.coordinate.longitude];
            [_search AMapGeocodeSearch:request];
        }
    }
    
    - (void)searchRequest:(id)request didFailWithError:(NSError *)error
    {
        NSLog(@"request :%@, error :%@",request,error);
    }
    - (void)onReGeocodeSearchDone:(AMapGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
    {
        NSLog(@"response :%@",response);
        NSString *title = response.regeocode.addressComponent.city;
        if (title.length == 0) {
            title = response.regeocode.addressComponent.province;
        }
        _mapView.userLocation.title = title;
        _mapView.userLocation.subtitle = response.regeocode.formattedAddress;
    }
    
    //用户代理方法
    - (void)mapView:(MAMapView *)mapView didChangeUserTrackingMode:(MAUserTrackingMode)mode animated:(BOOL)animated
    {
        //修改定位按钮状态
        if(mode == MAUserTrackingModeNone)
        {
            [_locationButton setImage:[UIImage imageNamed:@"location_no"] forState:UIControlStateNormal];
        }
        else{
            [_locationButton setImage:[UIImage imageNamed:@"location_yes"] forState:UIControlStateNormal];
        }
    }
    
    //记录当前所在位置
    - (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
    {
        NSLog(@"userLocation: %@",userLocation.location);
        _currentLocation = [userLocation.location copy];
        
    }
    
    - (void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view
    {
        //选中定位annotation的时候进行逆地理编码查询
        if ([view.annotation isKindOfClass:[MAUserLocation class]])
        {
            [self reGeoAction];
        }
    }
    
    
    //初始化地图
    - (void)initMapView
    {
        [MAMapServices sharedServices].apiKey = APIKey;
        _mapView = [[MAMapView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds))];
        //设置地图的代理和两个附件的位置
        _mapView.delegate = self;
        _mapView.compassOrigin = CGPointMake(_mapView.compassOrigin.x, 22);
        _mapView.scaleOrigin = CGPointMake(_mapView.scaleOrigin.x, 22);
        [self.view addSubview:_mapView];
        //打开用户定位
        _mapView.showsUserLocation = YES;
        
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self initMapView];
        [self initSearch];
        [self initControls];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end

    运行结果:

    如果你有更多的API接口想要实现,你可以去高德LBS开放平台去看看开发文档,可以作进一步深入和开发。

    github地址:https://github.com/AbelSu131/HelloAmap

  • 相关阅读:
    润乾报表之图片导出不显示
    润乾报表之前言
    ActionSheet & alertView
    OC基础知识
    状态栏的设置
    计算机的存储单位
    autoreleass的基本使用
    图片选择器(UIImagePickerController)
    Foundation
    Block
  • 原文地址:https://www.cnblogs.com/abelsu/p/4764373.html
Copyright © 2020-2023  润新知