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;
}


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