Tutorial: Making a Smarter iBeacon Emitter on iOS with Swift with PubNub | Guest Post

Apple has been using BLE on its devices since the iPhone 4S. Because of that great head start, the iPhone is easier to turn into a beacon than any other platform. In fact, Apple’s iBeacon protocol was the first to take advantage of the great qualities of BLE communication.

In this tutorial, we will make a smarter iBeacon emitter! Using PubNub and iBeacon, we can create two-way communication while still keeping the low energy asset of beacons! You’ll want to read a little bit on how we plan on doing this, this article will give you a high-level explanation on how our app is supposed to function. This weird, but simple setup increases the capabilities of iBeacons greatly!

We will first look into how to turn your iPhone into an iBeacon in Swift, and we will build the PubNub structure over it!

What are we waiting for? Let’s build amazing apps! This article is inspired by this example app so feel free to use some of its available source code.

Using your iPhone as an iBeacon

We won’t get into doing the user interface here, we really just want to focus using the iBeacon capabilities of your phone.

Setting up your View Controller

First things first, let’s import our libraries.

import UIKit
import CoreLocation
import CoreBluetooth

That’s all we’ll need for this.

Inside our view controller class, we’ll have variables representing the UUID, the major and the minor of our advertised signal.

You can chose any uuid or major and minor as long as the uuid is the same as the one you inserted in the app detecting your iBeacon signal.

Start advertising the iBeacon in a region

You need to create a CoreBluetooth peripheral manager which will control the advertising of your data. Don’t forget to set your View controller as a CBPeripheralManagerDelegate.

To simplify our app, we will start our peripheral manager when the view loads.

The first thing we want to do is build a beacon region. This will create an object defining the data you want to advertise: uuid, major, minor.

The next step is to create a peripheral manager instance. The peripheral manager is the element that will allow us to use the iPhone’s hardware to start acting as a beacon. We will need to set a delegate which will call the peripheral manager’s methods when certain events will be triggered. We set our view controller as the delegate. Don’t forget:

For iOS 8 or more, it is necessary for the app to request the user’s authorization to use location tools. This line usually will not suffice. You have to manually add a couple lines in the info.plist file which is located in the “Supporting Files” directory. If you right click on it and open it as “Source Code”, you want to make sure you add these lines inside the “<dict>” markup.

Alright, so we generated a dictionary containing the data we want to advertise in the proper format. The region object holds the important data. The measured power argument represents the RSSI power of our emitting device from a meter away. Remember, inside the advertised data, one byte represents this value which is used by the receiver to estimate how far the beacon is. By entering nil, this will return the default RSSI value of your device. That’s probably what you’ll want to do 99% of the time.

Finally we start our CBPeripheralManager. Since we set our View Controller as the delegate, as soon as the manager starts, the peripheralManagerDidUpdateState:peripheral: method of the delegate object (i.e. our view controller) will be called.

Use Objective-C libraries in Swift

The pubnub library is written in Objective-C, but we are coding in swift. All you need to do now is to build a bridging header. Create a new Objective-C header in your project called YourProject-Bridging-Header.h for good practice, and type:

Now in your project’s configuration panel, go to build settings and scroll down to the “Swift Compiler – Code Generation” section. Set the “install Objective-C Bridging Header” to Yes and in “Objective-C Bridging Header” type the path from your project’s root directory to your bridging header. It’ll be something like “YourProject/YourProject-Bridging-Header.h”

All set? Let’s roll.

Initializing PubNub

For the sake of simplicity, we will code our PubNub behaviour on the same view controller.

When someone joins the channel, the method is triggered and we send a message to the channel that the end user will receive! The message can be any object in the form of a JSON. Here we just send a string, but you could configure the message to have a receiver variable so that only the user who just subscribed receives it.

That’s it! Our iPhone acts like a beacon that emits information to join the PubNub channel. When the customer is close enough to the iBeacon, his phone will subscribe to the advertised PubNub channel. Our beacon is listening for presence events to the channel and immediately sends a message on the channel for the user to see!

Beautiful. Hope you like it. There is so much more you can do with so little code.

Share this:

Doug Thompson is CEO and Co-Founder of dot3 Ltd. and CEO of Fidget. He is a longtime blogger on technology and a serial entrepreneur and is based in Toronto, Canada.
You can drop him a line at doug@fidgets.net or follow him on Twitter or LinkedIn.

2 Responses to “Tutorial: Making a Smarter iBeacon Emitter on iOS with Swift with PubNub | Guest Post”

I followed the guide but when I added PubNub via cocoapods and tried to build, I get 6 errors. 1 of which points to the PNPrivateMacro.h file at line 10 saying that “#include — Include of non-modular header inside framework module ‘PubNub.PNPrivateMacro'”