Xamarin.iOS 9 – 문제 해결

이 문서에서는 Xamarin.iOS 앱에서 iOS 9를 사용하기 위한 몇 가지 문제 해결 팁을 제공합니다.

iOS 8 시뮬레이터는 어디에 있나요?

Xcode 7(이상)을 설치한 경우 기본적으로 모든 iOS 8 시뮬레이터를 iOS 9 시뮬레이터로 자동으로 바꿉니다. iOS 8에서 테스트해야 하는 경우 Xcode를 시작한 다음 iOS 8 시뮬레이터를 다운로드하여 설치할 수 있습니다.

Xcode에서 Xcode 메뉴를 선택한 다음 기본 설정...>다운로드:

iOS 8 Simulators Downloads

지금 확인 및 설치 단추를 선택하여 iOS 8 시뮬레이터를 다시 설치합니다.

왼쪽/오른쪽 특성 오류가 있는 레이아웃 제약 조건

iOS 8(및 이전)에서 Storyboards의 UI 요소는 동일한 레이아웃에서 오른쪽 및 왼쪽 특성(NSLayoutAttributeRight& NSLayoutAttributeLeft) 및 선행후행 특성(NSLayoutAttributeLeading&NSLayoutAttributeTrailing)을 혼합하여 사용할 수 있습니다.

동일한 Storyboard가 iOS 9에서 실행되는 경우 다음 형식으로 예외가 발생합니다.

'NSInvalidArgumentException' 예외로 인해 앱을 종료합니다. 이유: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: 선행/후행 특성과 오른쪽/왼쪽 특성 간에 제약 조건을 만들 수 없습니다. 둘 다 또는 둘 다에 선행/후행을 사용합니다.'

iOS 9는 오른쪽 및 왼쪽또는선행후행 특성을 모두 사용하도록 레이아웃을 적용합니다. 이 문제를 해결하려면 Storyboard 파일 내에서 동일한 특성 집합을 사용하도록 모든 레이아웃 제약 조건을 변경합니다.

자세한 내용은 iOS 9 제약 조건 오류 Stack Overflow 토론을 참조하세요.

오류 ITMS-90535: 예기치 않은 CFBundleExecutable 키

iOS 9로 전환한 후 앱에서 iOS 8(또는 이전 버전)에서 컴파일 및 실행된 타사 구성 요소(특히 기존 Google 지도 구성 요소)를 사용하며, iTunes에 새 빌드를 제출하려고 할 때 커넥트 양식에서 오류가 발생할 수 있습니다.

오류 ITMS-90535: 예기치 않은 CFBundleExecutable 키입니다. 'Payload/app-name.app/component.bundle'의 번들에는 번들 실행 파일이 없습니다...

일반적으로 오류 메시지에서 알 수 있듯이 프로젝트에서 명명된 번들을 찾아 키를 제거 CFBundleExecutable 하여 번들에 있는 번들을 편집 Info.plist 하여 이 문제를 해결할 수 있습니다. 키도 CFBundlePackageType 설정 BNDL 해야 합니다.

이러한 변경을 수행한 후 클린 수행하고 전체 프로젝트를 다시 빌드합니다. 이러한 변경 후 문제 없이 iTunes 커넥트 제출할 수 있습니다.

자세한 내용은 이 Stack Overflow 토론을 참조하세요.

CFNetwork SSLHandshake 실패(-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(App Transport Security)는 인터넷 리소스(예: 앱의 백 엔드 서버)와 앱 간에 보안 연결을 적용합니다. 또한 ATS는 프로토콜을 사용하는 HTTPS 통신과 고급 API 통신을 사용하여 TLS 버전 1.2를 사용하여 암호화해야 합니다.

ATS는 iOS 9 및 OS X 10.11(El Capitan)용으로 빌드된 앱에서 기본적으로 사용하도록 설정되므로 모든 CFURL연결NSURLConnection은 사용하거나 NSURLSession ATS 보안 요구 사항이 적용됩니다. 연결이 이러한 요구 사항을 충족하지 않으면 예외로 실패합니다.

이 문제를 해결하는 방법에 대한 자세한 내용은 앱 전송 보안 가이드의 ATS 옵트아웃 섹션을 참조하세요.

기존 앱이 iOS 9에서 실행되지 않음

iOS 9에서 실행할 기존 앱을 다시 빌드하고 다시 배포하는 방법에 대한 지침은 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: 인터페이스 작성기 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 cach 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을 대상으로 지정해야 합니다.

신뢰할 수 없는 엔터프라이즈 개발자

실제 iOS 하드웨어에서 iOS 9 버전의 Xamarin.iOS 앱을 실행하려고 하면 개발자 계정이 디바이스에서 신뢰할 수 없다는 메시지가 표시될 수 있습니다. 예시:

Untrusted Enterprise Developer alert

이 문제를 해결하려면 다음을 수행합니다.

  1. 개발 Mac에서 Xcode(최신 베타 버전)를 시작합니다.

  2. 메뉴에서 디바이스선택하여 디바이스 창을 엽니다.

    The Devices Window

  3. 디바이스 쪽 패널에서 디바이스를 선택하고 마우스 오른쪽 단추를 클릭한 다음 프로비저닝 프로필 표시를 선택합니다.

    SShow Provisioning Profiles

  4. 현재 디바이스에 있는 각 프로비저닝 프로필을 선택하고 단추를 선택하여 - 삭제합니다.

    Deleting a provisioning profile

  5. Xcode 메뉴에서 기본 설정...계정을 선택합니다.

    Xcode account preferences

  6. 세부 정보 보기... 단추를 클릭한 다음 모두 다운로드 단추를 선택합니다.

    Download all profiles

  7. 목록 업데이트가 완료되면 완료 단추를 선택하고 기본 설정 창을 닫습니다.

  8. iOS 디바이스에서 테스트하려는 Xamarin.iOS 앱의 기존 버전을 제거합니다.

  9. Mac용 Visual Studio 돌아가서 클린 빌드를 수행하고 디바이스에서 앱을 다시 실행합니다.

Xcode에 의해 로드된 새 프로비저닝 프로필이 표시되기 전에 Mac용 Visual Studio 중지하고 다시 시작해야 할 수 있습니다. Xamarin.iOS 앱에 대한 iOS 번들 서명 옵션을 조정하여 새 프로비저닝 프로필을 선택해야 할 수도 있습니다.

시작 화면 문제

이제 iOS 9는 다른 인터페이스 방향을 지원하기 위해 동일한 시작 이미지를 더 이상 다시 사용할 수 없도록 시작 화면 요구 사항을 적용합니다. 자세한 내용은 Apple의 UILanchImage 참조를 참조 하세요.

필요에 따라 스토리보드 파일을 사용하여 .png 이미지 파일 집합을 사용하는 대신 앱의 시작 화면을 표시할 수 있습니다. 이것은 지금 출시 화면을 제시 하는 애플의 선호 하는 방법. 자세한 내용은 통합 스토리보드 소개 가이드를 참조하세요.

마지막으로 앱은 시작 화면에 스토리보드 파일을 사용해야 하며 슬라이드 오버 패널 또는 분할 보기 모드에서 실행되는 것으로 간주될 네 가지 인터페이스 방향(세로, 거꾸로 세로, 가로 왼쪽 및 가로 오른쪽)을 모두 지원해야 합니다. iOS 9의 새로운 멀티태스킹 능력에 대한 자세한 내용은 iPad용 멀티태스킹 가이드를 참조하세요.

NSInternalInconsistencyException 예외

iOS 9용 기존 Xamarin.iOS 앱을 컴파일하고 실행할 때 양식에 오류가 발생할 수 있습니다.

Objective-C 예외가 throw되었습니다. 이름: NSInternalInconsistencyException 이유: 애플리케이션 시작이 끝날 때 애플리케이션 창에 루트 뷰 컨트롤러가 있어야 합니다.

이 오류는 응용 프로그램 시작이 끝날 때 앱 Windows에 루트 뷰 컨트롤러가 있어야 하고 기존 앱은 그렇지 않기 때문에 발생합니다.

이 문제에 대한 가능한 해결 방법은 두 개 이상 있습니다.

  1. 파일 대신 xib 스토리보드 파일을 사용하여 사용자 인터페이스를 정의하도록 앱을 업데이트합니다. 이렇게 하려면 앱의 크기와 Xcode의 인터페이스 작성기를 사용하여 스토리보드를 레이아웃하는 방법에 대한 지식에 따라 수정하는 데 많은 시간이 필요합니다. 자세한 내용은 통합 스토리보드 소개 설명서를 참조하세요.
  2. 앱의 UI에서 FinishedLaunching 뷰 컨트롤러를 가리키도록 클래스의 메서드 AppDelegate 에서 앱 창의 속성을 설정합니다RootViewController.

뷰를 초기화하고 컨트롤러를 보는 경우

Xamarin.iOS를 사용하면 뷰 또는 뷰 컨트롤러가 생성자 내에서 초기화될 수 있으며, 이는 관리 코드에서 무언가가 노출될 때 호출되지만 iOS 디자인을 깨뜨립니다.

일반적으로 호출될 시기를 확신할 수 없으므로 생성자에서 코드를 다시 Objective-C 호출할 수 있는 모든 항목을 초기화해서는 안 됩니다. 즉, 이 초기화를 수행해야 하는 더 나은 위치(다른 .ctor) 또는 재정의 호출( Objective-C 이벤트가 없음)이 있음을 의미합니다.