Bài viết hướng dẫn binding một custom control viết bằng Native code (Objective C) để có thể sử dụng trên Xamarin.iOS (C#).

Thư viện ta cần binding là https://github.com/zsy78191/XXXRoundMenuButton đã được đóng gói và đăng lên CocoaPods.

Phần 1. Chuẩn bị

Phần 2. Generate code sử dụng sharpie & pods

Mở Terminal và chạy lần lượt các lệnh sau:

  • mkdir temp (tạo thư mục temp)
  • cd temp (trỏ tới thư mục temp)
  • sharpie pod init ios XXXRoundMenuButton (clone source của thư viện XXXRoundMenuButton)

  • sharpie pod bind

Đợi quá trình generate hoàn tất bạn sẽ được các tập tin trong thư mục temp/Binding sau:

  • XXXRoundMenuButton_StructsAndEnums.cs
  • XXXRoundMenuButton_ApiDefinitions.cs
  • XXXRoundMenuButton.framework

Phần 3. Binding

Sao chép tập tin XXXRoundMenuButton.framework vào thư mục chứa source của project Binding Library đã tạo (có chứa trong thư mục con nào đó)

Sau đó sử dụng chức năng Add Native References để thêm framework trên vào Binding Library

Sử dụng TextEditor mở lần lượt 2 tập tin XXXRoundMenuButton_ApiDefinitions.csXXXRoundMenuButton_StructsAndEnums.cs trong thư mục Binding ở trên sau đó sao chép nội dung vào trong namespace scope của các tập tin tương ứng là ApiDefinitions.csStructs.cs trong project Binding Library, sau đó xóa đoạn “using XXXRoundMenuButton;” và các using đã khai báo. Kết quả ta được 2 tập tin mới như sau:

Chỉnh sửa

Ở tập tin Structs.cs: “enum XXXIconType : nint” sửa đổi thành “enum XXXIconType : ulong

Ở tập tin ApiDefinitions.cs: Xóa hoặc comment out đoạn code sau

Build -> Done

Phần 4. Sử dụng và khắc phục lỗi phát sinh.

Để sử dụng bạn có thể đóng gói thư viện Binding Library trên thành dll, hoặc reference project-project trong cùng solution.

Mặc dù build project Binding Library thành công, nhưng khi sử dụng vào một project Xamarin.iOS có thể phát sinh một số lỗi khi build hoặc lỗi runtime. Một số lỗi bạn có thể xem chi tiết và cách khắc phục ở https://docs.microsoft.com/en-us/xamarin/ios/troubleshooting/mtouch-errors

Ví dụ riêng đối với thư viện demo hôm nay có thể phát sinh các lỗi sau:

1. Lỗi MT5211: Native linking failed, undefined Objective-C class…

=> Cách khắc phụ thêm attribute [Protocol] trước interface XXXRoundMenuButton trong file ApiDefinitions.cs

2. Lỗi runtime Could not create an native instance of the type ‘…’: the native class hasn’t been loaded.

=> Chuộc phải vào framework đã add chọn Properties, tick chọn Force Load

3. Lỗi runtime ObjCRuntime.RuntimeException: Can’t register the class … when the dynamic registrar…

=> Cách khắc phục thêm “–optimize=-remove-dynamic-registrar” vào mtouch build agruments (nhớ thêm cho các Release và AppStore configuration)

Bài này ở đây, riêng đối với các framework viết bằng Swift binding sẽ tương đối phức tạp hơn nên xin hẹn các bạn ở một bài viết khác.

Source Code: https://github.com/KhuongNtrd/RoundMenu