Подтвердить что ты не робот

Как проверить "Разрешить полный доступ" в iOS 8?

В iOS 8, когда вы разрабатываете пользовательскую клавиатуру и устанавливаете свойство RequestsOpenAccess в YES в info.plist, в Настройках- > Добавить новую клавиатуру есть кнопка переключения с названием "Разрешить полный доступ". Как пользовательский код клавиатуры знает, что пользователь включил или отключил этот переключатель?

4b9b3361

Ответ 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)
  }