2011-10-17 46 views
3

我們有一個現有的應用程序,允許用戶將文本複製到粘貼板。在可能的情況下,我們將HTML和純文本都放在剪貼板上,因爲我們不知道用戶可能粘貼了哪些其他應用程序,並希望提供格式化(HTML)和無格式數據。其他應用程序粘貼HTML而不是我們的粘貼板數據的文​​本版本在iOS 5

此功能在iOS 3和4中效果很好。但是,只要用戶安裝iOS 5,當他們將我們的應用程序中的文本粘貼到任何其他應用程序中時,其他應用程序就會獲取HTML文本,但會將其視爲純文本。因此,如果他們選擇並複製H1標題,當他們粘貼到另一個應用程序中,而不是看到「這是標題」時,他們會看到「< h1>這是標題</h1>」。

注意,這是與現有的代碼工作正常的iOS 3和4有我們的iOS 3,4之間的代碼沒有變化,和5

爲了完整起見,這裏我們用它來把我們的代碼文本粘貼板上,以供參考提供了一個簡單的字符串:

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文本時,他們要求純文本,而同一應用的iOS 4下運行獲取純文本?「

回答

5

對於你們在家玩的人來說,這裏是我們發現的答案。

「public.utf8-plain-text」歷史上是在將包含無格式文本的NSString放入粘貼板時使用的正確UTI。內置控件在其「粘貼」操作期間控制所有請求並使用此版本的粘貼板內容(對於5之前的iOS版本)。如果您只在粘貼板中放置了「public.plain-text」或「public.text」文本,則內置控件完全忽略它,表示粘貼板爲空(不提供「粘貼」選項)。

在iOS 5中,有些內容發生了變化,當內置控件在上述情況下請求純文本時,它們將獲得「public.html」文本。

對於iOS 5,您必須使用「public.text」而不是「public.plain-text」或「public.utf8-plain-text」,儘管後兩者可能更正確,而前者太模糊完全有用。由於之前的iOS版本忽略了「public.text」,我們的解決方案是將所有三個版本放在粘貼板上:「public.text」和「public.utf8-plain-text」都會爲您提供純文本和「public.html」將爲您提供HTML文本。這似乎滿足iOS 4和5,而不必在代碼中放置明確的iOS版本測試,代價是在字典中增加一個條目。

蘋果公司的孩子們又失敗了。

編輯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

感謝您的信息。希望你已經把這個記錄成Apple的一個bug。 –

+1

完成。 10329669. – Craig

+0

用於記錄錯誤的+1。非常感謝 ! –

相關問題