Global:
Despite the CBPeripheral suppoting the NSCopying the protocol, each copy does not get a dedicated delegate. That is, the CoreBluetooth framework only allows for one delegate per (physical) peripheral, regardless of how many (CBPeripherals) copies exist for that peripheral. Thus, whichever objects becomes the peripheral's delegate last, and only that object, will receive data from the peripheral. Even if there are other objects that want to receive data from that same peripheral. In order to fix this I made all service objects capable of forwarding data (via NSNotificationCenter) to any other object that wants to receive data from that peripheral. Right now it's decentralized, that is, any service object can perform this task. I will concider centralizing this on a global object that simply listens for everyone.

Proximity:
Unfortunately RSSI is too unreliable to give accurate distance estimations. For that reason the proximity module has been updated to represent proximity with range estimates (i.e. immediate, near, far), just like iBeacon does. Thus, rather than displaying distance in feet (or meters) it will display the stregnth of the signal (after the iOS device receives it), both visually and numerically.

The module is not enabled yet. The only thing missing to finish it is to store several RSSI values at a time to be able to give an average RSSI (i.e. single readings are even more unreliable).

I created RSSI alerts so users can create alerts not only for ranges, but for specific RSSI values as well. This module will work with only one peripheral at time.