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 (и более предыдущих) элементы пользовательского интерфейса в раскадровки могут использовать сочетание атрибутов справа и слева (&) и ведущих и конечных атрибутов (NSLayoutAttributeLeading
NSLayoutAttributeRight
&NSLayoutAttributeTrailing
NSLayoutAttributeLeft
) в одном макете.
Если та же раскадровка запущена в 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 может появиться сообщение о том, что учетная запись разработчика не была доверена на устройстве. Например:
Чтобы устранить эту проблему, сделайте следующее:
Запустите Xcode (последнюю бета-версию) на компьютере разработки Mac.
Выберите устройства в меню "Окно", чтобы открыть окно "Устройства":
На боковой панели DEVICES выберите устройство, щелкните правой кнопкой мыши и выберите "Показать профили подготовки..."
Выберите каждый профиль подготовки на устройстве и нажмите - кнопку, чтобы удалить ее:
В меню Xcode выберите параметры и учетные записи:
Нажмите кнопку "Просмотреть сведения..." , а затем нажмите кнопку "Скачать все ".
После завершения обновления списка нажмите кнопку "Готово " и закройте окно "Настройки".
Удалите существующую версию приложения Xamarin.iOS, которое вы пытались протестировать с устройства iOS.
Вернитесь к 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 приложения, как ожидается, есть корневой контроллер представления в конце запуска приложения, и существующее приложение не выполняется.
Существует по крайней мере два возможных обходных решения для этой проблемы:
- Обновите приложение, чтобы использовать раскадровку вместо файлов для определения пользовательского
xib
интерфейса. Это требует много времени для исправления в зависимости от размера приложения и знаний о том, как использовать конструктор интерфейсов Xcode для макета раскадровки. Дополнительные сведения см. в документации по унифицированным раскадровкам . RootViewController
Настройте свойство окна приложения вFinishedLaunching
классеAppDelegate
, чтобы указать контроллер представления в пользовательском интерфейсе приложения.
Когда инициализировать представления и контроллеры представления
С помощью Xamarin.iOS можно инициализировать представления или контроллеры представления внутри конструкторов, которые вызываются, когда что-то предоставляется в управляемом коде, но он нарушает дизайн iOS.
Как правило, вы не должны инициализировать ничего, что может вызывать Objective-C код из конструктора, так как вы не можете быть уверены, когда он будет вызван. Это также означает, что есть лучшее место (другой Ctor) или вызовы переопределения (как Objective-C и не имеет событий), где эта инициализация должна быть выполнена.