2011-10-17 2 views
3

Nous avons une application existante qui permet à l'utilisateur de copier du texte dans la table de montage. Lorsque cela est possible, nous mettons du HTML et du texte brut dans le presse-papiers, car nous ne savons pas quelle autre application l'utilisateur pourrait coller et vouloir fournir à la fois des données formatées (HTML) et non formatées. Cette fonctionnalité fonctionne très bien avec iOS 3 et 4. Mais dès que l'utilisateur installe iOS 5, lorsqu'il colle du texte de notre application dans une autre application, l'autre application reçoit le texte HTML mais le traite en texte brut. Donc, si elles sélectionnent et copient un en-tête H1, lorsqu'elles sont collées dans l'autre application, au lieu de voir "Ceci est un titre", elles voient "< h1> Ceci est un en-tête </h1>".D'autres applications collez le code HTML plutôt que la version texte de nos données de tableau dans iOS 5

Notez que ceci est avec le code existant qui fonctionne bien dans iOS 3 et 4. Il n'y a pas de changement à notre code entre iOS 3, 4 et 5.

Pour être complet, voici le code que nous utilisons pour mettre notre texte sur la table de montage, avec une chaîne simple si juste pour la référence:

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

de toute évidence, ma question est « Pourquoi iOS 5 applications obtenir le texte HTML lorsqu'ils demandent le texte brut, alors que la même application fonctionnant sous iOS 4 obtient le texte brut? "

Répondre

5

Pour ceux d'entre vous qui jouent à la maison, voici la réponse que nous avons trouvée. "Public.utf8-plain-text" a toujours été l'UTI correct à utiliser lors de la mise en place d'un texte non formaté contenant NSString dans la table de montage. Les contrôles intégrés tous demandent et utilisent cette version du contenu du carton lors de leurs opérations de "collage" (pour les versions iOS antérieures à 5). Si vous placez uniquement du texte "public.plain-text" ou "public.text" dans la table de montage, les contrôles intégrés l'ignorent complètement, indiquant que le "pasteboard" est vide (ne vous donnant pas l'option "paste").

Dans iOS 5, quelque chose a changé et lorsque les commandes intégrées demandent du texte brut dans la situation ci-dessus, elles reçoivent le texte "public.html". Pour iOS 5, vous devez utiliser "public.text" au lieu de "public.plain-text" ou "public.utf8-plain-text", même si les deux derniers sont sans doute plus corrects et que le premier est trop vague pour être utile du tout. Depuis que les versions antérieures d'iOS ignorent "public.text", notre solution consiste à placer les trois versions sur la table de montage: "public.text" et "public.utf8-plain-text" vous donneront le texte en clair et "public.html" vous obtiendra le texte HTML. Cela semble satisfaire à la fois iOS 4 et 5 sans avoir à mettre un test de version iOS explicite dans le code, au prix d'une entrée supplémentaire dans le dictionnaire.

Encore un échec pour les enfants chez Apple.

EDIT pour 2016 et iOS 8/9

J'ai essayé de résoudre ce problème une fois pour toutes depuis que je posté cette question. Chaque fois que je fais une recherche Google, je me retrouve toujours à cette question.

Quelque part sur la ligne, iOS a introduit un concept de «web archive» pour mettre du code HTML sur la table de montage. Ce n'est pas bien documenté nulle part. J'ai trouvé une réponse here qui est antérieure à ma question, donc c'est un peu frustrant, mais ça fonctionne. Je l'ai mis à jour pour tirer parti de l'encodage base64 intégré dans les versions ultérieures d'iOS.Il se passe quelque chose comme ceci:

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

Merci pour l'info. J'espère que vous avez enregistré cela comme un bug chez Apple. –

+1

Terminé. 10329669. – Craig

+0

Et +1 pour la consignation du bogue. Merci beaucoup ! –

Questions connexes