Contenu connexe Similaire à Xamarin.iOS中引用自製Objective-C的Class Library (20) Plus de ShengWen Chiou (20) Xamarin.iOS中引用自製Objective-C的Class Library3. 步驟
1. 在Xcode中建立Static Library
2. 編譯此Static Library,使它能同時支援iOS
Device與iOS simulator硬體架構
3. 使用Objective Sharpie Tool產生轉換
Objective-C到C#的程式碼
4. 在Xamarin中建立iOS Binding Project
5. 在Xamarin中建立iOS APP專案,引用iOS
Binding Project
9. 產生iOS Simulator用的檔案
• xcodebuild -sdk iphonesimulator -configuration
Debug
– Build settings from command line:
– SDKROOT = iphonesimulator8.1
– === BUILD TARGET ShareCode OF PROJECT ShareCode
WITH CONFIGURATION Debug ===
– Check dependencies
– Write auxiliary files
– …
– ** BUILD SUCCEEDED **
10. 產生iOS Device用的檔案armv7
• xcodebuild -sdk iphoneos -arch armv7 -
configuration Debug
– Build settings from command line:
– ARCHS = armv7
– SDKROOT = iphoneos8.1
– === BUILD TARGET ShareCode OF PROJECT ShareCode
WITH CONFIGURATION Debug ===
– Check dependencies
– Write auxiliary files
– ** BUILD SUCCEEDED **
11. 產生iOS Device用的檔案armv7s
• xcodebuild -sdk iphoneos -arch armv7s -
configuration Debug
– Build settings from command line:
– ARCHS = armv7s
– SDKROOT = iphoneos8.1
– === BUILD TARGET ShareCode OF PROJECT ShareCode
WITH CONFIGURATION Debug ===
– Check dependencies
– Write auxiliary files
– ** BUILD SUCCEEDED **
12. 產生iOS Device用的檔案arm64
• xcodebuild -sdk iphoneos -arch arm64 -
configuration Debug
– Build settings from command line:
– ARCHS = arm64
– SDKROOT = iphoneos8.1
– === BUILD TARGET ShareCode OF PROJECT ShareCode
WITH CONFIGURATION Debug ===
– Check dependencies
– Write auxiliary files
– ** BUILD SUCCEEDED **
14. Static Library
• 檔案來源:build -> Debug-iphoneos_arm*
• 重新命名:libShareCode.a
– libShareCode_arm64.a
– libShareCode_armv7s.a
– libShareCode_armv7.a
– libShareCode_simulator.a
• 轉放至專案資料夾:ShareCode
15. 合併為一
• 使用lipo指令將.a檔案包成單一檔案
• lipo -create -output ShareCode.a
libShareCode-arm64.a libShareCode-
armv7s.a libShareCode-armv7.a
libShareCode-simulator.a
• 於是產生ShareCode.a
23. 使用Objective Sharpie
• Objective Sharpie is a command line tool
(provided by Xamarin) that can assist in
creating the definitions required to bind a
3rd party Objective-C library to C#.
• 下載並安裝
– http://files.xamarin.com/~abock/ObjectiveShar
pie/ObjectiveSharpie-1.1.1.pkg
24. 查看Xcode SDK
• sharpie xcode -sdks
– macosx10.8
– macosx10.9
– iphoneos7.1
– iphonesimulator7.1
– macosx10.10
– iphoneos8.2
– iphonesimulator8.2
– iphoneos8.1
– iphonesimulator8.1
25. 轉換ShareCode.h
• sharpie bind -output ShareCode -namespace
ShareCode -sdk iphoneos8.2 ShareCode.h –unified
– Compiler configuration:
– -isysroot /Applications/Xcode-
Beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
/iPhoneOS.sdk -miphoneos-version-min=8.2 -resource-dir
/Library/Frameworks/ObjectiveSharpie.framework/Versions/1.1.1/clang-
resources -arch armv7 -ObjC
– Parsing...
– [ 0%] parsing /Users/jason/Xcode/ShareCode/ShareCode.h
– [100%] parsing complete
– Binding...
– [bind] generating ShareCode.cs
– Submitting usage data to Xamarin...
– Submitted - thank you for helping to improve Objective Sharpie!
– Done.
26. 生成ShareCode.cs
• namespace ShareCode {
// @interface ShareCode : NSObject
[BaseType (typeof (NSObject))]
interface ShareCode {
// -(NSString *)sayHello:(NSString *)name;
[Export ("sayHello:")]
string SayHello (string name);
}
}
• 將它複製到ApiDefinition.cs
27. ApiDefinition.cs
• using System;
using System.Drawing;
using ObjCRuntime;
using Foundation;
using UIKit;
namespace ShareCode {
// @interface ShareCode : NSObject
[BaseType (typeof (NSObject))]
interface ShareCode {
// -(NSString *)sayHello:(NSString *)name;
[Export ("sayHello:")]
string SayHello (string name);
}
}
36. BindingSample2ViewController.cs
• public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Perform any additional setup after loading the view,
typically from a nib.
var obj = new ShareCode.ShareCode ();
this.helloLabel.Text = obj.SayHello ("HappyMan");
}
38. 結論
• 使用Objective-C Library轉到C# Library角
色有三個專案,範例:
– ShareCode (Xcode)
– BindingProjectTest (Xamarin)
– BindingSample (Xamarin)
• https://github.com/happymanx/Binding-
Library-from-ObjC-to-CSharp.git
39. 參考
• [Xamarin.iOS] 如何引用Objective-C寫的
Class Library
http://www.dotblogs.com.tw/toysboy21/archive/2013/08/27/115697.aspx
• Xamarin - Walkthrough: Binding an
Objective-C Library
http://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-
c/Walkthrough_Binding_objective-c_library/
Notes de l'éditeur ApiDefinition.cs - This file will contain the contracts that define how Objective-C API's will be wrapped in C#.
StructsAndEnums.cs - This file will hold any structures or enumeration values that are required by the interfaces and delegates. LinkTarget.Arm64預設沒有產生,必須自己加上去!