Оповещение об отображении iOS зависит от пользователя страны
В моем приложении мне нужно проверить страну пользователя, а затем отобразить предупреждение на основе этого. В файле AppDelegate у меня есть в didFinishLaunchingWithOptions:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
//Here you set the Distance Filter that you need
self.locationManager.distanceFilter = kCLDistanceFilterNone;
// Here you set the Accuracy
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
[self.locationManager startUpdatingLocation];
Тогда для делегата у меня есть это. Это работает, но предупреждение постоянно появляется снова. Как мне запустить его только один раз?
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
NSLog(@"Running");
CLLocation *newLocation = [locations lastObject];
CLGeocoder *reverseGeocoder = [[CLGeocoder alloc] init];
[reverseGeocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error)
{
CLPlacemark *myPlacemark = [placemarks objectAtIndex:0];
NSString *countryCode = myPlacemark.ISOcountryCode;
NSString *countryName = myPlacemark.country;
NSLog(@"My country code: %@ and countryName: %@", countryCode, countryName);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([countryName isEqualToString:@"Thailand"]) {
[defaults setBool:NO forKey:@"TestMode"];
[defaults synchronize];
}
else {
[defaults setBool:YES forKey:@"TestMode"];
[defaults synchronize];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Test Mode" message:@"Currently, live distribution is limited to the country of Thailand. You may still use the app in 'Test Mode' to store distribution data on your machine. When your country is added, you will have the option to upload it to our server." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
}];
}
2 ответа
Решение
Возьмите значение bool. Это должно быть ложным в первый раз. Затем замените свой код этим.
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
NSLog(@"Running");
CLLocation *newLocation = [locations lastObject];
[manager stopUpdatingLocation];
CLGeocoder *reverseGeocoder = [[CLGeocoder alloc] init];
[reverseGeocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error)
{
CLPlacemark *myPlacemark = [placemarks objectAtIndex:0];
NSString *countryCode = myPlacemark.ISOcountryCode;
NSString *countryName = myPlacemark.country;
NSLog(@"My country code: %@ and countryName: %@", countryCode, countryName);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([countryName isEqualToString:@"Thailand"]) {
[defaults setBool:NO forKey:@"TestMode"];
[defaults synchronize];
}
else {
[defaults setBool:YES forKey:@"TestMode"];
[defaults synchronize];
if(boolvar == false){
boolvar = true
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Test Mode" message:@"Currently, live distribution is limited to the country of Thailand. You may still use the app in 'Test Mode' to store distribution data on your machine. When your country is added, you will have the option to upload it to our server." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
}
}];
}
Вместо того, чтобы использовать...
[self.locationManager startUpdatingLocation];
... который говорит менеджеру местоположения отправлять обновления о местоположениях каждый раз, когда он получает обновление местоположения, почему бы вам не использовать:
[self.locationManager requestLocation];
Который отправит вам только первое местоположение, которое получает менеджер местоположения.