Xamarin.iOS
바인딩 신속한 라이브러리
수색…
소개
Xamarin 프로젝트에서 사용하기 위해 신속한 .framework 파일을 바인딩하는 과정을 안내하는 가이드를 따르기 쉽습니다.
비고
Xcode에서 라이브러리를 만들 때 빠른 라이브러리를 포함 할 수 있습니다. 하지 마! 최종 앱에는 NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib에 포함되지만 NAME.app/Frameworks/libswift*.dylib에 포함되어야합니다.
이 정보는 다른 곳에서도 찾을 수 있지만 언급 할만한 가치가 있습니다. 라이브러리에 비트 코드를 포함하지 마십시오. 현재 Xamarin에는 iOS 용 Bitcode가 포함되어 있지 않으며 Apple은 모든 라이브러리가 동일한 아키텍처를 지원하도록 요구합니다.
Xamarin.iOS에서 신속한 라이브러리 바인딩
Xamarin.iOS에서 Swift Library를 바인딩하는 것은 https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ 에서 볼 수있는 Objective-C와 동일한 프로세스를 따르지 만 몇 가지주의 사항이 있습니다.
- 신속한 클래스는 바인드 할 NSObject를 상속해야합니다.
- Swift 컴파일러는 신속한 클래스에서 @objc 주석 (예 : @objc (MyClass))을 사용하여 명시 적 목표 이름을 지정하지 않는 한 클래스 및 프로토콜 이름을 다른 것으로 변환합니다.
- 런타임에 APP는 Frameworks라는 폴더에 바인드 된 프레임 워크와 함께 신속한 핵심 라이브러리를 포함해야합니다.
- 앱이 AppStore에 푸시되면 Payload 폴더 옆에 SwiftSupport 폴더가 있어야합니다. IPA 파일 안에 있습니다.
여기 간단한 샘플 바인딩을 찾을 수 있습니다 : https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample
전체 바인딩 샘플 : https://github.com/Flash3001/iOSCharts.Xamarin
다음 단계를 수행하십시오.
1.1 내보낼 Swift 클래스 준비
Swift 클래스를 사용하려면 NSObject에서 상속 받아 objc 주석을 사용하여 Objective-C 이름을 명시 적으로 만들어야합니다. 그렇지 않으면 Swift 컴파일러는 다른 이름을 생성합니다. 아래는 Swift 클래스가 어떻게 생겼는지에 대한 예제 코드입니다. 루트 클래스가 NSObject에서 상속하는 한 어떤 클래스가 상속되는지는 중요하지 않습니다.
//Add this to specify explicit objective c name
@objc(MyClass)
open class MyClass: NSObject {
open func getValue() -> String
{
return "Value came from MyClass.swift!";
}
}
1.2 프레임 워크 빌드
비트 코드를 비활성화하십시오. *
장치 및 시뮬레이터 용 릴리스 용으로 빌드하십시오. *
- 신속한 바인딩에만 관련이 없습니다.
2. 뚱뚱한 도서관을 창조하십시오
프레임 워크는 여러 개의 파일을 포함하고 있습니다. 조금씩 먹어야하는 파일은 NAME.framework / NAME (확장자 없음)입니다.
- iphoneos / NAME.framework를 NAME.framework에 복사하십시오.
- 다음을 사용하여 FAT 라이브러리를 만듭니다.
- lipo-release - iphonesimulator / NAME.framework / NAME 릴리스 - iphoneos / NAME.framework / NAME - 출력 NAME.framework / NAME을 만듭니다.
- Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmodule의 파일을 NAME.framework / Modules / NAME.swiftmodule로 복사하십시오 (지금까지는 iphoneos의 파일 만 포함되어있었습니다)
3. 라이브러리 가져 오기
파일 -> 새로 만들기 -> iOS -> 바인딩 라이브러리에서 바인딩 프로젝트를 이미 생성했다고 가정합니다.
.frameworks를 가져 오는 Xamarin 지원. '기본 참조'를 마우스 오른쪽 버튼으로 클릭하고 '기본 참조 추가'를 클릭하십시오. 새로 만든 뚱뚱한기구를 찾아 내고 그것을 추가하십시오.
4. 헤더 내의 LIBRARY-Swift.h 파일을 기반으로 ApiDefinition을 만듭니다.
수동으로 할 수도 있지만 좋지는 않을 것입니다. Objetive Sharpie를 사용할 수 있습니다. Xamarin이 자체 라이브러리를 바인딩하는 데 사용하는 도구.
https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/ 에서 사용하는 방법
기본 명령은 다음과 같습니다. sharpie bind -sdk iphoneos9.3 NAME-Swift.h
System.Reflection.TargetInvocationException
이 발생하면 다른 SDK 버전이 설치되어 있기 때문일 수 있습니다. 다음 명령을 실행하여 설치 한 iPhone OS SDK를 확인하십시오.
sharpie xcode -sdks
NAME-Swift.h 파일은 NAME.framework / Headers / NAME-Swift.h에 있습니다.
참고 : 빠른 클래스는 "NSObject"에서 상속해야합니다. 그렇지 않으면 NAME-Swift.h 는 클래스를 가져 오지 않으며 Objetive Sharpie는 아무 것도 변환하지 않습니다.
바인딩 프로젝트 ApiDefinition.cs의 내용을 새로 만든 ApiDefinition.cs로 바꿉니다.
5. [Protocol] 및 [BaseType]을 모두 Objective-C 런타임에 클래스 이름을 포함하도록 변경합니다.
원래의 Swift 클래스 나 프로토콜에 1.1 단계에서 지정한 @objc (MyClass) 주석이 포함되지 않은 경우 내부 Objective-C 이름이 변경되어 올바른 이름으로 매핑해야합니다.
모든 이름은 NAME-Swift.h 파일에서 다음 형식으로 사용할 수 있습니다.
SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject
과
SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider
클래스의 BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name 속성과 ProcotolAttribute.Name https : // 를 사용하여 이름을 설정합니다 . 프로토콜에 대해서는 developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ 을 참조하십시오.
[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass
수동으로하는 것은 시원하지 않습니다. 이 도구를 사용하여 https://github.com/Flash3001/SwiftClassify 모든 이름을 삽입 할 수 있습니다. (진행중인 작업이지만 코드가 어떻게 작동하는지 간단히 살펴보면 아주 간단합니다.)
6.1 실행할 모든 종속성을 포함시킵니다.
앱에서 라이브러리를 사용하려고 시도하고 지금 실행하려고하면 충돌이 발생합니다. libswiftCore.dylib가 부족하여 오류가 발생했습니다.
이 같은:
Dyld Error Message:
Library not loaded: @rpath/libswiftCore.dylib
Referenced from: /Users/USER/Library/Developer/CoreSimulator/Devices/AC440891-C819-4050-8CAB-CE15AB4B3830/data/Containers/Bundle/Application/27D2EC87-5042-4FA7-9B80-A24A8971FB48/SampleUsing.app/Frameworks/SwiftSample.framework/SwiftSample
Reason: image not found
Xamarin.iOS는 Swift 라이브러리 바인딩에 대한 공식적인 지원을 제공하지 않습니다. 따라서 Frameworks 및 SwiftSupport 폴더에 신속하게 핵심 라이브러리를 수동으로 포함시켜야합니다. 시뮬레이터와 장치의 경우 Frameworks 폴더의 파일이 다릅니다. 그들은 /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains에서 찾을 수 있습니다.
프레임 워크 폴더 안의 파일을 수동으로 복사하는 대신이 라이브러리 https://github.com/Flash3001/Xamarin.Swift3.Support를 사용할 수 있습니다. 여기에는 하나의 NuGet 패키지에 속한 모든 단일 종속성 Swift 3.1 요구 사항이 포함됩니다.
보시다시피 Nuget Package는 바인딩 자체가 아닌 일반 소비자 용 앱에 포함되어 있습니다. 바인딩에 포함 시키려고하면 컴파일 오류가 발생합니다.
Nuget Package를 만들면 Nuget에 의존성을 포함하도록 지시 할 수 있습니다.
6.2. 포함시킬 신속 종속성 찾기.
중요한 것은 프로젝트에 포함해야하는 각 패키지를 파악하는 것입니다. 간단한 바인딩은 일반적으로 다음을 필요로합니다.
libswiftCore.dylib
libswiftCoreGraphics.dylib
libswiftCoreImage.dylib
libswiftDarwin.dylib
libswiftDispatch.dylib
libswiftFoundation.dylib
libswiftObjectiveC.dylib
libswiftQuartzCore.dylib
libswiftUIKit.dylib
각 종속성을 나열하려면 LibraryName.framework에서 다음 명령을 실행하면됩니다.
otool -l -arch armv7 LibraryName | grep libswift
Swift3 용 NuGet에서 사용할 수있는 모든 패키지를 포함시키지 마십시오. 앱 크기가 커질 수 있습니다.
7. SwiftSupport를 포함하여 AppStore에 App을 푸시합니다.
Apple은 Payload 폴더 옆에 SwiftSupport 폴더와 함께 귀하의 앱을 보내야합니다. 둘 다 IPA 패키지 안에 있습니다.
https://github.com/bq/ipa-packager 스크립트를 사용하여이 작업을 수행 할 수 있습니다.
이 과정은 도서관 소비자가 수동으로해야 할 유일한 과정입니다. 때마다 그 / 그녀는 AppStore에 앱을 밀어 넣으려고합니다.
'서명 및 배포'를 클릭하고 디스크에 저장을 클릭하십시오.
앞서 언급 한 스크립트를 사용하여 새로운 IPA를 만듭니다.
파일의 압축을 풀면 SwiftSupport 폴더가 포함됩니다.
비고
Xcode에서 라이브러리를 만들 때 빠른 라이브러리를 포함 할 수 있습니다. 하지 마! 최종 앱에는 NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib에 포함되지만 NAME.app/Frameworks/libswift*.dylib에 포함되어야합니다.
이 정보는 다른 곳에서도 찾을 수 있지만 언급 할만한 가치가 있습니다. 라이브러리에 비트 코드를 포함하지 마십시오. 현재 Xamarin에는 iOS 용 Bitcode가 포함되어 있지 않으며 Apple은 모든 라이브러리가 동일한 아키텍처를 지원하도록 요구합니다.
기권
이 가이드는 Lucas Teixeira 가 처음 만들었습니다. 모든 크레딧은 그의 소유입니다. 고마워, 루카스.