Приложение "Настройки" из другого приложения программно в iPhone

Я должен открыть приложение настроек из своего приложения, если GPS не включен в iPhone. Я использовал следующий код. Он хорошо работает в симуляторе iOS, но не работает в iPhone. Могу ли я знать, есть ли проблема в этом коде?

if (![CLLocationManager locationServicesEnabled]) {
        int (*openApp)(CFStringRef, Boolean);
        void *hndl = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices");
        openApp = (int(*)(CFStringRef, Boolean)) dlsym(hndl, "SBSLaunchApplicationWithIdentifier");
        openApp(CFSTR("com.apple.Preferences"), FALSE);
        dlclose(hndl);
    }

6 ответов

Решение

Хорошие новости:

Вы можете открывать приложения настроек программным способом, как это (работает только с iOS8 и далее).

Если вы используете Swift 3.0:

UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)

Если вы используете Objective-C:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

Для других более низких версий (менее iOS8) невозможно программно открыть приложение настроек.

Как ответили другие, вы не можете открыть Настройки из своего приложения.

Однако Вы можете решить ситуацию, как я сделал:

Выведите сообщение о том, что службы Location должны быть включены, объясняя причину, и покажите путь в этом сообщении:

"Настройки->Privacy->LocationServices"

Открытие настроек приложения программно возможно только с iOS 8. Итак, используйте следующий код...

if([CLLocationManager locationServicesEnabled]&&
   [CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied)
{
  //...Location service is enabled
}
else
{
    if([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)
    {
       UIAlertView* curr1=[[UIAlertView alloc] initWithTitle:@"This app does not have access to Location service" message:@"You can enable access in Settings->Privacy->Location->Location Services" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
      [curr1 show];
    }
    else
    {
       UIAlertView* curr2=[[UIAlertView alloc] initWithTitle:@"This app does not have access to Location service" message:@"You can enable access in Settings->Privacy->Location->Location Services" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Settings", nil];
       curr2.tag=121;
       [curr2 show];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
   if (alertView.tag == 121 && buttonIndex == 1)
 {
  //code for opening settings app in iOS 8
   [[UIApplication sharedApplication] openURL:[NSURL  URLWithString:UIApplicationOpenSettingsURLString]];
 }
}

openURL устарела в iOS10.0: пожалуйста, используйте openURL: параметры: завершение, а не

let url = URL(string: UIApplicationOpenSettingsURLString)!
UIApplication.shared.open(url, options: [:]) { success in }

До iOS 5.0 можно было открыть settings через URL schemaт.е.

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"My Settings URL"]];

Это устарело с iOS 5.1 и выше.

Вот версия Swift2, которая работала для меня, включая предупреждение, которое инструктирует пользователя, что делать, когда открываются настройки.

func initLocationManager() {
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()


// If there isn't a Lat/Lon then we need to see if we have access to location services
// We are going to ask for permission to use location if the user hasn't allowed it yet.
let status = CLLocationManager.authorizationStatus()
if(status == CLAuthorizationStatus.NotDetermined || status == CLAuthorizationStatus.Denied)  {

    //println(locationManager)

    //  check that locationManager is even avaiable.  If so, then ask permission to use it
    if locationManager != nil {
        locationManager.requestAlwaysAuthorization()

        //open the settings to allow the user to select if they want to allow for location settings.
        let alert = UIAlertController(title: "I Can't find you.", message: "To let my App figure out where you are on the map click 'Find Me' and change your location to 'Always' and come back to MyMobi.", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "No Thanks", style: UIAlertActionStyle.Default, handler:nil))
        alert.addAction(UIAlertAction(title: "Find Me", style: UIAlertActionStyle.Default, handler: {
            (alert: UIAlertAction!) in
            UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
        }))
        self.presentViewController(alert, animated: true, completion: nil)


    }
}
}
Другие вопросы по тегам