Kebechet.Maui.RevenueCat.iOS 4.31.9.1

dotnet add package Kebechet.Maui.RevenueCat.iOS --version 4.31.9.1
NuGet\Install-Package Kebechet.Maui.RevenueCat.iOS -Version 4.31.9.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Kebechet.Maui.RevenueCat.iOS" Version="4.31.9.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Kebechet.Maui.RevenueCat.iOS --version 4.31.9.1
#r "nuget: Kebechet.Maui.RevenueCat.iOS, 4.31.9.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Kebechet.Maui.RevenueCat.iOS as a Cake Addin
#addin nuget:?package=Kebechet.Maui.RevenueCat.iOS&version=4.31.9.1

// Install Kebechet.Maui.RevenueCat.iOS as a Cake Tool
#tool nuget:?package=Kebechet.Maui.RevenueCat.iOS&version=4.31.9.1

"Buy Me A Coffee"

Maui.RevenueCat.iOS

Versioning Scheme

The versioning scheme of Maui.RevenueCat.iOS is derived from the versioning of revenuecat/purchases-ios.

Example:

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

Binding creation

Porting old xamarin library ios to .NET MAUI

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 IntPtrNativeReference in ApiDefinitions - commit
  • Added NoBindingEmbedding = false - commit

Creating completely new binding consisted of these steps:

Because of a problem with bitcode I have decided to create completely new binding from scratch. Here are steps I have done:

Generating binding files

  • 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 the iphoneosXX.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 and StructsAndEnums.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 was iphoneos16.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 contains iphoneos16.4
        • after the download extract .xip file and after extraction right click on extracted Xcode file and Show Package Contents
        • then navigate there into /Applications/Xcode/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs and copy iPhoneOsXX.Y.sdk (if it is just link/alias then copy the iPhoneOs.sdk and rename it to iPhoneOsXX.Y.sdk in my case iPhoneOS16.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 copied iPhoneOSXX.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 generate ApiDefinitions.cs and StructsAndEnums.cs files again

Adjusting generated files

  • 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)
  • added namespaces - commit
  • comment out text that was not commented out - commit
  • then I merged interfaces with the same names e.g. RCAttribution and RCAttribution_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
  • 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 type NSObject - commit
  • replaced NSUrlRequest for NSMutableUrlRequest - commit
  • created delegates for Purchases - commit
  • removed inherited NSObject methods - commit
    • isEqual and Description
    • 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

Additional fix:

  • 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 from ApiDefinitions.cs file - commit

Xcode

  • 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/

⚠️Warning

  • in .NET 7 and with VS2022 v17.7 IT IS NOT POSSIBLE TO BUILD THE PACKAGE WITH EMBEDDED NATIVE LIBRARY (even with connected MAC).
  • in VS2022 v17.8.4 with latest MAUI it works correctly

License

This repository is licensed with the MIT license.

Product Compatible and additional computed target framework versions.
.NET net8.0-ios17.2 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0-ios17.2

    • No dependencies.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Kebechet.Maui.RevenueCat.iOS:

Package Downloads
Kebechet.Maui.RevenueCat.InAppBilling

Serves as an abstraction around RevenueCat Android and iOS SDKs https://docs.revenuecat.com/docs

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
4.31.9.1 802 1/18/2024
4.31.9.1-preview1 64 1/18/2024
4.31.9 83 1/17/2024
4.31.9-preview31 64 1/17/2024
4.31.9-preview30 67 1/17/2024
4.31.9-preview23 68 1/17/2024
4.31.9-preview22 68 1/17/2024
4.31.9-preview21 67 1/17/2024
4.31.9-preview1 73 1/17/2024
4.19.0.3 139 7/31/2023
4.19.0.2 109 7/31/2023
4.19.0.1 133 7/31/2023
4.19.0 1,045 7/21/2023
4.19.0-preview3 284 5/17/2023
4.19.0-preview2 105 5/17/2023
4.19.0-preview1 114 5/17/2023
4.9.0.2-fix8 150 5/17/2023
4.9.0.2-fix7 141 5/10/2023
4.9.0.2-fix5 99 5/7/2023
4.9.0.2-fix4 112 5/7/2023
4.9.0.2-fix3 106 5/7/2023
4.9.0.2-fix1 116 5/7/2023
4.9.0.2-fix0 107 5/6/2023

.NET8 Upgrade