How to Add Firebase’s Crashlytics to a Xamarin.iOS Project

Recently I’ve been doing some Xamarin development. Today, I had to find a way to add Firebase’s Crashlytics service to a Xamarin.iOS app. Not shockingly, there isn’t a ton of clear and succinct information on how to do this, so hopefully this post helps you.

1. Install NuGet packages.

Install the Xamarin.Firebase.iOS.Crashlytics and Xamarin.Firebase.iOS.Core packages into your Xamarin.iOS project. I don’t think the order of installing them matters, but I installed Crashlytics before Core.

2. Add the GoogleService-Info.plist file to your iOS project.

In your Firebase console, follow the SDK setup instructions until you get to Step 2. Download the .plist file and add it to your iOS project. Click on the file and set the Build Action to Bundle Resource.

3. Add Configure() calls to AppDelegate.

Find the FinishedLaunching() method in your AppDelegate.cs file. In the beginning of this method, put:

Firebase.Core.App.Configure();
Crashlytics.Configure();

You’ll need to add a using statement for Firebase.Crashlytics.

4. Does your iOS app reference the old Fabric Crashlytics? Well..

You need to remove the Fabric API key nodes from your Info.plist, or Crashlytics still won’t see any change. Thanks for Lucas for this answer. Specifically, remove the Fabric key element and the entire dict element after it, which contains the Fabric API key.

Guess what you don’t have to do? Anything to do with CocoaPods.

You’re welcome.

Advertisements

F2 [Rename] not working in all Sitecore instances

Feel dumb moment of the day.

If you use F2 to rename items and suddenly to your frustration, it’s not working anymore, you need to check if the Home tab is visible in the instances where it’s not working.

If it’s not visible, right click the dark gray tab section and click Home:

home tab unchecked sitecore

You’re welcome.

When does Sitecore Certification expire?

An associate pinged me with this question the other day and I really had no idea. My first thought was that they didn’t expire, since I didn’t actually receive a certificate after becoming certified; instead, just an email reporting that I passed the exam, my score, and the instructor’s congratulations. Nothing about when to retake the exam or when my certification expires.

My first thought of who to ask about this was the Sitecore community on Slack. At first I received my mixed answers, but someone provided an accurate answer: every 3 years. This seemed kind of vague for me, so I decided to get an official answer. I ended up emailing back my instructor (after almost 3 years!) and asking about when it expires, and I got an even better answer:

Certification expiration dates are the same as the Mainstream Support End Date for the corresponding Sitecore version per Sitecore Product Support Lifecycle policy. You can find the mainstream support end date for every version of Sitecore here:  https://kb.sitecore.net/articles/641167

By checking the version of Sitecore I was trained on and its mainstream support end date, I was able to officially determine when my certification expires. However, you should make a point to get re-certified regularly as new versions of Sitecore come out with major changes. Hope this helps some of you out there!

 

 

The Coveo Analytics are not enabled for this Search Interface

Last week I started working with Coveo Hive. There are a few strange things I ran into or wasn’t sure how to resolve. I’ll be writing a series of blog posts on these things as I continue to work on my very first Coveo Hive project.


I set up a Coveo Hive search page using the basic layout provided with Coveo for Sitecore. Opening the page in the Experience Editor, I immediately noticed an error in red:

The Coveo Analytics are not enabled for this Search Interface. Insert a Coveo Analytics component to record Coveo Usage Analytics data.

I thought the instruction here was a little bit vague. I also was shocked to not find much information in the documentation about this (specifically, how to enable usage analytics in Coveo Hive). In the previous Coveo framework, you would select the search interface in the Experience Editor, and check a box to enable Coveo Usage Analytics. In Hive, you add a component (as the literature dictates).

I wasn’t sure exactly where to insert it though, and how; but here’s what worked for me. The solution was to add a Coveo for Sitecore Analytics component to the UI Header, above the search box and search box settings. You may have to do some clicking and navigating the hierarchy of components to find the UI Header. Hope this helps!

Coding and the Dangers of Familiarity: Keep Your Senses Sharp

When I started at my current company, we essentially had one major project that everyone in the team worked on. It was a client that we had been working with for a long time.  It was a fun project to work on, and I learned a lot about ASP.NET MVC and Sitecore. Even when the project closed, I had no regrets about working on it for nearly two years, with very little other projects coming up during that time.

It wasn’t until the project closed that I realized how it programmed me into doing a certain set of coding practices. They weren’t particularly bad practices, but you could say they weren’t the accepted, best way of doing things. Soon, I was being assigned to projects where the best practices and/or frameworks were in use and I was expected to use those. I’ll give you two key examples, which were both shocking once I realized what I had not done:

  • Glass Mapper. I started a new project where Glass was being used extensively. I had some small training/research on Glass in the past, but this was first project where I had to use it. I did end up using it somewhat effectively, but what shocked me was how suddenly, my defensive coding instincts did not kick in. For example, for 1.5-2.0 years, I was used to doing this:
if (item != null && item.Fields["Heading"] != null && !string.IsNullOrEmpty(item.Fields["Heading"].Value))
{
   ...
}

The second I would use .Fields[] call in Sitecore development, I would know to do extensive null checks; it’s the way I was trained – but now, I was not using that call anymore. The code was completely different, and so I did not even think of checking for null for some reason. I don’t know why I wouldn’t check for null – maybe I thought Glass would take care of it and never return null? Silly me.

  • Logging. I learned Sitecore development in an environment where I never had to add logging in case an error occurs. My former co-workers that wrote the site added a global try/catch around everything, so that whenever some code in a controller errors out, the details of the error would be entered into a record in an Exception (SQL) table. Essentially, I very rarely or never had to use Log.Error to write an error to the Sitecore log, since the Exception table would always catch that. Well, this convenience turned me into a poor developer; I realized this as soon as some code I wrote went live for a new project. It unexpectedly errored out, but I had no way of finding out what the error was because the site had a custom error page.

This is just my personal experience, and I don’t mean to rag on the project that taught me how to do Sitecore development, but the point I’m trying to make is: if you do the same thing over and over, and suddenly have to do something new, make sure you do some common sense checks before committing the code; namely:

  • Null check all the things.
  • Log information, warnings and errors for each functional part of the code that will be running.
  • Also, will your change negatively affect something that you did not intend? Carefully observe the differences between your new code and the old code.

Additionally, If you’ve been working on one project for a long time, and the development practices generally used in that project are not optimal, keep you coding senses sharp by learning about the best practices in your spare time. Read articles, watch videos, create a Sandbox project which includes those better practices in use. If you have any similar experiences, I would love to read them – thanks!