我是以编程方式将图像复制到UIPasteboard,我想确定副本是否成功。具体来说,我正在iOS 8上创建一个自定义键盘,其中一些键将图像复制到粘贴板,供用户粘贴到文本域中。
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
[pasteBoard setImage:[UIImage imageNamed:anImage]];
为此,用户必须允许键盘上的“完全访问”。所以我要么必须确定是否启用了完全访问权限(不确定如何检查),或者确定复制到粘贴板是否成功。如果未启用“完全访问权限”,则必须提醒用户将其打开以使键盘正常工作。
当副本失败时(由于Full Access关闭),我从UIPasteboard获取日志消息:
UIPasteboard - failed to launch pasteboardd. Make sure it's installed in UIKit.framework/Support
无论如何都要在运行时捕获它吗?
有关如何实现这一目标的任何建议都将不胜感激!
答案 0 :(得分:3)
我现在似乎找到了解决方案。这来自Apple Developer forums (user Andrew Boyd),是我能找到的唯一正确解决问题的帖子。
- (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;
}
}
要使其正常工作,您必须配置一个应用程序组,您的键盘扩展程序将使用该组来尝试与您的键盘应用程序通信。为此,请按照Configuring App Groups上的Apple说明操作。使用您在那里创建的标识符替换上面代码中的字符串yourAppGroupID
。然后,此方法将尝试与键盘的主应用程序通信。如果成功,那么我们可以得出结论:Full Access已启用。
我希望这个解决方案可以帮助其他人,直到Apple [希望]更快地检查用户是否启用了完全访问权限。更不用说,希望它们为用户创建一种更简单的方法,以便在设置菜单之外启用完全访问。
答案 1 :(得分:3)
我在swift中这样做:
func isOpenAccessGranted() -> Bool {
return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}
也应该在Obj-C中工作:
- (BOOL)isOpenAccessGranted() {
return [[UIPasteboard generalPasteboard] isKindOfClass:UIPasteboard.class];
}