Разрешить проверку полного доступа на клавиатурах iOS10

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

-(BOOL)isOpenAccessGranted{
   return [UIPasteboard generalPasteboard];
 }

Я искал последнее Руководство разработчика для UIPasteboard, но не смог найти решение. . У кого-нибудь есть правильное решение для этого.


person iYoung    schedule 17.09.2016    source источник
comment
У меня такая же проблема.   -  person Mitul Marsoniya    schedule 17.09.2016


Ответы (6)


iOS11 и выше легко.

Решение iOS10: проверьте все типы, доступные для копирования, если один из них доступен, у вас есть полный доступ, в противном случае нет.

-- Свифт 4.2--

override var hasFullAccess: Bool
{
    if #available(iOS 11.0, *){
        return super.hasFullAccess// super is UIInputViewController.
    }

    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)
    }
}
person Ahmet Akkök    schedule 17.02.2017
comment
Пока хороший ответ - person Rian; 17.08.2017

Я исправил эту проблему. iOS 10.0 и Swift 3.0

func isOpenAccessGranted() -> Bool {

    if #available(iOSApplicationExtension 10.0, *) {
        UIPasteboard.general.string = "TEST"

        if UIPasteboard.general.hasStrings {
            // Enable string-related control...
            UIPasteboard.general.string = ""
            return  true
        }
        else
        {
            UIPasteboard.general.string = ""
            return  false
        }
    } else {
        // Fallback on earlier versions
        if UIPasteboard.general.isKind(of: UIPasteboard.self) {
            return true
        }else
        {
            return false
        }

    }

}

Используйте так: -

if (isOpenAccessGranted())
{
   print("ACCESS : ON")
}
else{
   print("ACCESS : OFF")
}
person Mitul Marsoniya    schedule 18.09.2016
comment
Не думаете ли вы, что установка строки TEST в UIPastebord general заменит ранее существовавший текст user. Это оптимальное решение? - person iYoung; 18.09.2016
comment
Это работа. Я использовал UIPasteboard.generalPasteboard().string вместо UIPasteboard.general.hasStrings. - person kb920; 19.09.2016
comment
@mitul Я пробовал это, но он вставляет TEST в текстовое поле OTT, что не является правильным решением. - person iYoung; 19.09.2016
comment
Это использование для проверки включения или выключения полного доступа. Теперь я изменю код, тогда вы не получите вредителя, просто просмотрите отредактированный код. - person Mitul Marsoniya; 19.09.2016
comment
@mitulmarsonia Это все еще не оптимально, так как он не будет вставлять TEST, вместо этого он переопределит уже скопированные данные пользователя с расширением . Надеюсь ты понимаешь. - person iYoung; 20.09.2016
comment
@iYoung Просто проверьте, прежде чем копировать данные. Например, если вы хотите проверить, прежде чем копировать данные, доступ вкл / выкл, тогда просто используйте эту функцию и после того, как вы введете свой код копирования. - person Mitul Marsoniya; 20.09.2016
comment
@mitulmarsonia: Полностью согласен с тем, что это обходной путь, но с точки зрения пользователя этого не ожидается, поскольку пользователю никогда не понравится, что данные, которые он скопировал для своего будущего использования, исчезнут. - person iYoung; 20.09.2016
comment
@iYoung Вы также правы, я тоже думаю об этом, но теперь я использую этот способ, потому что не знаю другого решения для swift 3.0. Если в будущем мы получим, я обязательно обновлю ответ. Спасибо. - person Mitul Marsoniya; 20.09.2016
comment
Я также читаю документы Apple об этом изменении, но, тем не менее, это не следует использовать для приложений, так я считаю. - person iYoung; 20.09.2016
comment
Если вы хотите временно, вы можете использовать, потому что у нас нет других вариантов. - person Mitul Marsoniya; 20.09.2016
comment
Сбой расширения клавиатуры, если UIImage был вставлен в UIPasteboard. - person user3404693; 23.09.2016

Для друзей, ищу решение в Objective-C, вот оно

NSOperatingSystemVersion operatingSystem= [[NSProcessInfo processInfo] operatingSystemVersion];

if (operatingSystem.majorVersion>=10) {
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    pasteboard.string = @"Hey";

    if (pasteboard.hasStrings) {
        pasteboard.string = @"";
        return true;
    }
    else
    {
        pasteboard.string = @"";
        return false;
    }
}
else
{
    return [UIPasteboard generalPasteboard];
}

P.S. Это всего лишь обходной путь

person iYoung    schedule 29.09.2016
comment
Привет. Можете ли вы объяснить, что я пробовал код, который вы упомянули, но он всегда дает только «Да». Даже если я удалю свою стороннюю клавиатуру. - person Prashant Solanki; 30.08.2017

Протестировано на iOS 10 Swift 3.0 и iOS 9.

Используйте #available(iOS 10.0, *) вместо #available(iOSApplicationExtension 10.0, *)

func isOpenAccessGranted() -> Bool {
    if #available(iOS 10.0, *) {
        var originalString = UIPasteboard.general.string
        if(!(originalString != nil)){
            originalString = ""
        }
        UIPasteboard.general.string = "Test"

        if UIPasteboard.general.hasStrings {
            UIPasteboard.general.string = originalString
            return true
        }else{
            return false
        }
    }else{
        return UIPasteboard.general.isKind(of: UIPasteboard.self)
    }
}
person Utsav Parikh    schedule 28.09.2016

Свифт 3

static func isOpenAccessGranted() -> Bool {
    if #available(iOS 10.0, iOSApplicationExtension 10.0, *) {
        let value = UIPasteboard.general.string
        UIPasteboard.general.string = "checkOpenedAccess"

        let hasString = UIPasteboard.general.string != nil
        if let _ = value, hasString {
            UIPasteboard.general.string = value
        }
        return hasString
    }
    else {
        return UIPasteboard(name: UIPasteboardName(rawValue: "checkOpenedAccess"), create: true) != nil
    }
}
person dimpiax    schedule 31.10.2016

Немного хакерски, но работает:

Свифт 5

static func isOpenAccessGranted() -> Bool {
    let inputVC = UIInputViewController()
    return inputVC.hasFullAccess
}
person Ruud Visser    schedule 22.01.2020