对象关系

对象各自的功能

业务流程

源码分析:

INTULocationRequestDefines.h

//这个文件主要定义库使用的常量,宏和枚举类型//static 定义作用域, 在引入头文件后可用
//命名规则: k + 库的前缀 + 名称  解决duplicate symbols
//定位精确度纬度:距离
static const CLLocationAccuracy kINTUHorizontalAccuracyThresholdCity =
5000.0;  // in metersstatic const CLLocationAccuracy kINTUHorizontalAccuracyThresholdNeighborhood =
1000.0;  // in metersstatic const CLLocationAccuracy kINTUHorizontalAccuracyThresholdBlock =100.0;  // in metersstatic const CLLocationAccuracy kINTUHorizontalAccuracyThresholdHouse =15.0;  // in metersstatic const CLLocationAccuracy kINTUHorizontalAccuracyThresholdRoom =5.0;  // in meters//定位精确度纬度:定位频率
static const NSTimeInterval kINTUUpdateTimeStaleThresholdCity =
600.0;  // in secondsstatic const NSTimeInterval kINTUUpdateTimeStaleThresholdNeighborhood =
300.0;  // in secondsstatic const NSTimeInterval kINTUUpdateTimeStaleThresholdBlock =
60.0;  // in secondsstatic const NSTimeInterval kINTUUpdateTimeStaleThresholdHouse =
15.0;  // in secondsstatic const NSTimeInterval kINTUUpdateTimeStaleThresholdRoom =
5.0;  // in seconds//枚举命名规则: 库前缀 + 枚举名称
//app定位服务状态
typedef NS_ENUM(NSInteger, INTULocationServicesState) {//枚举项命名规则:库前缀 + 枚举名称 + 项名称INTULocationServicesStateAvailable,INTULocationServicesStateNotDetermined,INTULocationServicesStateDenied,
//受限的,不太清楚什么意思INTULocationServicesStateRestricted,INTULocationServicesStateDisabled};
//每一次定位请求的唯一Id ,可以通过它操作某次定位请求,比如停止请求操作
//主要是可以使用INTULocationRequestID来描述它的意义,可读性比NSInteger高很多,
//比如方法返回就可以写成INTULocationRequestID而不是NSInteger
typedef NSInteger INTULocationRequestID;//定位精确度枚举类型
typedef NS_ENUM(NSInteger, INTULocationAccuracy) {INTULocationAccuracyNone = 0,INTULocationAccuracyCity,INTULocationAccuracyNeighborhood,INTULocationAccuracyBlock,INTULocationAccuracyHouse,INTULocationAccuracyRoom,};//每次定位请求完成之后,回调参数,用于描述定位请求的状态,是成功还是失败或者超时等
typedef NS_ENUM(NSInteger, INTULocationStatus) {INTULocationStatusSuccess = 0,INTULocationStatusTimedOut,INTULocationStatusServicesNotDetermined,INTULocationStatusServicesDenied,INTULocationStatusServicesRestricted,INTULocationStatusServicesDisabled,INTULocationStatusError};//定位结果回调
typedef void(^INTULocationRequestBlock)(CLLocation *currentLocation, INTULocationAccuracy achievedAccuracy, INTULocationStatus status);
复制代码

INTULocationManager.m

@interface INTULocationManager () <CLLocationManagerDelegate, INTULocationRequestDelegate>@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) CLLocation *currentLocation;
@property (nonatomic, assign) BOOL isMonitoringSignificantLocationChanges;
@property (nonatomic, assign) BOOL isUpdatingLocation;
@property (nonatomic, assign) BOOL updateFailed;
@property (nonatomic, strong) __INTU_GENERICS(NSArray, INTULocationRequest *) *
locationRequests;@end@implementation INTULocationManagerstatic id _sharedInstance;+ (INTULocationServicesState)locationServicesState{if ([CLLocationManager locationServicesEnabled] == NO) {return INTULocationServicesStateDisabled;}else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {return INTULocationServicesStateNotDetermined;}else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {return INTULocationServicesStateDenied;}else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted) {return INTULocationServicesStateRestricted;}return INTULocationServicesStateAvailable;}+ (instancetype)sharedInstance{static dispatch_once_t _onceToken;dispatch_once(&_onceToken, ^{_sharedInstance = [[self alloc] init];});return _sharedInstance;}- (instancetype)init
{NSAssert(_sharedInstance == nil, @"Only one instance of INTULocationManager should be created. Use +[INTULocationManager sharedInstance] instead.");self = [super init];if (self) {_locationManager = [[CLLocationManager alloc] init];_locationManager.delegate = self;#ifdef __IPHONE_8_4#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_8_4/* iOS 9 requires setting allowsBackgroundLocationUpdates to YES in order to receive background location updates.We only set it to YES if the location background mode is enabled for this app, as the documentation suggests it is afatal programmer error otherwise. */NSArray *backgroundModes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIBackgroundModes"];if ([backgroundModes containsObject:@"location"]) {if ([_locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {[_locationManager setAllowsBackgroundLocationUpdates:YES];}}#endif /* __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_8_4 */#endif /* __IPHONE_8_4 */_locationRequests = @[];}return self;
}- (INTULocationRequestID)requestLocationWithDesiredAccuracy:(INTULocationAccuracy)desiredAccuracytimeout:(NSTimeInterval)timeoutblock:(INTULocationRequestBlock)block{return [self requestLocationWithDesiredAccuracy:desiredAccuracytimeout:timeoutdelayUntilAuthorized:NOblock:block];}- (INTULocationRequestID)requestLocationWithDesiredAccuracy:(INTULocationAccuracy)desiredAccuracytimeout:(NSTimeInterval)timeoutdelayUntilAuthorized:(BOOL)delayUntilAuthorizedblock:(INTULocationRequestBlock)block{if (desiredAccuracy == INTULocationAccuracyNone) {NSAssert(desiredAccuracy != INTULocationAccuracyNone, @"INTULocationAccuracyNone is not a valid desired accuracy.");desiredAccuracy = INTULocationAccuracyCity; // default to the lowest valid desired accuracy}INTULocationRequest *locationRequest = [[INTULocationRequest alloc] initWithType:INTULocationRequestTypeSingle];locationRequest.delegate = self;locationRequest.desiredAccuracy = desiredAccuracy;locationRequest.timeout = timeout;locationRequest.block = block;BOOL deferTimeout = delayUntilAuthorized && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined);if (!deferTimeout) {[locationRequest startTimeoutTimerIfNeeded];}[self addLocationRequest:locationRequest];return locationRequest.requestID;}- (INTULocationRequestID)subscribeToLocationUpdatesWithBlock:(INTULocationRequestBlock)block{return [self subscribeToLocationUpdatesWithDesiredAccuracy:INTULocationAccuracyRoomblock:block];}- (INTULocationRequestID)subscribeToLocationUpdatesWithDesiredAccuracy:(INTULocationAccuracy)desiredAccuracyblock:(INTULocationRequestBlock)block{INTULocationRequest *locationRequest = [[INTULocationRequest alloc] initWithType:INTULocationRequestTypeSubscription];locationRequest.desiredAccuracy = desiredAccuracy;locationRequest.block = block;[self addLocationRequest:locationRequest];return locationRequest.requestID;}- (INTULocationRequestID)subscribeToSignificantLocationChangesWithBlock:(INTULocationRequestBlock)block{INTULocationRequest *locationRequest = [[INTULocationRequest alloc] initWithType:INTULocationRequestTypeSignificantChanges];locationRequest.block = block;[self addLocationRequest:locationRequest];return locationRequest.requestID;}- (void)forceCompleteLocationRequest:(INTULocationRequestID)requestID{for (INTULocationRequest *locationRequest in self.locationRequests) {if (locationRequest.requestID == requestID) {if (locationRequest.isRecurring) {[self cancelLocationRequest:requestID];} else {[locationRequest forceTimeout];[self completeLocationRequest:locationRequest];}break;}}}- (void)cancelLocationRequest:(INTULocationRequestID)requestID{for (INTULocationRequest *locationRequest in self.locationRequests) {if (locationRequest.requestID == requestID) {[locationRequest cancel];INTULMLog(@"Location Request canceled with ID: %ld", (long)locationRequest.requestID);[self removeLocationRequest:locationRequest];break;}}}- (void)addLocationRequest:(INTULocationRequest *)locationRequest{INTULocationServicesState locationServicesState = [INTULocationManagerlocationServicesState];if (locationServicesState == INTULocationServicesStateDisabled ||locationServicesState == INTULocationServicesStateDenied ||locationServicesState == INTULocationServicesStateRestricted) {// No need to add this location request, because location services are //turned off device-wide, or the user has denied this app permissions //to use them[self completeLocationRequest:locationRequest];return;}switch (locationRequest.type) {case INTULocationRequestTypeSingle:case INTULocationRequestTypeSubscription:{INTULocationAccuracy maximumDesiredAccuracy = INTULocationAccuracyNone;for (INTULocationRequest *locationRequest in [self activeLocationRequestsExcludingType:INTULocationRequestTypeSignificantChanges]) {if (locationRequest.desiredAccuracy > maximumDesiredAccuracy) {maximumDesiredAccuracy = locationRequest.desiredAccuracy;}}maximumDesiredAccuracy = MAX(locationRequest.desiredAccuracy, maximumDesiredAccuracy);[self updateWithMaximumDesiredAccuracy:maximumDesiredAccuracy];[self startUpdatingLocationIfNeeded];}break;case INTULocationRequestTypeSignificantChanges:[self startMonitoringSignificantLocationChangesIfNeeded];break;}__INTU_GENERICS(NSMutableArray, INTULocationRequest *) *newLocationRequests = [NSMutableArray arrayWithArray:self.locationRequests];[newLocationRequests addObject:locationRequest];self.locationRequests = newLocationRequests;INTULMLog(@"Location Request added with ID: %ld", (long)locationRequest.requestID);}- (void)removeLocationRequest:(INTULocationRequest *)locationRequest{__INTU_GENERICS(NSMutableArray, INTULocationRequest *) *newLocationRequests = [NSMutableArray arrayWithArray:self.locationRequests];[newLocationRequests removeObject:locationRequest];self.locationRequests = newLocationRequests;switch (locationRequest.type) {case INTULocationRequestTypeSingle:case INTULocationRequestTypeSubscription:{INTULocationAccuracy maximumDesiredAccuracy = INTULocationAccuracyNone;for (INTULocationRequest *locationRequest in [self activeLocationRequestsExcludingType:INTULocationRequestTypeSignificantChanges]) {if (locationRequest.desiredAccuracy > maximumDesiredAccuracy) {maximumDesiredAccuracy = locationRequest.desiredAccuracy;}}[self updateWithMaximumDesiredAccuracy:maximumDesiredAccuracy];[self stopUpdatingLocationIfPossible];}break;case INTULocationRequestTypeSignificantChanges:[self stopMonitoringSignificantLocationChangesIfPossible];break;}}- (CLLocation *)currentLocation
{   if (_currentLocation) {if (_currentLocation.coordinate.latitude == 0.0 && _currentLocation.coordinate.longitude == 0.0) {_currentLocation = nil;}}return _currentLocation;}- (void)requestAuthorizationIfNeeded{#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1// As of iOS 8, apps must explicitly request location services //permissions. INTULocationManager supports both levels, "Always" and //"When In Use".// INTULocationManager determines which level of permissions to request //based on which description key is present in your app's Info.plist// If you provide values for both description keys, the more permissive //"Always" level is requested.if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1 &&[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {BOOL hasAlwaysKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"] != nil;BOOL hasWhenInUseKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"] != nil;if (hasAlwaysKey) {[self.locationManager requestAlwaysAuthorization];} else if (hasWhenInUseKey) {[self.locationManager requestWhenInUseAuthorization];} else {// At least one of the keys NSLocationAlwaysUsageDescription or //NSLocationWhenInUseUsageDescription MUST be present in the //Info.plist file to use location services on iOS 8+.NSAssert(hasAlwaysKey || hasWhenInUseKey, @"To use location services in iOS 8+, your Info.plist must provide a value for either NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription.");}}#endif /* __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1 */}- (void)updateWithMaximumDesiredAccuracy:(INTULocationAccuracy)
maximumDesiredAccuracy{switch (maximumDesiredAccuracy) {case INTULocationAccuracyNone:break;case INTULocationAccuracyCity:if (self.locationManager.desiredAccuracy != kCLLocationAccuracyThreeKilometers) {self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;INTULMLog(@"Changing location services accuracy level to: low (minimum).");}break;case INTULocationAccuracyNeighborhood:if (self.locationManager.desiredAccuracy != kCLLocationAccuracyKilometer) {self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;INTULMLog(@"Changing location services accuracy level to: medium low.");}break;case INTULocationAccuracyBlock:if (self.locationManager.desiredAccuracy != kCLLocationAccuracyHundredMeters) {self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;INTULMLog(@"Changing location services accuracy level to: medium.");}break;case INTULocationAccuracyHouse:if (self.locationManager.desiredAccuracy != kCLLocationAccuracyNearestTenMeters) {self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;INTULMLog(@"Changing location services accuracy level to: medium high.");}break;case INTULocationAccuracyRoom:if (self.locationManager.desiredAccuracy != kCLLocationAccuracyBest) {self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;INTULMLog(@"Changing location services accuracy level to: high (maximum).");}break;default:NSAssert(nil, @"Invalid maximum desired accuracy!");break;}}- (void)startMonitoringSignificantLocationChangesIfNeeded{[self requestAuthorizationIfNeeded];NSArray *locationRequests = [self activeLocationRequestsWithType:INTULocationRequestTypeSignificantChanges];if (locationRequests.count == 0) {[self.locationManager startMonitoringSignificantLocationChanges];if (self.isMonitoringSignificantLocationChanges == NO) {INTULMLog(@"Significant location change monitoring has started.")}self.isMonitoringSignificantLocationChanges = YES;}}- (void)startUpdatingLocationIfNeeded{[self requestAuthorizationIfNeeded];NSArray *locationRequests = [self activeLocationRequestsExcludingType:INTULocationRequestTypeSignificantChanges];if (locationRequests.count == 0) {[self.locationManager startUpdatingLocation];if (self.isUpdatingLocation == NO) {INTULMLog(@"Location services updates have started.");}self.isUpdatingLocation = YES;}}- (void)stopMonitoringSignificantLocationChangesIfPossible{NSArray *locationRequests = [self activeLocationRequestsWithType:INTULocationRequestTypeSignificantChanges];if (locationRequests.count == 0) {[self.locationManager stopMonitoringSignificantLocationChanges];if (self.isMonitoringSignificantLocationChanges) {INTULMLog(@"Significant location change monitoring has stopped.");}self.isMonitoringSignificantLocationChanges = NO;}}- (void)stopUpdatingLocationIfPossible{NSArray *locationRequests = [self activeLocationRequestsExcludingType:INTULocationRequestTypeSignificantChanges];if (locationRequests.count == 0) {[self.locationManager stopUpdatingLocation];if (self.isUpdatingLocation) {INTULMLog(@"Location services updates have stopped.");}self.isUpdatingLocation = NO;}}- (void)processLocationRequests{CLLocation *mostRecentLocation = self.currentLocation;for (INTULocationRequest *locationRequest in self.locationRequests) {if (locationRequest.hasTimedOut) {// Non-recurring request has timed out, complete it[self completeLocationRequest:locationRequest];continue;}if (mostRecentLocation != nil) {if (locationRequest.isRecurring) {// This is a subscription request, which lives indefinitely (//unless manually canceled) and receives every location //update we get[self processRecurringRequest:locationRequest];continue;} else {// This is a regular one-time location requestNSTimeInterval currentLocationTimeSinceUpdate = fabs([mostRecentLocation.timestamp timeIntervalSinceNow]);CLLocationAccuracy currentLocationHorizontalAccuracy = mostRecentLocation.horizontalAccuracy;NSTimeInterval staleThreshold = [locationRequest updateTimeStaleThreshold];CLLocationAccuracy horizontalAccuracyThreshold = [locationRequest horizontalAccuracyThreshold];if (currentLocationTimeSinceUpdate <= staleThreshold &&currentLocationHorizontalAccuracy <= horizontalAccuracyThreshold) {// The request's desired accuracy has been reached, //complete it[self completeLocationRequest:locationRequest];continue;}}}}}- (void)completeAllLocationRequests{__INTU_GENERICS(NSArray, INTULocationRequest *) *locationRequests = [self.locationRequests copy];for (INTULocationRequest *locationRequest in locationRequests) {[self completeLocationRequest:locationRequest];}INTULMLog(@"Finished completing all location requests.");}- (void)completeLocationRequest:(INTULocationRequest *)locationRequest{if (locationRequest == nil) {return;}[locationRequest complete];[self removeLocationRequest:locationRequest];INTULocationStatus status = [self statusForLocationRequest:locationRequest];CLLocation *currentLocation = self.currentLocation;INTULocationAccuracy achievedAccuracy = [self achievedAccuracyForLocation:currentLocation];dispatch_async(dispatch_get_main_queue(), ^{if (locationRequest.block) {locationRequest.block(currentLocation, achievedAccuracy, status);}});INTULMLog(@"Location Request completed with ID: %ld, currentLocation: %@, achievedAccuracy: %lu, status: %lu", (long)locationRequest.requestID, currentLocation, (unsigned long) achievedAccuracy, (unsigned long)status);
}- (void)processRecurringRequest:(INTULocationRequest *)locationRequest{NSAssert(locationRequest.isRecurring, @"This method should only be called for recurring location requests.");INTULocationStatus status = [self statusForLocationRequest:locationRequest];CLLocation *currentLocation = self.currentLocation;INTULocationAccuracy achievedAccuracy = [self achievedAccuracyForLocation:currentLocation];if (locationRequest.block) {locationRequest.block(currentLocation, achievedAccuracy, status);}}- (NSArray *)activeLocationRequestsWithType:(INTULocationRequestType)
locationRequestType{return [self.locationRequests filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(INTULocationRequest *evaluatedObject, NSDictionary*bindings) {return evaluatedObject.type == locationRequestType;}]];}- (NSArray *)activeLocationRequestsExcludingType:(INTULocationRequestType)
locationRequestType{return [self.locationRequests filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(INTULocationRequest *evaluatedObject, NSDictionary*bindings) {return evaluatedObject.type != locationRequestType;}]];}- (INTULocationStatus)statusForLocationRequest:(INTULocationRequest *)
locationRequest{INTULocationServicesState locationServicesState = [INTULocationManager locationServicesState];if (locationServicesState == INTULocationServicesStateDisabled) {return INTULocationStatusServicesDisabled;}else if (locationServicesState == INTULocationServicesStateNotDetermined) {return INTULocationStatusServicesNotDetermined;}else if (locationServicesState == INTULocationServicesStateDenied) {return INTULocationStatusServicesDenied;}else if (locationServicesState == INTULocationServicesStateRestricted) {return INTULocationStatusServicesRestricted;}else if (self.updateFailed) {return INTULocationStatusError;}else if (locationRequest.hasTimedOut) {return INTULocationStatusTimedOut;}return INTULocationStatusSuccess;}- (INTULocationAccuracy)achievedAccuracyForLocation:(CLLocation *)location{if (!location) {return INTULocationAccuracyNone;}NSTimeInterval timeSinceUpdate = fabs([location.timestamp timeIntervalSinceNow]);CLLocationAccuracy horizontalAccuracy = location.horizontalAccuracy;if (horizontalAccuracy <= kINTUHorizontalAccuracyThresholdRoom &&timeSinceUpdate <= kINTUUpdateTimeStaleThresholdRoom) {return INTULocationAccuracyRoom;}else if (horizontalAccuracy <= kINTUHorizontalAccuracyThresholdHouse &&timeSinceUpdate <= kINTUUpdateTimeStaleThresholdHouse) {return INTULocationAccuracyHouse;}else if (horizontalAccuracy <= kINTUHorizontalAccuracyThresholdBlock &&timeSinceUpdate <= kINTUUpdateTimeStaleThresholdBlock) {return INTULocationAccuracyBlock;}else if (horizontalAccuracy <= kINTUHorizontalAccuracyThresholdNeighborhood&&timeSinceUpdate <= kINTUUpdateTimeStaleThresholdNeighborhood) {return INTULocationAccuracyNeighborhood;}else if (horizontalAccuracy <= kINTUHorizontalAccuracyThresholdCity &&timeSinceUpdate <= kINTUUpdateTimeStaleThresholdCity) {return INTULocationAccuracyCity;}else {return INTULocationAccuracyNone;}}#pragma mark INTULocationRequestDelegate method- (void)locationRequestDidTimeout:(INTULocationRequest *)locationRequest{for (INTULocationRequest *activeLocationRequest in self.locationRequests) {if (activeLocationRequest.requestID == locationRequest.requestID) {[self completeLocationRequest:locationRequest];break;}}}#pragma mark CLLocationManagerDelegate methods- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{self.updateFailed = NO;CLLocation *mostRecentLocation = [locations lastObject];self.currentLocation = mostRecentLocation;[self processLocationRequests];}- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{INTULMLog(@"Location services error: %@", [error localizedDescription]);self.updateFailed = YES;for (INTULocationRequest *locationRequest in self.locationRequests) {if (locationRequest.isRecurring) {[self processRecurringRequest:locationRequest];} else {[self completeLocationRequest:locationRequest];}}}- (void)locationManager:(CLLocationManager *)manager
didChangeAuthorizationStatus:(CLAuthorizationStatus)status{if (status == kCLAuthorizationStatusDenied || status == kCLAuthorizationStatusRestricted) {[self completeAllLocationRequests];}//__IPHONE_OS_VERSION_MAX_ALLOWED app能运行的最高系统版本
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) {#elseelse if (status == kCLAuthorizationStatusAuthorized) {#endif /* __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1 */for (INTULocationRequest *locationRequest in self.locationRequests) {[locationRequest startTimeoutTimerIfNeeded];}}}复制代码

转载于:https://juejin.im/post/5b681772f265da0fac1e37e3

iOS定位库-INTULocationRequest相关推荐

  1. ios 静态库冲突的解决办法

    参考:http://www.cnblogs.com/machao/p/5288460.html ios 静态库冲突的解决办法 最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的 ...

  2. IOS定位核心与地图

    本文转载至:http://www.cnblogs.com/xinye/archive/2013/06/13/3134746.html IOS定位核心与地图                 Core L ...

  3. iOS 定位和地图

    iOS中有三个定位服务组件: Wifi定位,通过查询一个Wifi路由器的地理位置的信息.比较省电,iPod touch和iPad也可以采用. 蜂窝基站定位,通过移动运用商基站定位.也适合有3G版本的i ...

  4. fir.im Weekly - 热门 iOS 第三方库大盘点

    本期 fir.im Weekly 收集的热度资源,大部分关于www.gyjqfkyy.comAndroid.iOS 开发工具.源码和脑洞大开的 UI 动画,希望给你带来更多的工作创意与灵感. 盘点国内 ...

  5. 33个2017年必须了解的iOS开源库

    原文 本文翻译自Medium,原作者为 Paweł Białecki 照片版权:(Unsplash/Markus Pe) 你好,iOS 开发者们!我的名字叫 Paweł,我是一个独立 iOS 开发者, ...

  6. iOS标准库中常用数据结构和算法之内存池

    上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...

  7. 编译-C++支持iOS静态库的脚本学习

    这是一个编译C++库,支持iOS静态库的一个脚本.仅供研究学习的. #!/bin/bashPLATFORMPATH="/Applications/Xcode.app/Contents/Dev ...

  8. 高德sdk定位当前位置_单次定位-获取位置-开发指南-iOS 定位SDK | 高德地图API

    iOS定位SDK提供的单次定位方法基于苹果定位核心,苹果定位核心会在设备移动时连续返回定位结果,高德在此基础上封装了单次定位.当设备可以正常联网时,还可以返回该定位点的对应的中国境内位置信息(包括:省 ...

  9. 开源:推荐一个不错的离线IP地址定位库

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://gitee.com/lions ...

最新文章

  1. 使用 git 下载linux 源码
  2. 最具中产气质的“网易考拉”,离“中国版Costco”还有多远?
  3. 基于c++的马氏距离算法代码_监控警戒区基于掩码算法的简单实现(附代码)
  4. java assert语句未执行_Java陷阱之assert关键字
  5. kubeadm安装的Kubernetes etcd备份恢复
  6. 在JSP中应用JavaBean
  7. 【坐在马桶上看算法】算法3:最常用的排序——快速排序
  8. arcpy.ProjectRaster_management
  9. python,opencv利用自适应阈值分割法实现微滴图像分割并计数
  10. NIST计划对量子加密进行众测
  11. 企业开票信息税号查询API接口服务
  12. 500个爆文标题_总结了500篇10W+爆文 好标题都离不开以下几点
  13. 如何免费复制网页内容
  14. 玉米社:短视频运营主要做哪些工作?
  15. word给大括号公式加编号
  16. python123新版个人所得税计算_Python 小案例 计算个人所得税
  17. dgl edges_浏览器趋势2016年10月:Microsoft Edges下降
  18. 常见测试工具总结:LR、Selenium
  19. 大学学计算机专业要自带电脑吗,大学上课要带电脑吗
  20. 操作系统课程设计-二级文件系统,Windows平台版本,c语言

热门文章

  1. GeoHash算法的原理及实现
  2. Java基础----多线程详解
  3. Android自定义快速设置
  4. stats.norm.sf(x) 的功能
  5. 拥抱零售新浪潮——美菱智能酒店无人售货机
  6. python中小球落地问题_Python解决抛小球问题 求小球下落经历的距离之和示例
  7. C++ 标准输入,标准输出,标准错误和标准日志
  8. idea插件安装路径
  9. docker可用容量 查看_查询docker中磁盘使用量大的容器
  10. 华为cce敏捷版体验安装实录