• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

Unity+IOS GPS后台更新GPS数据

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0427/473.html

 
Unity自带了游戏开发运营Input.Location的方式去获取GPS数据,但是假如你想后台获取GPS数据是没法完成的。
 
那就只能运用IOS原生代码去完成这个功用了。办法也很简单。
 
1.设置Info.plist
 
<key>NSLocationAlwaysUsageDescription</key>
 
<string>I need Location</string>
 
<key>NSLocationWhenInUseUsageDescription</key>
 
<string></string>
 
 
<key>UIBackgroundModes</key>
 
<array>
 
<string>fetch</string>
 
<string>location</string>
 
</array>
 
 
2.添加CoreLocation库.
 
 
 
3.修正UnityAppController.h文件(蓝色局部内容)
 
#import <QuartzCore/CADisplayLink.h>
 
#import <CoreLocation/CoreLocation.h>
 
#include "PluginBase/RenderPluginDelegate.h"
 
 
 
@class UnityView;
 
@class DisplayConnection;
 
 
 
@interface UnityAppController :NSObject<CLLocationManagerDelegate>
 
 
 
4.修正UnityAppController.mm文件
 
//添加内容
 
//>>>>>>>>>>>>>>>>>>>>>>
 
static UnityAppController *globalSelf;
 
CLLocationManager *locationManager;
 
CLLocation *myOldLocation;
 
extern "C"void StartGPSUpdate(){
 
    locationManager = [[CLLocationManager alloc] init];
 
    locationManager.delegate=globalSelf;
 
    locationManager.desiredAccuracy=kCLLocationAccuracyBest;//定位精度
 
    locationManager.distanceFilter=1;//kCLDistanceFilterNone定时更新  1:每隔一米更新一次
 
    locationManager.pausesLocationUpdatesAutomatically=NO;//设置能否允许系统自动暂停定位,这里要设置为NO,刚开端我没有设置,后台定位持续20分钟左右就中止了!
 
    [locationManager requestWhenInUseAuthorization];
 
    [locationManager startMonitoringSignificantLocationChanges];
 
    if(![CLLocationManager locationServicesEnabled]){
 
        NSLog(@"请开启定位:设置 >隐私 > 位置 >定位效劳");
 
    }
 
    
 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >=8) {
 
        //[_locationManager requestWhenInUseAuthorization];//⓵只在前台开启定位
 
        [locationManager requestAlwaysAuthorization];//⓶在后台也可定位
 
    }
 
    
 
    // 5.iOS9新特性:将允许呈现这种场景:同一app中多个location manager:一些常州手游开发只能在前台定位,另一些可在后台定位(并可随时制止其后台定位)。
 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >=9) {
 
        locationManager.allowsBackgroundLocationUpdates =YES;
 
    }
 
    
 
    [locationManager startUpdatingLocation];
 
    NSLog(@"start gps update");
 
}
 
extern "C"void StopGPSUpdate(){
 
    [locationManager stopUpdatingLocation];
 
    NSLog(@"stop gps update");
 
}
 
 
 
 
 
 
 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
 
{
 
    CLLocation *currentLocation = newLocation;
 
    myOldLocation=currentLocation;
 
    NSString *strResult=@"didUpdateToLoation";
 
    if (currentLocation !=nil) {
 
        NSString *lat = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
 
        NSString *lon=[NSString stringWithFormat:@"%.8f",currentLocation.coordinate.longitude];
 
        NSString *ele=[NSString stringWithFormat:@"%0.8f",currentLocation.altitude];
 
        strResult=[NSString stringWithFormat:@"{\"state\":\"UpdateGPS\",\"latitude\":\"%@\",\"longitude\":\"%@\",\"altitude\":\"%@\" }",lat,lon,ele];
 
        
 
         UnitySendMessage("GPSSDK","IOSGPSUpdate", [strResult UTF8String]);
 
        /*
 
         _longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
 
         _latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
 
         
 
         _verticalAccuracy.text=[NSString stringWithFormat:@"%.8f",currentLocation.altitude];
 
         _horizontalAccuracy.text=[NSString stringWithFormat:@"%.8f",currentLocation.horizontalAccuracy];
 
         _vertical.text=[NSString stringWithFormat:@"%.8f",currentLocation.verticalAccuracy];*/
 
    }
 
    
 
    // Reverse Geocoding
 
    NSLog(@"Resolving the Address:%@",strResult);
 
    
 
}
 
 
 
//<<<<<<<<<<<<<<<<<<<<<<<
 
 
 
- (id)init
 
{
 
if( (self = [super init]) )
 
{
 
// due to clang issues with generating warning for overriding deprecated methods
 
// we will simply assert if deprecated methods are present
 
// NB: methods table is initied at load (before this call), so it is ok to check for override
 
NSAssert(![self respondsToSelector:@selector(createUnityViewImpl)],
 
@"createUnityViewImpl is deprecated and will not be called. Override createUnityView"
 
);
 
NSAssert(![self respondsToSelector:@selector(createViewHierarchyImpl)],
 
@"createViewHierarchyImpl is deprecated and will not be called. Override willStartWithViewController"
 
);
 
NSAssert(![self respondsToSelector:@selector(createViewHierarchy)],
 
@"createViewHierarchy is deprecated and will not be implemented. Use createUI"
 
);
 
}
 
    globalSelf=self;//留意常州游戏开发培训一定要添加该行代码
 
returnself;
 
}
 
 
这样就完成了GPS开启中止以及后台更新GPS了。

上篇:上一篇:Unity3D IOS后台推送
下篇:下一篇:U3D 事情系统