cocos2dx 接ios定位

第一步:

Build Phases->Link Binary With Libaries-> 导入CoreLocation.framework

第二步:

Info->Custom iOS Target Properties-> 添加 NSLocationAlwaysUsageDescription 。NSLocationWhenInUseUsageDescription

第三步:Location.h文件

#ifndef Location_h
#define Location_h
#import <CoreLocation/CoreLocation.h>    

@interface Location : UIViewController<CLLocationManagerDelegate>
{
    CLLocationManager *_locationManager;    //定位服务管理类
}
@end

#endif

第四步:Location.mm文件

#import <Foundation/Foundation.h>
#import "Location.h"
#include "LocationManager.h"

@implementation Location

-(void)initializeLocationService
{
    // 初始化定位管理器
    _locationManager = [[CLLocationManager alloc] init];
    [_locationManager requestWhenInUseAuthorization];
    [_locationManager requestAlwaysAuthorization];//iOS8必须,这两行必须有一行执行,否则无法获取位置信息,和定位
    // 设置代理
    _locationManager.delegate = self;
    // 设置定位精确度到米
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    // 设置过滤器为无
    _locationManager.distanceFilter = kCLDistanceFilterNone;
    // 开始定位
    [_locationManager startUpdatingLocation];//开始定位之后会不断的执行代理方法更新位置会比较费电所以建议获取完位置即时关闭更新位置服务
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    CLLocation * location = locations.lastObject;
    // 纬度
    CLLocationDegrees latitude = location.coordinate.latitude;
    // 经度
    CLLocationDegrees longitude = location.coordinate.longitude;
    
    // 回调
    LocationManager::getInstance()->OnResult(latitude, longitude);
    
    [manager stopUpdatingLocation];
}

@end

第五步:c++单例

LocationManager.h

#ifndef LocationManager_h
#define LocationManager_h

#include "cocos2d.h"

USING_NS_CC;
using namespace std;

class LocationManager
{
public:
    LocationManager();
    virtual ~LocationManager();
    
    static LocationManager* getInstance();
    
    function<void(double,double)> OnLocationResult;

    void InitLocation();
    
    void OnResult(double latitude, double longitude);
    bool GetCity(std::function<void(double,double)> OnLocationResult);
    
private:
    static LocationManager *sLocationMgr;
};

#endif 

LocationManager.cpp

#include "LocationManager.h"

LocationManager *LocationManager::sLocationMgr = nullptr;

LocationManager::LocationManager() : OnLocationResult(nullptr)
{    
}

LocationManager::~LocationManager()
{
}

LocationManager* LocationManager::getInstance()
{
    if(sLocationMgr == nullptr)
        sLocationMgr = new LocationManager();
    
    return sLocationMgr;
}

void LocationManager::OnResult(double latitude, double longitude)
{
    if (OnLocationResult) OnLocationResult(latitude, longitude);
    OnLocationResult = nullptr;
}

LocationManager.mm

#import <Foundation/Foundation.h>
#include "LocationManager.h"
#include "Location.h"

bool LocationManager::GetCity(std::function<void(double,double)> _OnLocationResult)
{
    OnLocationResult = _OnLocationResult;
    Location *req = [[[Location alloc] initializeLocationService] autorelease];

    return true;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章