【问题标题】:Allow Full Access check in keyboards iOS10允许在键盘 iOS10 中进行完全访问检查
【发布时间】:2017-01-25 08:51:24
【问题描述】:

最近 iOS 更新了 iOS 10,并且对开发人员进行了某些更改,其中一项更改是现在我们无法像以前那样检查 允许完全访问,如下所示

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

我搜索了最新的Developer Guide for UIPasteboard,但无法解决。有没有人对此有适当的解决方案。

【问题讨论】:

  • 我也有同样的问题。

标签: ios keyboard ios10 custom-keyboard uipasteboard


【解决方案1】:

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)
    }
}

【讨论】:

  • 到目前为止答案很好
【解决方案2】:

我已经解决了这个问题。 iOS 10.0Swift 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")
}

【讨论】:

  • 你不认为将“TEST”字符串设置为 UIPastebord general 会替换用户预先存在的文本。这是最佳解决方案吗?
  • 这是我使用 UIPasteboard.generalPasteboard().string 而不是 UIPasteboard.general.hasStrings 的工作
  • @mitul 我已经尝试过了,但是它将 TEST 粘贴到 OTT 文本字段中,这不是正确的解决方案。
  • @mitulmarsonia:完全同意这是一种解决方法,但从用户的角度来看,这是不应该的,因为用户永远不会希望他为将来使用而复制的数据消失。
  • 如果 UIImage 已粘贴到 UIPasteboard,则使键盘扩展崩溃。
【解决方案3】:

朋友们,在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];
}

PS:这只是一种解决方法

【讨论】:

  • 嗨,你能解释一下我已经尝试过你提到的代码,但它总是只给出“是”。即使我移除了我的第 3 方键盘。
【解决方案4】:

在 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)
    }
}

【讨论】:

    【解决方案5】:

    斯威夫特 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
        }
    }
    

    【讨论】:

      【解决方案6】:

      有点hacky,但它有效:

      斯威夫特 5

      static func isOpenAccessGranted() -> Bool {
          let inputVC = UIInputViewController()
          return inputVC.hasFullAccess
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        • 1970-01-01
        • 2017-08-30
        • 2017-01-17
        • 2014-10-17
        • 2014-11-22
        • 1970-01-01
        相关资源
        最近更新 更多