代码之家  ›  专栏  ›  技术社区  ›  user961632

无法从iPhone上的Wifi连接获取位置

  •  1
  • user961632  · 技术社区  · 13 年前

    我正在尝试编写一个应用程序,为一个公共交通应用程序获取用户位置,当我在地面上时,这个应用程序效果很好。当我在地下时,即使我有无线网络和/或手机信号,位置也不会更新。下面是我正在使用的代码。据我所知,iPhone只能通过wifi信号获得位置,这是错误的吗?如有任何帮助,我们将不胜感激,提前感谢!

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        //********************** Add map ******************************************
    
        //setup location manager
        locationManager = [[CLLocationManager alloc] init];
        [locationManager setDelegate:self];
        [locationManager setDistanceFilter:kCLDistanceFilterNone];
        [locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
    
        //setup map view
        mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 160.0f)];
        mapView.showsUserLocation = YES;
        mapView.userTrackingMode = MKUserTrackingModeFollow;
    
        //run loop in background
        loopTimer = [[NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(tick:) userInfo:nil repeats:YES]retain];
    
    }
    
    // Search for n seconds to get the best location during that time
    - (void) tick: (NSTimer *) timer
    {
        // Check for valid coordinate
        CLLocationCoordinate2D coord = mapView.userLocation.location.coordinate;
    if (!coord.latitude && !coord.longitude) return;
    
        //get coordinates to update map
        [mapView setRegion:MKCoordinateRegionMake(coord, MKCoordinateSpanMake(0.005f, 0.005f)) animated:NO];
    
        //update current location in view
        currentLatView.text = [NSString stringWithFormat:@"%.2f", coord.latitude];
        currentLonView.text = [NSString stringWithFormat:@"%.1f", coord.longitude];
    
    }
    
    2 回复  |  直到 13 年前
        1
  •  0
  •   SPA    13 年前

    您在viewDidLoad中设置的位置管理器是CL位置管理器的实例,而当您将showsUserLocation设置为true时,MapKit使用其自己的实例。

    因此,MapKit没有使用您的距离过滤器设置和所需的精度,而且在任何情况下,您还没有使用startUpdatingLocation启动您的位置管理器。

    因此,请尝试启动位置管理器实例,然后使用委托方法

    locationManager:(CLLocationManager*)经理didUpdateToLocation:

    得到你的位置经理说的话。

        2
  •  0
  •   user961632    13 年前

    以下是我的想法,似乎效果良好,需要更多的测试。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        //********************** Add map ******************************************
    
        // Create the manager object
        self.locationManager = [[[CLLocationManager alloc] init] autorelease];
        locationManager.delegate = self;
    
        // This is the most important property to set for the manager. It ultimately determines how the manager will
        // attempt to acquire location and thus, the amount of power that will be consumed.
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    
        // When "tracking" the user, the distance filter can be used to control the frequency with which location measurements
        // are delivered by the manager. If the change in distance is less than the filter, a location will not be delivered.
        locationManager.distanceFilter = kCLLocationAccuracyBest;
    
        // Once configured, the location manager must be "started".
        [locationManager startUpdatingLocation];
    
        //initialize newCoord
        currentCoord = [[CLLocation alloc] initWithLatitude:0 longitude:0];
    
        //setup map view
        mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 160.0f)];
        mapView.showsUserLocation = YES;
        mapView.userTrackingMode = MKUserTrackingModeFollow;
    
        //create map view
        [self.view addSubview:mapView];
    
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        // test that the horizontal accuracy does not indicate an invalid measurement
        if (newLocation.horizontalAccuracy < 0) return;
    
        // test the age of the location measurement to determine if the measurement is cached
        // in most cases you will not want to rely on cached measurements
        NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
        if (locationAge > 5.0) return;
    
        // store all of the measurements, just so we can see what kind of data we might receive
        currentCoord = newLocation;
    
        [self tick];
    }
    
    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        // The location "unknown" error simply means the manager is currently unable to get the location.
        if ([error code] != kCLErrorLocationUnknown) {
            [self stopUpdatingLocation:NSLocalizedString(@"Error", @"Error")];
        }
    }
    
    - (void)stopUpdatingLocation:(NSString *)state
    {
        [locationManager stopUpdatingLocation];
        locationManager.delegate = nil;
    }
    
    - (void) tick
    {
        //do stuff here
    }
    
    推荐文章