确定是否成功复制到UIPasteboard

我正在以编程方式将图像复制到UIPasteboard,并且要确定副本是否成功。 具体来说,我在iOS 8上创build了一个自定义键盘,其中一些键将图像复制到粘贴板,供用户粘贴到文本框中。

UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard]; [pasteBoard setImage:[UIImage imageNamed:anImage]]; 

要做到这一点,用户必须允许键盘上的“完全访问”。 所以我必须要有一种方法来确定Full Access是否打开(不知道如何检查这个),或者确定复制到粘贴板是否成功。 如果完全访问没有打开,我必须提醒用户打开它以使键盘正常工作。

当复制失败时(由于完全访问被closures),我从UIPasteboard获得日志消息:

 UIPasteboard - failed to launch pasteboardd. Make sure it's installed in UIKit.framework/Support 

有没有在运行时捕捉这个?

任何build议如何实现这一点,将不胜感激!

我似乎已经find了一个解决scheme。 这来自苹果开发者论坛(用户安德鲁·博伊德) ,是唯一的职位,我可以find正确解决这个问题。

 - (BOOL)testFullAccess { NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"yourAppGroupID"]; // Need to setup in Xcode and Developer Portal NSString *testFilePath = [[containerURL path] stringByAppendingPathComponent:@"testFullAccess"]; NSError *fileError = nil; if ([[NSFileManager defaultManager] fileExistsAtPath:testFilePath]) { [[NSFileManager defaultManager] removeItemAtPath:testFilePath error:&fileError]; } if (fileError == nil) { NSString *testString = @"testing, testing, 1, 2, 3..."; BOOL success = [[NSFileManager defaultManager] createFileAtPath:testFilePath contents: [testString dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; return success; } else { return NO; } } 

为了达到此目的,您必须configuration一个应用程序组,您的键盘扩展将用来尝试与您的键盘应用程序进行通信。 为此,请按照Apple关于configuration应用程序组的说明进行操作 。 使用您在那里创build的标识符replace上面代码中的yourAppGroupIDstring。 然后,此方法将尝试与键盘的主应用程序进行通信。 如果成功,那么我们可以得出结论,完全访问。

我希望这个解决scheme可以帮助别人,直到苹果[希望]添加一个更快的检查,如果用户启用了完整的访问或不。 更何况,希望他们创造一个更简单的方法让用户在设置菜单之外启用完全访问权限。

我很快就这样做了:

 func isOpenAccessGranted() -> Bool { return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard) } 

还应该在Obj-C中工作:

 - (BOOL)isOpenAccessGranted() { return [[UIPasteboard generalPasteboard] isKindOfClass:UIPasteboard.class]; }