Zero to BLE Part Two Core Bluetooth Post Updated for Swift at Cloud City Development Blog!

I’m happy to announce that I recently updated Part Two of my Zero-to-BLE series on Core Bluetooth Post Updated for Swift at Cloud City Development Blog! It’s been updated for Swift 2, because when I wrote it, Swift 3 hadn’t officially been released and I honestly thought it would be published well in advance of the September 7 Apple Event.

Zero to BLE on iOS – Part Two – Swift Edition

Better late than never!

Who knows? Maybe there will be a Swift 3 version in the future? For sure all my code samples will be in Swift 3…

Hope you like it!

How to Query Custom URL Schemes in iOS 9 (Hint: it’s different now.)

This was a new one on me and I discovered it accidentally.

In one of my apps, NineOneOne ~ One-Touch Emergency Dialer, I query for the presence of the Skype app, so that an emergency call can be placed using Skype instead of the phone app.

Why would one want to do this? Well, as it turns out, I wanted users who had an iPad or an iPod Touch to be able to use NineOneOne on those devices without the presence of the phone. The obvious candidates were Skype and Google Voice, and at the time Google did not provide a way to launch Google Voice via custom URL scheme. Therefore Skype was it.

Prior to iOS 9, this process was super easy. Just call UIApplication’s canOpenURL method:

self.skypeEnabled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"skype://"]];

Unfortunately I noticed that this was breaking in iOS 9 and there was a little message in Xcode’s console:

This app is not allowed to query for scheme skype

…and this baffled me since I hadn’t heard of any changes to this API and it seemed like a pretty standard and common function to use.

The New Way
It turns out that, while this method still works in iOS 9, you have to take an extra step beforehand. At about the 10-minute mark in the video for Session number 703 at WWDC 2015, you will find that the presenter shows the new process going forward.

You need to open up your Info.plist file, and add a new record, LSApplicationQueriesSchemes, define it as an array, and then add the schemes that you will be querying in your app to that list:

LSApplicationQueriesSchemes-skype

Once I added that key and the “skype” URL scheme to the array in the Info.plist, the URL scheme querying immediately started to function again!

This strikes me as a way for Apple to keep track of who’s-querying-who’s-app by using the app’s metadata, and also for iOS 9 to deny any URL scheme queries that are not in the list, so we need to now be explicit up-front about which URL schemes we are interested in.

Understanding How Notifications Work on Apple Watch

I’ve had my Apple Watch for a little while now, and I have really found myself relying heavily on it as a device primarily for notifications.

The one thing that has really bothered me, however, is the somewhat random nature in which notifications are delivered to The Watch. I’m not sure I want all notifications to go to the watch, but I’d certainly like to know why some don’t end up on my watch and others do.

Finally I thought I’d take the time to find out, since I happen to be doing a lot of work lately with push notifications in iOS and I was wondering why certain notifications were delivered on my watch and others weren’t.

Turns out Apple has a little explainer on their support site that addresses that very subject:

About notifications on your Apple Watch – Apple Support

In a nutshell the rules go like this:

  • If your iPhone is unlocked, you’ll get notifications on your iPhone – not your Apple Watch.
  • If your iPhone is locked or asleep, you’ll get notifications on your Apple Watch, unless your Apple Watch is locked (i.e. you haven’t entered your passcode).

As a side note, the support article also mentions the following:

When you dismiss notifications on your Apple Watch, they’re also dismissed from your iPhone. You might get certain notifications on your watch that you need to respond to using your iPhone.

I hope this helps others who may have been a little mystified about how notifications work on Apple Watch!

How to Add an Internal Tester to TestFlight If They Already Have an iTunes Connect Account

As a consultant, I’ve had this situation come up many times, and it’s very frustrating because Apple doesn’t allow an Apple ID to belong to more than one iTunes Connect account.

The scenario is that you have a client or friend that you would like to be an internal tester in your organization’s iTunes Connect account, or, perhaps it’s the corollary situation in which you have a client who has their own iTunes Connect account and you need access to their account as a tester or admin or developer. I’ve had this situation come up both ways, and here is how I’ve dealt with it.

The main requirement is that your prospective tester has a Gmail account. I’m not sure if this trick works with other email systems but it definitely works with Gmail. So if they they do, then you should be good to go. These days most individuals and companies are using Gmail as their provider so I haven’t run into anyone that this didn’t work with yet.

On with the process!

In nutshell, to circumvent Apple’s crazy limitation, you can do the “+appname” trick on their Gmail email address. For example, if the person I want to add is “fred@myclient.com”, and the name of the app I’m working on is “Awesome App” I would send him an invitation as “fred+awesomeapp@myclient.com”. Their Gmail-based mail system will let the email through just fine.

Then, they create a new, separate Apple ID with “fred+appname@myclient.com”, and iTunes doesn’t complain. iTunes Connect emails get sent to the right place because Gmail just treats them as the same account, and then your client (or you) can have multiple iTunes Connect accounts with what amounts to the same email address.

Then when they receive the follow-up notification to join TestFlight, it arrives at the right email address, and when they tap the button in the email it opens TestFlight on their device, they sign in with their normal Apple ID (even if it’s fredjones@gmail.com), and then they’re in.

It feels a bit hackish, but it works!

I’m pretty sure I learned this technique from this blog post, which also has some other great suggestions for working with clients and getting their builds up to the App Store, which is a subject for another day…

Announcement: Lightning Talk @CocoaConf San Jose 2015!

This has been something I’ve wanted to do for a long time.

I was already signed up for CocoaConf San Jose 2015, and just a couple of weeks ago they announced in a conference email that they had four slots open for Lightning Talks. I immediately jumped at the chance.

Thankfully (and amazingly)… they accepted!

I don’t want to spoil the presentation since, after all, it’s only a five-minute presentation. However, I will say that the theme is Saving lives with iBeacons and it focuses on the combination of iOS, iBeacons, and Healthcare.

The talk came out of a recent project I was working on for a client of Cloud City Development and I thought would be perfect for a talk at a conference, and the client agreed!

Therefore, I am super excited that I can do an abbreviated version of the talk at CocoaConf San Jose, and I really hope I can do in a more robust, full-featured version in the future… but first things first!

See you there!

Quick list of what’s new in Xcode 7.1

What’s new in Xcode 7.1

Xcode 7.1

Xcode 7.1 adds support for new iOS devices and the new Apple TV. Xcode supports storyboards, unit and UI testing, playgrounds, and crash logs features for tvOS.

Interface Builder

  • Storyboards now support 3D Touch gestures such as Peek and Pop.

Debugging

  • Swift error breakpoints can be created in the Xcode debugger.

    Swift errors activate defined Swift error breakpoints when the error is thrown. You can edit Swift error breakpoint so that they are activated only for a specified Swift error type.

Enjoy!

Part Two of Core Bluetooth, iOS and Bluetooth LE Development Blog Series Now Available at Cloud City!

As I have mentioned before, I work for an awesome software development studio in San Francisco called Cloud City Development, and back in June we published Part One of the series Zero to BLE, which is a tutorial series focusing on developing for iOS using Core Bluetooth.

Today, I’m super excited to be able to announce that Part Two of the series has been published! As in the first article, the examples in the article are written in Objective-C, not Swift, and it has an associated tutorial project on Github that you can download and experiment with.

ZeroToBLE2

Again, I would like to thank Cloud City Development for allowing me to create this series, and I’m already working on Part Three, so look for that in the upcoming weeks!

Tutorial: How to Create a PDF with Quartz 2D (via @raywenderlich.com)

OK so this goes back a little bit – 2012, in fact – but I was recently researching how to create a PDF from within an iOS app. I honestly didn’t know if it was possible.

Thankfully, the following is a very helpful and clear tutorial on RayWenderlich.com by Tope Abayomi with steps for creating a PDF using Quartz 2D in iOS :

How To Create a PDF with Quartz 2D in iOS 5 – Part 1 – Ray Wenderlich

Thanks again Ray and crew!

 

How to use Helvetica Neue UltraLight (and other fonts) in your iOS Code

One of the more frustrating things about doing things in code is when it comes to fonts. Lately I had to do a guessing game when I wanted to use Helvetica Neue UltraLight as a font in a demo for an upcoming blog post for Cloud City Development, and it was making me crazy playing the “guess the font name in code” game:

“Helvetica Neue Ultra Light”? Nope.
“Helvetic-Neue-Ultra-Light”? Nope.
“Helvetica-Neue-UltraLight”? Nope.
“HelveticaNeue-Ultra-Light”? Nope.
“HelveticaNeue-UltraLight”? BINGO!

It took me a few tries through the trial-and-error method, but I eventually got the right name (as you can see from the list above, it’s “HelveticaNeue-UltraLight”), but it led me to think there must be an easier way.

Enter Font Book.

Font Book is an application that comes with Mac OS X for managing fonts in your system, and it turns out that it can help us as developers to solve these kinds of riddles. The challenge is that the answers are little a bit buried…

So… let’s go through this particular challenge.

First, let’s open Font Book (Look in Applications > Font Book, or if you’re an Alfred or Spotlight search user just start typing “Font Book” and it should pick it up immediately).

When you launch FontBook, it will probably look something like this (select “All Fonts” from the sidebar if it’s not already selected):

FontBook-1

Then, the next step is to scroll down and find “Helvetica Neue” in the list of font names, and then expand it and select “UltraLight” node in the list:

FontBook-2

If we examine the details in panel on the right, the item we are most interested in is the PostScript name entry, since this is the one that we will use in our code.

As you can see here, the value is “HelveticaNeue-UltraLight”:

FontBook-3

We can actually highlight and copy it directly from the detail panel. Very convenient.

Now that that’s done, it’s basically just a matter of plugging in the new value into your code:

Objective-C
myLabel.font = [UIFont fontWithName:@"HelveticaNeue-UltraLight" size:128.0];

Swift
myLabel.font = UIFont(name: "HelveticaNeue-UltraLight", size: 128.0)

…and that’s it! Mystery solved!

How to have multiple iTunes Connect accounts, and submit apps

iTunes Connect is a bag of hurt sometimes, especially if you have clients that you work with. One of the biggest frustrations that I have (and hopefully this will be changing in the future) is when you need to submit builds and you cannot use an email for an Apple ID in iTunes Connect to manage your client’s Apps, TestFlight, Users, etc.

While there is no easy way to accomplish this yet, at least there is this post by mokagio that helps ease some of the pain…

How to have multiple iTunes Connect accounts, and submit apps

TL;DR You can’t! There is no Apple way to do it, and this is yet another frustration of working in this platform. The steps described below are just a workaround to handle multiple iTunes Connect accounts in a sane-ish way.

While I don’t love using the Application Loader, at least it works. Also, creating email addresses for Apple IDs with the “+clientname” trick works great if you use a Gmail-based email system, and I’m fine with having my clients use this method when they add me to their iTunes Connect accounts.