В iOS 8, когда вы разрабатываете пользовательскую клавиатуру и устанавливаете свойство RequestsOpenAccess в YES в info.plist, в Настройках- > Добавить новую клавиатуру есть кнопка переключения с названием "Разрешить полный доступ". Как пользовательский код клавиатуры знает, что пользователь включил или отключил этот переключатель?
Как проверить "Разрешить полный доступ" в iOS 8?
Ответ 1
UPDATE 08/23/2017 для совместимости с iOS 10:
func isOpenAccessGranted() -> Bool{
UIPasteboard.general.string = "CHECK"
return UIPasteboard.general.hasStrings
}
iOS 8:
-(BOOL)isOpenAccessGranted{
return [UIPasteboard generalPasteboard];
}
Обратите внимание, что симулятор всегда скажет вам, что у вас есть полный доступ, поэтому для правильной работы вам необходимо запустить его с устройства.
Ответ 2
Это самый простой ответ и не требует установки групп приложений. Он тестируется в магазине приложений.
+ (BOOL)isOpenAccessGranted
{
return [UIPasteboard generalPasteboard];
}
Ответ 3
Для iOS 10 (бета-версия 5) они изменили API-интерфейс UIPasteboard, но я нашел следующее:
let originalString = UIPasteboard.general.string
UIPasteboard.general.string = "TEST"
if UIPasteboard.general.hasStrings
{
UIPasteboard.general.string = originalString
hasFullAccess = true
}
else
{
hasFullAccess = false
}
Ответ 4
Обновление: нет необходимости, чтобы группа приложений была включена, как указывали другие, просто проверьте доступ к картону:
- (BOOL)isFullAccessGranted
{
return !![UIPasteboard generalPasteboard];
}
ПРИМЕЧАНИЕ. Следующие функции больше не работают, даже если у вас есть Группа приложений включена...
Для пользовательской клавиатуры с Группа приложений включена, быстрый и надежный способ тестирования для состояния переключателя "Разрешить полный доступ":
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
}
Ответ 5
Я тестировал это сегодня в iOS 10, и получить доступ к картону, похоже, недостаточно. В iOS 10 вы можете установить картон в var без полного доступа. Вот решение, которое я придумал...
func checkFullAccess() -> Bool
{
var hasFullAccess = false
if #available(iOSApplicationExtension 10.0, *) {
let pasty = UIPasteboard.general
if pasty.hasURLs || pasty.hasColors || pasty.hasStrings || pasty.hasImages {
hasFullAccess = true
} else {
pasty.string = "TEST"
if pasty.hasStrings {
hasFullAccess = true
pasty.string = ""
}
}
} else {
// Fallback on earlier versions
var clippy : UIPasteboard?
clippy = UIPasteboard.general
if clippy != nil {
hasFullAccess = true
}
}
return hasFullAccess
}
Тестирование, чтобы увидеть, имеет ли файл cookboard какое-либо содержимое, возвращает false с полным доступом, даже если на картотеке есть контент. Конечно, на самом деле это может быть пустым, поэтому после всех этих тестов вы можете спокойно попытаться установить что-то на картоне, не беспокоясь о замене того, что уже есть. Если у вас есть доступ, а у картона есть контент, тогда тест вернет true, если у вас нет доступа, вы не можете перезаписать то, что было там.
НТН, Mike
Ответ 6
Для iOS 10 с использованием Swift 2.3 (если вы не хотите конвертировать ваши файлы в Swift 3.0)
func isOpenAccessGranted() -> Bool {
if #available(iOSApplicationExtension 10.0, *) {
let originalString = UIPasteboard.generalPasteboard().string
UIPasteboard.generalPasteboard().string = "Test"
if UIPasteboard.generalPasteboard().hasStrings {
UIPasteboard.generalPasteboard().string = originalString
return true
} else {
return false
}
} else {
return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}
}
Ответ 7
Этот код работает для меня, я также в группах приложений: https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW61
Возможно, он будет работать и без групп приложений.
И я использовал этот код:
if(isOpenAccessGranted()){
NSLog("FULL ACCESS ON")
}
else{
NSLog("FULL ACCESS OFF")
}
}
func isOpenAccessGranted() -> Bool {
return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}
Ответ 8
Полезное быстрое решение @hoiberg42:
func isOpenAccessGranted() -> Bool {
return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}
Работает как шарм!
Ответ 9
просто используйте
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
AudioServicesPlaySystemSound(1104);
});
tirck - когда включен полный доступ, звук будет воспроизводиться, если нет, потому что он вызывает фоновый поток, не будет блокировать основной поток
Ответ 10
Быстрое решение
if let test = UIPasteboard.generalPasteboard() as? UIPasteboard{
NSLog("Full Access: On")
return true
}else{
NSLog("Full Access: Off")
return false
}
внутри указанной функции, конечно.
Ответ 11
Сегодня для iOS 9.2 вы можете проверить открытый доступ на:
func isOpenAccessGranted() -> Bool {
return UIPasteboard(name: "checkOpenedAccess", create: true) != nil
}
Ответ 12
Приложения с группой приложений могут использовать:
func isOpenAccessGranted() -> Bool {
let fm = NSFileManager.defaultManager()
let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
AppGroup)?.path
return fm.isWritableFileAtPath(containerPath!)
}
Ответ 13
iOS10 Решение. Проверьте все типы, пригодные для копирования, если один из них доступен, у вас есть полный доступ, если нет.
P.S: исправлены новые телефоны и после обновления iOS.
- Swift 2.3 -
static func isFullAccessGranted() -> Bool
{
if #available(iOSApplicationExtension 10.0, *)
{
if UIPasteboard.generalPasteboard().hasStrings
{
return true
}
else if UIPasteboard.generalPasteboard().hasURLs
{
return true
}
else if UIPasteboard.generalPasteboard().hasColors
{
return true
}
else if UIPasteboard.generalPasteboard().hasImages
{
return true
}
else // In case the pasteboard is blank
{
UIPasteboard.generalPasteboard().string = ""
if UIPasteboard.generalPasteboard().hasStrings
{
return true
}else
{
return false
}
}
} else {
// before iOS10
if UIPasteboard.generalPasteboard().isKindOfClass( UIPasteboard)
{
return true
}else
{
return false
}
}
}
- Swift 3.0 -
static func isFullAccessGranted() -> Bool
{
if #available(iOSApplicationExtension 10.0, *)
{
if UIPasteboard.general.hasStrings
{
return true
}
else if UIPasteboard.general.hasURLs
{
return true
}
else if UIPasteboard.general.hasColors
{
return true
}
else if UIPasteboard.general.hasImages
{
return true
}
else // In case the pasteboard is blank
{
UIPasteboard.general.string = ""
if UIPasteboard.general.hasStrings
{
return true
}else
{
return false
}
}
} else {
// before iOS10
return UIPasteboard.general.isKind(of: UIPasteboard.self)
}
}
Ответ 14
Для тех из вас, кто использует iOS 10 и Objective-C, это будет работать по назначению.
- (BOOL)hasFullAccess
{
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
NSString *originalString = pasteboard.string;
pasteboard.string = @"TEST";
if (pasteboard.hasStrings) {
pasteboard.string = originalString;
return YES;
} else {
return NO;
}
}
Ответ 15
iOS 11 больше не требует взлома.
override var hasFullAccess: Bool {
if #available(iOS 11.0, *) {
return super.hasFullAccess// super is UIInputViewController.
}
if #available(iOS 10.0, *) {
let original: String? = UIPasteboard.general.string
UIPasteboard.general.string = " "
let val: Bool = UIPasteboard.general.hasStrings
if let str = original {
UIPasteboard.general.string = str
}
return val
}
return UIPasteboard.general.isKind(of: UIPasteboard.self)
}