我正在尝试获取iOS应用程序中的用户位置。我首先在我的项目中包括了corelocation框架。然后点击一个按钮,我调用核心位置api,如下所示。当我试图将其安装到设备中时,核心位置从不请求用户权限。当我尝试在单击按钮时获取位置时,我得到的KClauthorizationStatusNotDetected为AuthorizationStatus。请帮我做这件事。我不知道发生了什么事。
- (IBAction)fetchLessAccurateLocation:(id)sender {
[self.txtLocation setText:@""];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
locationManager.distanceFilter = 1000;
if ([self shouldFetchUserLocation]) {
[locationManager startUpdatingLocation];
}
}
这是我的shouldFetchUserLocation方法:
-(BOOL)shouldFetchUserLocation{
BOOL shouldFetchLocation= NO;
if ([CLLocationManager locationServicesEnabled]) {
switch ([CLLocationManager authorizationStatus]) {
case kCLAuthorizationStatusAuthorized:
shouldFetchLocation= YES;
break;
case kCLAuthorizationStatusDenied:
{
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"App level settings has been denied" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
alert= nil;
}
break;
case kCLAuthorizationStatusNotDetermined:
{
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The user is yet to provide the permission" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
alert= nil;
}
break;
case kCLAuthorizationStatusRestricted:
{
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The app is recstricted from using location services." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
alert= nil;
}
break;
default:
break;
}
}
else{
UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The location services seems to be disabled from the settings." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
alert= nil;
}
return shouldFetchLocation;
}
以下是我的核心位置委托方法:
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0){
NSLog(@"location fetched in delegate");
CLLocation* location = [locations lastObject];
NSDate* eventDate = location.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 15.0) {
// If the event is recent, do something with it.
NSLog(@"inside loop.... latitude %+.6f, longitude %+.6f\n",
location.coordinate.latitude,
location.coordinate.longitude);
}
NSLog(@"latitude %+.6f, longitude %+.6f\n",
location.coordinate.latitude,
location.coordinate.longitude);
[self.txtLocation setText:[NSString stringWithFormat:@"\nlatitude: %+.6f \nlongitude: %+.6f", location.coordinate.latitude, location.coordinate.longitude]];
[locationManager stopUpdatingLocation];
[locationManager stopMonitoringSignificantLocationChanges];
if(locationManager!=nil){
locationManager.delegate= nil;
locationManager= nil;
}
}
目标C遵循以下说明:
iOS-11 For iOS 11看看这个答案:iOS 11位置访问
需要将两个密钥添加到plist中,并提供如下图的消息:
1. NSLocationAlwaysAndWhenInUseUsageDescription
2. NSLocationWhenInUseUsageDescription
NSLocationWhenInUseUsageDescription
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
[locationManager requestWhenInUseAuthorization];
}else{
[locationManager startUpdatingLocation];
}
Delegat方法
#pragma mark - Lolcation Update
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"didFailWithError: %@", error);
UIAlertView *errorAlert = [[UIAlertView alloc]
initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
case kCLAuthorizationStatusRestricted:
case kCLAuthorizationStatusDenied:
{
// do some error handling
}
break;
default:{
[locationManager startUpdatingLocation];
}
break;
}
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations lastObject];
userLatitude = [NSString stringWithFormat:@"%f", location.coordinate.latitude] ;
userLongitude = [NSString stringWithFormat:@"%f",location.coordinate.longitude];
[locationManager stopUpdatingLocation];
}
快速代码
按照以下说明操作:
iOS-11 For iOS 11看看这个答案:iOS 11位置访问
需要将两个密钥添加到plist中,并提供如下图的消息:
1. NSLocationAlwaysAndWhenInUseUsageDescription
2. NSLocationWhenInUseUsageDescription
import CoreLocation
class ViewController: UIViewController ,CLLocationManagerDelegate {
var locationManager = CLLocationManager()
//MARK- Update Location
func updateMyLocation(){
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)){
locationManager.requestWhenInUseAuthorization()
}
else{
locationManager.startUpdatingLocation()
}
}
委托方法
//MARK: Location Update
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
NSLog("Error to update location :%@",error)
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status {
case .NotDetermined: break
case .Restricted: break
case .Denied:
NSLog("do some error handling")
break
default:
locationManager.startUpdatingLocation()
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations.last! as CLLocation
var latitude = location.coordinate.latitude
var longitude = location.coordinate.longitude
}
我也面临同样的问题,在重新安装我的应用程序后,每当检查[CLLocationManager authorizationStatus]
时,它都会返回kCLAuthorizationStatusNotDetermined
,而该应用程序甚至没有显示在设置中
iOS提示用户批准对位置服务的访问的授权对话框在[locationManager startUpdatingLocation]
上触发,在您的情况下,该对话框从不调用(shouldFetchUserLocation
将始终为否
)。
米格尔的解决方案似乎是一个很好的解决方案,我会尝试的。
当iOS8出现时,它对CLLocationManager的使用方式几乎没有改变。正如在其他答案中多次提到的,与iOS7相比,它需要额外的步骤。今天,我自己面对这个问题,发现了这篇文章(从其他多个问题中引用了这篇文章,但它完成了我先前的回答)。希望有帮助!
假设[CLLocationManager locationServicesEnabled]
返回YES,
随着iOS应用程序[iOS7和iOS8]的首次启动,LocationManager(CLLocationManager)授权状态预设为
authorizationStatus(CLAuthorizationStatus) = kCLAuthorizationStatusNotDetermined
启动LocationManager(CLLocationManager,Strong)并设置代理(CLLocationManager,LEGATE)
现在提示用户使用位置服务,并在设置下列出应用程序
位置更新-[self.locationManager startUpdatingLocation]
地区监控-[self.locationManager启动地区监控:beaconRegion]
在执行上述方法后,iOS将提示用户请求接受应用程序中的位置服务,并且无论用户选择什么,应用程序都将列在设置下
它与iOS8的情况相同,首次推出应用程序位置服务
authorizationStatus(CLAuthorizationStatus) = kCLAuthorizationStatusNotDetermined
iOS 8我们有了向用户显示提示的新方法
[self.locationManager requestAlwaysAuthorization]
or
[self.locationManager requestWhenInUseAuthorization]
requestAlwaysAuthorization/RequestWhenUseAuthorization可从iOS8获得。如果应用程序部署目标是iOS7,则将其包装在if块下,以确保在iOS7中不会导致应用程序崩溃。
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[self.locationManager requestAlwaysAuthorization]; .
}
或
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[self.locationManager requestWhenInUseAuthorization];
}
根据iOS8,必须在信息中包含说明应用程序为何使用requestAlwaysAuthorization/RequestWhenUseAuthorization的字符串。plist包括应用程序要求的所有这些财产
对于KCLAuthorizationStatusAuthorizationDalWays,包括键/值(字符串值)对
NSLocationAlwaysUsageDescription = App use Locations service mode Always
对于kCLAuthorizationStatusAuthorizedWhenInUse,使用包含键/值(字符串值)对
NSLocationWhenInUseUsageDescription = App use Locations service mode In Use
问题内容: 我不是在寻找java-web- start,而是在寻找胖客户端应用程序安装工具包。我有一个独立的应用程序,其中包含几个文件(jar文件,数据文件等),并且需要执行一些非常标准的安装任务,例如向用户询问目标目录,让他们找到系统的某些部分- 选择一些按计算机或按用户配置的选项,并可能尝试检测它们的某些计算机设置。 我正在寻找类似于MSI或其他向导驱动的安装应用程序的东西。什么是Java的良
我在设置的应用程序部分看到应用程序,上面写着。它完全是灰色的,我无法卸载它。当我从play store安装相同的版本时,它说不兼容的版本已经安装了。 我只想从我的设备上移除这个应用程序。 也不会从adb卸载 C:\users\athakur>adb卸载com.osfg.rintonesetter.main失败[DELETE_FAILED_INTERNAL_ERROR] 而且 C:\users\at
我正在尝试使用Android Studio3.6.3和我的手机制作一个应用程序来测试它。我遇到了一个问题,我认为卸载这个应用程序是个好主意,但现在,Android studio不知道我的手机上不存在这个应用程序,它试图运行文件。错误是: 05/27 21:03:30:在小米红米Note 7上启动“MainActivity”。 启动活动时出错 我怎样才能欺骗它重新安装正确的应用程序?
我正在尝试使用AppUpdateManager在应用程序更新API中实现Android。我首先尝试遵循文档,如果您在这里,那么您知道这是行不通的。 所以我读了十几篇教程和博客文章,介绍了如何实现这个功能。我大概90%在那。对我来说,在用户接受更新后,更新被下载,我的侦听器检测到下载完成,并且我显示自己的消息并回调(大多数教程在这一点上使用了一个Toast(吐司),但这不重要)。如果我的用户点击“r
我正在开发一个应用程序,它也可以从另一个应用程序启动。姑且称之为“被叫app”和“主叫app”。我正在使用protection level“signature”向“被调用的应用程序”的启动器活动添加权限。但是,当我添加此权限时,我无法从应用程序图标启动“被调用的应用程序”。上面写着“App未安装”。我还尝试使用“危险”保护级别。它给出了同样的错误。 我想这个问题可能是因为我给启动器活动提供了一个自
我正在开发一个企业应用程序。当我在iOS8测试版中测试它时,我看到了以下警报视图: 它只是第一次出现。我能设法避免吗?它与什么有关?