2011-10-17 6 views
3

사용자가 텍스트를 대지로 복사 할 수있는 기존 앱이 있습니다. 가능한 경우 다른 사용자가 붙여 넣을 수있는 앱이 무엇인지 알지 못하고 형식이 지정된 (HTML) 형식이 지정되지 않은 데이터를 제공하기 때문에 HTML 및 일반 텍스트를 모두 클립 보드에 저장합니다.다른 앱이 iOS 5의 Google 게시판 데이터의 텍스트 버전이 아닌 HTML을 붙여 넣습니다.

이 기능은 iOS 3 및 4에서 훌륭하게 작동합니다.하지만 사용자가 iOS 5를 설치하면 다른 앱에 텍스트를 붙여 넣을 때 다른 앱은 HTML 텍스트를 가져 오지만 일반 텍스트로 취급합니다. 따라서 H1 제목을 선택하고 복사 한 경우 다른 앱에 붙여 넣을 때 "This is a Heading"대신 "< h1> This is Heading </h1>"이라고 표시됩니다.

아이폰 OS 3, 4 사이에 우리의 코드에 아무런 변화가 없습니다 아이폰 OS 3과 4에서 잘 작동이 기존 코드와 것을 참고하고, 5 완성도를 들어

, 여기에 우리를 넣어 사용하는 코드입니다 단지 참조 용으로 만 제공 간단한 문자열로 대지에 텍스트 : 같은 응용 프로그램은 아이폰 OS 4에서 실행하는 동안 분명히

NSString * plainText = @"A Big Heading\r\nA regular paragraph."; 
NSString * htmlText = @"<h1>A Big Heading</h1><p>A regular paragraph.</p>"; 
UIPasteboard * pasteboard = [UIPasteboard generalPasteboard]; 
pasteboard.items = [NSArray arrayWithObject: 
    [NSDictionary dictionaryWithObjectsAndKeys: 
     plainText, @"public.utf8-plain-text", htmlText, @"public.html", nil]]; 

, 내 질문은 왜 그들이 일반 텍스트를 요청할 때에서 iOS 5 애플 리케이션, HTML 텍스트를받을 수 있나요 "입니다 일반 텍스트를 가져옵니다? "

답변

5

집에서 놀고있는 사람들을 위해, 우리가 발견 한 해답은 다음과 같습니다.

"public.utf8-plain-text"는 서식없는 텍스트가 포함 된 NSString을 대지로 넣을 때 사용되는 올바른 UTI였습니다. 내장 컨트롤은 "붙여 넣기"작업 (5 이전의 iOS 버전 용) 중에이 버전의 대지 내용을 요청하고 사용합니다. 대시 보드에 "public.plain-text"또는 "public.text"텍스트 만 넣으면 기본 컨트롤에서 완전히 무시하고 대시 보드는 비어 있습니다 ("붙여 넣기"옵션을 제공하지 않음).

iOS 5에서는 무엇인가가 변경되었으며 위의 상황에서 기본 제공 컨트롤이 일반 텍스트를 요청하면 "public.html"텍스트가 표시됩니다.

iOS 5의 경우, "public.plain-text"또는 "public.utf8-plain-text"대신 "public.text"를 사용해야합니다. 후자 2 개는 틀린 부분이 더 정확하고 전자는 너무 애매합니다 전혀 사용하지 마십시오.

이전 버전의 iOS 버전은 "public.text"를 무시했기 때문에 "public.text"및 "public.utf8-plain-text"라는 세 가지 버전 모두를 일반 텍스트와 "public.html"은 HTML 텍스트를 가져옵니다. 이것은 코드에 명시적인 iOS 버전 테스트를 넣지 않고도 iOS 4와 5 모두를 만족시키는 것으로 보입니다. 사전에 하나 더 입력해야합니다.

Apple에서 어린이를 한 명 더 실패합니다. 나는이 질문을 게시 이후

는 2016

편집 및 iOS 8/9

나는 한 번이 문제를 해결하기 위해 노력하고 모든 영원히했습니다. Google 검색을 할 때마다 나는 항상이 질문으로 끝납니다.

iOS는 HTML을 페이스트 보드에 배치하기위한 "웹 아카이브"개념을 도입했습니다. 그것은 어디에서나 잘 문서화되지 않았습니다. 내 질문에 선행하는 대답 here을 찾았으므로 조금 실망 스럽지만 작동합니다. 최신 버전의 iOS에서 내장 된 base64 인코딩을 이용하도록 업데이트했습니다.다음과 같이 바뀝니다.

NSMutableDictionary * contents = [NSMutableDictionary dictionaryWithCapacity:6]; 
NSString * htmlText = @"<h1>A Heading</h1><p>A paragraph.</p>" 
//... put other formats in the dictionary, then... 
NSData * data = [htmlText dataUsingEncoding:NSUTF8StringEncoding]; 
NSString * base64encodedString = [data base64EncodedStringWithOptions:0]; 
NSString * webArchiveString = [NSString stringWithFormat: 
    @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
    "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">" 
    "<plist version=\"1.0\">" 
    "<dict>" 
    "<key>WebMainResource</key>" 
    "<dict>" 
    "<key>WebResourceData</key>" 
    "<data>%@</data>" 
    "<key>WebResourceFrameName</key>" 
    "<string></string>" 
    "<key>WebResourceMIMEType</key>" 
    "<string>text/html</string>" 
    "<key>WebResourceTextEncodingName</key>" 
    "<string>UTF-8</string>" 
    "<key>WebResourceURL</key>" 
    "<string>about:blank</string>" 
    "</dict>" 
    "</dict>" 
    "</plist>", base64encodedString]; 
[contents setObject:webArchiveString forKey:@"Apple Web Archive pasteboard type"]; 
UIPasteboard * pasteboard = [UIPasteboard generalPasteboard]; 
pasteboard.items = [NSArray arrayWithObject:contents]; 
+0

감사 정보. 희망이 당신은 애플에서 버그로 기록했습니다. –

+1

완료. 10329669. – Craig

+0

그리고 버그를 기록하기위한 +1. 많은 감사합니다! –