2011-10-17 10 views
3

ユーザーがテキストをペーストボードにコピーできるようにする既存のアプリがあります。可能であれば、HTMLとプレーンテキストの両方をクリップボードに貼り付けます。これは、ユーザーが貼り付けようとしているアプリが何であるかわからないために、書式付き(HTML)と書式なしの両方のデータを提供したいからです。iOS 5のペーストボードデータのテキスト版ではなく、他のアプリが貼り付けます

この機能はiOS 3と4でうまくいきます。しかし、ユーザーがiOS 5をインストールすると、アプリからのテキストを他のアプリに貼り付けるとすぐに、他のアプリはHTMLテキストを取得してプレーンテキストとして扱います。したがって、H1見出しを選択してコピーした場合、「This is a Heading」と表示されるのではなく、「< h1>これは見出し</h1>」と表示されます。

iOSの3、4の間に我々のコードには変更はありませんiOSの3と4で正常に動作し、これは、既存のコードであることに注意してください、と5完全性については

は、ここで私達は私達のを置くために使用するコードですペーストボード上のテキスト、あくまでも参考のために提供される単純な文字列で:彼らは、プレーンテキストを要求したときに同じアプリはiOSの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でした。組み込みコントロールはすべて、ペーストボードのコンテンツのこのバージョンを「ペースト」操作中に要求し、使用します(iOSバージョン5以前)。ペーストボードに「public.plain-text」または「public.text」テキストだけを置くと、ペーストボードが空である(「ペースト」オプションを与えていない)というビルトインコントロールは完全に無視します。

iOS 5では、何かが変更され、組み込みのコントロールが上記の状況でプレーンテキストを要求すると、「public.html」というテキストが取得されます。

iOS 5では、「public.plain-text」または「public.utf8-plain-text」の代わりに「public.text」を使用する必要があります。後者の2つは間違いなく正確で、前者はあまりにも曖昧ですまったく役に立たない。

以前のiOSバージョンでは「public.text」は無視されていましたので、私たちの解決方法は3つのバージョンをすべてペーストボードに置くことです:「public.text」と「public.utf8-plain-text」はプレーンテキストと"public.html"はHTMLテキストを取得します。これは、コードに明示的なiOSバージョンテストを入れなくても、iOS 4と5の両方を満足させると思われます。

もう1つアップルの子供のために失敗します。 2016年のための

EDITとiOS 8/9

私はこの質問を投稿以来、一度、すべてのこの問題を解決しようとしてきました。私がGoogleの検索をするたびに、私はいつもこの質問に戻る。

iOSは、どこかに沿って、ペーストボードにHTMLを置くための「Webアーカイブ」コンセプトを導入しました。それはどこにでもよく書かれていません。私は答えを見つけた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

ありがとうございました。あなたがこれをAppleにバグとして記録してくれることを願っています。 –

+1

完了。 10329669. – Craig

+0

そして、バグを記録するための+1。どうもありがとう ! –

関連する問題