We finished Part 1 of our series with the POSSIBLE Mobile Seaworthy Framework Checklist for Vendors. This checklist includes items that we like to see in the frameworks we add to the apps we work on. If a framework vendor meets most or all of the criteria on the checklist, integrating their framework into our projects will probably be a pleasurable experience. Before we get to Part 2 which is coming soon, we’d like to take a detour and try our checklist on a widely-used app metrics framework.
Apteligent (formerly Crittercism) provides a suite of tools for tracking the health of your app including dashboards, release tracking, network monitoring, and crash reporting. As we work with clients to develop their analytics strategy, Apteligent’s offerings are one of our go-to recommendations for app metrics. Here’s what we get when we download the Apteligent framework for iOS:
We have documentation, release notes, an example app, and a static framework for both iOS and tvOS. We followed the ExampleApp.html link to clone the example app on Github. Now we have everything we need to get started. Let’s evaluate Apteligent’s framework against our checklist to see how they do!
The Apteligent Framework Review
✔ Provide a sample project that cleanly builds and runs in a simulator and on device with zero issues or warnings.
We were able to clone the example app and build it with the latest release version of Xcode with zero issues or warnings. The sample project has tabs for demoing several of the Apteligent features. We’re off to a great start!
✔ The sample project and framework do not require third-party tools such as CocoaPods.
When we click the Documentation.html file we are greeted with an introductory web page that includes a quick link to the setup guide. While CocoaPods is the recommended way of installing Apteligent, they also offer Manual installation instructions that are very easy to follow.
✘ The sample project is written in Swift.
It’s not recommended by Apple to distribute static libraries in Swift until Swift reaches ABI compatibility. We do like to see it demonstrated that Objective-C libraries are cleanly interoperable with Swift, so we include this item on our checklist. Apteligent’s sample project is written in Objective-C.
While we don’t have a Swift sample project, the app does provide nullability annotations and typed collections which give us good Swift interoperability.
✔ The framework is built with the latest non-beta version of Xcode.
The Apteligent team builds with the latest version of Xcode.
✔ The framework provides configurable debug log levels with the option to completely silence them.
The framework provides log levels including Silent, Error, Warning, and Info. They do an excellent job of giving us control of how much logging we want to see. The ability to completely silence the framework is particularly appreciated.
✔ The framework has a small memory and on-disk footprint.
The framework size on disk is about 24 MB but the end user will only see about 2-2.5 MB disk usage when the framework is linked in a project (source). We found idle memory usage to be minimal at about 1 MB. We are not concerned with the resource usage of the framework.
✔ The framework has been tested with all of the deployment targets supported.
In our evaluation we see that the iOS target works well, and as far as we know the team is testing on all of the deployment targets they support.
✔ The framework supports Bitcode and can build with Bitcode enabled.
We can see that the sample project has Bitcode enabled and the framework supports Bitcode.
✔ The framework doesn’t swizzle system API methods.
Apteligent does offer a powerful network monitoring dashboard which relies on method swizzling. The good news is that you can choose to entirely opt out of this feature, so we’ll round up to a check for allowing us the choice to turn off swizzling.
✔ The framework’s public interfaces are commented with Headerdoc.
Yes, they are.
✔ The framework’s public interfaces use Objective-C nullability tags and typed collection syntax.
We see both nullability annotations and typed collections which means the team is concerned with good Swift interoperability.
✔ If the framework includes a Universal binary, the provided fat binary must have the architectures needed (run lipo -info on the binary from Terminal to see what architectures it supports): arm64, armv7, i386, x86_64.
$ lipo -info Crittercism
$ Architectures in the fat file: Crittercism are: i386 armv7 armv7s x86_64 arm64
We have all of the architectures we need.
✔ The SDK package provides comprehensive documentation that describes SDK setup and use.
When we follow Documentation.html we are greeted with a wealth of information on how to use various features of the Apteligent framework.
✔ The SDK package provides a list of bundled third-party libraries used in the framework so we can assess compatibility with our other third-party frameworks.
We did not find that the Apteligent iOS framework bundles other third-party libraries.
✔ Dependencies that must be built into your binary are name-mangled so we do not have symbol collisions.
Because we did not find evidence of bundled third-party libraries, there was no need for name-mangling.
✔ Until we have ABI (application binary interface) compatibility with Swift, build your framework with Objective-C or make it open-source.
The static framework is built with Objective-C.
✔ We depend on you, so be faster than us at shipping updates when new iOS versions are released! During iOS Beta Season, proactively provide beta frameworks that address the deprecations, bugs, and new APIs that accompany every iOS release.
Let’s look back at when Apteligent introduced Bitcode support. Bitcode was announced at WWDC 2015, and iOS 9 was released on September 15, 2015. On September 18, 2015, Apteligent supports Bitcode. That’s pretty good!
The Verdict: Shipshape and Seaworthy
Overall we find that the Apteligent framework passes all of our criteria for seaworthiness apart from including a Swift sample project—nice job! That means we should have an easy time integrating their framework into our projects, and we’re confident the team will continue to support our needs into the future.
Recall that in Part 1 of this series we said, “When developers enjoy working with your framework, they will advocate for it over alternatives, and that’s a competitive advantage for you.” We think the Apteligent SDK is very well-documented, meticulously-maintained, and it matches up well in quality to their services. Give Apteligent a try on your iOS project!
This article is part of a series on iOS Frameworks. For your reference, here’s the full collection of articles.