2014-09-28 2 views
1

프로그램 방식으로 이미지를 UIPasteboard에 복사하고 있으며 복사가 성공했는지 여부를 확인하고 싶습니다. 특히 iOS 8에서 사용자 정의 키보드를 만들고 있는데, 키의 일부는 사용자가 텍스트 필드에 붙여 넣을 수 있도록 이미지를 대지로 복사합니다.UIPasteboard에 대한 복사가 성공했는지 여부를 확인하십시오.

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

이렇게하려면 사용자가 키보드에서 "전체 액세스"를 허용해야합니다. 따라서 전체 액세스가 켜져 있는지 (이 방법을 확인하는 방법이 확실하지 않은지) 확인하거나 대지로의 복사가 성공했는지 확인할 방법이 필요합니다. 전체 액세스가 켜져 있지 않으면 키보드 작동을 위해 사용자에게 경고해야합니다.

복사가되지 않습니다

(전체 액세스가 해제되기 때문에), 나는 UIPasteboard에서 로그 메시지가 :

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

이 런타임에 잡으려고 어쨌든이 있나요?

이 문제를 해결하는 방법에 대한 제안 사항에 감사드립니다.

답변

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

이 작동하는 키보드 확장 키보드 응용 프로그램과 통신 할 시도에서 사용할 앱 그룹을 구성해야합니다. 이렇게하려면 Apple 지침 (Configuring App Groups)을 따르십시오. 위 코드에서 yourAppGroupID 문자열을 바꾸려면 해당 식별자를 사용하십시오. 그런 다음이 방법은 키보드의 기본 앱과 통신을 시도합니다. 성공하면 Full Access가 온 것으로 결론을 내릴 수 있습니다.

나는이 솔루션이 사용자가 Full Access를 사용하도록 설정했는지 여부를 [가망 있더라도] 빠른 확인을 추가 할 때까지 다른 사람에게 도움이되기를 바랍니다. 말할 것도없이, 사용자가 설정 메뉴 외부에서 모든 권한을 사용하도록하는 쉬운 방법을 만들면 좋을 것입니다.

+1

감사합니다, timgcarlson을. 나를 위해 완벽하게 일했습니다. 이 글을 읽은 다른 사람들을 위해 : "group.com.yourdomain.yourapp"이 앱과 확장 타겟 모두에 체크 표시되어 있는지 확인하십시오. 이 체크 박스는 Xcode 6.1 GUI에서 약간 작아서보기가 어렵습니다. – lifjoy

+0

이것은 오래된 대답입니다. iOS8 이상을 확인하는 올바른 방법은 isOpenAccessGranted를 사용하는 것입니다. –

3

나는 신속이 일을 해요 :

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

뿐만 아니라의 Obj-C에서 작동합니다 :

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