# Xcode 4 / Sandboxing : problème avec fichier PDF



## POUNAS (23 Août 2012)

Salut à toutes et à tous,

J'ai activé le "sandboxing" pour mon application (enable app sandboxing, allow printing, user selected file access "read/write access") sous XCode 4.4.

(pour info, je suis sous 10.8.1)

Mais quand je souhaite, dans mon application, générer un fichier PDF à partir du dialogue "Imprimer" - je ne peux pas !

Voici le message d'erreur (dans les log) :

"deny file-write-create ... /file.pdf" !

J'ai peut être oublié quelque chose...

Si vous avez une idée, ne pas hésiter.

merci par avance.

OUNAS


----------



## Nyx0uf (24 Août 2012)

Si tu souhaites enregistré dans un endroit autre que les dossiers par défaut (Pictures, Downloads, Movies) il faut que tu demandes à l'utilisateur où, via un NSOpenPanel par exemple.

Ensuite il faut utiliser les Security-scoped bookmarks : http://developer.apple.com/library/...uide/AppSandboxInDepth/AppSandboxInDepth.html


----------



## POUNAS (24 Août 2012)

merci pour ta réponse.

j'ai ajouté dans mon fichier entitlements :

com.apple.security.files.bookmarks.document-scope YES
com.apple.security.files.bookmarks.app-scope YES

le problème persiste. :hein:

voici le code pour générer mon fichier pdf :


```
... NSPrintOperation *printOp = [NSPrintOperation printOperationWithView : viewToPrint printInfo: printInfo];
            
[printOp setShowsPrintPanel: NO];
[printOp setShowsProgressPanel: YES];
            
[printOp runOperation]; ...
```

en fait j'utilise le print dialog pour générer mon pdf.

je n'utilise donc pas réellement d'URL (la notion d'URL est importante pour utiliser  la méthode bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error: par exemple).

comment autoriser alors le print dialog à sauvegarder mon fichier PDF en dehors du scope défini par la sandbox ?


----------



## Lio70 (24 Août 2012)

J'ai du mal a voir ou est ton probleme car avec des settings sandbox/entitlements identiques a ceux que tu indiques dans ton premiere message, je n'ai pas ce probleme avec mon app dans une situation similaire.

Essaye avec setShowsPrintPanel:YES pour sauver le PDF manuellement et vois si tu as encore l'erreur.
Si oui, a l'ouverture du panel ou bien au moment de sauver le PDF a proprement parler ?


----------



## POUNAS (25 Août 2012)

Au moment de sauvegarder le fichier à proprement parler.

Aucun pb avec le save panel.

Après avoir saisi le nom du fichier pdf, j'ai le message "impression impossible" qui apparaît.

Et dans les log, un deny create


----------



## Lio70 (25 Août 2012)

Et ce, quel que soit l'endroit ou tu choisis d'enregistrer le fichier ?

Dans ton premier message, l'erreur est claire: tu veux sauver a un endroit ou tu n'as pas les droits en ecriture. Au fait, pourquoi as-tu cree/modifie ton fichier d'entitlements manuellement? Cela n'est pas necessaire. tu devrais t'en sortir avec les cases a cocher des options d'Xcode. Je parle de tes deux lignes:
com.apple.security.files.bookmarks.document-scope YES
com.apple.security.files.bookmarks.app-scope YES


----------



## POUNAS (25 Août 2012)

"Et ce, quel que soit l'endroit ou tu choisis d'enregistrer le fichier ?"

non en fait, je peux sauvegarder mon fichier PDF uniquement dans les répertoires images, musique, ... ceux qui sont controllés par la sandbox.

mais si par exemple, je veux sauvegarder mon fichier sur le bureau, je ne peux pas.

j'ai utilisé les attributs 
com.apple.security.files.bookmarks.document-scope YES
com.apple.security.files.bookmarks.app-scope YES
car d'après la doc d'Apple, ils permettraient d'écrire en dehors du scope de la sandbox.

---------- Nouveau message ajouté à 16h07 ---------- Le message précédent a été envoyé à 14h47 ----------

fait intéressant, j'ai supprimé dans mon code "*[printOp setShowsPrintPanel: NO];*".

il apparait le save panel et aussi comme prévu le print dialog.

je sélectionne l'option "generate pdf" dans le print dialog, j'écris le nom de mon fichier quelque part dans mon file system...

et la surprise, ca marche !!!!

Dans mon application, j'ai une toolbar qui contient 2 options : print and save PDF file.

je souhaite conserver ces 2 options (si possible !).

printOp setShowsPrintPanel: NO avec sandbox : un problème d'autorisation ?

*****

Autre fait intéressant, j'ai utilisé mon option "print" qui affiche un dialogue print traditionnel.

je sélectionne l'option "generate pdf", j'écris le nom de mon fichier quelque part dans mon file system...

et la ca ne marche pas !!!! mais j'ai pas les mêmes logs que mon problème principal.

voici les logs :

Aug 25 15:52:01 Mac-mini-de-Fabrice.local com.apple.SecurityServer[15]: Succeeded authorizing right 'system.print.admin' by client '/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/printtool' [454] for authorization created by '/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/printtool' [454] (0,0)
Aug 25 15:52:04 Mac-mini-de-Fabrice.local librariand[920]: client process 996 does not have a valid com.apple.developer.ubiquity-container-identifiers entitlement
Aug 25 15:52:04 Mac-mini-de-Fabrice.local librariand[920]: error in handle_container_path_request: LibrarianErrorDomain/9/The client process does not have a valid com.apple.developer.ubiquity-container-identifiers entitlement
Aug 25 15:52:10 Mac-mini-de-Fabrice.local Hiero[996]: *** Assertion failure in -[NSAccessoryWindow sendEvent:], /SourceCache/RemoteViewServices/RemoteViewServices-80.3/NSAccessoryWindow.m:144
Aug 25 15:52:10 Mac-mini-de-Fabrice.local Hiero[996]: window allowed unexpectedly

Nous avons donc 2 comportements totalement différents !!!


----------

