Fabric August Update

By Annum Munir, Product Marketing Manager

Summer’s almost over but we’re not taking any breaks from shipping new features. In August, we focused on expanding your view into app stability, updated a few of our Android SDKs, and added new functionality to our mobile app. We also celebrated a major milestone for fastlane! Read on for more details:

Introducing OOM reporting: a new dimension to app quality

We extended our crash coverage to include out-of-memory (OOM) reporting on iOS. An OOM event is an unexpected app termination that occurs when a mobile device runs out of memory. However to your users, OOM events look just like crashes, which makes them detrimental to your stability and also extremely difficult to detect. This month, we used intelligent heuristics to bring OOM reporting to Crashlytics. Now, you can monitor your OOM-free sessions, immediately see when they become a problem, and get valuable direction on where to start your troubleshooting.

Don’t let OOMs disrupt your user experience! Learn how on the Crashlytics blog.

Launched Twitter Kit 2.0 and Digits 2.0 for Android

We upgraded our Twitter Kit and Digits SDKs for Android to keep them stable, predictable, and reliable (we already did this for Twitter Kit for iOS a few months ago). In version 2.0, we refined our libraries based on your feedback, updated major underlying dependencies, and also enhanced performance and aligned with modern Android tools. To get these latest versions, simply click the “Update” buttons within your Android IDE plugin - we’ll take care of the rest.

For more specifics, check out the Twitter Developer blog.

Fabric mobile app updates: Crashlytics-only mode & account switching

The Fabric mobile app helps you keep tabs on your app when you’re on the go. While our app gives you a wealth of real-time analytics data, if you want to focus solely on stability you can now switch to a “Crashlytics-only” mode. This way, you have visibility into all of your crashes even if you don’t have Answers enabled!

On top of the new mode, you can also easily switch between your Fabric accounts within our mobile app. In just a few clicks, you’ll be able to monitor all of your releases across all accounts — even if you’re away from your desk. 

Update the app today to get these upgrades:



fastlane surpasses 10,000 stars on GitHub

fastlane automates the tedious, repetitive tasks of mobile deployment so you can spend more time doing what you love: creating amazing user experiences. Over the past months, we’ve worked with our community to make fastlane even better. Today, we’re excited to share that fastlane has surpassed 10,000 stars on GitHub. In fact, fastlane now has more GitHub stars than the language it was written in. We’re humbled by your support and we can’t wait to keep moving fastlane forward!

Here’s our internal changelog:

Fabric

  • iOS

    • Added logging of a warning if Fabric +with: is incorrectly invoked multiple times

    • Improved beta support when Fabric is embedded in a dynamic library

  • Android

    • Fixed issue causing the Crashlytics privacy prompt to not be shown in rare cases

Crashlytics

  • iOS

    • Improved defensiveness when handling Custom Keys and Logs data

    • Added support for Answers 1.3.0

  • Android

    • Updated Crashlytics Core dependency

    • Improved crash reporting efficiency when handling stack overflow errors

Answers

  • iOS

    • CPU/networking are now reduced when in Low Power mode on iOS, or under thermal pressure on macOS

    • Adopted NSURLSession background uploads, making for much more efficient and reliable networking

    • Adopted NSBackgroundActivityScheduler, which results in improved background behavior on macOS

    • Improved compatibility for macOS apps that use Automatic Termination and Sudden Termination

    • Improved visibility of Answers background operations by adopting NSActivity APIs

    • Improved on-disk event storage, reducing I/O and CPU overhead

    • Fixed a bug that could cause Answers to send a report with no events

  • Android

    • Updated Crashlytics Core dependency

Digits

  • Android

    • Clarified external api by defining "internal" package

    • Clarified events generated by defining "events" package

    • Enabled unique user counts per custom attribute by updating the sample application's logger to use custom events

Twitter Kit

  • Android

    • Removed Digits dependency

    • Dropped support for API versions before API 14 (ICS)

    • Updated Twitter Core dependency

    • Removed previously deprecated methods and classes

    • Added contentDescription for media based on altText field

    • Migrated to Retrofit 2.0 and OkHttp 3.2

    • TwitterApiClient now automatically refreshes expired guest tokens

    • Removed all public reference to Application Authentication

    • Fixed issue parsing withheldInCountries field in User objec.

    • Added altText field to MediaEntity object

    • Added Quote Tweet to Tweet object

MoPub

Fabric July Update

By Brian Lynn, Product Marketing Manager

With summer in full swing, we turned up the heat this month by shipping two major releases to help you further engage and retain your users!

Quickly recognize and solve user retention problems

To build a successful mobile business, app development teams need to keep a close eye on user retention, which is crucial for their app’s growth. What’s the point of spending time and money to acquire new users if they churn the next day? That’s why in July, we released Answers activity segments to help you understand how engaged your current users are and how many are at risk of abandoning your app. More on the Answers blog.

Engage users with a seamless Vine viewing experience

We also added Vine support to Twitter Kit so you can easily engage users by bringing creative and quirky video content into your app. Now, Twitter Kit will automatically play a Vine that is embedded within a Tweet, expand these videos within the timeline, and seamlessly play them on loop within the video player. More on the Twitter Developer blog.

Easily build real-time apps with PubNub and Digits

Besides shipping major releases, we also co-hosted a webinar with our friends at PubNub to help developers accelerate real-time data delivery for their apps. During the webinar, their team showed you how to build a real-time mobile chat app in Android using Fabric and PubNub. And, Chris Oryschak, a Fabric product manager, demonstrated how you can easily and securely verify users using Digits without any cumbersome passwords or complex 2-factor authentication setups. Check out the webinar here or grab the slides!

Here’s our internal changelog:

Crashlytics

  • Android

    • Beta now works for apps using the v2 signature in the latest Android Gradle Plugin, on devices running Android N

    • Beta kit’s startup time is now even faster

    • Fixed a bug to prevent false negatives when determining whether an app was installed by Beta

    • Removed logging when the Beta by Crashlytics app cannot be found

Answers

  • iOS

    • Released activity segments feature

  • Android

    • Released activity segments feature

Digits

  • Android (bug fixes):

    • OSS gradle files breakages in v 1.11.0 to help customers continue using our OSS project as an example

    • Crash caused when digitsLoginFailure event was reported without countryCode

    • Users being unable to login when guest auth expires on the service but not on the client

    • Delete contacts throws exception in okhttp 2.3.1+

Twitter Kit

  • Android

    • Bump Digits and tweet-ui dependencies

    • Allow non-filtered search results for SearchTimeline

MoPub

Fabric June Update

By Brian Lynn, Product Marketing Manager

While the Copa America fever catches on this June and excitement looms around our office, we still hunkered down and shipped a ton of new upgrades on Fabric for you -- even if that meant missing a game or two! Here’s the low down:

Understand your phone verification conversion funnel

If you use Digits to onboard users, you may have been looking for more insights into your conversion funnel and more flexibility in testing the Digits flow. That’s why in June, we’re excited to release two major upgrades for Digits: an integration with Answers and the Digits sandbox. Now, you can easily track login events and even log specific user actions within the Digits flow. Also, you can now run tests without triggering any rate limits -- more on the Digits blog!

Powerful, real-time analytics on the go

Since we launched the first Fabric mobile app, we’ve been heads down building out more functionality to help you dive deeper into your data and understand how your apps are growing. This month, we released a major upgrade to the app: the ability to drill into your most impactful adoption and stability metrics, such as DAU, MAU, and retention, so you can stay on top of your new releases on the go. Check them out in the original announcement!

Grow your app with mobile deep linking

User acquisition data for mobile apps is often fragmented between different marketing channels. And it’s even harder to understand which organic channels are most effective in driving new installs. To solve this, we released our integration with Branch: a powerful, multi-channel deep linking and attribution tool for growing your app and effectively tracking the source of your most engaged users. See what you can do with Branch in the original announcement.

Build your game into a successful business

As few months ago, we released Fabric support for Unity to solve the common challenges game developers face. In June, we made it even easier for you to turn your game into a thriving business with a brand new native MoPub integration. We also gave you more control to customize the setup process with manual initialization and deferred SDK activation during onboarding. See more in the original announcement.

Create powerful actions with fastlane plugins

We love developing fastlane with you and want to empower you with more freedom to help mobile developers and strengthen your bond with them. That’s why we also released fastlane plugins in June – a new, faster way to create actions and connect directly with the fastlane community. More here!

 

Here’s our internal changelog:

Fabric Platform

  • Android

    • Added the name of the exception to the Answers Crash event

Crashlytics

  • Android

    • Wrote the exception name to Answers when sending a Crash event

    • Updated Crashlytics Core and Answers dependency

    • Updated Fabric Base dependency for Beta by Crashlytics

Answers

  • Android

    • Facilitated sending the exception name with Crash events

Digits

Twitter Kit

  • iOS

    • Add SFSafariViewController support for login

    • Fix bug when Tweet includes a newline character

    • Add methods for getting tweets from `TWTRTimelineViewController`

    • Support `extended_tweet` mode for Tweet objects

    • Fix non-module header issue with CocoaPods and Swift

  • Android

    • Updated Twitter Core Dependency

    • Fix Fake ID exploit

MoPub

 

Introducing fastlane plugins: A new way to create powerful actions

By Hemal Shah, Product Manager

Introducing fastlane plugins

The beauty of open source software is that innovation can come from anyone, anywhere, and at any time. Over the past year and a half, the fastlane community has embraced this opportunity to make fastlane even better. These community-contributed additions, including approximately 80% of all fastlane actions and spaceship, have already saved millions of precious developer hours!

We love developing fastlane with you and want to empower you with more freedom to help mobile developers and strengthen your bond with them. Today, we’re introducing fastlane plugins – a new, faster way to create actions and connect directly with the fastlane community.

 

A whole new way to move fastlane forward

fastlane is comprised of hundreds of actions that make app deployment a breeze. From helping you distribute your beta builds to posting notifications in Slack channels, the possibilities of what you can automate to save time are endless! And because fastlane is open, everyone has the power to build on top of it.

Up until now, new actions that were proposed by our passionate community were merged into the main repository. To use them, all fastlane customers would need to upgrade their gems to the latest version. We’re excited to announce we’ve made this process even smoother with the new fastlane plugins architecture.

Think of fastlane plugins like building blocks; they’re a new, modular way to create and distribute actions independently of fastlane itself. In other words, these plugins allow actions to be added faster because they aren’t bundled into the main fastlane repository. Everyone has the power to invent, share, and deploy new plugins in this new architecture without waiting for PRs to be approved and gems to be updated – they’re your fast pass to making a dent in the mobile development universe! And everyone also gets instant access to tons of new actions. So, whether you’re a plugin creator or consumer or both, fastlane plugins are a win-win for the entire fastlane family.

I’m pumped to see where developers take fastlane via plugins. This gives people the chance to quickly create actions useful to their workflow, and then easily share them with the world.


Complete ownership of your masterpiece

You’re the boss of your plugin. From concept (what cool actions can you dream of?) to coding (#shipit) and promotion (share it with the world!), you’ll have control of your plugin’s design and destiny. Once your plugin is live, you’ll get to hear feedback from other fastlane customers and interact with them directly. This is your golden opportunity to showcase your talent and collect some good karma by giving back to the community!

To start creating new plugins, simply type fastlane new_plugin in your terminal and fastlane will walk you through the whole set-up.

fastlane new_plugin

Once you’re done, fastlane will generate the code that is necessary to activate your plugin and get it ready to publish to the world! Plus, this code will be all set to run on CI for automatic build and testing.

 

Easily discover actions

Rest assured, new and existing plugins won’t be buried out of sight because fastlane can quickly discover external plugins created by community contributors.

To see the wealth of new actions available to you, type “fastlane search_plugins” in your terminal. If you have a specific problem or task in mind, just add a keyword to the end of this query (type fastlane search_plugins [keyword]) for more targeted search results.

fastlane search_plugin

We also regularly update this page on GitHub with a list of all fastlane plugins. Some of our favorite plugins include github_status (to check on the status of GitHub’s APIs), and upload_folder_to_s3 (to store assets and artifacts in S3 on AWS). There’s even a fastlane plugin that plays victory music called tunes!

 

Instant access to new plugins – no updates needed!

You can create, use, and update plugins independently of the fastlane release cycle. There’s no need to update fastlane first, these plugins will work seamlessly with your existing version!

To install new plugins, just type fastlane add_plugin [name]. Within seconds, fastlane will retrieve the necessary code and generate the configuration files so you can immediately add the new plugin action into your local project.  

fastlane add_plugin

 

Onward and upward to a brighter future

We built fastlane plugins to empower you to make a meaningful and immediate impact. Together, let’s make fastlane even better. We can’t wait to see the amazing new actions our community builds! And remember, we love seeing your work so Tweet us a link to your new plugin once it’s ready to rock.

 

Fabric for Unity updates: Empowering game developers to build successful businesses

By Hemal Shah, Product Manager

Fabric for Unity Updates June 2016

Life is more fun when you get to play games. Games immerse us in new worlds, energize our competitive spirits, and provide endless hours of entertainment.

But building profitable mobile games is hard. We’re on a mission to fix that. In March, we released Fabric support for Unity (one of the world’s most popular game development platforms), to solve the common challenges game developers face. Our goal was to give you more time to create those delightfully addictive gaming experiences we all know and love. Since we launched, we’ve been blown away by your feedback:

As a publisher with developers worldwide, we use Fabric across our entire portfolio of games. We love that Fabric for Unity is incredibly simple to implement, free to use and provides us with powerful tools to make great games.


Today, we’re making it even easier to turn your game into a thriving business with a brand new native MoPub integration. Plus, we’re giving you more control to customize the setup process with manual initialization and deferred SDK activation during onboarding. Learn how to get started with these features below:

 

Transform your app into a thriving mobile business

Who would say “no” to earning more money for their smash game? For years, game developers have used MoPub to maximize their ad revenue. Now, the MoPub Kit is available directly in the Fabric for Unity plugin. There’s no need to install it separately – we’re bringing it to your IDE. With just a few clicks, you’ll be able to integrate a comprehensive monetization platform into your game and transform your app into a business.
 

Fabric for Unity MoPub ad

 

MoPub will give you ad serving for cross promotion or direct sales, free ad network mediation, and instant access to over 175 demand partners through the MoPub Marketplace, a leading real-time bidding exchange for mobile advertising. And you’ll never have to worry about compromising your user experience because MoPub allows you to create a customized native interface that fits naturally within your game. This is the easiest and fastest way to grab your piece of the $43.6 billion mobile advertising pie.
 

How MoPub's Ad Exchange Works

More control over initializing kits

Over the last few months, we worked closely with our customers to fully understand their game development process. One big takeaway was that some apps need to update their Terms of Service, or take care of other nuanced items, before being ready to initialize Fabric kits. To help with this, we’re giving you more control over the initialization of our kits to suit your unique app setup.

By default, Fabric kits will initialize automatically to ensure you get the best performance as early as possible, but if you need a little extra time at startup, you can enable “manual initialization” in the plugin and start Fabric whenever your app is ready.
 

Fabric for Unity Manual Initialization


Activate your app at your own pace

Building your app on Unity can take a long time - sometimes more than an hour! Yikes. We always want to save you time, so you now have the freedom to install as many Fabric kits as your heart desires with no pressure to build and run your app immediately. With deferred activation, you’ll be able to complete the kit installation process later, and build and run your app as it fits with your natural workflow.

 

Built-in dependency management you can depend on

Let’s be real: dependency management on Unity is not easy. You should be able to download updates without stressing over compatibility problems. That’s why we built an intelligent solution that will automatically manage dependencies for Fabric kits. For example, if you try to download a new kit that puts another at risk of breaking, we’ll alert you and tell you what you need to update first.

Basically, we’ll manage these kit relationships for you so you have peace of mind that everything will always work smoothly. Dependency management is a built-in safety mechanism for our Fabric for Unity plugin.

 

Making game development pain-free and fun

With Fabric, building mobile games is as fun as actually playing them. We’re passionate about helping you create new, imaginative, and interactive experiences that flourish into healthy businesses.

To take advantage of these enhancements, simply update the Fabric plugin directly in Unity. If you’re not using Fabric for Unity, just click the button below to get started. As always, we’d love to hear your feedback on what you’re up to and how you like our plugin!

 

Branch now available on Fabric: Grow your app with deep linking

By Jonathan Zazove, Product Manager

Since launching Fabric in 2014, we’ve partnered with some of the best mobile app tools to help you solve the biggest challenges in building your mobile business. Some of the challenges we’ve heard from you is that user acquisition data is often fragmented between different marketing channels, and sharing your app across those channels is really cumbersome. This makes marketing your app difficult, and you wouldn't know if you're converting users effectively.

To solve that, we’re announcing a brand new integration today: Branch, a powerful, multi-channel deep linking and attribution tool for growing your apps, is now available on Fabric.

Know which marketing channels work for your growth

While in-app analytics tools help you understand user engagement within your app, they don’t tell you which channels your users actually came from nor give you the ability to track that data. Branch’s deep links have solved this by carrying your referral data through multiple channels (i.e., web, app store) and the app install process. Now, by integrating Branch with Answers – our mobile analytics tool within Fabric (ranked #1 by SourceDNA) – you can easily start using mobile deep links to gain insights about where your user growth is coming from and how to optimize your marketing campaigns right within your Fabric dashboard.

Because Branch works with Answers right out of the box, you can instantly see which channel/content is driving the most installs – without any additional work on your part. You’ll also know right away how your current users are sharing your app which is vital to your business’s growth (we know first hand how important evangelists are from our own community!)

See Branch’s announcement to learn more about how it works.

Seamless installation for engineering teams

As with our other partner SDKs (e.g., Amazon, Stripe, Optimizely), we'll automatically provision your Branch keys so you can easily onboard your app if you already have an account with  Branch (if not, we can create one for you here). You can also install the Branch SDK or update to the latest version with a simple click on Fabric.

From our friends at 8Tracks:

Fabric's one-click-install and update functionality allows us to be sure that we’ll never miss a critical update for our SDKs. It’s the platform we trust when managing our SDKs!

 

We’re absolutely thrilled to get this into your hands so you can start optimizing your campaigns and get the most bang for the marketing buck. We look forward to continue helping you build and grow your mobile business!

Powerful, real-time analytics on the go with the Fabric mobile app

by Meekal Bajaj, Product Manager

Just a few months ago, we launched the Fabric mobile app so you always have visibility into your app’s stability and usage even on the go. Since then, many of you have requested more functionality within our app that can help you dive deeper into your data and understand how your apps are growing. We’ve listened!

Today, we’re releasing a major upgrade to the app: the ability to drill into your most impactful adoption and stability metrics, such as DAU, MAU, and retention, to stay on top of your new releases — all in real-time.

Your most important metrics, always at your fingertips

The questions driving key product decisions are often asked in meeting rooms and hallways. However, the lack of access to data in the moment means those questions are often left unresolved. This delay can impede even the best of teams from making the call on how to grow the business!

With today’s update, you can now quickly understand how your app’s user activity is changing over time by drilling into the daily active users graph. We’ll show you how many new users you are acquiring every day. By benchmarking your active and new users against the same time last week, you can immediately understand how your app is growing.

Don’t wait to open your laptop to investigate changes in user behavior. Now you can know right away how your retention and new users rates are influencing your monthly active user counts, directly from your phone.

Inform your decisions with the #1 mobile analytics & crash reporting solutions

To build the most engaging and stable apps, you not only need total visibility, but also data that you can trust. The data within the Fabric mobile app is powered by Answers and Crashlytics, the leading real-time mobile analytics and crash reporting solutions. With our latest update, you’ll have the freedom and confidence to make informed product decisions for your mobile apps -- anywhere, anytime.

From our friends at Instacart:

We love the Fabric mobile app. Its real-time analytics makes it the first place we look to when we need to get a pulse on how our apps are doing. Our team checks it at least several times a day!


Keep your latest release at the forefront

Launch day is stressful for any app. With so many moving parts, the risk of something going wrong is high. With the Fabric mobile app, you can stay on top of new releases by monitoring the adoption and stability of your latest version on the go. Also, you can explore the top issues by day through the crash-free users graph. And if you see your stability diverge from what it should be, you can easily filter down to the specific issues and take action.

We’re thrilled to ship this new update and are excited to continue helping you make informed decisions about your app wherever you are. To get the latest features, just update your app through the Apple App Store or Google Play Store. We can’t wait for you to try it!

Productionizing GraphQL.js: How we protect customer data & site uptime

By Sam Neubardt, Software Engineer

We recently released Fabric mission control, a new dashboard on fabric.io that shows the pulse of all your apps. In order to build mission control, we needed to query for metrics across multiple apps, which would’ve been very difficult to integrate into our existing REST endpoints. Therefore, we decided to create a new service to handle GraphQL queries (Fin Hopkins went over GraphQL basics and introduced our usage of it in a previous post). To do this we used GraphQL.js (a library that serves as the reference implementation of the GraphQL specification) as our core query resolver. We were incredibly happy with GraphQL.js as it’s flexible and easy to work with, however, little is prescribed in terms of production operation.

Before putting this new tool into production, we needed to solve two common problems that almost all developers face: how can we protect our customer’s data and be confident that abuse will not impact the availability of the site?

Infrastructure context

Let’s start by defining exactly what proper access control is: it is knowing both who is making a request (authenticating them) and if they’re authorized to perform the operation they’re requesting. GraphQL.js can easily be exposed as an HTTP service using express-graphql (an adapter library that provides an Express handler). Express is a popular framework for writing HTTP services with Node.js, so we had plenty of options for common concerns like authentication, logging, and CORS. We used OAuth 2 to authenticate requests, but still needed to figure out how to authorize access to fields in our schema to ensure that we protect our customer’s data.

For some extra context, we store data across a number of backend systems. Rather than embed access rules in each of them, we decided to consolidate authorization logic in our GraphQL server. Having a single set of access rules for resources reduces the responsibilities of the services that own those resources. The flexibility of GraphQL.js allowed us to integrate these rules with our schema to build a single representation of the available data and the conditions that allow access to it.

Schema basics: GraphQL.js 101

Before we dive into our solution, here’s a refresher on GraphQL.js. GraphQL requires a schema that describes the entities in your system and their relationships with each other. You can define a new type with GraphQL.js using the GraphQLObjectType constructor:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
   },
 }),
});
 

Each field on a GraphQL type has an associated function (called its resolver function) to fetch the value for that field from the input data (called the source). Many resolvers are simple — they just perform a field lookup off the source data (this is the default behavior and in this case the resolver can be omitted). Resolvers can also perform arbitrary complex operations — such as making a request to another service and parsing the response.

In addition to the source data, resolvers are also called with a context object. It contains data specific to an individual GraphQL request. We use it to inject caches, a logger, and information about the authenticated account.

Authorizing access to the GraphQL schema

Now that you’re all caught up on GraphQL.js let’s take a look at how we added authorization to our schema.

A schema’s resolvers are the key abstraction through which its behavior is defined. So we modified the resolve functions in our schema to check authorization. Given this type in our schema:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: (source) => source.identifier,
   },
 }),
});
 

Here’s how we added authorization checks to the resolve function:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: (source, _args, ctx) => {
       if (ctx.account.canViewApp(source)) {
         return source.identifier;
       }
     },
   },
 }),
});
 

And since resolvers are just functions we can modify their behavior using function composition, which allows us to abstract this pattern:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: makeAuthorizedResolver(
       (source, _args, ctx) => ctx.account.canViewApp(source),
       (source) =>  source.identifier
     ),
   },
 }),
});
  
function makeAuthorizedResolver(authorizationCheckFunc, resolveFunc) {
  return function authorizedResolver(...args) {
    if (authorizationCheckFunc.apply(this, args)) {
      return this.resolveFunc.apply(this, args);
    }
  }
}
 

We even factored the authorization checker out so it could be reused:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: makeAuthorizedResolver(hasAccessToApp, (source) => {
       return source.identifier,
     }),
   },
 }),
});

function hasAccessToApp(source, _args, ctx) {
 return ctx.account.canViewApp(source);
}

function makeAuthorizedResolver(authorizationCheckFunc, resolveFunc) {
  return function authorizedResolver(...args) {
    if (authorizationCheckFunc.apply(this, args)) {
      return this.resolveFunc.apply(this, args);
    }
  }
}
 

The authorization primitives we wrote are highly reusable which makes it easy to check access across the schema. Using makeAuthorizedResolver ensures that we’re checking authorization consistently across the code base. We’ve found that the best way to prevent errors is to build systems that make it easy to do the right thing. But we wanted to take things a step further; to not only make it easy to check authorization on every field but to require it.

Mandating authorization in GraphQL schemas

Requiring explicit authorization on every field in the schema gives us a strong guarantee that we’re controlling access to our customer’s data. To do this we took advantage of the flexibility of JavaScript to build a new abstraction into our resolve functions. Since functions are objects we can assign new fields to them at runtime — in this case information to mark them as a special “authorization” function:

function makeAuthorizedResolver(authorizationCheckFunc, resolveFunc) {
  const resolver = function authorizedResolver(...args) {
    if (authorizationCheckFunc.apply(this, args)) {
      return this.resolveFunc.apply(this, args);
    }
  };
  resolver.checksAuthorization = true;
  return resolver;
}
 

If a field in a type we define is missing a resolve function tagged as one that checks authorization, then tests will fail. This moves authorization to the forefront of an engineer’s mind as they make changes to the schema.

We even generalized this into a facility for checking arbitrary properties on our resolvers by “tagging” additional fields onto the resolver function and verifying their presence in tests. This is a shared code base (meaning engineers may not have all the necessary context when making changes), and people make mistakes. Verifying our schema in tests helps us ensure that the appropriate guard rails are in place to prevent human error from taking down the site, and has proved to be an effective strategy as we’ve increased the number of developers working on our GraphQL server.

Preventing abuse without sacrificing agility

After implementing authorization in our schema we moved on to figure out how to protect our GraphQL server from abuse. Since it handles queries for arbitrary data served by multiple backend services a bad query could impact other systems that our customers rely on 24/7. Even if no one makes intentionally malicious requests, there’s still the chance that we’d accidentally ship a bad query to production (could you imagine taking down the site due to a preventable mistake?). However, we didn’t want to put up fences that would get in the way of product development. We identified and implemented a couple of key techniques to protect the availability of our system while maintaining the properties that allowed us to work fast with GraphQL.

First, we restricted the total concurrency of a single request. Since our GraphQL server is dispatching requests to other services asynchronously a single query can result in many concurrent downstream requests. We’re primarily concerned with limiting the impact to other services, and preventing requests from getting made felt more straightforward than parsing a query to attempt to infer its impact statically. Large queries have little effect on our GraphQL service itself as it’s a service composition layer with little logic of its own. We can easily scale it out if needed since it’s totally stateless (our backend services require more attention to increase the capacity of their data stores as well).

To enforce this restriction, requests to other services must first acquire a permit on a per-query semaphore before executing. The total concurrency per query is limited by the number of available permits.

We also added a limit to the total execution time of a request. Long running queries are stopped after this timeout elapses. This, along with the concurrency limit, places an upper bound on the concurrent work allowed by a single inbound request — in effect limiting the “breadth” of a query.

We can use these limits to understand the worst case performance of our system. Understanding and limiting the work that could be done by the service allows us to be good clients. These restrictions are all instrumented so we can keep track of their impact and understand if we need to adjust them. We’ve found that these techniques have provided a good degree of safety against overwhelming the server, without getting in the way as we write queries. The instrumentation we added makes it clear during development if a query gets restricted, giving the developer the chance to improve it before going to production.

Success!

Overall we’ve been really pleased working with GraphQL. It was great to quickly integrate GraphQL with other services that allowed us to rapidly iterate on customer features, rather than non-user facing infrastructure. Head over to fabric.io to see it in action!

 

We're helping our customers build the best apps in the world. Want to be a part of the Fabric team and build awesome stuff? Check out our open positions!

Building Fabric mission control with GraphQL and Relay

By Fin Hopkins, Software Engineer

A few weeks ago, we shipped mission control, a new dashboard for Fabric that shows you the most important information across all of your apps on the same page. To build it, we turned to two fairly new technologies, GraphQL and Relay, because of the flexibility they bring to fetching data. Although investigating and productionizing these new technologies added an upfront cost to the project, we found that they paid off over the course of development and we’re excited by their potential as we develop more for Fabric.

What does it take to responsibly dive headfirst into a new technology and framework? Here’s how we went about it:

Bringing together the data

Just from the description of mission control (“all your apps, all their important information”), we knew that we were going to faceplant into the limitations of our existing API architecture. Before mission control, pages on fabric.io were limited to showing one kit’s worth of information for one app at a time, and our RESTful APIs and backend data providers reflected that design. If we were going to show you the most important data for any of your kits, for all of your apps, in under 500 network requests from the browser, we’d need to build something new.

That “new” could have been mission control–specific endpoints in our Ruby on Rails API layer, but, as we’ll see, that would have been forcing an architecture we already weren’t satisfied with to do something it wasn’t suited for. Instead, we took this as an opportunity to vet GraphQL, a technology that, on its surface, was tailor-made to our problem. If this experiment went well, we could see ourselves adopting GraphQL for more features, bringing its benefits to all Fabric teams.

Rendering a page with the information diversity and density we were going for requires making multiple API calls to a variety of backend systems, such as those for Answers, Crashlytics, and Beta. A RESTful public endpoint that combined those sources would actually spend most of its time waiting for those API responses, something our existing Ruby on Rails setup is decidedly poor at. Making the API calls in serial would take far too long, but parallel requests in Rails would require bringing in a concurrency library like EventMachine, and even then we’d still be tying up one of our limited Unicorn processes for the duration of the request.

GraphQL for a better server

GraphQL, developed at Facebook, is a query language for, well, graphs of data. You start with a strongly-typed schema of your data, which is defined principly as objects and their fields. A user Account might have strings for name and email address, but it might also have a “connection” to a list of Apps. Those Apps will have their own fields, like name, icon, or current number of active users. An App might also have a connection back to a list of member Accounts. GraphQL lets you start at a “root” in your schema — say, the current account — and query for the subset of fields you’d like returned. In our case, one query might be for the account’s starred Apps, their names, icons, and the timestamp / value pairs of their daily and monthly active user data.

It’s important to note that the queries come from the client. For mission control, that’s a webapp written in JavaScript. The server is a general engine that can fulfill any query that matches the schema. That flexibility will be very important later on.

By using the reference GraphQL implementation, graphql-js, we would have access to Node’s native concurrency, giving us the “wait fast” behavior we want. Backend API requests could happen in parallel, and running out of Unicorn workers during those waits wouldn’t be a concern. This has since been proven in production: loading the mission control details for an app can approach two dozen internal API requests but still return in only a few hundred milliseconds to the browser.

Relay for a better process

Adopting GraphQL would also give us the opportunity to adopt Relay, another Facebook library that integrates GraphQL and React (we love React). Relay essentially annotates React components with a GraphQL query that describes the data they need for rendering. Defining the query next to the rendering code allows a component to be developed and maintained in isolation, rather than in concert with server-side API changes. That means it’s faster and easier to make changes during development.

We knew we would be rapidly iterating mission control in response to usability studies and beta tester feedback, so anything that reduced what we needed to change to bring in new data would pay off and speed those cycles up. Having new data available with just a tweak to the GraphQL query and a hot reload in the browser changed how we were able to work. We iterated on mission control in mob sessions with our product manager and designer, and Relay let us instantly respond to their feedback and see changes working live.

“Go slow to go fast”

After kicking the tires of graphql-js and Relay (“Does it do what it says it on the tin? Can we do development / testing / logging / monitoring / deploying / &c.; up to our standards?”), we got a thumbs up from other Fabric engineers and buy-in from our product manager to give it a shot for mission control. We were upfront that this was a “go slow to go fast” strategy: getting a GraphQL server and Relay frontend infrastructure up-and-running was going to take some initial time that wouldn’t be spent shipping new features to our customers, but once it was in place, we were betting we’d be able to write our feature (and hopefully many more) much more quickly than we could have on the old stack.

Adopting graphql-js

Though we’ll have more to say later about specific productionization and hardening steps we took, putting graphql-js on top of our JSON-returning backend services was straightforward. Though any unification of previously-disparate data sources will require some smoothing over of inconsistencies, on the whole we were able to craft a solid schema out of the most important Crashlytics, Answers, and Beta data.

Our best advice to new graphql-js users is to build your schema out slowly, so you can see how your data model will get consumed by a frontend client, and also to lean heavily on DataLoader to dedupe, cache, and adapt multiple one-off requests to use bulk endpoints. We also have become fans of marking any field we can as “not-null,” for reasons we’ll explain in a future post. (Spoiler: you can automatically generate valid Relay data for testing and development.)

Speed bumps in production

Development was going swimmingly against development backends and fixture data, but once we got mission control loaded up in production we saw that it actually took quite a long time to see any apps on the page. Despite all of the parallel fetches and concurrent processing in our GraphQL server, we’d see the loading spinner for sometimes as long as 10 seconds! It was a terrible experience for what was due to become the new fabric.io home page.

In that first iteration, our by-the-book use of Relay and GraphQL led us to an extreme that was ill-suited to our backend’s characteristics. Relay works by gathering up the data requests for all the (transitive) sub-components of a particular root component and combining them into a single query to the backend. That meant that we were making a single request for all of the mission control data at once: metrics, issue counts, velocity alerts, and so on, our first page of 25 apps. To fulfill such a query, our GraphQL server was making scores of requests to our backend services, and, even though they were mostly in parallel, it couldn’t return anything to the browser until they had all completed.

In an ideal world, these requests would all be consistently performant, but in our situation the backend services would occasionally hit a snag that would add a few hundred milliseconds or even a couple of seconds to their response times, delaying the rendering of anything in the browser. As we added to mission control and the GraphQL query grew, the number of internal requests — and the chance of this happening — grew along with it.

An even worse case would happen when one of the dozens of internal requests timed out or had an otherwise transient error. This would add an error to the response — which Relay interprets as a failure — requiring a second attempt from the client while the loader still spun. Of course, there was no guarantee that this next attempt wouldn’t have its own transient errors, leading to a sort of starvation by flakiness.

Though Relay’s mega-query was an efficient use of client-side network connections, it was trading that against the time-to-first-render of the page. Luckily, while Relay and GraphQL were leading us into making these giant, flaky queries, they also provided the tools we needed to fix them.

Smaller batches of data

Our solution was easy enough: split up the queries. We knew we could request the basic information about your apps in a small number of bulk requests to backends that had very predictable performance. With that data, we could start rendering rows for each app and make the page functional for navigation while we brought in the metrics and highlights information. Separating each app’s detailed data into its own request would isolate a slow response to just a single app, not the whole page.

To accomplish this in Relay, we made our AppRow component take “app” and “appDetails” props, each with its own fragment. The former fragment requested the bare-bones data and was referenced by our page’s top-level RootContainer. We then wrapped each AppRow in its own RootContainer to load the “appDetails” fragment (while passing through the “app” prop).

// MissionControl.jsx
render() {
  return <Relay.RootContainer route={appListRoute} Component={AppList}/>;
}

// AppList.jsx
render() {
  return <div>
    {this.props.account.apps.map((app) => <AppDetailsLoader 
appId={app.id}><App app={app} appDetails={null}/></AppDetailsLoader>)}
  </div>;
}

// AppDetailsLoader.jsx
render() {
  const appView = React.children.only(this.props.children);

  return <Relay.RootContainer
    route={new DetailsRoute({appId: this.props.appId})
    Component={App}
    renderLoading={() => appView}
    renderFetched={(data) => React.cloneElement(appView, {appDetails:
data.app})}
    />;
}

 

It’s important to note that this refactor of the queries was entirely done client-side. Because of GraphQL’s flexibility, we were free to make the connection / responsiveness tradeoff that was appropriate to the experience we wanted. If we had resigned to make this change with a legacy-style, fixed API, we would have had to split out the code on the server and then maintain two endpoints instead of one. Furthermore, a different frontend client (on mobile, perhaps) wouldn’t have been able to choose its own performance tradeoff without writing yet another endpoint to the same data.

GraphQL is not a magic wand

This was an important lesson for us and one that anyone adopting GraphQL will have to pay attention to: combining data from multiple sources is a big advantage of using GraphQL, but the more distinct backends or internal requests that go into servicing a single query, the more you will have to consider the case where one of them fails.

This experience also caused us to rethink how we wanted to handle retries and backoff. We were hoping to keep all retry logic on the client for operational simplicity, but, if just one internal request had a transient failure, a client-side retry would not only waste all the work that did succeed from the first request, it would be at risk for its own transient failure. Since most of our backend failures and timeouts were transient, rather than consistently slow, we added a retrying wrapper around request-promise in our GraphQL server to re-do those requests. This simple change eliminated 99% of the errors when resolving queries, and the expense of a second or two of extra latency in cases where a retry occurred after a timeout.

Going fast

While we can’t compare our GraphQL / Relay implementation to mission control built with RESTful endpoints on Ruby on Rails, we’re satisfied with both the pace and the experience of developing mission control. We’re confident that “go slow to go fast” paid off. Even if the “go slow” made things take longer than just following our old API pattern, we can now be in “go fast” mode from here on out, as can everyone else doing client development at Fabric. GraphQL has let us build a platform for ourselves that is delightful to build upon.

We took Relay to production with eyes open about its pre-release status. We expected a few rough edges, and we found some: pulling in connections a page at a time was awkward; after the page was open for a while polling for updates, running a mutation (starring an app, for example) could generate a query with 30K of duplicate fields. We were able to write workarounds in both cases (a mixin for paging in connections, and an alternate query tracker that continuously collapses), and we’ve found the maintainers at Facebook are very responsive and helpful when we run into things.

For a project like mission control, GraphQL and Relay were a near-perfect solution, and the cost of building it any other way justified the investment. Now that we have these pieces in place, we see ourselves using them again and again.

Stay tuned for our next post, where Sam Neubardt is going to share more about how we extended graphql-js to make a productionized GraphQL server.

 

We're helping our customers build the best apps in the world. Want to be a part of the Fabric team and build awesome stuff? Check out our open positions!

Fabric May Update

By Annum Munir, Product Marketing Manager

May is an exciting time for mobile developers. Whether it’s the start of summer or the kick off of conferences, app development teams are spoiled with new products and improvements. In May, we shipped a bunch of features to save you time, speed up user login, shed more light on user behavior, and make it even easier to monetize and grow your app. Here’s a roundup of what we released:

Bringing powerful PRs, one-click installation, and enhanced deployment options to fastlane

Going forward, you don’t need to locally compile your app just to test and preview a change. With fastlane, you can now do it straight on GitHub from the pull request! We also introduced one-click installation (so it’s even easier to get started with fastlane) and added support for two-step verification for stronger security. On top of that, fastlane now supports uploading of APK expansion files and you can quickly promote existing beta builds straight to production on Google Play.

P.S. Try deploying fastlane with the rocketship emoji! You can totally do this.

Read the full announcement.

Dynamic routing supercharges Digits login performance

With Digits, we released dynamic routing to further improve SMS delivery and boost login conversion rates. Dynamic routing allows us to intelligently send your Digits SMS confirmation code through the best quality route (to thousands of carriers in over 217 countries) with greater speed and ironclad confidence.

If extenuating circumstances delay an SMS confirmation code from arriving quickly, Digits voice fallback will save the day and deliver the codes via a voice call. Dynamic routing is completely free and automatically enabled for you!

Read the full announcement.

More visibility into business-critical user actions with Answers

With our latest update for Answers’ event attributes feature, you will now see the top 10 categories for each category event attribute! This update helps you easily discover the most popular categories, and see how they change and trend over the past 30 days. We’ve also added new drill-down options so you can toggle and customize your graphs to suit your unique app goals.

Read the full announcement.

Seamlessly monetize your app with Twitter Kit + MoPub

This month, we officially launched our integration of Twitter Kit and MoPub, making it easy for developers to insert MoPub ads directly into the Twitter content they display in their Android and iOS apps. Now, with just a few lines of code, you can engage your users with a dynamic timeline of Tweets and build your business with native MoPub ads that fit seamlessly into the stories you want to tell.

Doing more with 140 characters

In addition, we announced an upcoming set of changes (rolling out over the next few months) to enable people to express even more within 140 characters on Twitter. These changes will allow for richer public conversations that are easier to follow, and ensure people can attach extra elements, media, and content to Tweets without sacrificing the characters they have.

Read more about these changes and how to transition your products in our Twitter Developer Blog.

Here’s our internal changelog:

Fabric Platform

  • Android

    • Improved Fabric SDK initialization time

Crashlytics Kit

  • Android

    • Updated Fabric Dependency

Answers Kit

Digits Kit

  • iOS

    • More specific error types around contact upload error

    • More verbose debug console logging

    • Updated Fabric Dependency

  • Android

    • Updated Fabric Dependency

Twitter Kit

  • iOS

    • Fixed non-modular import error in Cocoapods

    • Monetize your app by seamlessly displaying native ads from MoPub’s ad exchange in-line within your Twitter timelines

    • Fix bug where retweets are not filtered properly when using `TWTRUserTimelineDataSource`

    • Better error handling around web auth

    • New convenience method for requesting Twitter user email

    • New delegate methods on Tweet detail view controller

    • Linkification in Tweet detail view controller

    • Updated Fabric Dependency

    • Allow #hashtags to be pre-filled in Composer

  • Android

    • Initial release of twitter-mopub

    • Monetize your app by seamlessly displaying native ads from MoPub’s ad exchange in-line within your Twitter timelines

    • Allow #hashtags to be pre-filled in Composer

    • Updated Fabric Dependency

MoPub Kit

Bringing powerful PRs, one-click installation, and enhanced deployment options to fastlane

By Hemal Shah, Product Manager

launching-fastlane-prs-one-click-install-deployment-upgrades-header.png

We know that time is your most precious asset. Our goal is to help you and your team spend more time creating amazing user experiences — not waste it by drudging through cumbersome, repetitive deployment tasks.

That’s why, eight months ago, we welcomed fastlane into the Fabric developer toolbox streamlining the entire app deployment process. Since then, fastlane has already saved over 1 million developer hours! Here are some more exciting updates from the fastlane family:

Introducing device grid: painlessly preview app changes from PRs

Constantly improving your app is awesome. You know what’s not awesome? Having to manually attach screenshots to every feature change, being forced to download remote changes and compile a new build locally, and having to test a beta build and then fiddle through app screens just to make sure a new feature works.

Instead of doing all this work, wouldn’t it be nice to test your app directly from a pull request? Imagine the amount of time you could save if you were able to interact with code changes in the same place where you already give feedback. Well now you can!

Device grid by fastlane takes the grunt work (and the guesswork of how app changes will look and feel) out of this process by allowing you to easily stream your latest app changes on a virtual simulator right from a browser. With fastlane, GitHub, danger, and Appetize.io, you can interact with your new code straight from a PR. Get started with device grid today.

One click and you’re done: install fastlane via the Fabric Mac app

fastlane makes app deployment fast and simple. So naturally, installing fastlane should be just as fast and simple too, right? Up until now, you could only install fastlane from the command line via Ruby. Moving forward, we’re giving you another, quicker option: fastlane can now be installed with one click from the Fabric Mac app.

We’ll bundle everything you need to run fastlane and even check to make sure you don’t have an existing version installed, so you don’t need to worry about any dependency conflicts.

Two-factor authentication support for greater security and control

We understand that you want extra security when deploying builds using fastlane. Recently, Apple allowed support for two-factor authentication for iTunes Connect, and we’re pleased to announce that all fastlane tools now support two-factor authentication. If you choose to use 2FA for your developer portal or CI systems, we’ve got your back.

Here’s how to use 2FA on a CI system.

Android expansion files and Google Play build promotion

We’re incredibly proud of the open source community around fastlane. Every day, developers contribute amazing things that make fastlane more powerful and efficient. Two particularly awesome community contributions we want to highlight are: support for uploading APK expansion files and a new option for promoting APK between tracks.

These updates will help you better manage your APK expansion files and quickly promote beta builds straight to production on Google Play, skipping the online submission process.

Here are the release notes for uploading APK expansion files and promoting APK between tracks.

More time = more power

Our mission is to solve and automate the tedious aspects of mobile development and give developers more freedom to innovate and create. We can’t wait to see what you build and deploy next with lightning speed!

P.S. As a bonus treat, you can now trigger and run fastlane with the rocketship emoji. Seriously. Give it a try and let us know when your next deployment is underway!

Introducing Fabric mission control

by Meekal Bajaj, Product Manager

Since we launched the Fabric mobile app for developers in February, we’ve been using Fabric’s web dashboard (fabric.io) to stay on top of how our own app is performing. Many times we found ourselves switching back and forth between different dashboards for our production and dogfood builds. Knowing that many of you monitor a lot more apps every day, we set out to build something that can make this experience completely seamless and empower you to know your apps’ performance easily at any moment.

Today, we’re thrilled to introduce Fabric mission control — the pulse of all your apps on a single, intuitive dashboard.

One stop to keep up with all your apps

When key information about your apps lives across different dashboards, it’s hard for the team to have the context they need to make the best decisions. While Fabric today gives you the #1 crash reporting and mobile analytics tools that show you the pulse of your apps, those insights live on different dashboards on fabric.io. We wanted to take that experience to a whole new level.

With Fabric mission control, we bring together the critical top level information across all your apps onto one single dashboard. Now, you get a complete view to easily see the pulse of your apps at a glance.

We’ll be rolling out access and enabling the mission control dashboard for all customers over the next few days. Once it’s enabled on your account, it will automatically be set as your default starting page when visiting fabric.io. You can easily toggle mission control on and off to chose the dashboard experience that works best for you.

From our friends at BuzzFeed:

Fabric’s new mission control is the first thing we look at everyday. We have it up on the TVs at our office so we can monitor our DAU, crash rate etc. across all of our key apps at any given moment.

 

Data that truly matters — front and center

It’s important to stay on top of the most critical issues affecting your apps. Fabric sifts through millions of issues and events every day and brings you the most important information about your apps. We’ve distilled all that data on your mission control so you can hone in on the areas that need your attention right now.

On your new mission control, you can jump straight to critical issues or see a summary of how your top build is performing. If you’re wondering how well-tested your latest beta is, you can see that as soon as you open your web dashboard.

Key apps and data points —instantly accessible

Fabric lets you decide which apps you want to focus on, and in which order on mission control. Simply favorite an app to pin it to the top or reorder your apps so that the most important ones are the first you see. 

You can also easily locate an app or a number of apps via the search bar built right into your mission control. When searching, we filter the list in real-time to only show the apps that match what you are looking for. Clicking on each metric takes you directly to the details you need.

We couldn’t be happier to get this into your hands. We truly believe that the new Fabric mission control is yet another huge step toward our mission to help you build the best apps. Sign into fabric.io and check out the new mission control!

New milestone achieved: over 2 billion active devices

By Rich Paret, General Manager, Developer Platform

Ever since we launched Crashlytics four years ago, our mission has always been and remains the same: to build tools that mobile app development teams love. That’s why we built Fabric, which reached a huge milestone last July by serving over one billion active devices around the globe.

Today, just nine months after reaching our first milestone, we’re proud to share that we’ve doubled our previous achievement: Fabric is now serving over two billion active devicesmeasured on a 30-day basis — on both iOS and Android.

It’s been an amazing journey to see Fabric being used and trusted by tens of thousands of top apps around the world. Thank you for trusting your business to Fabric and Twitter; we take that commitment seriously and look forward to continue supporting you in building the best experiences for your customers. Let’s put a dent in the universe together.

Cheers,



fastlane has saved over 1 million developer hours

By Felix Krause, Founder of fastlane

Four years before joining Fabric, I was building an iOS app with two other developers. We were so excited to push the latest update to our customers, but we had to spend an entire day taking & uploading screenshots and figuring out how to use iTunes Connect. It was incredibly frustrating and I knew there had to be a better way.

Fast forward to 2015: I wanted to solve this pain for myself and other developers once and for all, so I built fastlane to streamline the entire app deployment process. What use to take days or weeks now takes minutes — or even seconds — using fastlane. Then 8 months ago, I had started monitoring how much time fastlane is saving for the community.

Today, I’m thrilled to share that fastlane has saved over 1 million developer hours. On behalf of the Fabric team, I’m humbled by the incredible response for fastlane thus far. I never imagined its impact would be this large.

With 1 million hours being equivalent to over 114 years, my Fabric colleagues and I were excited just thinking of all the cool things developers could do with all that time back. A few ideas we had:

  • Build 28 more Golden Gate Bridges in San Francisco
  • Circle the globe 15,000 times in an airplane
  • Watch all Star Wars movies 75,000 times
  • Make a round-trip flight in a space shuttle from Earth to Pluto almost 4 times

We look forward to continue supporting you in your app development journey. In the meantime, let us know what you've done with the time you saved — we’d love to hear it!

Fabric March update

By Jonathan Zazove, Product Manager

Between the holidays and celebrations in March, we haven’t forgotten our mission to build the best developer tools to make your lives easier. During March, we hunkered down and shipped a number of major releases: Fabric for Unity, Nuance Kit and fastlane for Android v1.0, among other upgrades and enhancements.

Doubling down on games with Fabric for Unity

For years, Twitter has helped game developers deliver amazing experiences through rich content and app distribution tools that drive discovery and conversation about your content. Within the Fabric team, we doubled down on that support by releasing Fabric for Unity earlier this month. Now, you can easily build, distribute, and monetize your games with best-in-class tools all readily accessible in one place.

Read more on the full announcement.

Nuance SpeechKit now available on Fabric

Today, we're thrilled to share that Nuance have made their SpeechKit SDK available via Fabric. Nuance gives you tools to quickly develop a natural speech interface for applications. They offer highly-accurate cloud speech recognition, an extensive portfolio of natural sounding text-to-speech voices, and the flexibility to use their speech with a variety of platforms and languages. Just like all of our kits on Fabric, you can install or update the SpeechKit with just a few clicks. We take care of all the grunt work like provisioning your keys, so if you already have an account with Nuance, you can easily onboard your app.

fastlane for Android: now official

Since we opened beta access to fastlane’s support for Android a few months ago, we’ve been expanding its capabilities and doubling down on serving the mobile ecosystem. Today, we're thrilled to share that we're officially releasing fastlane for Android v1.0. Now, you’ll get the same award-winning app deployment experience as on iOS. We’re really grateful for the strong fastlane community whose contributions helped bring a stable, reliable version for us to release. We're excited to continue helping you build, test and release the best apps and updates to the Google Play Store!

 

Here’s our changelog:

Fabric Platform

  • Unity

    • Released Unity plugin with Crashlytics, Answers and Twitter Kit integrations.

  • iOS

    • Shipped the Nuance SpeechKit.

  • Android

    • Shipped the Nuance SpeechKit.

    • Released fastlane for Android version 1.0.

Crashlytics Kit

Answers Kit

Digits Kit

Twitter Kit

  • iOS

    • Fixed issue using a `TWTRTimelineViewController` as the root view controller of a Storyboard.

    • Deprecated support for iOS 7.0.

    • Added TWTRTweetDetailViewController for showing full size images.

    • Added `geocode_specifier` property to `TWTRSearchTimelineDataSource` to allow filtering by location.

    • Added `topTweetsOnly` property to `TWTRSearchTimelineDataSource` to allow the default filtering of Tweets.

    • Changed `TWTRTimelineViewController` to use automatic cell heights.

    • Shipped automatic update on the timestamp on `TWTRTweetView` every 30 seconds.

    • Shipped support for Dynamic Type for accessible text sizes in `TWTRTweetView`.

    • Removed deprecated methods on `Twitter` class.

    • Removed methods from `TWTRTweetViewDelegate` in favor of `NSNotifications`.

    • Added TWTRLoginMethods enum to allow developers to decide which login method they would like to use.

    • Made `-[TWTRAPIClient uploadMedia:contentType:completion:]` public.

    • Remove the TWTRShareEmailViewController.

    • Improve image size selection logic for Tweets with attached media.

  • Android

    • Removed Verisign Class 3 Certificate from pinning list.

    • Fixed JavaDocs.

MoPub Kit

Doubling down on games: introducing Fabric for Unity

By Hemal Shah, Product Manager

Think back to the first game you ever played. Do you remember your high score or the feeling when you beat the level you spent all night trying to get past? We do too. For years, Twitter has helped game developers deliver amazing experiences through rich content and app distribution tools that drive discovery and conversation about your content.

Within the Fabric team, we want to double down on that support, and make it even easier to help you build, distribute, and monetize amazing games with best-in-class tools. That’s why today we’re thrilled to announce that Fabric now supports Unity, one of the most popular game development engines in the world.

 

Focus on building. We’ll help take care of the rest.

In building Fabric for Unity, we worked with hundreds of amazing game developers and learned that a wide variety of teams are facing many of the same challenges:

  • building a stable game for every user
  • surfacing metrics that matter
  • acquiring more customers
  • generating revenue

As we set out to build Unity support for Fabric, we wanted to bring our award-winning SDKs to game developers that leverage the Unity engine. We crafted a streamlined onboarding and update experience through one unified Unity plugin that would give you time back each week to focus on building your game.

Integrated straight in your Unity IDE, there are no extra steps required when you want to install or update any of our SDKs. We know that you're comfortable in your IDE, so with Fabric, you never have to leave it.

With Fabric, the idea of a single tool that will not take long to implement but give us a broad reach in terms of capabilities in Unity, is a huge offering.


A great game starts with a stable base. Using Crashlytics, the #1 crash reporting tool, you get the best of iOS and Android crash reporting to your native and C# code. We perform a deep analysis of each stack trace to identify the most important frames so you can see the exact cause of the crash and immediately address the issue.

Crashlytics was integral to the development of our hit mobile games Star Trek Timelines and Game of Thrones Ascent, and vital to the live operations of both titles. The detailed crash data empowers our engineers to quickly drill down on specific issues, and the visualization tools provide product managers and producers a clear picture of how our crash metrics shift with each new game update. A minimal crash rate means happier players, and Crashlytics is our tool for achieving that goal!



We also know that game analytics can be a hassle. With every chart, graph and filter imaginable, finding the data you need can be time-consuming. Having real-time insights about what your customers are doing in your app will save you time and overhead costs. That’s where Fabric comes in.

Answers, part of the Fabric suite of tools and seamlessly integrated with Crashlytics, is a perfect match for game developers. Out of the box, it has events that match directly to your game milestones, including:

You can even log any custom event for the unique situations and player scenarios your game has. Our analytics support for Unity gives you the easy wins when it comes to getting the most important metrics you need to make key business decisions -- all in real-time. And with the Fabric mobile app, available on both iOS and Android, you can be notified about key stability and performance alerts on the go.

 

Unlock growth with Twitter – globally

Building a great game means attracting and retaining as many users as possible. As you know, you need to find the most efficient ways to get new customers excited and continue that emotional high for current users.

With Fabric, you can tap into the power of Twitter and attach rich photos, videos and other media experiences to Tweets that drive traffic to your website or app. Victories are sweetest when celebrated. Twitter provides a unique platform to let your players celebrate their triumphs in real time. The Twitter feed is live, public, and conversational; our tools give you the ability to make your game a part of that conversation. With Twitter through Fabric, you can create a way for players to quickly Tweet in a way that feels natural to your game.

To make sure you’re getting the widest and most effective distribution possible, you can even leverage Twitter’s mobile app promotion ecosystem.

Twitter was my virtual leaderboard. 100 percent of the initial discovery of my game came through Twitter because of the 'Tweet your score' button.



Build a business. Maximize ad revenue.

MoPub has been used by game developers since its inception five years ago to help maximize the value of ad supported games. The system offers a single, comprehensive monetization platform that can be seamlessly integrated through Fabric. You can take advantage of all the major ad formats in mobile to create a customized experience that fits naturally with the content of your game.

Our system gives you free ad serving for cross promotion or direct sales, free ad network mediation, and immediate access to over 175 demand partners through MoPub Marketplace, a leading real-time bidding exchange for mobile advertising.

From our friends at FEO Media:

Moving to MoPub for network mediation has been one of the most positive steps this year for the company; not only for increased revenue, but because of the additional controls and transparency.

 

The most seamless game development experience

Our passion is to build developer tools and services that make your life easy. For Unity, we set out to craft the most seamless plugin in the market. With just a few clicks you can easily onboard our kits into any Unity project. We’ve even built in a few extras that we think all Unity developers will appreciate:

  • Proper dependency management is baked in so you’ll have a hassle-free experience from conception to monetization.
  • Elegant notifications when your tools are out of date; we even automate the update process so when you’re ready, you can always ship the most up-to-date code.
  • Pain-free downloading and updating. No more removing files manually.

To get started, simply download and import the Fabric plugin into your project. We're excited to help you through your game development journey and can’t wait to hear what you think!

 

Fabric February Update

By Hemal Shah, Product Manager

For the past month, we’ve been focusing on customer love. Rather than giving our customers some of those awesome candied hearts, we spent our time shipping some things we knew would win your hearts.

Introducing the Fabric mobile app

Since we launched Fabric in 2014, our mission has been to make tools that let you focus on building the best apps. We heard from you that some of the most impactful crashes and performances updates don’t always happen when you’re in front of a laptop.

With the Fabric mobile app, it’s never been easier to know what’s going on with your app on the go. We sift through millions of events every day to intelligently give you the most important information.

See the original announcement here!

Full support for tvOS with Fabric

Over the past few months, we’ve made major enhancements to the Fabric platform, adding things like tvOS support for Digits and Crashlytics. In February, we wanted to be able to bring the power of Answers that you’ve come to know and love to tvOS as well! This includes instant visibility into critical performance metrics, such as DAUs, MAUs, and crash-free users — all in real time.

Read more on the Answers blog!

Introducing screengrab on fastlane: automating screenshots on Android

Taking app screenshots is a ton of work and a huge time sink. The process usually requires capturing the shots, making sure each one is lined up correctly, and then localizing them for your customers’ needs — not to mention, you have to do this on every device, for every language you support. With fastlane, we solved this for iOS with our snapshot tool, and this month we brought the same magic to Android with screengrab!

See the original announcement.

The most powerful and intelligent crash reporter

In February, the Crashlytics team released a dashboard feature that highlights significant and unique bits of information about particular issues with badges! Now after a new release, you'll easily be able to identify if you have any issues that stand out against the rest.

Read more on the Crashlytics blog.

 

Here’s our changelog:

Fabric Platform

  • iOS, OS X and tvOS
    • Fix: Corrects a bug that could prevent Multipart MIME encoding from succeeding if the payload contained a zero-byte file

    • Fix: Improved stability when running on OS X 10.7

    • Enhancement: upload-symbols tool is now bundled within the CocoaPod

    • Improves README for CocoaPod users

    • Improves handling of paths with spaces in them

Crashlytics Kit

Digits Kit

  • Coming soon!

Twitter Kit

  • Android

    • Fixed retrieving auth token when using OkHttp 2.3+

    • Added gif or duration badge to media view

MoPub Kit

fastlane wins “Outstanding Performance” in Fukuoka Ruby Award Competition

By Felix Krause, Founder of fastlane

When I started fastlane, I never imagined that I’d be so fortunate to work with a community so passionate about developer tools. Since fastlane joined Fabric a few months ago, we’ve been working on making fastlane a best-in-class automation toolset that developers love, on both iOS and Android. Part of this journey involved my participation in the 2016 Fukuoka Ruby Award Competition, where creators and innovators showcased the companies, apps, and services that they built with Ruby.

I’m honored to share that fastlane won theOutstanding Performance award!

fastlane uses advanced Ruby features, and even defines its own custom Ruby DSL, to offer highly optimized configuration files for mobile app developers. It’s a privilege to be celebrated by the creators of Ruby, and for fastlane, it’s a big stamp of approval to show that we’re building tools that have a real impact.

Congratulations to all the other award winners; it's great to see so much innovation happening around the world!

Unifying fastlane tools

By Felix Krause, Founder of fastlane

TL;DR — fastlane is moving to a mono repo, and there's no change for you!

For more than five years, I’ve been working as an iOS developer for various companies around the world. During that time, it became clear there was lots of room for improvement around mobile developer tools, especially the deployment of apps. Because of that, I started implementing little tools to help me automate tedious tasks like uploading metadata for release builds or generating screenshots. Each of those tools had no connection with each other and ran as standalone commands. About four months after the initial release of deliver, snapshot and frameit, I noticed one common theme: everyone using these tools developed their own shell scripts to trigger different deployment steps, pass on information, and ensure every step was successful.

I wanted to help developers connect all the tools they use into one, simple, unified workflow. I ended up building a very flexible and powerful tool called fastlane. fastlane defines a simple configuration file that allows every mobile developer to specify steps for the release process of their app. fastlane takes care of all the heavy lifting, like passing information between build steps, and ensuring each step is successful while using sensible defaults so you can focus on building a great app instead of the overhead to build and deploy.

Since the beginning, fastlane integrated with all the tools you already love, like CocoaPods, Slack, and xctool. Additionally, fastlane was designed to be as open as possible, allowing every developer to extend it to fit their needs. This was 🔑: within weeks, there was a passionate and growing fastlane community. Over 70% of all the fastlane integrations were contributed by amazing external developers. To this day, this number continues to amaze me!

But it didn’t stop there. After the initial release of fastlane, I published 10 new standalone tools, all tightly integrated with fastlane. As you can imagine, this added a lot of complexity to the fastlane architecture, especially the number of repositories and their dependencies. It resulted in confusion for users, as it’s unclear on how to contribute, where to submit issues and where to look up the documentation.

For example, here are some fun facts about fastlane:

  • fastlane has its own repo just to manage the other repos called “countdown

  • The fastlane organization has over 30 GitHub repositories

  • I added 360 commits whose only purpose was to update internal dependencies between fastlane tools

As the community grows, the current architecture continues to cause confusion and overhead for both the end-users and the fastlane team. The last few weeks I’ve been busy working with the team to find a good solution, and I’m extremely excited for what we came up with.

Our goal to unify fastlane tools

As our community grew and we thought about how to make fastlane as amazing as possible, we wanted to think about a centralized way that would serve as the foundation for the future development of fastlane.

Our team created a main repo, and all fastlane repositories will be migrated to it. Each tool will be in a subfolder enabling you easy access to its source code.

With developers top of mind, we made this as seamless and hassle-free as possible. With this migration, you can still use all tools directly, so your setup will continue to work as usual. This should not break any existing setups and doesn’t require any action from your side.

Unifying fastlane means having one place for everything you need. Now, there will be one place to submit and search for issues on GitHub, one place for the documentation, one place to contribute to fastlane, and one tool to install.

We also want to be in a place to best help the fastlane community. Now, there will be less time spent keeping repositories in sync with tools like TravisCI, Rubocop, and GitHub settings.

We’ll be making this move within the next couple of weeks.

Our commitment to transparency

It was super important for our team to include the fastlane community in the process early and share these details before anything was done. In particular, we want the switch to be as flawless as possible without requiring any changes on your end.

With this change, I’m confident we’ve built a solid foundation for the future development of fastlane, so that we can move faster with new tools, features and ongoing support.

fastlane’s continued success is only possible thanks to including the fastlane community early in the process. I’m excited to see what the future of fastlane holds!

 

Introducing the Fabric mobile app

by Meekal Bajaj, Product Manager 

Since we launched Fabric in 2014, our mission has been to make tools that let you focus on building the best apps. Crashlytics and Answers have made it easy to see your app’s stability. But crashes don’t always happen when you are at your desk. And when time is of the essence, having the right context at your fingertips can make all the difference.

Today, we are thrilled to release the Fabric mobile app – your app’s heartbeat in your pocket.

The Fabric mobile app makes it easy for you to know what’s going on with your app. We sift through millions of events every day to intelligently give you the most important information. And starting today, our real-time alerting system will send you a push notification when something critical is affecting your app.

Keep a pulse on your app, even on the go

A few months ago our friends at Runkeeper, an app that helps runners track fitness, reached out to us with a problem: they had the least access to Fabric when their users were the most active – on weekends.

Runkeeper users are the most engaged then, making it the best time for the service to launch new promotions. To ensure that issues were triaged as soon as they happened, the Runkeeper team needed uninterrupted access to their dashboard, including weekends. With the Fabric app, the team can find out immediately when something critical is affecting their app via push notifications – no matter where they are.

From our friends at Runkeeper:

Having been using the Fabric mobile app since it was in beta, I know how connected our team will be once more start using it. Now, when I leave the office, I know that I can count on Fabric to send nudges when something critical happens to our app's stability. Because of that, our team will get tons of time back, and can truly deliver on the best customer experience for our users, no matter where we are.


Push notifications that matter

When you get a push notification from us, we’ll give you everything you need to know: full stacktraces, number of affected users, and breakdown of devices and platforms – all in real time. That way, even before you pull up your laptop, you know where to look for a bug, who on your team to reach out to and how it could affect your metrics.

If you have lots of apps, don’t worry: you won’t be bombarded with push notifications! With per-app settings, you control how much and how often you want to get notified about each app. We’ve even turned the frequency down by default so you will only receive notifications for high priority issues. And for those times you want to be uninterrupted or away from work, we’ve added a mute option.

We can’t wait for you to try it!