Compartilhar via


Xamarin.iOS 9 – Solução de problemas

Este artigo fornece várias dicas de solução de problemas para trabalhar com o iOS 9 em aplicativos Xamarin.iOS.

Onde estão os simuladores do iOS 8?

Se você instalou o Xcode 7 (ou superior), ele substituirá automaticamente todos os simuladores do iOS 8 por simuladores do iOS 9 por padrão. Se você ainda precisar testar no iOS 8, você pode iniciar o Xcode e, em seguida, baixar e instalar os simuladores do iOS 8.

No Xcode, selecione o menu Xcode e depois Preferências...>Downloads:

iOS 8 Simulators Downloads

Selecione o botão Verificar e instalar agora para reinstalar os simuladores do iOS 8.

Restrição de layout com erros de atributo esquerdo/direito

No iOS 8 (e anteriores), os elementos da interface do usuário em Storyboards podiam usar uma mistura de Atributos Direita & Esquerda (NSLayoutAttributeRight & NSLayoutAttributeLeft) e Atributos À Esquerda & À Direita (NSLayoutAttributeLeading & NSLayoutAttributeTrailing) no mesmo layout.

Se o mesmo Storyboard for executado no iOS 9, ele resultará em uma exceção da seguinte forma:

Encerrando o aplicativo devido à exceção não detectada 'NSInvalidArgumentException', motivo: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Não é possível fazer uma restrição entre um atributo à esquerda/à direita e um atributo direita/esquerda. Use leading/trailing para ambos ou para nenhum dos dois."

O iOS 9 impõe layouts para usar os atributos Right & LeftouLeading & Trailing, mas não ambos. Para corrigir esse problema, altere todas as restrições de layout para usar o mesmo atributo definido dentro do arquivo Storyboard.

Para obter mais informações, consulte a discussão Stack Overflow de erro de restrição do iOS 9.

ERRO ITMS-90535: Chave CFBundleExecutable inesperada

Depois de mudar para o iOS 9, a partir de um aplicativo usa componentes de terceiros (especificamente nosso componente existente do Google Maps) que compilou e executou no iOS 8 (ou anterior), ao tentar enviar a nova compilação para o iTunes Connect você pode obter um erro no formulário:

ERRO ITMS-90535: Chave CFBundleExecutable inesperada. O pacote em 'Payload/app-name.app/component.bundle' não contém um executável de pacote...

Esse problema geralmente pode ser resolvido encontrando o pacote nomeado no projeto, em seguida, - assim como a mensagem de erro sugere - editado o Info.plist que está no pacote removendo a CFBundleExecutable chave. A CFBundlePackageType chave também deve ser definida BNDL .

Depois de fazer essas alterações, faça uma limpeza e reconstrua todo o projeto. Você pode enviar para o iTunes Connect sem problemas depois de fazer essas alterações.

Para obter mais informações, consulte esta discussão sobre estouro de pilha.

Erro CFNetwork SSLHandshake (-9824)

Ao tentar se conectar à Internet, diretamente ou a partir de uma exibição da Web no iOS 9, você pode receber um erro no formulário:

2015-09-04 14:38:05.757 FormsWebViewiOS[2553:30362] CFNetwork SSLHandshake failed (-9824)
2015-09-04 14:38:05.758 FormsWebViewiOS[2553:30363] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)

Ou na forma:

2015-09-04 14:39:17.881 FormsWebViewiOS[2568:30974] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
Temporary exceptions can be configured via your app's Info.plist file.

No iOS9, o ATS (App Transport Security) impõe conexões seguras entre recursos da Internet (como o servidor back-end do aplicativo) e seu aplicativo. Além disso, o ATS requer que a comunicação usando o protocolo e a HTTPS comunicação de API de alto nível seja criptografada usando TLS versão 1.2 com sigilo de encaminhamento.

Como o ATS está habilitado por padrão em aplicativos criados para iOS 9 e OS X 10.11 (El Capitan), todas as conexões que usam NSURLConnection, CFURLou NSURLSession estarão sujeitas aos requisitos de segurança do ATS. Se suas conexões não atenderem a esses requisitos, elas falharão com uma exceção.

Consulte a seção Desativar o ATS do nosso guia de Segurança de Transporte de Aplicativo para obter informações sobre como resolver esse problema.

Meus aplicativos existentes não são executados no iOS 9

Consulte nossas informações de compatibilidade do iOS 9 para obter instruções sobre como recriar e reimplantar seus aplicativos existentes para execução no iOS 9.

UICollectionViewCell.ContentView é nulo em construtores

Motivo: No iOS 9, o initWithFrame: construtor agora é necessário, devido a mudanças de comportamento no iOS 9, como afirma a documentação UICollectionView. Se você registrou uma classe para o identificador especificado e uma nova célula deve ser criada, a célula agora é inicializada chamando seu initWithFrame: método.

Correção: Adicione o initWithFrame: construtor assim:

[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
    Initialize (); // refactor initialize code into a method
}

Exemplos relacionados: MotionGraph, TextKitDemo

UIView falha ao iniciar com codificador ao carregar uma exibição de um Xib/Nib

Motivo: O initWithCoder: construtor é chamado ao carregar uma exibição de um arquivo Xib do Construtor de Interfaces. Se esse construtor não for exportado, o código não gerenciado não poderá chamar a versão gerenciada dele. Anteriormente (por exemplo, no iOS 8) o construtor era invocado IntPtr para inicializar visualizações.

Correção: Crie e exporte o initWithCoder: construtor assim:

[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
    Initialize (); // refactor initialize code into a method
}

Exemplo relacionado: Chat

Mensagem Dyld: Nenhuma imagem de cache com nome...

Você pode enfrentar uma falha com as seguintes informações no log:

Dyld Error Message:
Dyld Message: no cach image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)

Motivo: este é um bug no linker nativo da Apple, que acontece quando eles tornam uma estrutura privada pública (JavaScriptCore foi tornado público no iOS 7, antes disso era uma estrutura privada), e o objetivo de implantação do aplicativo é para uma versão iOS quando a estrutura era privada. Nesse caso, o vinculador da Apple será vinculado à versão privada do framework em vez da versão pública.

Correção: Isso será abordado para o iOS 9, mas há uma solução fácil que você pode aplicar a si mesmo enquanto isso: basta direcionar uma versão posterior do iOS em seu projeto (você pode tentar o iOS 7 neste caso). Outras estruturas podem apresentar problemas semelhantes, por exemplo, a estrutura do WebKit foi tornada pública no iOS 8 (e, portanto, segmentar o iOS 7 resultará nesse erro; você deve direcionar o iOS 8 para usar o WebKit em seu aplicativo).

Desenvolvedor corporativo não confiável

Ao tentar executar a versão iOS 9 do seu aplicativo Xamarin.iOS em hardware iOS real, você pode receber uma mensagem informando que sua conta de desenvolvedor não é confiável no dispositivo. Por exemplo:

Untrusted Enterprise Developer alert

Para resolver esse problema, faça o seguinte:

  1. Inicie o Xcode (a versão beta mais recente) no Mac de desenvolvimento.

  2. Selecione Dispositivos no menu Janela para abrir a Janela Dispositivos:

    The Devices Window

  3. No painel lateral DISPOSITIVOS, selecione seu dispositivo, clique com o botão direito do mouse e selecione Mostrar perfis de provisionamento...:

    SShow Provisioning Profiles

  4. Selecione cada perfil de provisionamento atualmente no dispositivo e selecione o - botão para excluí-lo:

    Deleting a provisioning profile

  5. No menu Xcode , selecione Preferências... e Contas:

    Xcode account preferences

  6. Clique no botão Ver Detalhes... e, em seguida, selecione o botão Baixar tudo :

    Download all profiles

  7. Quando a atualização da lista terminar, selecione o botão Concluído e feche a janela Preferências.

  8. Remova a versão existente do aplicativo Xamarin.iOS que você estava tentando testar do dispositivo iOS.

  9. Retorne ao Visual Studio para Mac, faça uma compilação limpa e tente executar novamente o aplicativo no dispositivo.

Talvez seja necessário parar e reiniciar o Visual Studio para Mac antes que os novos perfis de provisionamento carregados pelo Xcode sejam vistos. Talvez você também precise ajustar as opções de assinatura de pacote do iOS para seu aplicativo Xamarin.iOS para selecionar os novos perfis de provisionamento.

Problemas da tela de inicialização

O iOS 9 agora impõe os requisitos da tela de inicialização para que a mesma imagem de inicialização não possa mais ser reutilizada para oferecer suporte a diferentes orientações de interface. Consulte a Referência UILanchImage da Apple para obter mais informações.

Opcionalmente, você pode usar um arquivo de storyboard para apresentar a Tela de Inicialização do seu aplicativo, em vez de usar um conjunto de arquivos de imagem .png. Esta é agora a maneira preferida da Apple para apresentar telas de lançamento. Consulte nosso guia de Introdução aos Storyboards Unificados para obter mais informações.

Por fim, seu aplicativo deve usar um arquivo de storyboard para sua Tela de Inicialização e oferecer suporte a todas as quatro orientações de interface (Retrato, Retrato de cabeça para baixo, Paisagem à esquerda e Paisagem à direita) a serem consideradas para execução em um painel Slide Over ou no modo de Visualização dividida. Para saber mais sobre as novas habilidades multitarefa do iOS 9, consulte nosso guia Multitarefa para iPad .

Exceção NSInternalInconsistencyException

Ao compilar e executar um aplicativo Xamarin.iOS existente para iOS 9, você pode receber um erro no formato:

Objective-C exceção lançada. Nome: NSInternalInconsistencyException Motivo: Espera-se que as janelas do aplicativo tenham um controlador de exibição raiz no final da inicialização do aplicativo

Esse erro está sendo gerado porque espera-se que o Windows do aplicativo tenha um Controlador de Exibição Raiz no final da inicialização do aplicativo e seu aplicativo existente não.

Há pelo menos duas soluções possíveis para esse problema:

  1. Atualize o aplicativo para usar o arquivo de storyboard em vez de arquivos para definir sua interface do xib usuário. Isso requer muito tempo para corrigir, dependendo do tamanho do seu aplicativo e do conhecimento de como usar o Construtor de Interfaces do Xcode para criar storyboards de layout. Para obter mais informações, consulte nossa documentação de Introdução aos Storyboards Unificados .
  2. Configure a RootViewController propriedade de Window do aplicativo no FinishedLaunching método na AppDelegate classe para apontar para um View Controller na interface do usuário do seu aplicativo.

Quando inicializar modos de exibição e controladores de exibição

Com o Xamarin.iOS, é possível fazer com que Views ou View Controllers inicializem dentro de construtores, que são chamados quando algo é exposto em código gerenciado, mas quebra o design do iOS.

Em geral, você não deve inicializar nada que possa chamar de volta Objective-C o código do construtor, pois você não pode ter certeza de quando ele será chamado. Isso também significa que há um lugar melhor (outro .ctor) ou chamadas para substituir (como Objective-C não tem eventos) onde essa inicialização deve ser feita.