App Sandbox: indicador com escopo de documento não resolvido; não está retornando nenhum erro

Eu estou sandboxing meu aplicativo e tentando permitir a importação / exportação de vários arquivos, usando um arquivo XML para se referir a eles. Para permitir que meu aplicativo (ou outro aplicativo em área restrita) acesse os arquivos listados no XML, também incluo um indicador com escopo de segurança serializado. Eu estou serializando como descrito emesta respostae meus testes unitários (que sãonão sandboxed) escreva e leia os dados XML sem problemas. Quando meu aplicativo resolve o marcador, oNSURL retornado é nulo, como é oNSError referência. Desde que eu não acredito que deveria ser o caso, por que isso está acontecendo? Eu posso contornar isso, pedindo ao usuário para selecionar um arquivo / diretório com umNSOpenPanel, mas eu ainda gostaria de ter os marcadores para trabalhar como deveriam.

Reproduzido em um projeto de teste

Para reproduzir em casa, crie um novo aplicativo Cocoa no Xcode e use o seguinte Gist para os arquivos no projeto:https://gist.github.com/2582589 (atualizado com um loop apropriado de próxima visualização)

Então sigaInstruções da Apple assinar com código o projeto. Você reproduz o problema (que enviei para a Apple comordar: // 11369377) clicando nos botões em sequência. Você escolhe qualquer arquivo no disco (fora do contêiner do aplicativo), depois um XML para exportar e, em seguida, o mesmo XML para importar.

Espero que vocês possam me ajudar a descobrir o que estou fazendo de errado. Ou estou fazendo algo errado e a estrutura está erroneamente guardada para si mesma, ou estou fazendo certo e está totalmente quebrada. Eu tento nãoculpar o quadro, então qual é? Ou existe outra possibilidade?

Código de amostra

Exportando o XML paradocURL:

<code>// After the user picks an XML (docURL) destination with NSSavePanel

[targetURL startAccessingSecurityScopedResource];
NSData *bookmark = [targetURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
                       includingResourceValuesForKeys:nil
                                        relativeToURL:docURL
                                                error:&error];
[targetURL stopAccessingSecurityScopedResource];
</code>

Importando o XML dedocURL:

<code>// After the user selected the XML (docURL) from an NSOpenPanel

NSURL *result = [NSURL URLByResolvingBookmarkData:bookmarkData
                                          options:NSURLBookmarkResolutionWithSecurityScope
                                    relativeToURL:docURL
                              bookmarkDataIsStale:nil
                                            error:&error];
</code>

Eu tentei cercar essa chamada com[docURL ..AccessingSecurityScopedResource], o que não fez diferença (como esperado, já que o docURL já está dentro do escopo depois de ter sido selecionado no painel aberto

Além disso, eu especifico o seguinte na minhaapp.entitlements Arquivo:

<code>com.apple.security.files.user-selected.read-write
com.apple.security.files.bookmarks.app-scope
com.apple.security.files.bookmarks.collection-scope
</code>

Como mencionado acima, o segundo passo (resolver o marcador) é concluído, mas deixaerror eresult nada. Como estou implementando o sandbox, a maioria dos erros que cometi resultaram em umNSError sendo retornado, o que me ajudou a resolver o bug. Mas agora não há erro e nenhuma URL é resolvida.

Etapas diversas de solução de problemas

Eu tentei colocar o arquivo XML no sandbox do meu aplicativo, o que não fez diferença, então o acesso ao arquivo XML não é o problema

O aplicativo usa ARC, mas também os testes de unidade, que são bem-sucedidos. Eu tentei usar um aloc / init em vez do método de classe autoreleased, também (apenas no caso)

Eu colei o código de resolução de URL imediatamente após criar o marcador e ele funciona bem, produzindo um URL com escopo de segurança

Eu fiz umpo no marcador originalmente criado (antes da serialização) e, em seguida, no indicador após a desserialização, e eles correspondem 100%. Serialização não é o problema

Substituí a chamada de resolução porCFURLCreateByResolvingBookmarkData(..), sem alteração. Se for um bug, ele está presente na API do Core Foundation, assim como na camada de cacau

Especificando um valor parabookmarkDataIsStale: não tem efeito

Se eu especificar0 paraoptions:, então euFaz recuperar uma NSURL válida, mas ela não tem escopo de segurança e, portanto, as chamadas subseqüentes para ler o arquivo ainda falham

Em outras palavras, o indicador desserializado parece ser válido. Se os dados do marcador estiverem corrompidos, duvido que a NSURL possa fazer algo com ele

NSURL.h não contém nenhum comentário útil para apontar algo que estou fazendo errado

Alguém mais está usando marcadores de documento com escopo de segurança em um aplicativo de área restrita com êxito? Se sim, o que você está fazendo diferente do que eu sou?

Pedido de versão do sistema operacional

Alguém com acesso ao beta do Leão da montanha pode verificar se o meu projeto de amostra mostra o mesmo erro (falta de um)? Se for um bug que foi corrigido depois do Lion, não vou me preocupar com isso. Ainda não estou no programa de desenvolvimento e, portanto, não tenho acesso. Não tenho certeza se responder a essa pergunta violaria o NDA, mas espero que não.

questionAnswers(1)

yourAnswerToTheQuestion