Xamarin. iOS 9 – 문제 해결Xamarin.iOS 9 – Troubleshooting

이 문서에서는 Xamarin.ios 앱에서 iOS 9로 작업 하기 위한 몇 가지 문제 해결 팁을 제공 합니다.This article provides several troubleshooting tips for working with iOS 9 in Xamarin.iOS apps.

XML을 구문 분석 하는 동안 문제가 발생 했습니다.There was a problem parsing the XML

Xamarin iOS 디자이너는 Xcode 7 기능을 아직 지원 하지 않습니다.The Xamarin iOS Designer does not yet support Xcode 7 features. 스토리 보드는 StackView와 같은 새 iOS 9 (Xcode 7) 디자이너 요소를 사용 하려고 할 때 디자이너에서 "XML을 구문 분석 하는 동안 문제가 발생 했습니다." 를 사용 하 여 로드 되지 않습니다.Storyboards will fail to load in designer with "There was a problem parsing the XML" when attempting to use new iOS 9 (Xcode 7) designer elements such as StackView.

iOS Designer Xcode 7 기능에 대 한 지원은 예정 된 주기 6 기능 릴리스를 대상으로 합니다.iOS Designer support for Xcode 7 features is targeted for the upcoming Cycle 6 feature release. 주기 6의 미리 보기 버전은 현재 알파 채널에서 사용할 수 있으며 새로운 Xcode 7 기능을 제한적으로 지원 합니다.The preview version of Cycle 6 is currently available in the Alpha channel and has limited support for the new Xcode 7 features.

Mac용 Visual Studio에 대 한 부분 해결 방법: 스토리 보드를 마우스 오른쪽 단추로 클릭 하 고 > Xcode Interface Builder에서 열기를 선택 합니다.Partial workaround for Visual Studio for Mac: Right-click the storyboard and choose Open With > Xcode Interface Builder.

IOS 8 시뮬레이터는 어디에 있나요?Where are the iOS 8 Simulators?

Xcode 7 이상을 설치한 경우 기본적으로 모든 iOS 8 시뮬레이터를 iOS 9 시뮬레이터로 자동으로 대체 합니다.If you have installed Xcode 7 (or greater) it will automatically replace all of the iOS 8 simulators with iOS 9 simulators by default. IOS 8에서 테스트 해야 하는 경우 Xcode를 시작한 다음 iOS 8 시뮬레이터를 다운로드 하 여 설치할 수 있습니다.If you still need to test on iOS 8, you can start Xcode, then download and install the iOS 8 simulators.

Xcode에서 Xcode 메뉴를 선택 하 고 기본 설정 ... > 다운로드를 선택 합니다.In Xcode, select the Xcode menu then Preferences... > Downloads:

확인 및 지금 설치 단추를 클릭 하 여 iOS 8 시뮬레이터를 다시 설치 합니다.Click the Check and Install Now button to reinstall the iOS 8 simulators.

왼쪽/오른쪽 특성 오류가 있는 레이아웃 제약 조건Layout Constraint with Left/Right Attribute Errors

IOS 8 (및 이전 버전)에서 Storyboard의 UI 요소는 오른쪽 & 왼쪽 특성 (NSLayoutAttributeRight & NSLayoutAttributeLeft)과 선행 & 후행 특성 (NSLayoutAttributeLeading & NSLayoutAttributeTrailing)을 함께 사용할 수 있습니다. 동일한 레이아웃.In iOS 8 (and prior), UI elements in Storyboards could use a mix of both Right & Left Attributes (NSLayoutAttributeRight & NSLayoutAttributeLeft) and Leading & Trailing Attributes (NSLayoutAttributeLeading & NSLayoutAttributeTrailing) in the same layout.

에서 동일한 Storyboard가 iOS 9에서 실행 되는 경우 다음과 같은 형식으로 예외가 발생 합니다.If the same Storyboard in run in iOS 9, it will result in an exception in the following form:

Catch 되지 않은 예외 ' NSInvalidArgumentException '로 인해 앱을 종료 하는 중입니다. 이유: ' * * * + [NSLayoutConstraint constraintWithItem: attribute: relatedBy: toItem: attribute: 승수: constant:]: 선행/후행 사이에 제약 조건을 만들 수 없습니다. 특성과 오른쪽/왼쪽 특성이 있습니다.Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: A constraint cannot be made between a leading/trailing attribute and a right/left attribute. 또는 둘 다에 대해 선행/후행을 사용 합니다. 'Use leading/trailing for both or neither.'

iOS 9는 오른쪽 & 왼쪽 또는 선행 & 후행 특성 중 하나만 사용 하도록 레이아웃을 적용 합니다.iOS 9 enforces layouts to use either Right & Left or Leading & Trailing attributes but not both. 이 문제를 해결 하려면 스토리 보드 파일 내에 설정 된 것과 동일한 특성을 사용 하도록 모든 레이아웃 제약 조건을 변경 합니다.To fix this issue, change all layout constraints to use the same attribute set inside your Storyboard file.

자세한 내용은 iOS 9 제약 조건 오류 Stack Overflow 토론을 참조 하세요.For more information, please see the iOS 9 constraint error Stack Overflow discussion.

오류 ITMS-90535: 예기치 않은 CFBundleExecutable 키입니다.ERROR ITMS-90535: Unexpected CFBundleExecutable Key

IOS 9로 전환한 후 앱에서 iOS 8 (또는 이전 버전)에서 컴파일되고 실행 된 타사 구성 요소 (특히 기존 Google Maps 구성 요소)를 사용 하 여 새 빌드를 iTunes Connect에 제출 하려고 할 때 다음과 같은 형식으로 오류를 가져올 수 있습니다.After switching to iOS 9, from an app uses 3rd party components (specifically our existing Google Maps component) that compiled and ran on iOS 8 (or earlier), when trying to submit the new build to iTunes Connect you can get an error in the form:

오류 ITMS-90535: 예기치 않은 CFBundleExecutable 키입니다.ERROR ITMS-90535: Unexpected CFBundleExecutable Key. ' 페이로드/app-name/구성 요소. 번들 '의 번들에 번들 실행 파일이 포함 되어 있지 않습니다.The bundle at 'Payload/app-name.app/component.bundle' does not contain a bundle executable...

이 문제는 일반적으로 오류 메시지가 제안-CFBundleExecutable 키를 제거 하 여 번들에 있는 Info.plist를 편집 하는 것 처럼 프로젝트에서 명명 된 번들을 찾아 해결할 수 있습니다.This issues can usually be solved by finding the named bundle in the project then - just as the error message suggests - edited the Info.plist that is in the bundle by removing the CFBundleExecutable key. CFBundlePackageType 키를 BNDL으로 설정 해야 합니다.The CFBundlePackageType key should be set to BNDL as well.

이러한 변경을 수행한 후에는 전체 프로젝트를 정리 하 고 다시 빌드합니다.After making these changes, do a clean and rebuild the entire project. 이러한 변경을 수행한 후에는 문제 없이 iTunes Connect에 제출할 수 있습니다.You should be able to submit to iTunes Connect without issue after making these changes.

자세한 내용은이 Stack Overflow 토론을 참조 하세요.For more information, please see this Stack Overflow discussion.

CFNetwork SSLHandshake 실패 (-9824) 오류CFNetwork SSLHandshake failed (-9824) Error

직접 또는 iOS 9의 웹 보기에서 인터넷에 연결 하려고 할 때 다음과 같은 형식으로 오류가 발생할 수 있습니다.When attempting to connect to the internet, either directly or from a web view in iOS 9, you might get an error in the form:

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)

또는 다음과 같은 형식으로 되어 있습니다.Or in the form:

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)는 인터넷 리소스 (예: 앱의 백 엔드 서버)와 앱 간 보안 연결을 적용 합니다.In iOS9, App Transport Security (ATS) enforces secure connections between internet resources (such as the app's back-end server) and your app. 또한 ATS는 TLS 버전 1.2을 사용 하 여 암호화 하기 위해 HTTPS 프로토콜 및 고급 API 통신을 사용 하는 통신이 필요 합니다.Additionally, ATS requires communication using the HTTPS protocol and high-level API communication to be encrypted using TLS version 1.2 with forward secrecy.

ATS는 iOS 9 및 OS X 10.11 (El Capitan) 용으로 빌드된 앱에서 기본적으로 사용 하도록 설정 되어 있으므로 NSURLConnection, CFURL 또는 NSURLSession를 사용 하는 모든 연결에는 ATS 보안 요구 사항이 적용 됩니다.Since ATS is enabled by default in apps built for iOS 9 and OS X 10.11 (El Capitan), all connections using NSURLConnection, CFURL or NSURLSession will be subject to ATS security requirements. 연결이 이러한 요구 사항을 충족 하지 않는 경우에는 예외와 함께 실패 합니다.If your connections do not meet these requirement, they will fail with an exception.

이 문제를 해결 하는 방법에 대 한 자세한 내용은 앱 전송 보안 가이드의 ATS의 옵트아웃 (옵트아웃) 섹션을 참조 하세요.Please see the Opting-Out of ATS section of our App Transport Security guide for information on how to solve this issue.

IOS 9에서 기존 앱이 실행 되지 않음My existing apps don't run on iOS 9

IOS 9에서 실행 되도록 기존 앱을 다시 빌드하고 다시 배포 하는 방법에 대 한 지침은 ios 9 호환성 정보 를 참조 하세요.See our iOS 9 compatibility information for instructions on re-building and re-deploying your existing apps to run on iOS 9.

UICollectionViewCell는 생성자에서 Null입니다.UICollectionViewCell.ContentView is Null in Constructors

이유: IOS 9에서는 UICollectionView 설명서 상태로ios 9의 동작 변경으로 인해 initWithFrame: 생성자가 필요 합니다.Reason: In iOS 9 the initWithFrame: constructor is now required, due to behavior changes in iOS 9 as the UICollectionView documentation states. 지정 된 식별자에 대 한 클래스를 등록 하 고 새 셀을 만들어야 하는 경우 이제 해당 initWithFrame: 메서드를 호출 하 여 셀을 초기화 합니다.If you registered a class for the specified identifier and a new cell must be created, the cell is now initialized by calling its initWithFrame: method.

해결 방법: 다음과 같이 initWithFrame: 생성자를 추가 합니다.Fix: Add the initWithFrame: constructor like this:

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

관련 샘플: Motiongraph, TextKitDemoRelated samples: MotionGraph, TextKitDemo

Xib/Nib에서 뷰를 로드 하는 경우 UIView가 코드 작성자 있는지를 사용 하 여 초기화 되지 않습니다.UIView fails to Init with Coder when Loading a View from a Xib/Nib

이유: initWithCoder: 생성자는 Interface Builder Xib 파일에서 뷰를 로드할 때 호출 되는 생성자입니다.Reason: The initWithCoder: constructor is the one called when loading a view from an Interface Builder Xib file. 이 생성자가 내보내지 않는 경우 관리 되지 않는 코드는 관리 되는 버전을 호출할 수 없습니다.If this constructor is not exported unmanaged code can’t call our managed version of it. 이전 (예:Previously (eg. iOS 8) IntPtr 생성자를 호출 하 여 뷰를 초기화 합니다.in iOS 8) the IntPtr constructor was invoked to initialize view.

해결 방법: 다음과 같이 initWithCoder: 생성자를 만들고 내보냅니다.Fix: Create and export the initWithCoder: constructor like this:

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

관련 샘플: 채팅Related sample: Chat

Dyld 메시지: 이름이 있는 캐시 이미지가 없습니다 ...Dyld Message: No Cache Image with Name...

로그에서 다음 정보를 사용 하 여 충돌이 발생할 수 있습니다.You might experience a crash with the following information in the log:

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

이유: 이는 개인 프레임 워크를 공용으로 만들 때 (JavaScriptCore가 전용 프레임 워크 였던 이전에는 iOS 7에서 공용으로 설정 됨), 프레임 워크가 전용 인 경우 앱의 배포 대상이 iOS 버전용입니다.Reason: This is a bug in Apple's native linker, which happens when they make a private framework public (JavaScriptCore was made public in iOS 7, before that it was a private framework), and the deployment target of the app is for an iOS version when the framework was private. 이 경우 Apple의 링커는 공용 버전 대신 프레임 워크의 전용 버전과 연결 됩니다.In this case Apple's linker will link with the private version of the framework instead of the public version.

해결 방법: 이는 iOS 9에 대 한 것 이지만 사용자에 게 직접 적용할 수 있는 해결 방법이 있습니다. 프로젝트에서 이후 iOS 버전을 대상으로 합니다 .이 경우 iOS 7을 사용해 볼 수 있습니다.Fix: This will be addressed for iOS 9, but there is an easy workaround you can apply yourself in the meantime: just target a later iOS version in your project (you can try iOS 7 in this case). 다른 프레임 워크는 비슷한 문제를 나타낼 수 있습니다. 예를 들어 ios 8에서 WebKit framework가 공용으로 설정 되었으므로 iOS 7을 대상으로 지정 하면이 오류가 발생 합니다. 앱에서 WebKit를 사용 하려면 iOS 8을 대상으로 해야 합니다.Other frameworks might exhibit similar problems, for example the WebKit framework was made public in iOS 8 (and so targeting iOS 7 will result in this error; you should target iOS 8 to use WebKit in your app).

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

실제 iOS 하드웨어에서 iOS 9 버전의 Xamarin.ios 앱을 실행 하려고 할 때 개발자 계정이 장치에서 신뢰 되지 않았다는 메시지가 표시 될 수 있습니다.When attempting to run the iOS 9 version of your Xamarin.iOS app on real iOS hardware, you might get a message saying that your developer account has not been trusted on the device. 예를 들면,For example:

이 문제를 해결 하려면 다음을 수행 합니다.To solve this issue, do the following:

  1. 개발 Mac에서 Xcode (최신 베타 버전)을 시작 합니다.Start Xcode (the latest beta version) on the development Mac.

  2. 메뉴에서 장치 를 선택 하 여 장치 창을 엽니다.Select Devices from the Window menu to open the Devices Window:

  3. 장치 측면 패널 에서 장치를 선택 하 고 마우스 오른쪽 단추를 클릭 한 다음 프로 비전 프로필 표시...를 선택 합니다.Under the DEVICES side panel, select your device, right-click and select Show Provisioning Profiles...:

  4. 현재 장치에서 각 프로 비전 프로필을 선택 하 고 - 단추를 클릭 하 여 삭제 합니다.Select each provisioning profile currently on the device and click the - button to delete it:

  5. Xcode 메뉴에서 기본 설정 ...계정을 선택 합니다.From the Xcode menu, select Preferences... and Accounts:

  6. 자세히 보기 ... 단추를 클릭 한 다음 모두 다운로드 단추를 클릭 합니다.Click the View Details... button, then click the Download all button:

  7. 목록의 업데이트가 완료 되 면 완료 단추를 클릭 하 고 기본 설정 창을 닫습니다.When the list has finished updating, click the Done button and close the Preferences window.

  8. IOS 장치에서 테스트 하려는 기존 버전의 Xamarin.ios 앱을 제거 합니다.Remove the existing version of the Xamarin.iOS app that you were trying to test from the iOS device.

  9. Mac용 Visual Studio으로 돌아가서 클린 빌드를 수행 하 고 장치에서 앱을 다시 실행 해 봅니다.Return to Visual Studio for Mac, do a clean build and try to re-run the app on the device.

Xcode에 의해 로드 된 새 프로 비전 프로필이 표시 되기 전에 Mac용 Visual Studio를 중지 하 고 다시 시작 해야 할 수 있습니다.You might have to stop and restart Visual Studio for Mac before the new provisioning profiles loaded by Xcode are seen. 새 프로 비전 프로필을 선택 하려면 Xamarin.ios 앱에 대 한 Ios 번들 서명 옵션을 조정 해야 할 수도 있습니다.You might also have to adjust the iOS Bundle Signing options for your Xamarin.iOS app to select the new provisioning profiles.

시작 화면 문제Launch Screen Issues

이제 iOS 9는 동일한 시작 이미지를 다른 인터페이스 방향을 지원 하기 위해 더 이상 재사용할 수 없도록 시작 화면 요구 사항을 강제로 적용 합니다.iOS 9 now enforces the Launch Screen requirements so that the same launch image can no longer be reused to support different interface orientations. 자세한 내용은 Apple의 UILanchImage 참조 를 참조 하세요.See Apple's UILanchImage Reference for more information.

필요에 따라 storyboard 파일을 사용 하 여 .png 이미지 파일 집합을 사용 하는 것과는 반대로, 앱의 시작 화면을 표시할 수 있습니다.Optionally, you can use a storyboard file to present your app's Launch Screen as opposed to using a set of .png image files. 이제 시작 화면을 표시 하는 Apple의 선호 되는 방법입니다.This is now Apple's preferred way to present Launch Screens. 자세한 내용은 통합 된 스토리 보드 소개 가이드를 참조 하세요.Please see our Introduction to Unified Storyboards guide for more information.

마지막으로 앱은 시작 화면에 스토리 보드 파일을 사용 해야 하며 패널 또는 분할 보기 모드에서 실행 되는 것으로 간주 되는 네 가지 인터페이스 방향 (세로, 세로, 세로, 세로, 가로 왼쪽 및 가로 오른쪽)을 모두 지원 합니다.Finally, your app must use a storyboard file for its Launch Screen and support all four interface orientations (Portrait, Upside-down Portrait, Landscape Left and Landscape Right) to be considered for running in a Slide Over panel or in Split View mode. IOS 9의 새로운 멀티태스킹 기능에 대해 자세히 알아보려면 iPad 용 멀티태스킹 가이드를 참조 하세요.To find out more about the new multitasking abilities of iOS 9, please see our Multitasking for iPad guide.

NSInternalInconsistencyException 예외NSInternalInconsistencyException Exception

IOS 9 용 기존 Xamarin.ios 앱을 컴파일하고 실행 하는 경우 다음과 같은 형식으로 오류가 발생할 수 있습니다.When compiling and running an existing Xamarin.iOS app for iOS 9 you might get an error in the form:

목표-C 예외가 throw 되었습니다.Objective-C exception thrown. 이름: NSInternalInconsistencyException Reason: 응용 프로그램 실행이 끝날 때 응용 프로그램 창에 루트 뷰 컨트롤러가 있어야 합니다.Name: NSInternalInconsistencyException Reason: Application windows are expected to have a root view controller at the end of application launch

응용 프로그램 시작이 종료 될 때 응용 프로그램 창에 루트 뷰 컨트롤러가 있어야 하 고 기존 앱이 발생 하지 않기 때문에이 오류가 발생 합니다.This is error is being raised because app Windows are expected to have a Root View Controller at the end of application launch and your existing app doesn't.

이 문제에 대 한 두 가지 이상의 해결 방법이 있습니다.There are at least two possible workarounds for this problem:

  1. 앱을 업데이트 하 여 해당 사용자 인터페이스를 정의 하려면 xib 파일 대신 스토리 보드 파일을 사용 합니다.Update app to use storyboard file instead of xib files to define its User Interface. 이 기능을 사용 하려면 앱 크기와 iOS Designer (또는 Xcode의 Interface Builder)를 사용 하 여 스토리 보드를 레이아웃 하는 방법에 따라 상당한 시간이 필요 합니다.This one requires quite a lot of time depending on size of your app and knowledge of how to use the iOS Designer (or Xcode's Interface Builder) to layout storyboards. 자세한 내용은 통합 Storyboard 소개 설명서를 참조 하세요.For more information, see our Introduction to Unified Storyboards documentation.
  2. 앱 UI의 뷰 컨트롤러를 가리키도록 AppDelegate 클래스의 FinishedLaunching 메서드에서 앱 창의 RootViewController 속성을 설정 합니다.Setup RootViewController property of app Window in FinishedLaunching method in AppDelegate class to point to a View Controller in your app's UI.

뷰를 초기화 하 고 컨트롤러를 확인 하는 경우When to Initialize Views and View Controllers

Xamarin.ios를 사용 하면 관리 코드에 항목이 노출 될 때 호출 되는 생성자 내에서 뷰 또는 뷰 컨트롤러 초기화를 수행할 수 있지만 iOS 디자인은 중단 됩니다.With Xamarin.iOS it’s possible to make View or View Controller initialization inside constructors which are called when something is exposed into managed code but it breaks iOS design.

일반적으로 호출 되는 시기를 알 수 없으므로 생성자에서 백 목표-C 코드를 호출할 수 있는 모든 항목을 초기화 해서는 안 됩니다.In general you should not initialize anything that can call back Objective-C code from the constructor since you can't be sure when it will be called. 이는이 초기화를 수행 해야 하는 위치 (다른 .ctor) 또는 재정의 (목적-C에 이벤트 없음)가 더 적합 함을 의미 하기도 합니다.That also means there's a better places (other .ctor) or calls to override (as Objective-C has no events) where this initialization should be done.