tgios 0.0.38 → 0.0.39
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile.lock +1 -1
- data/lib/tgios/beacon_manager.rb +139 -28
- data/lib/tgios/ui_text_field_binding.rb +1 -1
- data/lib/tgios/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGI1N2Q0YWY4YWJlNzQ4M2YyZWM2ZTMyN2UyM2RkNTY1NGM2MGRhNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ODM4NjY3M2I4MzdlZjdlZjIxMTkzM2Y0ZGJlMjFhY2UxMWUxMzMyZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZGNlZTQzNzJiN2RjMDliOWE3YjBkNDMzOTVmM2FkYjA4MjY4OWM0ZDgzZjZh
|
10
|
+
ZDhiYTRjYWZhZmEyNzMyMmJmNWNmNWNhNGY5OTk5YzhiMDYzZjAwY2U2ZmE0
|
11
|
+
ZjY0NTc3ZDQ3YTlkN2U1NWI1NzQ3YTcwN2JjODBiNmQ0NzUwZWM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODBhZDg0NmRlN2M1NjhhZTdlY2JmYjI0NTJmZjk0MjVmZDE0ZWIxYmQ2ZjE4
|
14
|
+
MjliN2M4ZTgxMjg2M2NlNTlkYjExZDcxYmZhYzA0OTlmODY1MWQ2ODE4MDlk
|
15
|
+
YmUwYTM1YjI5ZDBiMTI3MjUxMTYzYTY1Y2E1MTQwMmE2OGM3Y2M=
|
data/Gemfile.lock
CHANGED
data/lib/tgios/beacon_manager.rb
CHANGED
@@ -12,17 +12,26 @@ module Tgios
|
|
12
12
|
k = :proximityUUID if k.to_s == 'uuid'
|
13
13
|
instance_variable_set("@#{k}", v)
|
14
14
|
end
|
15
|
+
@proximityUUID ||= NSUUID.new
|
16
|
+
@major ||= 34702
|
17
|
+
@minor ||= 31202
|
18
|
+
@accuracy ||= 3.0
|
19
|
+
@rssi ||= -85
|
20
|
+
@proximity ||= CLProximityFar
|
15
21
|
end
|
16
22
|
end
|
17
23
|
|
18
24
|
class BeaconManager < BindingBase
|
19
25
|
attr_accessor :range_method, :range_limit, :tolerance, :current_beacon, :background
|
26
|
+
attr_reader :current_bluetooth_state
|
20
27
|
ALGORITHMS = [:continue, :timeout]
|
21
28
|
|
22
29
|
BeaconFoundKey = 'Tgios::BeaconManager::BeaconFound'
|
23
30
|
BeaconsFoundKey = 'Tgios::BeaconManager::BeaconsFound'
|
31
|
+
RangingFailedKey = 'Tgios::BeaconManager::RangingFailed'
|
24
32
|
EnterRegionKey = 'Tgios::BeaconManager::EnterRegion'
|
25
33
|
ExitRegionKey = 'Tgios::BeaconManager::ExitRegion'
|
34
|
+
BluetoothChangedKey = 'Tgios::BeaconManager::BluetoothChanged'
|
26
35
|
|
27
36
|
def self.default=(val)
|
28
37
|
@default = val
|
@@ -49,23 +58,40 @@ module Tgios
|
|
49
58
|
self.algorithm = (options[:algorithm] || :continue)
|
50
59
|
@tolerance = (options[:tolerance] || 5)
|
51
60
|
|
52
|
-
@uuid = NSUUID.alloc.initWithUUIDString(options[:uuid])
|
53
|
-
@major = options[:major]
|
54
|
-
@minor = options[:minor]
|
55
61
|
@range_method = (options[:range_method] || :rssi)
|
56
62
|
@range_limit = (options[:range_limit] || -70)
|
57
63
|
|
58
|
-
@
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
@regions = []
|
65
|
+
region_options = options[:regions]
|
66
|
+
if !region_options.is_a?(Array)
|
67
|
+
region_options = [{uuid: options[:uuid], major: options[:major], minor: options[:minor]}]
|
68
|
+
end
|
69
|
+
|
70
|
+
region_options.each do |region_hash|
|
71
|
+
if region_hash.is_a?(Hash)
|
72
|
+
uuid = region_hash[:uuid]
|
73
|
+
major = region_hash[:major]
|
74
|
+
minor = region_hash[:minor]
|
75
|
+
else
|
76
|
+
uuid = region_hash
|
77
|
+
end
|
78
|
+
uuid = uuid.upcase
|
79
|
+
nsuuid = NSUUID.alloc.initWithUUIDString(uuid)
|
80
|
+
region = if major && minor
|
81
|
+
CLBeaconRegion.alloc.initWithProximityUUID(nsuuid, major: major, minor: minor, identifier: identifier(uuid, major, minor))
|
82
|
+
elsif major
|
83
|
+
CLBeaconRegion.alloc.initWithProximityUUID(nsuuid, major: major, identifier: identifier(uuid, major, minor))
|
84
|
+
else
|
85
|
+
CLBeaconRegion.alloc.initWithProximityUUID(nsuuid, identifier: identifier(uuid, major, minor))
|
86
|
+
end
|
87
|
+
@regions << {region: region, active: false}
|
88
|
+
|
89
|
+
region.notifyOnEntry = true
|
90
|
+
region.notifyOnExit = true
|
91
|
+
region.notifyEntryStateOnDisplay = true
|
92
|
+
end
|
68
93
|
|
94
|
+
central_manager
|
69
95
|
start_monitor
|
70
96
|
|
71
97
|
UIApplicationWillEnterForegroundNotification.add_observer(self, 'on_enter_foreground:')
|
@@ -73,8 +99,8 @@ module Tgios
|
|
73
99
|
|
74
100
|
end
|
75
101
|
|
76
|
-
def identifier
|
77
|
-
[
|
102
|
+
def identifier(uuid, major, minor)
|
103
|
+
[uuid, major, minor].join('/')
|
78
104
|
end
|
79
105
|
|
80
106
|
def on(event_key,&block)
|
@@ -104,16 +130,18 @@ module Tgios
|
|
104
130
|
end
|
105
131
|
|
106
132
|
def locationManager(manager, didEnterRegion: region)
|
107
|
-
NSLog 'didEnterRegion'
|
108
133
|
did_enter_region(region)
|
109
134
|
end
|
110
135
|
|
111
136
|
def locationManager(manager, didExitRegion: region)
|
112
|
-
NSLog 'didExitRegion'
|
113
137
|
did_exit_region(region)
|
114
138
|
end
|
115
139
|
|
116
140
|
def locationManager(manager, didRangeBeacons: beacons, inRegion: region)
|
141
|
+
|
142
|
+
region_hash = get_region_hash(region)
|
143
|
+
return unless region_hash[:active]
|
144
|
+
|
117
145
|
beacons = beacons.sort_by{|b| b.try(@range_method)}
|
118
146
|
beacons = beacons.reverse if @range_method == :rssi
|
119
147
|
known_beacons = beacons.select{|b| b.proximity != CLProximityUnknown}
|
@@ -124,7 +152,7 @@ module Tgios
|
|
124
152
|
|
125
153
|
NSLog("beacons_in_range: ")
|
126
154
|
beacons_in_range.each_with_index do |bir, i|
|
127
|
-
NSLog("##{i}: major: #{bir.major}, minor: #{bir.minor}, accuracy: #{bir.accuracy}, rssi: #{bir.rssi}")
|
155
|
+
NSLog("##{i}: major: #{bir.major}, minor: #{bir.minor}, accuracy: #{bir.accuracy.round(3)}, rssi: #{bir.rssi}")
|
128
156
|
end
|
129
157
|
push_beacon(beacon) # nil value will signify null beacon
|
130
158
|
|
@@ -142,7 +170,8 @@ module Tgios
|
|
142
170
|
end
|
143
171
|
|
144
172
|
def locationManager(manager, rangingBeaconsDidFailForRegion: region, withError: error)
|
145
|
-
@events[:ranging_failed].call(region, error) if
|
173
|
+
@events[:ranging_failed].call(region, error) if has_event(:ranging_failed)
|
174
|
+
RangingFailedKey.post_notification(self, {region: region, error: error})
|
146
175
|
end
|
147
176
|
|
148
177
|
def location_manager
|
@@ -178,27 +207,36 @@ module Tgios
|
|
178
207
|
end
|
179
208
|
|
180
209
|
def start_monitor
|
181
|
-
|
182
|
-
|
210
|
+
@regions.each do |region_hash|
|
211
|
+
region = region_hash[:region]
|
212
|
+
location_manager.startMonitoringForRegion(region)
|
213
|
+
location_manager.requestStateForRegion(region)
|
214
|
+
end
|
183
215
|
end
|
184
216
|
|
185
217
|
def stop_monitor
|
186
|
-
|
187
|
-
|
218
|
+
@regions.each do |region_hash|
|
219
|
+
region = region_hash[:region]
|
220
|
+
location_manager.stopRangingBeaconsInRegion(region)
|
221
|
+
location_manager.stopMonitoringForRegion(region)
|
222
|
+
end
|
188
223
|
end
|
189
224
|
|
190
225
|
def on_enter_foreground(noti)
|
191
|
-
NSLog 'on_enter_foreground'
|
192
226
|
self.performSelector('start_monitor', withObject: nil, afterDelay:1)
|
193
227
|
end
|
194
228
|
|
195
229
|
def on_enter_background(noti)
|
196
|
-
NSLog 'on_enter_background'
|
197
230
|
stop_monitor unless @background
|
198
231
|
end
|
199
232
|
|
200
233
|
def did_enter_region(region)
|
201
234
|
if region.isKindOfClass(CLBeaconRegion)
|
235
|
+
|
236
|
+
region_hash = get_region_hash(region)
|
237
|
+
return if region_hash.blank?
|
238
|
+
region_hash[:active] = true
|
239
|
+
|
202
240
|
location_manager.startRangingBeaconsInRegion(region)
|
203
241
|
if has_event(:enter_region)
|
204
242
|
@events[:enter_region].call(region)
|
@@ -209,7 +247,19 @@ module Tgios
|
|
209
247
|
|
210
248
|
def did_exit_region(region)
|
211
249
|
if region.isKindOfClass(CLBeaconRegion)
|
250
|
+
|
251
|
+
region_hash = get_region_hash(region)
|
252
|
+
return if region_hash.blank?
|
253
|
+
region_hash[:active] = false
|
254
|
+
|
212
255
|
location_manager.stopRangingBeaconsInRegion(region)
|
256
|
+
@previous_beacons.delete_if {|b|
|
257
|
+
beacon = b.is_a?(Hash) ? b[:beacon] : b
|
258
|
+
self.class.beacon_in_region(beacon, region)
|
259
|
+
}
|
260
|
+
if self.class.beacon_in_region(@current_beacon, region)
|
261
|
+
@current_beacon = nil
|
262
|
+
end
|
213
263
|
if has_event(:exit_region)
|
214
264
|
@events[:exit_region].call(region)
|
215
265
|
end
|
@@ -217,6 +267,33 @@ module Tgios
|
|
217
267
|
end
|
218
268
|
end
|
219
269
|
|
270
|
+
def central_manager
|
271
|
+
@central_manager ||= CBCentralManager.alloc.initWithDelegate(self, queue: nil)
|
272
|
+
end
|
273
|
+
|
274
|
+
def centralManagerDidUpdateState(central)
|
275
|
+
state = central.state
|
276
|
+
@current_bluetooth_state = state
|
277
|
+
|
278
|
+
if has_event(:bluetooth_changed)
|
279
|
+
@events[:bluetooth_changed].call(state)
|
280
|
+
end
|
281
|
+
BluetoothChangedKey.post_notification(self, {state: state})
|
282
|
+
|
283
|
+
@regions.each do |region_hash|
|
284
|
+
region = region_hash[:region]
|
285
|
+
case state
|
286
|
+
when CBCentralManagerStatePoweredOff, CBCentralManagerStateUnsupported, CBCentralManagerStateUnauthorized
|
287
|
+
did_exit_region(region)
|
288
|
+
when CBCentralManagerStatePoweredOn
|
289
|
+
did_enter_region(region)
|
290
|
+
when CBCentralManagerStateResetting
|
291
|
+
when CBCentralManagerStateUnknown
|
292
|
+
else
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
220
297
|
def has_event(event)
|
221
298
|
@events.has_key?(event)
|
222
299
|
end
|
@@ -257,6 +334,8 @@ module Tgios
|
|
257
334
|
max_beacon_key = count_hash.max_by(&:last).first
|
258
335
|
@current_beacon = @beacons_last_seen_at[max_beacon_key][:beacon]
|
259
336
|
end
|
337
|
+
else
|
338
|
+
@current_beacon = beacon
|
260
339
|
end
|
261
340
|
end
|
262
341
|
|
@@ -266,17 +345,48 @@ module Tgios
|
|
266
345
|
|
267
346
|
def self.beacon_eqs(beacon1, beacon2)
|
268
347
|
return beacon1 == beacon2 if beacon1.nil? || beacon2.nil?
|
269
|
-
beacon1.minor == beacon2.minor && beacon1.major == beacon2.major && beacon1.proximityUUID == beacon2.proximityUUID
|
348
|
+
beacon1.minor == beacon2.minor && beacon1.major == beacon2.major && beacon1.proximityUUID.UUIDString.upcase == beacon2.proximityUUID.UUIDString.upcase
|
349
|
+
end
|
350
|
+
|
351
|
+
def self.region_eqs(region1, region2)
|
352
|
+
return region1 == region2 if region1.nil? || region2.nil?
|
353
|
+
region1.identifier.upcase == region2.identifier.upcase
|
354
|
+
end
|
355
|
+
|
356
|
+
def self.beacon_in_region(beacon, region)
|
357
|
+
return false unless beacon
|
358
|
+
|
359
|
+
match = beacon.proximityUUID == region.proximityUUID
|
360
|
+
return false unless match
|
361
|
+
major = region.major
|
362
|
+
if major
|
363
|
+
match = match && beacon.major == major
|
364
|
+
return false unless match
|
365
|
+
minor = region.minor
|
366
|
+
if minor
|
367
|
+
match = match && beacon.minor == minor
|
368
|
+
end
|
369
|
+
end
|
370
|
+
match
|
270
371
|
end
|
271
372
|
|
272
373
|
def self.beacon_key(beacon)
|
273
|
-
[beacon.try(:
|
374
|
+
[beacon.try(:proximityUUID).try(:UUIDString).try(:upcase), beacon.try(:major), beacon.try(:minor)].join('/')
|
274
375
|
end
|
275
376
|
|
276
377
|
def new_fake_beacon(options)
|
277
|
-
|
378
|
+
region_hash = @regions.first
|
379
|
+
region = region_hash[:region] if region_hash
|
380
|
+
region_options = region ? {uuid: region.proximityUUID, major: region.major, minor: region.minor} : {}
|
381
|
+
FakeBeacon.new(region_options.merge(options))
|
382
|
+
end
|
383
|
+
|
384
|
+
def get_region_hash(region)
|
385
|
+
region_hash = @regions.find{|r| self.class.region_eqs(r[:region], region) }
|
386
|
+
region_hash || {}
|
278
387
|
end
|
279
388
|
|
389
|
+
|
280
390
|
def self.supported
|
281
391
|
CLLocationManager.isRangingAvailable
|
282
392
|
end
|
@@ -289,6 +399,7 @@ module Tgios
|
|
289
399
|
@events = nil
|
290
400
|
@current_beacon = nil
|
291
401
|
@previous_beacons = nil
|
402
|
+
@regions = []
|
292
403
|
end
|
293
404
|
|
294
405
|
def dealloc
|
@@ -282,7 +282,7 @@ module Tgios
|
|
282
282
|
stop_listen
|
283
283
|
@model=nil
|
284
284
|
@decimal_button=nil
|
285
|
-
if !@ui_field.nil? && @ui_field.delegate == self
|
285
|
+
if !@ui_field.nil? && @ui_field.weakref_alive? && @ui_field.delegate == self
|
286
286
|
@ui_field.delegate = nil
|
287
287
|
toolbar = @ui_field.inputAccessoryView
|
288
288
|
toolbar.items = nil unless toolbar.nil?
|
data/lib/tgios/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tgios
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.39
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- April Tsang
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-12-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sugarcube
|