如何在iOS 8中启用"允许完全访问"?

che*_*vyn 37 keyboard ios8

在iOS 8中,当开发自定义键盘并在info.plist中将RequestsOpenAccess属性设置为YES时,在设置 - >添加新键盘上有一个名为"允许完全访问"的切换按钮.自定义键盘代码如何知道用户启用或禁用此切换?

Jul*_*lon 33

更新08/23/2017 iOS 10兼容性:

func isOpenAccessGranted() -> Bool{
    UIPasteboard.general.string = "CHECK"
    return UIPasteboard.general.hasStrings
}
Run Code Online (Sandbox Code Playgroud)

iOS 8:

-(BOOL)isOpenAccessGranted{
   return [UIPasteboard generalPasteboard];
}
Run Code Online (Sandbox Code Playgroud)

请注意,模拟器将始终告诉您具有完全访问权限,因此要使其正常工作,您需要从设备运行它.

  • 请注意,由于iOS 8.3中的行为已更改,因此不再有效 - 在设备上运行时始终返回"true". (4认同)
  • @JulioBailon fisch2的回答对我有用.即使未授予完全访问权限,iOS 8.3中的新功能也可以从共享组容器中读取,因此上述代码始终返回true,但除非您具有完全访问权限,否则无法编写.不确定这是一个错误还是预期的行为 - 它在8.4测试版中是相同的. (2认同)

fis*_*ch2 15

这是迄今为止最简单的答案,不需要您设置应用程序组.它在应用商店中进行了生产测试.

+ (BOOL)isOpenAccessGranted
{
    return [UIPasteboard generalPasteboard];
}
Run Code Online (Sandbox Code Playgroud)

  • 在swift中,这将是`UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)` (6认同)
  • @ hoiberg42 - 很好的电话.当所有其他方法都失败时(8.3) (2认同)

sch*_*erz 11

对于iOS 10(Beta 5),他们更改了UIPasteboard API,但我发现以下工作:

let originalString = UIPasteboard.general.string
UIPasteboard.general.string = "TEST"
if UIPasteboard.general.hasStrings
{
    UIPasteboard.general.string = originalString
    hasFullAccess = true
}
else
{
     hasFullAccess = false
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 9

我今天在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
}
Run Code Online (Sandbox Code Playgroud)

测试以查看粘贴板是否具有某些内容,即使在粘贴板上有内容,也会关闭完全访问权限返回false.当然它实际上可能是空的,所以在所有这些测试之后你可以安全地尝试在粘贴板上设置一些东西而不用担心替换已经存在的东西.如果您确实有访问权并且粘贴板有内容,那么测试将返回true,如果您没有访问权限,则无法覆盖那里的内容.

HTH,迈克


tim*_*our 8

更新:无需像其他人提到的那样启用应用组,只需检查对粘贴板的访问:

- (BOOL)isFullAccessGranted
{
    return !![UIPasteboard generalPasteboard];
}
Run Code Online (Sandbox Code Playgroud)

注意:即使您启用了应用程序组,以下内容也不再有效...

对于启用了应用程序组的自定义键盘,以下是测试"允许完全访问"开关状态的快速,可靠的方法:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 这在键盘扩展中非常有效.但是,这总是在包含应用程序中返回true.您知道如何在包含的应用程序中检查允许完全访问的状态吗? (2认同)

iOS*_*use 5

对于使用Swift 2.3的iOS 10(如果您不想将文件转换为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)
    }
}
Run Code Online (Sandbox Code Playgroud)