iOS 9 호환성

iOS 9 기능을 바로 앱에 추가할 계획이 없더라도 최신 버전의 Xamarin으로 앱을 다시 빌드해야 합니다.

Important

이 페이지의 정보는 iOS 9 호환성에 대한 업데이트를 아직 제출하지 않은 iOS 8 이하를 대상으로 하는 앱 스토어에 이미 있는 앱을 사용하는 고객을 위한 것입니다. 이미 최신 버전인 Xcode 7 및 Xamarin.iOS 9를 사용하고 있는 경우 앱 개발을 위해 iOS 9 소개를 참조하세요.

첫 번째 iOS 9 베타가 표시되었을 때 이전 버전의 Xamarin에서 iOS 9에서 시작할 수 없는 이전 앱으로 나타나는 두 가지 문제를 확인했습니다.

  • 32비트 디바이스(통합 API를 사용하여 빌드된 앱 포함)에서 시작할 수 없는 iOS 8 이하용 앱을 빌드합니다.
  • 전체 경로로 실패한 P/Invoke가 지정되지 않았습니다.

Xamarin 설치를 최신 안정 채널 릴리스로 업데이트한 다음, 앱을 다시 빌드하고 다시 배포하면 이러한 두 가지 문제가 해결됩니다.

iOS 9 기능으로 앱을 즉시 업데이트할 계획이 없는 경우에도 최신 버전의 Xamarin으로 다시 빌드하고 App Store에 다시 제출하는 것이 좋습니다.

이렇게 하면 고객이 업그레이드한 후 iOS 9에서 앱이 실행됩니다. iOS 8을 계속 지원할 수 있습니다. 최신 릴리스로 다시 빌드해도 애플리케이션 대상 버전에 영향을 주지 않습니다.

iOS 9 에서 기존 앱을 테스트하는 동안 추가 문제가 있는 경우 아래 호환성 개선 섹션을 참조하세요.

Visual Studio를 사용하여 업데이트

Visual Studio가 최신 안정 버전으로 업데이트되도록 명시적으로 검사 것이 좋습니다.

구성 요소, Nugets 및 기타 라이브러리는 어떤가요?

위에서 멘션 두 가지 문제를 해결하기 위해 사용하는 구성 요소 또는 Nugets의 새 버전을 기다릴 필요가 없습니다. 이러한 문제는 Xamarin.iOS의 최신 안정 릴리스로 앱을 다시 빌드하여 해결됩니다.

마찬가지로 구성 요소 공급업체와 NuGet 작성자는 위에서 멘션 두 가지 문제를 해결하기 위해 새 빌드를 제출할 필요가 없습니다. 그러나 구성 요소 또는 NuGet이 Xib 파일에서 보기를 사용 UICollectionView 하거나 로드하는 경우 아래와 멘션 iOS 9 호환성 문제를 해결하기 위해 업데이트가 필요할 수 있습니다.

코드의 호환성 향상

iOS 9에서 호환성이 손상되는 이전 버전의 iOS에서 작동하는 데 사용되는 코드 패턴의 몇 가지 경우가 있습니다. iOS 9에서 테스트할 때 발생할 수 있는 몇 가지 가능한 문제(및 솔루션)는 다음과 같습니다.

생성자에서 UICollectionViewCell.ContentView가 null입니다.

이유: iOS 9 initWithFrame: 에서는 이제 UICollectionView 설명서 상태와 같이 iOS 9의 동작 변경으로 인해 생성자가 필요합니다. 지정된 식별자에 대한 클래스를 등록하고 새 셀을 만들어야 하는 경우 이제 해당 메서드를 호출하여 셀을 초기화합니다 initWithFrame: .

수정: 다음과 같이 생성자를 추가 initWithFrame: 합니다.

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

관련 샘플: MotionGraph, TextKitDemo

Xib/Nib에서 뷰를 로드할 때 UIView에서 코더를 사용하여 초기화하지 못함

이유:initWithCoder: 생성자는 Interface Builder Xib 파일에서 뷰를 로드할 때 호출되는 생성자입니다. 이 생성자를 내보내지 않으면 관리되지 않는 코드는 관리되는 버전을 호출할 수 없습니다. 이전에는(예: iOS 8에서) IntPtr 생성자가 호출되어 뷰를 초기화했습니다.

수정: 다음과 같이 생성자를 만들고 내 initWithCoder: 보냅니다.

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

관련 샘플: 채팅

Dyld 메시지: 이름이 있는 캐시 이미지가 없습니다...

로그에 다음 정보가 있으면 충돌이 발생할 수 있습니다.

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

이유: 이는 프라이빗 프레임워크를 공개(JavaScriptCore가 프라이빗 프레임워크가 되기 전에 iOS 7에서 공개됨)할 때 발생하는 Apple의 네이티브 링커의 버그이며, 앱의 배포 대상은 프레임워크가 프라이빗인 경우 iOS 버전용입니다. 이 경우 Apple 링커는 퍼블릭 버전 대신 프라이빗 버전의 프레임워크와 연결됩니다.

수정: 이 문제는 iOS 9에 대해 해결되지만, 그 동안 직접 적용할 수 있는 쉬운 해결 방법이 있습니다. 프로젝트에서 이후 iOS 버전을 대상으로 지정하기만 하면 됩니다(이 경우 iOS 7을 사용해 볼 수 있습니다). 다른 프레임워크에서도 비슷한 문제가 발생할 수 있습니다. 예를 들어 WebKit 프레임워크가 iOS 8에서 공개되었으므로 iOS 7을 대상으로 지정하면 이 오류가 발생합니다. 앱에서 WebKit을 사용하도록 iOS 8을 대상으로 지정해야 합니다.