-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/BeaconScanner.xcodeproj/xcuserdata/mviamari.xcuserdatad/xcschemes/xcschememanagement.plist b/BeaconScanner.xcodeproj/xcuserdata/mviamari.xcuserdatad/xcschemes/xcschememanagement.plist
deleted file mode 100644
index 2ed24ff..0000000
--- a/BeaconScanner.xcodeproj/xcuserdata/mviamari.xcuserdatad/xcschemes/xcschememanagement.plist
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- SchemeUserState
-
- Beacon Scanner.xcscheme
-
- orderHint
- 0
-
-
- SuppressBuildableAutocreation
-
- 6753158718EF27D30024E9CE
-
- primary
-
-
- 675315A818EF27D30024E9CE
-
- primary
-
-
-
-
-
diff --git a/BeaconScanner.xcodeproj/xcuserdata/mwelles.xcuserdatad/xcschemes/xcschememanagement.plist b/BeaconScanner.xcodeproj/xcuserdata/mwelles.xcuserdatad/xcschemes/xcschememanagement.plist
deleted file mode 100644
index 6ac6c2d..0000000
--- a/BeaconScanner.xcodeproj/xcuserdata/mwelles.xcuserdatad/xcschemes/xcschememanagement.plist
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- SchemeUserState
-
- BeaconScanner.xcscheme
-
- orderHint
- 0
-
-
- SuppressBuildableAutocreation
-
- 6753158718EF27D30024E9CE
-
- primary
-
-
- 675315A818EF27D30024E9CE
-
- primary
-
-
-
-
-
diff --git a/BeaconScanner.xcodeproj/xcuserdata/nathanhekman.xcuserdatad/xcschemes/Beacon Scanner.xcscheme b/BeaconScanner.xcodeproj/xcuserdata/nathanhekman.xcuserdatad/xcschemes/Beacon Scanner.xcscheme
deleted file mode 100644
index b5e2520..0000000
--- a/BeaconScanner.xcodeproj/xcuserdata/nathanhekman.xcuserdatad/xcschemes/Beacon Scanner.xcscheme
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/BeaconScanner/BeaconScanner-Info.plist b/BeaconScanner/BeaconScanner-Info.plist
index 80cf5e6..922f861 100644
--- a/BeaconScanner/BeaconScanner-Info.plist
+++ b/BeaconScanner/BeaconScanner-Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.13
+ 1.2.0
CFBundleSignature
????
CFBundleVersion
@@ -27,10 +27,16 @@
LSMinimumSystemVersion
${MACOSX_DEPLOYMENT_TARGET}
NSHumanReadableCopyright
- Copyright © 2014 Huge, Inc. All rights reserved.
+ Copyright © 2026 Michael L. Welles. All rights reserved.
NSMainNibFile
MainMenu
NSPrincipalClass
NSApplication
+ NSBluetoothAlwaysUsageDescription
+ BeaconScanner needs Bluetooth access to detect and display nearby iBeacon devices.
+ CFBundleHelpBookFolder
+ BeaconScanner.help
+ CFBundleHelpBookName
+ nyc.welles.BeaconScanner.help
diff --git a/BeaconScanner/BeaconScanner.help/Contents/Info.plist b/BeaconScanner/BeaconScanner.help/Contents/Info.plist
new file mode 100644
index 0000000..04a2efc
--- /dev/null
+++ b/BeaconScanner/BeaconScanner.help/Contents/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleIdentifier
+ nyc.welles.BeaconScanner.help
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ BeaconScanner Help
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.2.0
+ CFBundleSignature
+ hbwr
+ CFBundleVersion
+ 1
+ HPDBookAccessPath
+ index.html
+ HPDBookIndexPath
+ BeaconScanner.helpindex
+ HPDBookTitle
+ BeaconScanner Help
+ HPDBookType
+ 3
+
+
diff --git a/BeaconScanner/BeaconScanner.help/Contents/Resources/en.lproj/index.html b/BeaconScanner/BeaconScanner.help/Contents/Resources/en.lproj/index.html
new file mode 100644
index 0000000..a5c4440
--- /dev/null
+++ b/BeaconScanner/BeaconScanner.help/Contents/Resources/en.lproj/index.html
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+ BeaconScanner Help
+
+
+
+ BeaconScanner Help
+
+ BeaconScanner is a macOS application for detecting and monitoring iBeacon devices via Bluetooth Low Energy (BLE).
+
+ Getting Started
+
+ - Enable Bluetooth - Ensure Bluetooth is turned on in System Settings.
+ - Grant Permission - When prompted, allow BeaconScanner to use Bluetooth.
+ - Start Scanning - Click the Start Scanning button to begin detecting nearby iBeacons.
+
+
+ Understanding the Display
+ Detected beacons are shown in a table with the following columns:
+
+
+
+ | Column |
+ Description |
+
+
+ | UUID |
+ The beacon's unique proximity identifier (128-bit) |
+
+
+ | Major |
+ Group identifier (0-65535), typically represents a location or zone |
+
+
+ | Minor |
+ Individual identifier (0-65535), typically represents a specific beacon |
+
+
+ | RSSI |
+ Received Signal Strength Indicator in dBm (closer to 0 = stronger signal) |
+
+
+ | Power |
+ Calibrated signal strength at 1 meter (used for distance estimation) |
+
+
+ | Last Seen |
+ Timestamp of the most recent detection |
+
+
+
+ Features
+
+ Recording Mode
+ Enable the Recording checkbox to keep beacons in the list even after they go out of range. This is useful for logging all beacons detected during a session.
+
+ Copy UUID
+ Select a beacon and press ⌘C to copy its UUID to the clipboard.
+
+ Beacon Timeout
+ By default, beacons that haven't been detected for 15 seconds are removed from the list (unless Recording mode is enabled).
+
+
+ Note: BeaconScanner requires a Mac with Bluetooth 4.0 (BLE) support. Most Macs from 2012 and later include this hardware.
+
+
+ iBeacon Protocol
+ iBeacon is Apple's protocol for Bluetooth proximity sensing. Each beacon broadcasts:
+
+ - A Proximity UUID identifying the beacon network/owner
+ - A Major value for grouping beacons (e.g., by store location)
+ - A Minor value for individual beacon identification
+ - A Measured Power value for distance calibration
+
+
+ Troubleshooting
+
+ No beacons detected
+
+ - Verify Bluetooth is enabled in System Settings
+ - Ensure your Mac supports Bluetooth Low Energy (4.0+)
+ - Check that nearby iBeacons are powered on and advertising
+ - Try moving closer to the beacon
+
+
+ Scanning won't start
+
+ - Check that BeaconScanner has Bluetooth permission in System Settings → Privacy & Security → Bluetooth
+ - Try quitting and restarting the application
+
+
+
+ © 2026 Michael L. Welles. All rights reserved.
+
+
+
diff --git a/BeaconScanner/HGBeaconScanner.m b/BeaconScanner/HGBeaconScanner.m
index 84ae248..849828b 100644
--- a/BeaconScanner/HGBeaconScanner.m
+++ b/BeaconScanner/HGBeaconScanner.m
@@ -47,7 +47,7 @@ -(void)stopScanning {
}
-(void)startScanning {
- if (self.centralManager.state == CBCentralManagerStatePoweredOn) {
+ if (self.centralManager.state == CBManagerStatePoweredOn) {
[self.centralManager scanForPeripheralsWithServices:nil
options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
self.scanning = YES;
@@ -62,14 +62,15 @@ -(NSNumber *)bluetoothLMPVersion {
dispatch_once(&onceToken, ^{
NSPipe *outputPipe = [[NSPipe alloc] init];
NSTask *task = [[NSTask alloc] init];
- task.launchPath = @"/bin/bash";
+ task.executableURL = [NSURL fileURLWithPath:@"/bin/bash"];
if (floor(kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_10) {
task.arguments = @[ @"-c", @"system_profiler -detailLevel full SPBluetoothDataType | grep 'LMP Version:' | awk '{print $4}' | tr -d '(' | tr -d ')'"];
} else {
task.arguments = @[ @"-c", @"system_profiler -detailLevel full SPBluetoothDataType | grep 'LMP Version:' | awk '{print $3}'"];
}
task.standardOutput = outputPipe;
- [task launch];
+ NSError *error = nil;
+ [task launchAndReturnError:&error];
[task waitUntilExit];
NSData *output = [[outputPipe fileHandleForReading] availableData];
NSString *outputString = [[[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding] stringByReplacingOccurrencesOfString:@"\n"withString:@""];
@@ -86,16 +87,16 @@ -(NSNumber *)bluetoothLMPVersion {
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
NSString *state = nil;
switch (central.state) {
- case CBCentralManagerStateResetting:
+ case CBManagerStateResetting:
state = HGGBluetoothStateResetting;
break;
- case CBCentralManagerStateUnsupported:
+ case CBManagerStateUnsupported:
state = HGGBluetoothStateUnsupported;
break;
- case CBCentralManagerStateUnauthorized:
+ case CBManagerStateUnauthorized:
state = HGGBluetoothStateUnauthorized;
break;
- case CBCentralManagerStatePoweredOff:
+ case CBManagerStatePoweredOff:
//LMP version of 0x4 reports itself off, even though its' actually unsupported;
if ([[self bluetoothLMPVersion] integerValue] < 6) {
state = HGGBluetoothStateUnsupported;
@@ -103,13 +104,13 @@ - (void)centralManagerDidUpdateState:(CBCentralManager *)central {
state = HGGBluetoothStatePoweredOff;
}
break;
- case CBCentralManagerStatePoweredOn:
+ case CBManagerStatePoweredOn:
state = HGGBluetoothStatePoweredOn;
break;
default:
state = HGGBluetoothStateUnknown;
break;
-
+
}
if (state != HGGBluetoothStatePoweredOn) {
if (self.scanning) {
diff --git a/BeaconScanner/HGBeaconViewController.m b/BeaconScanner/HGBeaconViewController.m
index 2b2abe9..61793a7 100644
--- a/BeaconScanner/HGBeaconViewController.m
+++ b/BeaconScanner/HGBeaconViewController.m
@@ -112,11 +112,11 @@ - (id)init {
[[RACObserve(self, recordCheckboxButton) deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSButton *button) {
- button.state = (self.isRecording ? NSOffState : NSOnState);
+ button.state = (self.isRecording ? NSControlStateValueOff : NSControlStateValueOn);
@strongify(self)
button.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(NSButton *button) {
@strongify(self)
- self.isRecording = !(button.state == NSOnState);
+ self.isRecording = !(button.state == NSControlStateValueOn);
return [RACSignal empty];
}];
}];
@@ -214,9 +214,9 @@ - (IBAction) copy:(id)sender
return;
}
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
- [pasteboard declareTypes:@[NSStringPboardType]
+ [pasteboard declareTypes:@[NSPasteboardTypeString]
owner:nil];
- [pasteboard setString:beacon.proximityUUID.UUIDString forType:NSStringPboardType];
+ [pasteboard setString:beacon.proximityUUID.UUIDString forType:NSPasteboardTypeString];
}
#pragma mark - KVO Compliance for beacons
diff --git a/BeaconScanner/en.lproj/Credits.rtf b/BeaconScanner/en.lproj/Credits.rtf
index aac679b..e25dcc8 100644
--- a/BeaconScanner/en.lproj/Credits.rtf
+++ b/BeaconScanner/en.lproj/Credits.rtf
@@ -6,5 +6,9 @@
\f0\b\fs24 \cf0 Engineering:
\b0 \
- Michael Welles \
+ Michael L. Welles\
+\
+\b Copyright:
+\b0 \
+ \'a9 2026 Michael L. Welles. All rights reserved.\
}
\ No newline at end of file
diff --git a/BeaconScannerTests/BeaconScannerTests-Info.plist b/BeaconScannerTests/BeaconScannerTests-Info.plist
index 169b6f7..146bb1f 100644
--- a/BeaconScannerTests/BeaconScannerTests-Info.plist
+++ b/BeaconScannerTests/BeaconScannerTests-Info.plist
@@ -13,7 +13,7 @@
CFBundlePackageType
BNDL
CFBundleShortVersionString
- 1.0
+ 1.2.0
CFBundleSignature
????
CFBundleVersion
diff --git a/BeaconScannerTests/BeaconScannerTests.m b/BeaconScannerTests/BeaconScannerTests.m
index e300116..60b3661 100644
--- a/BeaconScannerTests/BeaconScannerTests.m
+++ b/BeaconScannerTests/BeaconScannerTests.m
@@ -9,6 +9,8 @@
#import
#import "HGBeaconScanner.h"
#import "HGBeacon.h"
+#import
+
@interface DesktopBeaconTests : XCTestCase
@end
@@ -29,8 +31,27 @@ - (void)tearDown
- (void)testManagerScanningStart
{
- [[HGBeaconScanner sharedBeaconScanner] startScanning];
- XCTAssertTrue([[HGBeaconScanner sharedBeaconScanner] scanning], @"Manager can start scanning");
+ HGBeaconScanner *scanner = [HGBeaconScanner sharedBeaconScanner];
+
+ // Use XCTestExpectation with the reactive signal for proper async handling
+ XCTestExpectation *expectation = [self expectationWithDescription:@"Bluetooth state received"];
+ __block NSString *receivedState = nil;
+
+ // Subscribe to bluetooth state signal - RACReplaySubject will replay last value
+ [[scanner.bluetoothStateSignal take:1] subscribeNext:^(NSString *state) {
+ receivedState = state;
+ [expectation fulfill];
+ }];
+
+ // Wait up to 10 seconds for Bluetooth to report state
+ XCTWaiterResult result = [XCTWaiter waitForExpectations:@[expectation] timeout:10.0];
+
+ // Skip if we didn't receive state in time
+ XCTSkipIf(result != XCTWaiterResultCompleted, @"Bluetooth state not available (timeout)");
+ XCTSkipIf(receivedState != HGGBluetoothStatePoweredOn, @"Bluetooth not powered on (state: %@)", receivedState);
+
+ [scanner startScanning];
+ XCTAssertTrue(scanner.scanning, @"Manager can start scanning");
}
- (void)testManagerScanningStop
@@ -39,4 +60,68 @@ - (void)testManagerScanningStop
XCTAssertFalse([[HGBeaconScanner sharedBeaconScanner] scanning], @"Manager can stop scanning");
}
+#pragma mark - Help Menu Tests
+
+- (void)testHelpBookFolderConfigured
+{
+ NSBundle *bundle = [NSBundle mainBundle];
+ NSString *helpBookFolder = [bundle objectForInfoDictionaryKey:@"CFBundleHelpBookFolder"];
+ XCTAssertNotNil(helpBookFolder, @"CFBundleHelpBookFolder should be configured in Info.plist");
+ XCTAssertEqualObjects(helpBookFolder, @"BeaconScanner.help", @"Help book folder should be BeaconScanner.help");
+}
+
+- (void)testHelpBookNameConfigured
+{
+ NSBundle *bundle = [NSBundle mainBundle];
+ NSString *helpBookName = [bundle objectForInfoDictionaryKey:@"CFBundleHelpBookName"];
+ XCTAssertNotNil(helpBookName, @"CFBundleHelpBookName should be configured in Info.plist");
+ XCTAssertEqualObjects(helpBookName, @"nyc.welles.BeaconScanner.help", @"Help book name should match bundle identifier");
+}
+
+- (void)testHelpBundleExists
+{
+ NSBundle *bundle = [NSBundle mainBundle];
+ NSString *helpBookFolder = [bundle objectForInfoDictionaryKey:@"CFBundleHelpBookFolder"];
+ XCTAssertNotNil(helpBookFolder, @"Help book folder must be configured");
+
+ NSString *helpPath = [[bundle resourcePath] stringByAppendingPathComponent:helpBookFolder];
+ BOOL isDirectory = NO;
+ BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:helpPath isDirectory:&isDirectory];
+
+ XCTAssertTrue(exists, @"Help bundle should exist at %@", helpPath);
+ XCTAssertTrue(isDirectory, @"Help bundle should be a directory");
+}
+
+- (void)testHelpIndexExists
+{
+ NSBundle *bundle = [NSBundle mainBundle];
+ NSString *helpBookFolder = [bundle objectForInfoDictionaryKey:@"CFBundleHelpBookFolder"];
+ XCTAssertNotNil(helpBookFolder, @"Help book folder must be configured");
+
+ NSString *helpPath = [[bundle resourcePath] stringByAppendingPathComponent:helpBookFolder];
+ NSString *indexPath = [helpPath stringByAppendingPathComponent:@"Contents/Resources/en.lproj/index.html"];
+
+ BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:indexPath];
+ XCTAssertTrue(exists, @"Help index.html should exist at %@", indexPath);
+}
+
+- (void)testHelpContentNotEmpty
+{
+ NSBundle *bundle = [NSBundle mainBundle];
+ NSString *helpBookFolder = [bundle objectForInfoDictionaryKey:@"CFBundleHelpBookFolder"];
+ XCTAssertNotNil(helpBookFolder, @"Help book folder must be configured");
+
+ NSString *helpPath = [[bundle resourcePath] stringByAppendingPathComponent:helpBookFolder];
+ NSString *indexPath = [helpPath stringByAppendingPathComponent:@"Contents/Resources/en.lproj/index.html"];
+
+ NSError *error = nil;
+ NSString *content = [NSString stringWithContentsOfFile:indexPath encoding:NSUTF8StringEncoding error:&error];
+
+ XCTAssertNil(error, @"Should be able to read help content: %@", error);
+ XCTAssertNotNil(content, @"Help content should not be nil");
+ XCTAssertGreaterThan(content.length, 100, @"Help content should have substantial content");
+ XCTAssertTrue([content containsString:@"BeaconScanner"], @"Help content should mention BeaconScanner");
+ XCTAssertTrue([content containsString:@"iBeacon"], @"Help content should mention iBeacon");
+}
+
@end
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..ad09f26
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,73 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Project Overview
+
+BeaconScanner is a macOS desktop application written in Objective-C for scanning and detecting iBeacon devices via Bluetooth Low Energy (BLE). It fills a gap in Apple's macOS ecosystem by providing iBeacon client support that was only available on iOS.
+
+## Build Commands
+
+```bash
+# Install dependencies (requires CocoaPods)
+pod install
+
+# Open in Xcode (always use workspace, not project)
+open BeaconScanner.xcworkspace
+
+# Build: Cmd+B in Xcode
+# Run: Cmd+R in Xcode
+# Test: Cmd+U in Xcode
+```
+
+## Dependencies (CocoaPods)
+
+- **ReactiveCocoa** - Reactive programming framework for signal-based communication
+- **BlocksKit** - Block-based API extensions
+- **libextobjc** - Objective-C extensions (@weakify/@strongify macros)
+
+## Architecture
+
+### Core Components
+
+**HGBeaconScanner** (Singleton)
+- Central manager for all Bluetooth scanning operations
+- Instantiates `CBCentralManager` on a dedicated dispatch queue
+- Exposes `beaconSignal` (RACSignal) for detected beacons
+- Exposes `bluetoothStateSignal` for Bluetooth state changes
+- Implements `CBCentralManagerDelegate` protocol
+
+**HGBeacon** (Model)
+- Represents a single iBeacon with UUID, major, minor, measuredPower, RSSI
+- Parses 25-byte iBeacon manufacturer data from BLE advertisements
+- Static factory methods: `beaconWithAdvertisementDataDictionary:` and `beaconWithManufacturerAdvertisementData:`
+
+**HGBeaconViewController** (UI Controller)
+- Manages NSTableView displaying detected beacons
+- Subscribes to beacon signals and updates UI reactively
+- Implements housekeeping to remove stale beacons (15-second timeout)
+- Supports beacon recording feature via HGBeaconHistory
+
+### Data Flow
+
+1. `HGBeaconScanner` receives BLE advertisements via `CBCentralManagerDelegate`
+2. `HGBeacon` parses manufacturer data to extract iBeacon payload
+3. Valid beacons are emitted via `beaconSignal` (RACSubject)
+4. Subscribers (like `HGBeaconViewController`) receive and process beacon events
+
+### iBeacon Protocol
+
+The 25-byte payload format:
+- Bytes 0-1: Company ID (0x4C = Apple)
+- Byte 2: Data type (0x02)
+- Byte 3: Data length (0x15 = 21 bytes)
+- Bytes 4-19: Proximity UUID (128-bit)
+- Bytes 20-21: Major (16-bit, big-endian)
+- Bytes 22-23: Minor (16-bit, big-endian)
+- Byte 24: Measured Power (calibrated RSSI at 1m)
+
+## Key Patterns
+
+- **Reactive subscriptions**: Use RACSignal subscriptions for beacon events, not delegate callbacks
+- **Signal filtering**: Filter `beaconSignal` by UUID to listen for specific beacons
+- **Stale beacon cleanup**: Periodically purge beacons not heard from recently (see HGBeaconViewController for implementation)
diff --git a/Podfile b/Podfile
index 8c09fd2..98b4f98 100644
--- a/Podfile
+++ b/Podfile
@@ -1,7 +1,21 @@
+platform :osx, '10.13'
+
target 'Beacon Scanner' do
use_frameworks!
- pod 'ReactiveCocoa'
+ pod 'ReactiveCocoa', '~> 2.5' # Last Objective-C version (3.0+ is Swift)
pod 'BlocksKit'
pod 'libextobjc'
+
+ target 'BeaconScannerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ target.build_configurations.each do |config|
+ config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '10.13'
+ end
+ end
end
diff --git a/Podfile.lock b/Podfile.lock
index b83b950..1dfa9ec 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -8,59 +8,65 @@ PODS:
- BlocksKit/UIKit
- BlocksKit/Core (2.2.5)
- BlocksKit/DynamicDelegate (2.2.5)
- - libextobjc (0.4):
- - libextobjc/EXTADT (= 0.4)
- - libextobjc/EXTConcreteProtocol (= 0.4)
- - libextobjc/EXTKeyPathCoding (= 0.4)
- - libextobjc/EXTNil (= 0.4)
- - libextobjc/EXTSafeCategory (= 0.4)
- - libextobjc/EXTScope (= 0.4)
- - libextobjc/EXTSelectorChecking (= 0.4)
- - libextobjc/EXTSynthesize (= 0.4)
- - libextobjc/NSInvocation+EXT (= 0.4)
- - libextobjc/NSMethodSignature+EXT (= 0.4)
- - libextobjc/RuntimeExtensions (= 0.4)
- - libextobjc/UmbrellaHeader (= 0.4)
- - libextobjc/EXTADT (0.4):
+ - libextobjc (0.6):
+ - libextobjc/EXTADT (= 0.6)
+ - libextobjc/EXTConcreteProtocol (= 0.6)
+ - libextobjc/EXTKeyPathCoding (= 0.6)
+ - libextobjc/EXTNil (= 0.6)
+ - libextobjc/EXTSafeCategory (= 0.6)
+ - libextobjc/EXTScope (= 0.6)
+ - libextobjc/EXTSelectorChecking (= 0.6)
+ - libextobjc/EXTSynthesize (= 0.6)
+ - "libextobjc/NSInvocation+EXT (= 0.6)"
+ - "libextobjc/NSMethodSignature+EXT (= 0.6)"
+ - libextobjc/RuntimeExtensions (= 0.6)
+ - libextobjc/UmbrellaHeader (= 0.6)
+ - libextobjc/EXTADT (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/EXTConcreteProtocol (0.4):
+ - libextobjc/EXTConcreteProtocol (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/EXTKeyPathCoding (0.4):
+ - libextobjc/EXTKeyPathCoding (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/EXTNil (0.4):
+ - libextobjc/EXTNil (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/EXTSafeCategory (0.4):
+ - libextobjc/EXTSafeCategory (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/EXTScope (0.4):
+ - libextobjc/EXTScope (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/EXTSelectorChecking (0.4):
+ - libextobjc/EXTSelectorChecking (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/EXTSynthesize (0.4):
+ - libextobjc/EXTSynthesize (0.6):
- libextobjc/RuntimeExtensions
- - libextobjc/NSInvocation+EXT (0.4):
+ - "libextobjc/NSInvocation+EXT (0.6)":
- libextobjc/RuntimeExtensions
- - libextobjc/NSMethodSignature+EXT (0.4):
+ - "libextobjc/NSMethodSignature+EXT (0.6)":
- libextobjc/RuntimeExtensions
- - libextobjc/RuntimeExtensions (0.4)
- - libextobjc/UmbrellaHeader (0.4)
- - ReactiveCocoa (2.3):
- - ReactiveCocoa/UI (= 2.3)
- - ReactiveCocoa/Core (2.3):
+ - libextobjc/RuntimeExtensions (0.6)
+ - libextobjc/UmbrellaHeader (0.6)
+ - ReactiveCocoa (2.5):
+ - ReactiveCocoa/UI (= 2.5)
+ - ReactiveCocoa/Core (2.5):
- ReactiveCocoa/no-arc
- - ReactiveCocoa/no-arc (2.3)
- - ReactiveCocoa/UI (2.3):
+ - ReactiveCocoa/no-arc (2.5)
+ - ReactiveCocoa/UI (2.5):
- ReactiveCocoa/Core
DEPENDENCIES:
- BlocksKit
- libextobjc
- - ReactiveCocoa
+ - ReactiveCocoa (~> 2.5)
+
+SPEC REPOS:
+ trunk:
+ - BlocksKit
+ - libextobjc
+ - ReactiveCocoa
SPEC CHECKSUMS:
- BlocksKit: 7f422b971407001178d181a43b99014ea2591fe6
- libextobjc: f2802d4262f6885570df9799747409ceb1de602c
- ReactiveCocoa: 81ee2fb7df2dfc6bd52b5d70473662195e20ca7d
+ BlocksKit: 8639b2848dd51c35c957af4d9fbdc7a769a1fc12
+ libextobjc: aed8b7d2b07f511c1a7ecaacb33ea03e327c69b7
+ ReactiveCocoa: e2db045570aa97c695e7aa97c2bcab222ae51f4a
-PODFILE CHECKSUM: 1ed3d7ebe15a03726069be1da715cce97033d967
+PODFILE CHECKSUM: 08be8fbc49c90237034bfaac302f18b3448b1321
-COCOAPODS: 1.2.0
+COCOAPODS: 1.16.2