Extending Cross-Platform Capabilities with .NET MAUI and Mac Catalyst
- Home
- Blog
Akshay Athalye
Praful Dandgawal
|
For our global clients across industrial machine manufacturers and OEMs, device communication is not just a feature they want. It is something they count on every single day. At Saviant, we build applications that sit right at the centre of that workflow, giving clients a way to connect with their devices, send commands, and pull back real-time data without friction.
The devices themselves vary widely, from data loggers and smart meters to USB-connected hardware and Bluetooth Low Energy (BLE) loggers. What ties them all together is the need for the mobile application to handle everything reliably, regardless of platform. When communication breaks down, users get to know right away, and that kind of disruption affects both trust and usability. This is the story of how our team at Saviant collaborated as a mobile app consulting and development partner with one of our clients to help them build and extend robust mobile application to macOS using .NET MAUI and Mac Catalyst in just 4 months.
Laying the foundation: How our cross-platform journey began
Our journey started with a Xamarin application running on Android, iOS and Windows. This allowed us to deploy features across different environments with a single codebase.
As the app has grown, Xamarin has been a good foundation to build on. But when Microsoft moved to .NET MAUI, it became clear that adopting the new framework was the right move for our long-term goals. For a more technical overview of our journey from Xamarin to .NET MAUI Migration, check out the blog: Migrating from Xamarin.Forms to .NET MAUI
Why .NET MAUI: A strategic choice
As we started planning the next phase of the application, picking the right cross-platform framework was probably the most important decision we had to make. While there are other powerful options like React Native and Flutter. They are largely built with a mobile-first approach, with desktop support still catching up. In our case, the application required robust desktop support, especially for USB and BLE device communication scenarios.
We are not simply trying to support the platforms we already have. We also wanted to make something that was scalable. Our goal was to create a foundation that would be easily extensible to new platforms and evolving use cases. That meant choosing a framework that would allow flexibility and scalability, so we could continue to improve the application while also ensuring a consistent experience across all platforms.
.NET MAUI fit well with our client’s goals because:
- It treats both mobile and desktop platforms as first-class citizens.
- It allows deep integration with platform-specific capabilities.
- It builds on our existing C# expertise and ecosystem.
- It supports a single codebase, making development and maintenance more efficient.
Taken together, these factors made .NET MAUI the clear choice as we moved forward with the cross-platform work.
Extending to macOS: Aligning with evolving client needs
Once the MAUI foundation was in good shape, bringing the application to macOS was the natural next step for our .NET MAUI development team.
Up until this point, the client had been relying on old legacy native applications on both Windows and macOS to handle USB device communication. These had been built years earlier and were becoming increasingly difficult to maintain. They also lacked the flexibility to keep up with changing requirements.
With a plan already in place to retire those legacy apps within the year, the goal became consolidating everything into a single modern solution that could handle all existing functionality, including device communication, without keeping the old systems alive.
Extending the existing MAUI application to cover macOS was the practical way to get there. Since we already had the core logic in place, much of the groundwork was done. This approach lets us -
- Reuse much of the existing MAUI codebase.
- Keep the experience consistent across platforms.
- Reduce dependence on separate native applications.
- Speed up macOS app development with minimal additional effort.
In short, it was a practical approach that aligned well with the broader goal of a single, scalable, unified solution across all platforms.
Choosing the right approach for macOS support
When we first started looking at macOS support within the MAUI ecosystem, we had a few different paths to consider. One of them was the native macOS backend. Microsoft.Maui.Platforms.MacOS which is built on AppKit, Apple's longstanding desktop UI framework. It is an interesting option in theory, but in practice it is still experimental, has notable gaps in functionality, and Microsoft hasn't given it the green light for production use yet.
Given those constraints, Mac Catalyst was the more sensible choice. It gave us a stable foundation, fit naturally with how our application was already structured, and meant we weren't betting on something that could change significantly down the road.
That said, Mac Catalyst comes with its own trade-offs. Since it is essentially designed to bring iPad apps to the Mac, it doesn't give you the same low-level hardware access you'd get from a fully native macOS app. For most things, that is fine, but USB communication was a sticking point. The standard Catalyst layer just wasn't enough there.
So, we took a pragmatic approach: we kept Mac Catalyst for the overall application experience but layered in native macOS libraries and driver level integrations specifically to handle USB. This gave us the best of both worlds, a consistent, maintainable UI built on a solid platform, with the hardware access we needed where it actually mattered.
Because we needed a stable user experience and solid platform integration, Mac Catalyst was the better fit. Going that route gave us:
- Leverage a more mature and stable UI layer.
- Maintain consistency with existing application behaviour.
- Access better-supported controls and system integrations
With that foundation in place, the macOS transition went smoothly, particularly for BLE communication and support for our client’s Bluetooth loggers.
Overcoming challenges: Enabling USB communication on macOS
USB communication was where things got genuinely difficult. The client’s devices are custom vendor-specific and do not communicate as standard USB hardware. Getting them to work properly meant going deeper into system-level integration while also navigating the security constraints and architectural quirks that macOS brings with it.
We spent real time on this part of the project, researching, testing different approaches, and rethinking our design multiple times to get reliable communication working between the app and the connected devices.
In the end, we got it working. The macOS version now handles USB communication just as reliably as the legacy app it replaced, which was the bar we needed to clear.
AI assisted development in native macOS integration
During .NET MAUI development on Mac, particularly in areas involving complex native integrations and system-level code, AI assisted development tools like Claude and GitHub copilot proved useful.
When we were dealing with low-level, platform-specific code where documentation was sparse, having an AI assist helped us move faster and reduce iteration time.
The role was targeted, not a replacement for engineering judgment, but a useful accelerator in the right situations.
Outcome: A unified and scalable cross-platform solution
By the end of this project, the Saviant team had delivered -
- A single unified application across Android, iOS, Windows, and macOS
- Smooth and reliable communication for both USB and BLE devices
- Reduced reliance on legacy native applications
- Easier maintenance with a shared codebase for cross platform app development
- A strong foundation to support future platform expansion
But beyond the technical wins, what matters most is that users across all four platforms, Android, iOS, Windows, and macOS, now get a consistent, dependable experience when they interact with their devices. That was the goal from the start.
Today, our client delivers a robust device monitoring and analytics environment that supports a wide range of environmental and agricultural applications. Field engineers can seamlessly configure, deploy, and manage IoT devices on-site, significantly simplifying operations and reducing management costs for hundreds of NGOs worldwide.
The client’s smart devices and data loggers offer an industry-leading 0.2 measurement accuracy, making them ideal for highly regulated environments such as pharmaceutical facilities, where precision is critical.
Check out the detailed case study: Seamless device integration & management of 1000s of
Data Loggers with IoT, Cloud and Mobile apps.
Conclusion
In the end, this was more than just solving our client problem. It changed our perspective on how to build technology solutions for clients. We established a foundation that can sustain the client’s current needs and future needs, with an emphasis on scalability, addressing platform-specific challenges directly, and making intentional choices at every moment.
As we continue to build on this, the direction remains the same to maintain a consistent, reliable experience our clients can count on, no matter what comes next.