- this binding is based on: https://github.com/thisisthekap/Xamarin.RevenueCat.iOS
- it is created for .NET MAUI and targeted to
.NET 8
- it contains bindings for RevenueCat iOS plugin
The versioning scheme of Maui.RevenueCat.iOS
is derived from the versioning of revenuecat/purchases-ios
.
revenuecat/purchases-ios | Maui.RevenueCat.iOS | Note |
---|---|---|
3.4.1 | 3.4.1.0 | First version of bindings for 3.4.1 |
3.4.1 | 3.4.1.17 | Bindings for 3.4.1 containing fixes |
First version of our Maui binding was just changed Xamarin.RevenueCat.iOS
binding working for .NET MAUI. It was binding around RevenueCat ios 4.9.0
, but this native library contained bitcode which is no longer accepted by AppStore.
Porting of binding from Xamarin to Maui required several changes:
- Removed some attributes in
ApiDefinitions
- commit - Changed
IntPtr
->NativeReference
inApiDefinitions
- commit - Added
NoBindingEmbedding = false
- commit
Because of a problem with bitcode I have decided to create completely new binding from scratch. Here are steps I have done:
- On my MAC I have downloaded and installed Objective Sharpie
- I have downloaded RevenueCat.framework.zip of
purchases-ios v4.19.0
- I have extracted the
iOS
folder on my MAC desktop - started terminal, then
cd ~/Desktop
- firstly check what versions of xcode SDKs you have installed by
sharpie xcode -sdks
and use theiphoneosXX.Y
version you have - I used command
sharpie bind -framework iOS/RevenueCat.framework -sdk iphoneos16.4 -scope iOS/RevenueCat.framework/Headers
- this command generated
ApiDefinitions.cs
andStructsAndEnums.cs
files - in case it did not and gives you error:
RevenueCat: framework requires SDK 'iphoneosXX.Y' which is not installed. You may need a newer Xcode.
In my case it wasiphoneos16.4
- if you have older Xcode then update it
- if you have newest Xcode then you need to install older iOS SDKs
- go to Apple developer web and download Xcode that contains that SDK. In my case
Xcode 14.3.1
containsiphoneos16.4
- after the download extract
.xip
file and after extraction right click on extracted Xcode file andShow Package Contents
- then navigate there into
/Applications/Xcode/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
and copyiPhoneOsXX.Y.sdk
(if it is just link/alias then copy theiPhoneOs.sdk
and rename it toiPhoneOsXX.Y.sdk
in my caseiPhoneOS16.4.sdk
) - then go to location of your original Xcode ->
Show Package Contents
-> navigate again to:/Applications/Xcode/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
and paste the copiediPhoneOSXX.Y.sdk
there - restart Xcode
- to verify you did everything correctly run in terminal:
sharpie xcode -sdks
and the new SDK you copied should be now there as well - then run the
sharpie
command to generateApiDefinitions.cs
andStructsAndEnums.cs
files again
- go to Apple developer web and download Xcode that contains that SDK. In my case
- this command generated
- then I placed new framework file into repo
- firstly commented but later completely removed
Verify
attributes - commit - then removed all device-specific attributes - commit
- TIP: You can find all attributes by searching for
iOS (
. Because all of them contain this string - at the same time commented out
(AutoGeneratedName = true)
- TIP: You can find all attributes by searching for
- added namespaces - commit
- comment out text that was not commented out - commit
- then I merged interfaces with the same names e.g.
RCAttribution
andRCAttribution_RevenueCat_Swift_3714
I put together - commit- I have also removed obsolete & deprecated interfaces/methods
- removed default using there were useless - commit
- removed constants interface - commit
- because I didnt know how to bind
byte[]
😅 - (optional) If you would like to bind the
RevenueCatVersionNumber
use this for interface name:[BaseType(typeof(NSObject))] [DisableDefaultCtor] interface RCConstants
and above the variable put[Static]
attribute
- because I didnt know how to bind
- removed interfaces without methods/properties - commit
- remove Protocols that were used for inheritance - commit
- removed delegate that was not used anywhere - commit
- added
INativeObject
inheritance for interfaces that were used in dictionaries and was of typeNSObject
- commit - replaced
NSUrlRequest
forNSMutableUrlRequest
- commit - created delegates for Purchases - commit
- removed inherited
NSObject
methods - commitisEqual
andDescription
- also removed
DebugDescription
- commit
- removed inherited
NSOperation
methods - commit - I have created aliases for methods named the same - commit
⚠️ I dont know if this is correct or even necessary, maybe I could delete them as well
- removed attributes containing
Name
- commit- this was because on my windows machine I was getting errors that platform doesnt have symbols specified for this methods containing the name
- later I completely removed those methods because the error was still there - commit
- ✅ - Done
- I have tested this new binding in the simulator as well as on real device through TestFlight and it works as expected
- if you experience build error:
lang++ exited with code 1: error : Undefined symbols for architecture arm64
- I experienced this problem while debugging on Remote device (iphone connected directly to MAC and that MAC connected to Windows)
"_OBJC_CLASS_$_FakeASIdManager", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_FakeAfficheClient", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_FakeTrackingManager", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_NetworkOperation", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_PaymentQueueWrapper", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_ProductsFetcherSK1", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_PurchasesReceiptParser", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_StoreKit1Wrapper", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_StoreKitRequestFetcher", referenced from:
objc-class-ref in registrar.o
"_OBJC_CLASS_$_TrackingManagerProxy", referenced from:
objc-class-ref in registrar.o
- then remove those types e.g.
FakeASIdManager
fromApiDefinitions.cs
file - commit
- When latest Xcode version is out it doesn't mean MAUI/Xamarin can immediately it.
- You can find here what Xcode is currently supported. Even though Xcode version is on the list make sure to check open github issues in the xamarin-macios repo
- In case you want to upgrade/downgrade to specific Xcode version then:
- uninstall your current version
- download version you want: https://developer.apple.com/download/all/
- extract
.xip
file and move it's content to/Applications
folder - after extraction open Xcode and it will ask you to install additional components (e.g. iOS) so install it
- In case you get error
The connection cannot continue because the remote iOS SDK was not found or is corrupted.
- go to your MAC and in terminal do:
rm -rf ~/Library/Caches/Xamarin/XMA/SDKs/dotnet/
- go to your MAC and in terminal do:
- in
.NET 7
and withVS2022
v17.7
IT IS NOT POSSIBLE TO BUILD THE PACKAGE WITH EMBEDDED NATIVE LIBRARY (even with connected MAC).- You need to build this package on MAC with VS for MAC. Only that way it will link native library to the package.
- dotnet/maui#14982
- in
VS2022
v17.8.4
with latestMAUI
it works correctly
This repository is licensed with the MIT license.