在iOS 8中,当开发自定义键盘并在info.plist中将RequestsOpenAccess属性设置为YES时,在Settings->处有一个切换按钮。添加名为“允许完全访问”的新键盘。自定义键盘代码如何知道用户启用或禁用此切换?
答案 0 :(得分:33)
UPDATE 08/23/2017 for iOS 10兼容性:
func isOpenAccessGranted() -> Bool{
UIPasteboard.general.string = "CHECK"
return UIPasteboard.general.hasStrings
}
iOS 8:
-(BOOL)isOpenAccessGranted{
return [UIPasteboard generalPasteboard];
}
请注意,模拟器将始终告诉您具有完全访问权限,因此要正常工作,您需要从设备运行它。
答案 1 :(得分:15)
这是迄今为止最简单的答案,并不要求您设置应用程序组。它在应用程序商店中进行了生产测试。
+ (BOOL)isOpenAccessGranted
{
return [UIPasteboard generalPasteboard];
}
答案 2 :(得分: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
}
答案 3 :(得分: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
}
测试以查看粘贴板是否有某些内容返回false并关闭完全访问权限,即使粘贴板上有内容也是如此。当然它实际上可能是空的,所以在所有这些测试之后你可以安全地尝试在粘贴板上设置一些东西而不用担心替换已经存在的东西。如果您确实有访问权并且粘贴板有内容,那么测试将返回true,如果您没有访问权限,则无法覆盖那里的内容。
HTH, 麦克
答案 4 :(得分:8)
更新:无需像其他人提到的那样启用App Group,只需检查对粘贴板的访问权限:
- (BOOL)isFullAccessGranted
{
return !![UIPasteboard generalPasteboard];
}
注意:即使您已启用App Group,以下内容也不再有效
对于启用了App Group的自定义键盘,以下是一种快速,可靠的方法来测试"允许完全访问"切换:
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 :(得分: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)
}
}
答案 6 :(得分:2)
可能没有应用程序组也可以。
我使用了这段代码:
package Adduser;
import Utility.Base;
import Utility.Login_Page;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Add_User {
public static void main(String[] args){
{
//LOGIN TO SITE
Base.openURL();
Login_Page.login();
}}}
答案 7 :(得分:1)
对于那些使用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;
}
}
答案 8 :(得分:1)
iOS 11不再需要任何黑客攻击。
opt
|-- app
| |-- index.php
| |-- foo
| | `-- file-c1
| `-- bar
| `-- file-h2
答案 9 :(得分:0)
只需使用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
AudioServicesPlaySystemSound(1104);
});
tirck是,当启用完全访问时,声音将播放,如果没有,因为它的调用是在后台线程中将不会阻塞主线程
答案 10 :(得分:0)
快速解决方案
if let test = UIPasteboard.generalPasteboard() as? UIPasteboard{
NSLog("Full Access: On")
return true
}else{
NSLog("Full Access: Off")
return false
}
当然在上面的功能里面。
答案 11 :(得分:0)
今天,对于iOS 9.2,您可以通过以下方式检查已打开的访问权限
func isOpenAccessGranted() -> Bool {
return UIPasteboard(name: "checkOpenedAccess", create: true) != nil
}
答案 12 :(得分:0)
应用群组的应用可以使用:
func isOpenAccessGranted() -> Bool {
let fm = NSFileManager.defaultManager()
let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
AppGroup)?.path
return fm.isWritableFileAtPath(containerPath!)
}
答案 13 :(得分:0)
iOS11及以上版本很简单。
iOS10解决方案:检查所有可复制的类型,如果其中一个可用,则您具有完全访问权限,否则不会。
- Swift 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)
}
}