zoukankan      html  css  js  c++  java
  • 基于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

  • 相关阅读:
    深入Android 【一】 —— 序及开篇
    Android中ContentProvider和ContentResolver使用入门
    深入Android 【六】 —— 界面构造
    The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config or add the AspNetCompatibilityRequirements attribute to the ser
    Dynamic Business代码片段总结
    对文件的BuildAction以content,resource两种方式的读取
    paraview 3.12.0 windows下编译成功 小记
    百度网盘PanDownload使用Aria2满速下载
    netdata的安装与使用
    用PS给证件照排版教程
  • 原文地址:https://www.cnblogs.com/abelsu/p/4764373.html
Copyright © 2011-2022 走看看