Поделиться через


Xamarin.iOS 9 — устранение неполадок

В этой статье приведены несколько советов по устранению неполадок для работы с iOS 9 в приложениях Xamarin.iOS.

Где находятся симуляторы iOS 8?

Если вы установили Xcode 7 (или более поздней версии), он автоматически заменит все симуляторы iOS 8 симуляторами iOS 9 по умолчанию. Если вам по-прежнему нужно протестировать на iOS 8, можно запустить Xcode, а затем скачать и установить симуляторы iOS 8.

В Xcode выберите меню Xcode и параметры...>Скачивание:

Скачивание симуляторов iOS 8

Нажмите кнопку "Проверить и установить сейчас", чтобы переустановить симуляторы iOS 8.

Ограничение макета с ошибками атрибутов слева или вправо

В iOS 8 (и более предыдущих) элементы пользовательского интерфейса в раскадровки могут использовать сочетание атрибутов справа и слева (&) и ведущих и конечных атрибутов (NSLayoutAttributeLeadingNSLayoutAttributeRight&NSLayoutAttributeTrailingNSLayoutAttributeLeft) в одном макете.

Если та же раскадровка запущена в iOS 9, это приведет к исключению в следующей форме:

Завершающее приложение из-за неоценимого исключения NSInvalidArgumentException: "*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: ограничение нельзя сделать между начальным/конечным атрибутом и правым или левым атрибутом. Используйте начальный или конечный путь для обоих или ни для того, ни другого.

iOS 9 применяет макеты для использования атрибутов Right и Left или Leading и Trailing, но не обоих. Чтобы устранить эту проблему, измените все ограничения макета, чтобы использовать один и тот же набор атрибутов в файле раскадровки.

Дополнительные сведения см. в обсуждении ошибки стека переполнения стека ограничений iOS 9.

ОШИБКА ITMS-90535: непредвиденный ключ CFBundleExecutable

После перехода на iOS 9 из приложения используются сторонние компоненты (в частности, существующий компонент Google Maps), скомпилированные и запущенные в iOS 8 (или более ранних версиях), при попытке отправить новую сборку в iTunes Connect, вы можете получить ошибку в форме:

ОШИБКА ITMS-90535: непредвиденный ключ CFBundleExecutable. Пакет по адресу "Полезные данные/app-name.app/component.bundle" не содержит исполняемый файл пакета...

Эта проблема обычно может быть решена путем поиска именованного пакета в проекте , так же, как сообщение об ошибке предлагает - отредактировало Info.plist , что находится в пакете, удалив CFBundleExecutable ключ. Кроме CFBundlePackageType того, необходимо задать BNDL ключ.

После внесения этих изменений выполните очистку и перестройте весь проект. После внесения этих изменений вы можете отправить в iTunes Connect без проблем.

Дополнительные сведения см. в этом обсуждении Stack Overflow .

Ошибка SSLHandshake CFNetwork (-9824)

При попытке подключиться к Интернету напрямую или из веб-представления в iOS 9 может возникнуть ошибка в форме:

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)

Или в форме:

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.

В iOS9 безопасность транспорта приложений (ATS) обеспечивает безопасные подключения между интернет-ресурсами (например, сервером серверного сервера приложения) и приложением. Кроме того, ATS требует обмена данными с использованием HTTPS протокола и высокоуровневого взаимодействия API для шифрования с помощью TLS версии 1.2 с секретностью пересылки.

Так как ATS включен по умолчанию в приложениях, созданных для iOS 9 и OS X 10.11 (El Capitan), все подключения, использующие NSURLConnection, CFURLили NSURLSession будут соответствовать требованиям безопасности ATS. Если ваши подключения не соответствуют этим требованиям, они завершаются ошибкой с исключением.

Дополнительные сведения об устранении этой проблемы см. в разделе "Отказ от использования ATS" в руководстве по безопасности транспорта приложений.

Мои существующие приложения не работают в iOS 9

Сведения о совместимости iOS 9 см. в инструкциях по перестроению и повторному развертыванию существующих приложений для запуска в iOS 9.

UICollectionViewCell.ContentView имеет значение NULL в конструкторах

Причина. В iOS 9 конструктор теперь требуется из-за изменений поведения в iOS 9 initWithFrame: в качестве состояний документации UICollectionView. Если вы зарегистрировали класс для указанного идентификатора и необходимо создать новую ячейку, она теперь инициализирована путем вызова его initWithFrame: метода.

ИсправлениеinitWithFrame:: добавьте конструктор следующим образом:

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

Связанные примеры: MotionGraph, TextKitDemo

UIView не удается ввести кодировщик при загрузке представления из Xib/Nib

Причина. Конструктор initWithCoder: вызывается при загрузке представления из Xib-файла построителя интерфейсов. Если этот конструктор не экспортируется, неуправляемый код не может вызвать управляемую версию. Ранее (например, в iOS 8) IntPtr конструктор был вызван для инициализации представлений.

Исправление: создайте и экспортируйте initWithCoder: конструктор следующим образом:

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

Связанный пример: чат

Dyld Message: Нет образа кэша с именем...

В журнале может возникнуть сбой со следующими сведениями:

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

Причина. Это ошибка в собственном компоновщике Apple, которая происходит, когда они делают частную платформу общедоступной (JavaScriptCore был открыт в iOS 7, прежде чем она была частной платформой), а цель развертывания приложения — для версии iOS, когда платформа была закрытой. В этом случае компоновщик Apple будет связываться с частной версией платформы вместо общедоступной версии.

Исправление. Это будет решено для iOS 9, но в этом случае можно применить простое решение: просто нацелиться на более позднюю версию iOS в проекте (в этом случае можно попробовать iOS 7). Другие платформы могут столкнуться с аналогичными проблемами, например, платформа WebKit была открыта в iOS 8 (и поэтому назначение iOS 7 приведет к этой ошибке. Для использования WebKit в приложении следует использовать WebKit 8).

Ненадежный корпоративный разработчик

При попытке запустить приложение Xamarin.iOS версии iOS на реальном оборудовании iOS iOS может появиться сообщение о том, что учетная запись разработчика не была доверена на устройстве. Например:

Ненадежный оповещение разработчика enterprise

Чтобы устранить эту проблему, сделайте следующее:

  1. Запустите Xcode (последнюю бета-версию) на компьютере разработки Mac.

  2. Выберите устройства в меню "Окно", чтобы открыть окно "Устройства":

    Окно устройств

  3. На боковой панели DEVICES выберите устройство, щелкните правой кнопкой мыши и выберите "Показать профили подготовки..."

    Профили подготовки SShow

  4. Выберите каждый профиль подготовки на устройстве и нажмите - кнопку, чтобы удалить ее:

    Удаление профиля подготовки

  5. В меню Xcode выберите параметры и учетные записи:

    Параметры учетной записи Xcode

  6. Нажмите кнопку "Просмотреть сведения..." , а затем нажмите кнопку "Скачать все ".

    Скачивание всех профилей

  7. После завершения обновления списка нажмите кнопку "Готово " и закройте окно "Настройки".

  8. Удалите существующую версию приложения Xamarin.iOS, которое вы пытались протестировать с устройства iOS.

  9. Вернитесь к Visual Studio для Mac, выполните чистую сборку и попытайтесь повторно запустить приложение на устройстве.

Перед просмотром новых профилей подготовки, загруженных Xcode, может потребоваться остановить и перезапустить Visual Studio для Mac. Вам также может потребоваться настроить параметры подписи пакета iOS для приложения Xamarin.iOS, чтобы выбрать новые профили подготовки.

Проблемы с экраном запуска

IOS 9 теперь применяет требования к экрану запуска, чтобы один и тот же образ запуска больше не был использован для поддержки различных ориентаций интерфейса. Дополнительные сведения см. в справочнике по UILanchImage Apple.

При необходимости можно использовать раскадровку для представления экрана запуска приложения, а не для использования набора файлов изображений .png . Теперь это предпочтительный способ apple представить экраны запуска. Дополнительные сведения см. в руководстве по унифицированным раскадровкам .

Наконец, приложение должно использовать раскадровки для своего экрана запуска и поддерживать все четыре ориентации интерфейса (книжный, перевернутый вниз книжный, альбомный левый и альбомный правый) для запуска на панели слайд-over или в режиме разделения представления. Чтобы узнать больше о новых возможностях многозадачности iOS 9, ознакомьтесь с нашим руководством по многозадачности для iPad .

Исключение NSInternalInconsistencyException

При компиляции и запуске существующего приложения Xamarin.iOS для iOS 9 может возникнуть ошибка в форме:

Objective-C исключение, вызванное. Имя: NSInternalInconsistencyException Reason: окна приложений должны иметь корневой контроллер представления в конце запуска приложения.

Эта ошибка возникает из-за того, что в windows приложения, как ожидается, есть корневой контроллер представления в конце запуска приложения, и существующее приложение не выполняется.

Существует по крайней мере два возможных обходных решения для этой проблемы:

  1. Обновите приложение, чтобы использовать раскадровку вместо файлов для определения пользовательского xib интерфейса. Это требует много времени для исправления в зависимости от размера приложения и знаний о том, как использовать конструктор интерфейсов Xcode для макета раскадровки. Дополнительные сведения см. в документации по унифицированным раскадровкам .
  2. RootViewController Настройте свойство окна приложения в FinishedLaunching классеAppDelegate, чтобы указать контроллер представления в пользовательском интерфейсе приложения.

Когда инициализировать представления и контроллеры представления

С помощью Xamarin.iOS можно инициализировать представления или контроллеры представления внутри конструкторов, которые вызываются, когда что-то предоставляется в управляемом коде, но он нарушает дизайн iOS.

Как правило, вы не должны инициализировать ничего, что может вызывать Objective-C код из конструктора, так как вы не можете быть уверены, когда он будет вызван. Это также означает, что есть лучшее место (другой Ctor) или вызовы переопределения (как Objective-C и не имеет событий), где эта инициализация должна быть выполнена.