Как проверить, предоставлено ли разрешение «Разрешить полный доступ» из содержащего приложения?

Я работаю над проектом расширения клавиатуры. В некоторых точках кода приложения мне нужно проверить, предоставил ли пользователь разрешение «Разрешить полный доступ» для расширения клавиатуры. Дело в том, что мне нужно выполнить эти тесты со стороны приложения, и на основе этого позволить пользователю получить доступ к настройкам клавиатуры или предупредить его, если разрешение не было предоставлено.

Проблема в том, что методы, представленные здесь, такие как:

func isOpenAccessGranted() -> Bool {
    return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}

or:

func isOpenAccessGranted() -> Bool {
let fm = NSFileManager.defaultManager()
let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
                    "group.com.example")?.path
var error: NSError?
fm.contentsOfDirectoryAtPath(containerPath!, error: &error)
if (error != nil) {
    NSLog("Full Access: Off")
    return false
}
NSLog("Full Access: On");
return true
}

Работает только со стороны клавиатуры, так как это разрешение влияет только на клавиатуру. Со стороны содержащего приложения оба этих метода всегда возвращают значение true.

Кто-нибудь знает надежный способ проверить это со стороны приложения?


person Emil Adz    schedule 20.08.2015    source источник
comment
Решение для любой версии iOS выше 8.3 будет очень признательно. Событие, если оно работает только для некоторых версий.   -  person Rasto    schedule 18.12.2015


Ответы (2)


Рассмотрите возможность использования NSUSerdefaults в своем приложении и на клавиатуре. Чтобы расширение и приложение могли использовать одни и те же NSUserdefaults, вы можете просто включить группы приложений. Выберите основное целевое приложение в своем проекте в навигаторе проектов, перейдите к возможностям и включите группы приложений, включив его, добавив свой профиль разработчика и устранив возможные проблемы. Sceenshot Теперь создайте новый контейнер. Согласно справке, он должен начинаться с «group», поэтому дайте ему имя, например «group.com.mycompany.myapp». Выберите цель расширения «Сегодня» и повторите этот процесс включения групп приложений. Не создавайте новую, а выберите эту вновь созданную группу, чтобы обозначить, что расширение «Сегодня» является частью группы.

Теперь это позволит вам использовать те же NSUserdefaults, что и ваше приложение-контейнер. Все, что вам нужно сделать сейчас, это использовать предоставленный вами код и добавить метод сохранения в NSUserdefaults следующим образом:

func isOpenAccessGranted() -> Bool {
    let defaults = NSUserDefaults.standardUserDefaults()
    let fm = NSFileManager.defaultManager()
    let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
        "group.com.example")?.path
    var error: NSError?
    fm.contentsOfDirectoryAtPath(containerPath!, error: &error)
    if (error != nil) {
        NSLog("Full Access: Off")
        defaults.setBool(false, forKey: "hasFullAccess")
        return false
    }
    NSLog("Full Access: On");
    defaults.setBool(true, forKey: "hasFullAccess")
    return true
}

Сделайте это в своем расширении клавиатуры. А затем в своем родительском приложении просто извлеките их и действуйте в соответствии с их значением.

let hasFullAccess : Bool = NSUserDefaults.standardUserDefaults().boolForKey("hasFullAccess")


if hasFullAccess{
    //User granted full access
}
else{
    //User didn't grant full access
}

Если пользователь не предоставил полный доступ, покажите предупреждение, иначе код прочь!

РЕДАКТИРОВАТЬ: После обращения в службу технической поддержки разработчиков Apple они сказали мне, что на данный момент это невозможно сделать каким-либо поддерживаемым способом. Их ответ ниже:

Наши инженеры рассмотрели ваш запрос и пришли к выводу, что не существует поддерживаемого способа достижения желаемой функциональности с учетом поставляемых в настоящее время конфигураций системы.

Если вы хотите, чтобы Apple рассмотрела возможность добавления поддержки таких функций в будущем, отправьте запрос на улучшение с помощью инструмента Bug Reporter по адресу https://developer.apple.com/bug-reporting/.

Надеюсь, это поможет, Джулиан

person Julian E.    schedule 19.12.2015
comment
Ну, это половина решения в лучшем случае. Это лучше, чем ничего, но у этого решения есть некоторые недостатки. Во-первых, это решение будет работать только после первого использования клавиатуры и, если я не ошибаюсь, с предоставлением полного доступа. в противном случае клавиатура не сможет получить доступ к общим NSUserDefaults. Затем, если пользователь перейдет к настройкам и отключит разрешение на полный доступ, у вас будет неправильное значение на стороне приложения, пока пользователь снова не будет использовать вашу клавиатуру. Это действительно неудовлетворительно, но спасибо за ваши усилия и помощь. - person Emil Adz; 19.12.2015
comment
@Эмиль Адз Хм. Я понимаю. Что ж, мне жаль, что ты так себя чувствуешь. Я постараюсь найти лучший способ и отредактировать его. - person Julian E.; 19.12.2015
comment
Однако я хотел бы перейти к некоторым пунктам, которые вы упомянули. В группах приложений вы можете сразу поделиться файлом NSUSerdefaults. Вы можете без проблем реализовать решение, которое будет просто возвращать новейшее значение каждый раз при загрузке клавиатуры, проверять, предоставлен ли полный доступ или нет, и возвращать значение true или false и обновлять NSUserdefault. Это будет не более 5-8 строк кода, и его будет легко проверить. Затем, если вы обновите NSUserdefaults, вы также сможете изменить содержимое в своем родительском приложении. - person Julian E.; 19.12.2015
comment
Я действительно не понял, как ваш комментарий отвечает на любой из двух вопросов, которые я поднял с вашим решением. - person Emil Adz; 19.12.2015
comment
А жаль. Я думал, что выразился на ясном английском языке и в легко понятных моментах. Простите за это. Я пытаюсь сказать, что NSUserdefaults могут быть записаны и доступны сразу же при запуске клавиатуры, нет необходимости в разрешении полного доступа. Я хотел использовать ваш код, чтобы показать вам, как вы можете получить доступ к возвращаемому значению true или false в вашем приложении-контейнере. Вы заявили, что, если вы не ошибаетесь, приложению необходимо получить полный доступ, чтобы иметь доступ к NSUserdefaults. Вы ошибаетесь, любое расширение может получить доступ к NSUserdefaults, размещенным в группе приложений. - person Julian E.; 19.12.2015
comment
без каких-либо дополнительных разрешений. - person Julian E.; 19.12.2015
comment
Мое второе замечание заключалось в том, что вы можете просто вызывать функцию, которая возвращает true или false каждый раз, например, при открытии клавиатуры. Вы сами решаете, когда его вызывать, и, добавляя код для сохранения в NSUserdefaults, вы всегда будете иметь самое новое значение. Например, вы можете вызывать его каждый раз, когда загружается клавиатура. - person Julian E.; 19.12.2015
comment
У вас будет неправильное значение, пока пользователь снова не воспользуется вашей клавиатурой, но нет другого способа обновить эти значения без использования клавиатуры. - person Julian E.; 19.12.2015
comment
Что ж, в настоящее время я не работаю над этим проектом для iPhone, поэтому у меня не было возможности проверить оператор разрешения полного доступа и NSUserdefaults. Тем не менее, это не решает ни одну из двух проблем. Значение будет пустым до первого использования клавиатуры. и это будет неправильно до первого использования клавиатуры после изменения настроек. - person Emil Adz; 19.12.2015
comment
Это обходной путь, не идеальный, но, насколько мне известно, единственный способ сделать это. Вы можете просто предложить пользователю разрешить полный доступ к клавиатуре, как это делается в приложении Swift Keyboard. Кроме этого, на самом деле нет лучшего способа проверки, поскольку эта информация относится только к клавиатуре. Я отправил запрос в службу технической поддержки, чтобы узнать больше для вас, но, похоже, это самое близкое, что вы можете получить. - person Julian E.; 19.12.2015
comment
Вам придется предположить, что это ложь, пока клавиатура не будет использована в первый раз, и почему бы просто не предложить пользователю разрешить полный доступ, как в других приложениях? - person Julian E.; 19.12.2015
comment
Извините, если этот ответ не оправдал ваших ожиданий, но, насколько я знаю, это лучшее, что вы можете получить для этой информации. Извините, и я дам вам знать, что говорит DTS - person Julian E.; 19.12.2015
comment
Что ж, мы ему подсказываем, но я думаю, и мои начальники тоже, что этого недостаточно. Для справки, это совсем другая проблема, эти вопросы на самом деле уже не имеют ничего общего с рассматриваемым вопросом. - person Emil Adz; 19.12.2015
comment
Я понимаю это. Я просто боюсь, что это максимум, что вы можете сделать, так как многие большие приложения для клавиатуры не делают ничего, кроме как просто предлагать пользователю включиться. Извините, я не смог помочь вам более чем наполовину решить в лучшем случае - person Julian E.; 19.12.2015
comment
Извините, если вас обидело это заявление. Это было не мое внимание. - person Emil Adz; 20.12.2015
comment
Нет-нет, я постараюсь узнать больше для вас и дам вам знать как можно скорее. Говори скорее! - person Julian E.; 20.12.2015
comment
Еще раз спасибо за ваши усилия, вот +1 за это. - person Emil Adz; 20.12.2015
comment
@EmilAdz Я обновил ответ информацией, полученной от Apple DTS. Надеюсь, теперь это поможет вам больше ... - person Julian E.; 22.12.2015
comment
Пожалуйста, обновите с правильными шагами, он больше не работает, как упоминалось - person Sandip Patel - SM; 14.12.2016

Вы можете легко проверить, предоставлено ли разрешение «Разрешить полный доступ» в iOS 11 и более поздних версиях.

  1. Чтобы получить разрешение «Разрешить полный доступ», сначала создайте подкласс класса UIInputViewController.
  2. Добавьте код. Код возвращает логическое значение.

Цель-C

[self hasFullAccess];

Свифт

self.hasFullAccess

https://developer.apple.com/documentation/uikit/uiinputviewcontroller/2875763-hasfullaccess?changes=_2

person said altintop    schedule 12.01.2021