2010-11-28 7 views
4

J'essaie d'ajouter des fonctions d'impression à une application ios. lors de l'impression elle-même fonctionne très bien, et l'application fonctionne sur ios> 4, je n'ai pas encore compris comment garder les ios 3.1 compatibilité ...ios: ajoutez l'impression, mais gardez la compatibilité avec ios 3

Je suppose que la question est la suivante: completionHandler: (UIPrintInteractionCompletionHandler)

Un bloc de type UIPrintInteractionCompletionHandler que vous mettre en œuvre pour gérer la conclusion du travail d'impression (par exemple, pour réinitialiser l'état) et gérer les erreurs rencontrées lors de l'impression.

une fois que j'ajouter le bloc:

void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = 
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { 
}; 

l'application ne sera même pas lancer sur iOS 3.1 probablement parce que les blocs ne sont pas là disponibles.

oui, je me suis assuré que ce code ne sera pas exécuté lors de son lancement sur iOS 3.1 ...

if (([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.2) && ([UIPrintInteractionController isPrintingAvailable])) 

donc je me demande s'il y a un moyen d'avoir support d'impression pour iOS> 4.2, mais en gardant pour fonctionner sur iOS 3.1?

peut-être y at-il un moyen d'utiliser une méthode à la place du "bloc"? ou comment serait la bonne façon d'avoir l'impression disponible sur les appareils iOS pris en charge, et rester rétrocompatible avec iOS 3.1?

+1

la réponse courte: n'utilisez pas le compilateur LLVM 1.6. 1) le SDK de base de votre projet doit être iOS 4.2 (ou supérieur), 2) la cible de déploiement de votre projet doit être iOS 3.1 ou supérieure. (vous devez donc abandonner la compatibilité iPhone pré-3.1.), 3) la version du compilateur C/C++ de votre projet doit être LLVM GCC 4.2 (si vous avez besoin de support pour iOS pré-4.0) ou LLVM 1.6 (si vous ne supportez iOS 4.0 et ci-dessus, car il ne sera pas faible liaison lien pour les blocs). ----/trouvé cette réponse dans un message du 22 novembre 2010: http://www.marco.org/ – jra

Répondre

6

ajoutez simplement -weak_framework UIKit aux paramètres du projet sous "Autres indicateurs de liaison" et assurez-vous d'utiliser un code conditionnel pour l'impression de l'API. code conditionnel doit vérifier la disponibilité des fonctionnalités, pas la version OS:

if (NSClassFromString(@"UIPrintInteractionController")){ 
    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = 
    ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { 
    }; 
} 

Définir vos cibles de projet pour iOS 3, et vous êtes bon d'aller.

+0

merci beaucoup! il peut certainement être résolu avec la configuration de construction ... mon problème était, que j'avais LLVM compilateur 1.6 mis [il ne sera pas faible lien de soutien pour les blocs] ... et cela fonctionne parfaitement bien avec LLVM GCC 4.2. voir aussi: http://www.marco.org/ (entrée du 22 novembre 2010) – jra

+0

Vous ne pouvez toujours pas vous référer aux classes UIPrint ..., car elles n'existent pas dans iOS 3.x. Comment t'es-tu débrouillé? –

+0

objektivs, NSClassFromString est seulement utilisé pour détecter si le runtime supporte le UIPrintInteractionController - s'il réussit, vous pouvez l'utiliser, assurez-vous simplement qu'il se trouve dans un bloc de code conditionnel. –

1

Définissez la cible de déploiement dans vos paramètres de projet sur iOS 3.x. Cependant, définissez le SDK de base sur 4.2. Maintenant, vous pouvez utiliser les classes 4.2 et les iPhones 3.x peuvent également installer votre application. Gardez à l'esprit que lorsque vous utilisez une classe 4.2 sur un iPhone 3.x, l'application va planter (donc continuez à vérifier la version du système sur le pouce).

+0

Je l'ai déjà fait. le problème est, que la ligne de code avec le completionHandler provoquera l'application de ne pas fonctionner sur iOS 3.1. mais grâce aux réponses j'ai compris pourquoi. – jra

0
NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare:@"3.2" options: NSNumericSearch]; 
    if (order == NSOrderedSame || order == NSOrderedDescending && [[UIDevice currentDevice]isMultitaskingSupported]) { 
    // >4.2 
    } 
       else { 
         //< 4.2 
       } 

Note: changer aussi UIKit réglage cadre de "nécessaire" à "faible" cela vous aidera à exécuter l'application sur iOs < 4.2 ainsi que iOs> = 4.2

+1

Quelques #defines gentils pour vérifier la version d'iOS sont donnés dans http://stackoverflow.com/questions/3339722/check-iphone-ios-version et compte pour manipuler des chaînes de version comme "4.2.1" – tomwhipple

2

La meilleure pratique pour détecter si AirPrint est disponible, utilisez NSClassFromString. Si vous utilisez cette méthode en général, vous savez toujours si la classe que vous voulez est disponible, sans avoir à coder en dur les fonctionnalités correspondant à quelle version. Exemple de code:

Class printControllerClass = NSClassFromString(@"UIPrintInteractionController"); 
if (printControllerClass) { 
    [self setupCanPrintUI]; 
} else { 
    [self setupCannotPrintUI]; 
} 

De cette façon, votre application peut encore travailler sur les versions précédentes d'iOS, mais il ne sera pas en mesure d'imprimer à partir d'eux.

J'ai été capable d'utiliser cette technique et de l'exécuter sur un périphérique iOS 3.0 sans aucun problème avec le code de bloc (le truc basé sur ^).Dans mes paramètres de génération, le SDK de base est défini sur iOS 4.2 et la cible de déploiement sur iOS 3.0. J'ai posté un projet Xcode à la fin de this blog post on printing in iOS. C'est le projet qui fonctionne avec succès pour moi sur un appareil avec iOS 3.0 et un autre appareil avec iOS 4.2. Vous devrez peut-être modifier l'identifiant du bundle dans info.plist pour que la signature de code fonctionne pour vous, mais cela est indépendant de l'impression.

+0

mon issue avec le ' Le code de bloc 'était, que j'avais LLVM compilateur 1.6 mis [il ne sera pas faible lien de soutien pour les blocs] ... et il fonctionne parfaitement bien avec LLVM GCC 4.2. lire http://www.marco.org/1648550153 (entrée du 22 novembre 2010) pour plus de détails. – jra