Определите, была ли копия в UIPasteboard успешной или нет

Я программно копирую изображение в UIPasteboard и хочу определить, было ли копирование успешным или нет. В частности, я создаю пользовательскую клавиатуру на iOS 8, где некоторые клавиши будут копировать изображение на монтажный стол, чтобы пользователь мог вставить его в текстовое поле.

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

Для этого пользователю необходимо разрешить «Полный доступ» на клавиатуре. Поэтому мне нужно либо определить, включен ли полный доступ (не знаю, как это проверить), либо определить, было ли копирование на монтажный стол успешным. Если полный доступ не включен, я должен предупредить пользователя, чтобы он включил его, чтобы клавиатура работала.

Когда копирование не удается (из-за отключения полного доступа), я получаю сообщение журнала от UIPasteboard:

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

Есть ли способ поймать это во время выполнения?

Любые предложения о том, как этого достичь, будут оценены!


person timgcarlson    schedule 28.09.2014    source источник


Ответы (2)


Кажется, я нашел решение на данный момент. Это взято с форумов разработчиков Apple (пользователь Эндрю Бойд) и является единственным сообщением, которое я смог найти, что правильно решает проблему.

- (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;
    }
}

Чтобы это работало, вы должны настроить группу приложений, которую ваше расширение клавиатуры будет использовать для связи с вашим приложением клавиатуры. Для этого следуйте инструкциям Apple по Настройка групп приложений. . Используйте созданный там идентификатор, чтобы заменить строку yourAppGroupID в приведенном выше коде. Затем этот метод попытается связаться с основным приложением для вашей клавиатуры. В случае успеха можно сделать вывод, что Полный доступ включен.

Я надеюсь, что это решение поможет кому-то еще, пока Apple [надеюсь] не добавит более быструю проверку, включил ли пользователь полный доступ или нет. Не говоря уже о том, что, надеюсь, они создадут более простой способ для пользователя включить полный доступ за пределами меню настроек.

person timgcarlson    schedule 28.09.2014
comment
Спасибо, Тимгкарлсон. Работал отлично для меня. Для тех, кто читает это: убедитесь, что group.com.yourdomain.yourapp отмечен флажком как в приложении, так и в целях расширения. Флажок крошечный в графическом интерфейсе Xcode 6.1, поэтому его трудно увидеть. - person lifjoy; 28.10.2014
comment
это старый ответ. Правильный способ проверить iOS8 и выше — использовать isOpenAccessGranted. - person Sam B; 15.03.2016

Я делаю это быстро:

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

Должен работать и в Obj-C:

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