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, poderá iniciar o Xcode e, em seguida, baixar e instalar os simuladores do iOS 8.
No Xcode, selecione o menu Xcode e, em seguida , Preferências...>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 nos Storyboards podiam usar uma combinação de Atributos Direito e Esquerdo (NSLayoutAttributeRight
& NSLayoutAttributeLeft
) e Atributos À Esquerda e à Direita (NSLayoutAttributeLeading
& NSLayoutAttributeTrailing
) no mesmo layout.
Se o mesmo Storyboard for executado no iOS 9, isso resultará em uma exceção no seguinte formato:
Encerrando o aplicativo devido à exceção não detectada 'NSInvalidArgumentException', motivo: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: uma restrição não pode ser feita entre um atributo à esquerda/à direita e um atributo à direita/à esquerda. Use à esquerda/à direita para ambos ou nenhum.'
O iOS 9 impõe layouts para usar os atributos Direita e Esquerda ou À Esquerda e à Direita, 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 do Stack Overflow sobre o 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 que usa componentes de terceiros (especificamente nosso componente existente do Google Maps) que compilou e foi executado 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 e, em seguida, assim como a mensagem de erro sugere, editando 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 o Stack Overflow .
Erro CFNetwork SSLHandshake falhou (-9824)
Ao tentar se conectar à Internet, diretamente ou de uma visualização da Web no iOS 9, você pode receber um erro no formato:
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 os recursos da Internet (como o servidor de back-end do aplicativo) e seu aplicativo. Além disso, o ATS requer comunicação usando o protocolo e a comunicação de API de alto nível a ser criptografada usando TLS HTTPS
versão 1.2 com sigilo de encaminhamento.
Como o ATS é ativado por padrão em aplicativos criados para iOS 9 e OS X 10.11 (El Capitan), todas as conexões que usam NSURLConnection
, CFURL
, ou 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 Recusa do ATS do nosso guia 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 com o iOS 9 para obter instruções sobre como recriar e reimplantar seus aplicativos existentes para serem executados no iOS 9.
UICollectionViewCell.ContentView é nulo em construtores
Motivo: no iOS 9, o initWithFrame:
construtor agora é necessário, devido a alterações de comportamento no iOS 9, conforme a documentação UICollectionView afirma. 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 inicializar com o 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 IntPtr
construtor era invocado 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 de Dyld: Nenhuma imagem de cache com nome...
Você pode ter 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 vinculador nativo da Apple, que acontece quando eles tornam pública uma estrutura privada (o JavaScriptCore foi tornado público no iOS 7, antes disso era uma estrutura privada) e o destino de implantação do aplicativo é para uma versão do iOS quando a estrutura era privada. Nesse caso, o vinculador da Apple será vinculado à versão privada da estrutura em vez da versão pública.
Correção: isso será resolvido para o iOS 9, mas há uma solução alternativa fácil que você pode aplicar 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, direcionar 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:
Para resolver esse problema, faça o seguinte:
Inicie o Xcode (a versão beta mais recente) no Mac de desenvolvimento.
Selecione Dispositivos no menu Janela para abrir a janela Dispositivos:
No painel lateral DISPOSITIVOS, selecione seu dispositivo, clique com o botão direito do mouse e selecione Mostrar perfis de provisionamento...:
Selecione cada perfil de provisionamento atualmente no dispositivo e selecione o - botão para excluí-lo:
No menu Xcode , selecione Preferências... e Contas:
Clique no botão Exibir detalhes... e selecione o botão Baixar tudo :
Quando a atualização da lista terminar, selecione o botão Concluído e feche a janela Preferências.
Remova a versão existente do aplicativo Xamarin.iOS que você estava tentando testar no dispositivo iOS.
Retorne ao Visual Studio para Mac, faça um build limpo 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 na 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 dar 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 de apresentar telas de inicialização. Consulte nosso guia 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 dar 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 exibiçã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 formulário:
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 aplicativo Windows 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 alternativas possíveis para esse problema:
- Atualize o aplicativo para usar o arquivo de storyboard em vez de
xib
arquivos para definir sua interface do 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 fazer o layout de storyboards. Para obter mais informações, consulte nossa documentação Introdução aos Storyboards Unificados . RootViewController
Configure a propriedade de app Window noFinishedLaunching
método naAppDelegate
classe para apontar para um Controlador de Exibição na interface do usuário do aplicativo.
Quando inicializar exibições e controladores de exibição
Com o Xamarin.iOS, é possível que Views ou View Controllers sejam inicializados dentro de construtores, que são chamados quando algo é exposto no código gerenciado, mas interrompe 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 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.