motion-firebase 2.1.5 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +192 -64
- data/lib/firebase-auth/firebase_simple_login.rb +0 -76
- data/lib/firebase/fdata_snapshot.rb +4 -0
- data/lib/firebase/firebase.rb +53 -42
- data/lib/firebase/firebase_auth.rb +219 -0
- data/lib/firebase/firebase_facebook_helper.rb +24 -0
- data/lib/firebase/firebase_github_helper.rb +20 -0
- data/lib/firebase/firebase_twitter_helper.rb +169 -0
- data/lib/firebase/fquery.rb +16 -4
- data/lib/firebase/version.rb +2 -1
- data/lib/motion-firebase-auth.rb +3 -11
- data/lib/motion-firebase.rb +3 -1
- metadata +6 -19
- data/lib/vendor/Firebase.framework/Firebase +0 -0
- data/lib/vendor/Firebase.framework/Versions/A/Firebase +0 -0
- data/lib/vendor/Firebase.framework/Versions/A/Headers/FDataSnapshot.h +0 -146
- data/lib/vendor/Firebase.framework/Versions/A/Headers/FEventType.h +0 -43
- data/lib/vendor/Firebase.framework/Versions/A/Headers/FMutableData.h +0 -139
- data/lib/vendor/Firebase.framework/Versions/A/Headers/FQuery.h +0 -229
- data/lib/vendor/Firebase.framework/Versions/A/Headers/FTransactionResult.h +0 -50
- data/lib/vendor/Firebase.framework/Versions/A/Headers/Firebase.h +0 -707
- data/lib/vendor/Firebase.framework/build-MacOSX/Firebase.framework.bridgesupport +0 -582
- data/lib/vendor/Firebase.framework/build-iPhoneSimulator/Firebase.framework.bridgesupport +0 -582
- data/lib/vendor/FirebaseSimpleLogin.framework/FirebaseSimpleLogin +0 -0
- data/lib/vendor/FirebaseSimpleLogin.framework/Versions/A/FirebaseSimpleLogin +0 -0
- data/lib/vendor/FirebaseSimpleLogin.framework/Versions/A/Headers/FATypes.h +0 -52
- data/lib/vendor/FirebaseSimpleLogin.framework/Versions/A/Headers/FAUser.h +0 -97
- data/lib/vendor/FirebaseSimpleLogin.framework/Versions/A/Headers/FirebaseSimpleLogin.h +0 -221
- data/lib/vendor/FirebaseSimpleLogin.framework/build-MacOSX/FirebaseSimpleLogin.framework.bridgesupport +0 -230
- data/lib/vendor/FirebaseSimpleLogin.framework/build-iPhoneSimulator/FirebaseSimpleLogin.framework.bridgesupport +0 -230
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b20746e49429ffd9ecbea7ba992defdb3d70e4d9
|
4
|
+
data.tar.gz: b476715c9efb45dd9d6876948354c6b7c20188e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25e5edfd58e5dc43f8602f1ce879c90e56424625becd3370d4f6215432f9ec4d2e190dda858170372851188c938d1f4d753c99bebac1920a615d2f0f3fcceae4
|
7
|
+
data.tar.gz: 95b3e16250ce1670813d7d76a7581077420f1eb9edf26441e0daecbe27a982f8ebc8c0c560249a09f925ceec33e5585b5ef0c546ce62d6f63a15852fe36c1485
|
data/README.md
CHANGED
@@ -7,21 +7,39 @@ Adds more rubyesque methods to the built-in classes.
|
|
7
7
|
|
8
8
|
For a Ruby (MRI) Firebase wrapper, check out <https://github.com/derailed/bigbertha>.
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
Installation
|
11
|
+
============
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
The **motion-firebase** gem ships with "freeze dried" copies of the Firebase
|
14
|
+
framework. This way we can guarantee that the version of **motion-firebase** is
|
15
|
+
*definitely* compatible with the version of Firebase that is included. As new
|
16
|
+
features get announced, we update the gem.
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
Also, it means that installation is easy! When you compile your RubyMotion
|
19
|
+
project, the Firebase SDK gets included automatically.
|
18
20
|
|
19
|
-
|
21
|
+
motion-firebase 3.0
|
22
|
+
========
|
23
|
+
|
24
|
+
Lots of changes in this version: <3.0.md>
|
25
|
+
|
26
|
+
# SDK
|
20
27
|
|
21
28
|
##### Initializing a Firebase object
|
22
29
|
|
23
30
|
```ruby
|
24
31
|
Firebase.new(url)
|
32
|
+
|
33
|
+
# it's common to set a global firebase URL. Set it in your app delegate,
|
34
|
+
# and calling `new` will use that default URL.
|
35
|
+
Firebase.url = 'https://your-app.firebaseio.com'
|
36
|
+
Firebase.url # => 'https://your-app.firebaseio.com'
|
37
|
+
Firebase.new
|
38
|
+
|
39
|
+
# these all work, too:
|
40
|
+
Firebase.url = 'your-app.firebaseio.com'
|
41
|
+
Firebase.url = 'your-app'
|
42
|
+
Firebase.url # => 'https://your-app.firebaseio.com'
|
25
43
|
```
|
26
44
|
|
27
45
|
##### Getting references to children locations
|
@@ -72,6 +90,16 @@ SDK
|
|
72
90
|
|
73
91
|
##### Attaching observers to read data
|
74
92
|
|
93
|
+
[Events](https://www.firebase.com/docs/web/guide/retrieving-data.html) can have the value of:
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
:child_added, :added, FEventTypeChildAdded
|
97
|
+
:child_moved, :moved, FEventTypeChildMoved
|
98
|
+
:child_changed, :changed, FEventTypeChildChanged
|
99
|
+
:child_removed, :removed, FEventTypeChildRemoved
|
100
|
+
:value, FEventTypeValue
|
101
|
+
```
|
102
|
+
|
75
103
|
```ruby
|
76
104
|
handle = firebase.on(event_type) { |snapshot| 'completion block' }
|
77
105
|
handle = firebase.on(event_type) { |snapshot, previous_sibling_name| 'completion block' }
|
@@ -107,6 +135,12 @@ SDK
|
|
107
135
|
firebase.start_at(priority, child: child_name)
|
108
136
|
# => firebase.queryStartingAtPriority(priority, andChildName: child_name)
|
109
137
|
|
138
|
+
firebase.equal_to(priority)
|
139
|
+
# => firebase.queryEqualToPriority(priority)
|
140
|
+
|
141
|
+
firebase.equal_to(priority, child: child_name)
|
142
|
+
# => firebase.queryEqualToPriority(priority, andChildName: child_name)
|
143
|
+
|
110
144
|
firebase.end_at(priority)
|
111
145
|
# => firebase.queryEndingAtPriority(priority)
|
112
146
|
|
@@ -119,10 +153,26 @@ SDK
|
|
119
153
|
|
120
154
|
##### Managing presence
|
121
155
|
|
156
|
+
SOO COOL! Play with these, you can *easily* create a presence system for your
|
157
|
+
real-time app or game.
|
158
|
+
|
122
159
|
```ruby
|
123
|
-
|
124
|
-
|
125
|
-
|
160
|
+
Firebase.online!
|
161
|
+
Firebase.offline!
|
162
|
+
Firebase.connected? # returns a Firebase ref that changes value depending on connectivity
|
163
|
+
|
164
|
+
# or you can pass in a block, this block will be called with the connected
|
165
|
+
# state as a bool:
|
166
|
+
handler = Firebase.connected? do |connected|
|
167
|
+
if connected
|
168
|
+
# so awesome
|
169
|
+
end
|
170
|
+
end
|
171
|
+
# you should turn it off when you're done, otherwise you'll have a memory leak
|
172
|
+
Firebase.off(handler)
|
173
|
+
|
174
|
+
# so what you do is get a ref to the authenticated user's "presence" value.
|
175
|
+
# Then, on_disconnect, set the value to 'false'.
|
126
176
|
firebase.on_disconnect(value) # set the ref to `value` when disconnected
|
127
177
|
firebase.on_disconnect(value) { |error| 'completion block' }
|
128
178
|
firebase.on_disconnect(value, priority: priority)
|
@@ -131,34 +181,12 @@ SDK
|
|
131
181
|
firebase.on_disconnect(nil) { |error| 'completion block' }
|
132
182
|
firebase.on_disconnect({ child: values })
|
133
183
|
firebase.on_disconnect({ child: values }) { |error| 'completion block' }
|
184
|
+
|
185
|
+
# sometimes you need to cancel these 'on_disconnect' operations
|
134
186
|
firebase.cancel_disconnect
|
135
187
|
firebase.cancel_disconnect { |error| 'completion block' }
|
136
188
|
```
|
137
189
|
|
138
|
-
##### Authenticating
|
139
|
-
|
140
|
-
```ruby
|
141
|
-
firebase.auth(secret_key)
|
142
|
-
firebase.auth(secret_key) { |error, data| 'completion block' }
|
143
|
-
firebase.auth(secret_key,
|
144
|
-
completion: proc { |error, data| 'completion block' },
|
145
|
-
disconnect: proc { |error| 'completion block', },
|
146
|
-
)
|
147
|
-
# calls `unauth`, or if you pass a block calls `unauthWithCompletionBlock`
|
148
|
-
firebase.unauth
|
149
|
-
firebase.unauth do |error|
|
150
|
-
# ...
|
151
|
-
end
|
152
|
-
# when using FirebaseSimpleLogin to authenticate, this child node should be
|
153
|
-
# monitored for changes
|
154
|
-
firebase.auth_state
|
155
|
-
# usually you'll want to monitor its value, so this is a helper for that:
|
156
|
-
handle = firebase.on_auth do |snapshot|
|
157
|
-
end
|
158
|
-
# be a good citizen and turn off the listener later!
|
159
|
-
firebase.off(handle)
|
160
|
-
```
|
161
|
-
|
162
190
|
##### Transactions
|
163
191
|
|
164
192
|
```ruby
|
@@ -204,72 +232,172 @@ SDK
|
|
204
232
|
```ruby
|
205
233
|
Firebase.dispatch_queue=(queue)
|
206
234
|
Firebase.sdkVersion
|
235
|
+
Motion::Firebase::SdkVersion # this string is more human readable than sdkVersion
|
207
236
|
```
|
208
237
|
|
209
|
-
# FirebaseSimpleLogin Class Reference
|
210
238
|
|
211
|
-
|
239
|
+
# Firebase Authentication Reference
|
240
|
+
|
241
|
+
Most of the authentication methods can be called statically as long as you have
|
242
|
+
set a default `Firebase.url`
|
212
243
|
|
213
|
-
#####
|
244
|
+
##### Checking current authentication status
|
214
245
|
|
215
246
|
```ruby
|
216
|
-
|
217
|
-
|
247
|
+
Firebase.authenticated? # => true/false
|
248
|
+
# you pretty much always need to hold a reference to the "handler"
|
249
|
+
auth_handler = Firebase.authenticated? do |auth_data|
|
250
|
+
if auth_data
|
251
|
+
# authenticated!
|
252
|
+
else
|
253
|
+
# not so much
|
254
|
+
end
|
255
|
+
end
|
256
|
+
# turn off the handler, otherwise, yeah, memory leaks.
|
257
|
+
Firebase.off_auth(auth_handler)
|
218
258
|
```
|
219
259
|
|
220
|
-
#####
|
260
|
+
##### Authenticate with previous token
|
221
261
|
|
222
262
|
```ruby
|
223
|
-
auth
|
263
|
+
Firebase.auth(token) do |error, auth_data|
|
264
|
+
end
|
224
265
|
```
|
225
266
|
|
226
267
|
##### Removing any existing authentication
|
227
268
|
|
228
269
|
```ruby
|
229
|
-
|
270
|
+
Firebase.logout
|
230
271
|
```
|
231
272
|
|
232
|
-
|
273
|
+
## Email/password authentication methods
|
233
274
|
|
234
|
-
|
235
|
-
|
236
|
-
`:new_password`.
|
275
|
+
This is the most common way to login. It allows Firebase to create users and
|
276
|
+
tokens.
|
237
277
|
|
238
278
|
```ruby
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
279
|
+
Firebase.create_user(email: 'hello@example.com', password: '12345') { |error, auth_data| }
|
280
|
+
Firebase.remove_user(email: 'hello@example.com', password: '12345') { |error, auth_data| }
|
281
|
+
Firebase.login(email: 'hello@example.com', password: '12345') { |error, auth_data| }
|
282
|
+
Firebase.login_anonymously { |error, auth_data| }
|
283
|
+
Firebase.update_user(email: 'hello@example.com', old_password: '12345', new_password: '54321') { |error, success| }
|
284
|
+
|
285
|
+
auth_data.uid # is a globally unique user identifier
|
286
|
+
auth_data.token # can be stored (in a keychain!) to authenticate the same user again later
|
243
287
|
```
|
244
288
|
|
245
|
-
|
289
|
+
See <https://www.firebase.com/docs/ios/api/#fauthdata_properties> for other
|
290
|
+
`auth_data` properties.
|
291
|
+
|
292
|
+
|
293
|
+
## Other authentication providers
|
294
|
+
|
295
|
+
##### Facebook authentication
|
246
296
|
|
247
|
-
|
248
|
-
|
297
|
+
This Facebook helper is a port of the Objective-C code from
|
298
|
+
<https://www.firebase.com/docs/ios/guide/login/facebook.html>.
|
249
299
|
|
250
300
|
```ruby
|
251
|
-
|
301
|
+
Firebase.open_facebook_session(
|
302
|
+
permissions: ['public_profile'], # these are the default values. if
|
303
|
+
allow_login_ui: true, # you're OK with them, they are
|
304
|
+
) do |error, auth_data| # optional, so just provide a block.
|
305
|
+
end
|
252
306
|
```
|
253
307
|
|
254
|
-
##### Twitter authentication
|
308
|
+
##### Twitter authentication
|
255
309
|
|
256
|
-
|
257
|
-
|
258
|
-
|
310
|
+
This Twitter helper is a port of the Objective-C code from
|
311
|
+
<https://www.firebase.com/docs/ios/guide/login/twitter.html>. You should read
|
312
|
+
that page to see how Firebase recommends handling multiple accounts. It's a
|
313
|
+
little streamlined here, since `open_twitter_session` returns a block that you
|
314
|
+
can call with the chosen account.
|
259
315
|
|
260
316
|
```ruby
|
261
|
-
|
317
|
+
# it's nice to be able to set-and-forget the twitter_api_key (in your
|
318
|
+
# application delegate, for example)
|
319
|
+
Firebase.twitter_api_key = 'your key!'
|
320
|
+
|
321
|
+
# You must set Firebase.url=, or call open_twitter_session on an existing
|
322
|
+
# Firebase ref. The first step is to get the Twitter accounts on this
|
323
|
+
# device. Even if there is just one, you need to "choose" it here. Also,
|
324
|
+
# you can pass the twitter api_key as an option, otherwise this method will
|
325
|
+
# use Firebase.twitter_api_key
|
326
|
+
Firebase.open_twitter_session(api_key: 'your key!') do |error, accounts, next_step|
|
327
|
+
# next_step is a block you call with the chosen twitter account and a
|
328
|
+
# firebase handler for the authentication success or failure
|
329
|
+
if error
|
330
|
+
# obviously do some stuff here
|
331
|
+
else
|
332
|
+
present_twitter_chooser(accounts, next_step) do |error, auth_data|
|
333
|
+
# this block is passed to next_step in present_twitter_chooser
|
334
|
+
if error
|
335
|
+
# bummer
|
336
|
+
else
|
337
|
+
# awesome!
|
338
|
+
end
|
339
|
+
end
|
340
|
+
else
|
341
|
+
end
|
342
|
+
|
343
|
+
def present_twitter_chooser(accounts, next_step, &firebase_handler)
|
344
|
+
if accounts.length == 1
|
345
|
+
next_step.call(accounts[0], &firebase_handler)
|
346
|
+
else
|
347
|
+
# present a controller or action sheet or something like that
|
348
|
+
... awesome twitter account chooser code ...
|
349
|
+
next_step.call(account, &firebase_handler)
|
350
|
+
end
|
351
|
+
end
|
262
352
|
```
|
263
353
|
|
264
|
-
#####
|
354
|
+
##### Github authentication
|
355
|
+
|
356
|
+
Firebase doesn't provide much help on this one. I'm not even sure *how* to get
|
357
|
+
a github access token from the user... but anyway here's the `motion-firebase`
|
358
|
+
code based on <https://www.firebase.com/docs/ios/guide/login/github.html>.
|
265
359
|
|
266
360
|
```ruby
|
267
|
-
|
361
|
+
Firebase.github_token = 'github oauth token'
|
362
|
+
Firebase.open_github_session do |error, auth_data|
|
363
|
+
end
|
268
364
|
```
|
269
365
|
|
270
|
-
#####
|
366
|
+
##### Google authentication
|
367
|
+
|
368
|
+
This process is more involved, and relies on the GooglePlus framework. I didn't
|
369
|
+
take the time to port the code this time, but I hope someone does someday! 😄
|
370
|
+
|
371
|
+
You can read Firebase's instructions here: <https://www.firebase.com/docs/ios/guide/login/google.html>
|
271
372
|
|
272
373
|
```ruby
|
273
|
-
|
274
|
-
|
374
|
+
Firebase.google_token = 'google oauth token'
|
375
|
+
Firebase.open_google_session do |error, auth_data|
|
376
|
+
end
|
377
|
+
```
|
378
|
+
|
379
|
+
##### Generic OAuth Authentication
|
380
|
+
|
381
|
+
Usually you will use the helpers from above, but here are some lower level
|
382
|
+
methods:
|
383
|
+
|
384
|
+
```ruby
|
385
|
+
# using a token
|
386
|
+
firebase_ref.login_to_oauth(provider, token: token) do |error, auth_data| .. end
|
387
|
+
firebase_ref.login_to_oauth(provider, token) do |error, auth_data| .. end
|
388
|
+
|
389
|
+
# using parameters
|
390
|
+
firebase_ref.login_to_oauth(provider, oauth_token: token, oauth_token_secret: secret) do |error, auth_data| .. end
|
391
|
+
params = { ... }
|
392
|
+
firebase_ref.login_to_oauth(provider, params) do |error, auth_data| .. end
|
393
|
+
|
394
|
+
# which is a wrapper for these SDK methods:
|
395
|
+
firebase_ref.authWithOAuthProvider(provider, token: token, withCompletionBlock: block)
|
396
|
+
firebase_ref.authWithOAuthProvider(provider, parameters: params, withCompletionBlock: block)
|
397
|
+
|
398
|
+
# Again, the `open_*_session` methods are even more convenient.
|
399
|
+
firebase_ref.login_to_facebook(facebook_access_token, &block)
|
400
|
+
firebase_ref.login_to_twitter(token: token, secret: secret, &block)
|
401
|
+
firebase_ref.login_to_github(github_oauth_token, &block)
|
402
|
+
firebase_ref.login_to_google(google_oauth_token, &block)
|
275
403
|
```
|
@@ -12,38 +12,6 @@ class FirebaseSimpleLogin
|
|
12
12
|
checkAuthStatusWithBlock(and_then)
|
13
13
|
end
|
14
14
|
|
15
|
-
def create(credentials, &block)
|
16
|
-
raise "email is required in #{__method__}" unless credentials.key?(:email)
|
17
|
-
raise "password is required in #{__method__}" unless credentials.key?(:password)
|
18
|
-
email = credentials[:email]
|
19
|
-
password = credentials[:password]
|
20
|
-
begin
|
21
|
-
createUserWithEmail(email, password: password, andCompletionBlock: block)
|
22
|
-
rescue RuntimeError => e
|
23
|
-
block.call(e, nil)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def remove(credentials, &block)
|
28
|
-
raise "email is required in #{__method__}" unless credentials.key?(:email)
|
29
|
-
raise "password is required in #{__method__}" unless credentials.key?(:password)
|
30
|
-
email = credentials[:email]
|
31
|
-
password = credentials[:password]
|
32
|
-
removeUserWithEmail(email, password: password, andCompletionBlock: block)
|
33
|
-
end
|
34
|
-
|
35
|
-
def login(credentials, &block)
|
36
|
-
raise "email is required in #{__method__}" unless credentials.key?(:email)
|
37
|
-
raise "password is required in #{__method__}" unless credentials.key?(:password)
|
38
|
-
email = credentials[:email]
|
39
|
-
password = credentials[:password]
|
40
|
-
begin
|
41
|
-
loginWithEmail(email, andPassword: password, withCompletionBlock: block)
|
42
|
-
rescue RuntimeError => e
|
43
|
-
block.call(e, nil)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
15
|
def update(credentials, &block)
|
48
16
|
raise "email is required in #{__method__}" unless credentials.key?(:email)
|
49
17
|
raise "old_password is required in #{__method__}" unless credentials.key?(:old_password)
|
@@ -54,48 +22,4 @@ class FirebaseSimpleLogin
|
|
54
22
|
changePasswordForEmail(email, oldPassword: old_password, newPassword: new_password, completionBlock: block)
|
55
23
|
end
|
56
24
|
|
57
|
-
def send_password_reset(email, &block)
|
58
|
-
sendPasswordResetForEmail(email, andCompletionBlock: block)
|
59
|
-
end
|
60
|
-
|
61
|
-
def login_to_facebook(credentials, &block)
|
62
|
-
if credentials.is_a?(NSString)
|
63
|
-
app_id = credentials
|
64
|
-
credentials = {}
|
65
|
-
else
|
66
|
-
app_id = credentials[:app_id]
|
67
|
-
raise "app_id is required in #{__method__}" unless app_id
|
68
|
-
end
|
69
|
-
permissions = credentials[:permissions] || ['email']
|
70
|
-
audience = credentials[:audience] || ACFacebookAudienceOnlyMe
|
71
|
-
loginToFacebookAppWithId(app_id, permissions: permissions, audience: audience, withCompletionBlock: block)
|
72
|
-
end
|
73
|
-
|
74
|
-
def login_to_twitter(credentials, &block)
|
75
|
-
if credentials.is_a?(NSString)
|
76
|
-
app_id = credentials
|
77
|
-
credentials = {}
|
78
|
-
else
|
79
|
-
app_id = credentials[:app_id]
|
80
|
-
raise "app_id is required in #{__method__}" unless app_id
|
81
|
-
end
|
82
|
-
on_multiple = credentials[:on_multiple] || ->(accounts) { 0 }
|
83
|
-
loginToTwitterAppWithId(app_id, multipleAccountsHandler: on_multiple, withCompletionBlock: block)
|
84
|
-
end
|
85
|
-
|
86
|
-
def login_to_google(credentials, &block)
|
87
|
-
if credentials.is_a?(NSString)
|
88
|
-
app_id = credentials
|
89
|
-
credentials = {}
|
90
|
-
else
|
91
|
-
app_id = credentials[:app_id]
|
92
|
-
raise "app_id is required in #{__method__}" unless app_id
|
93
|
-
end
|
94
|
-
loginToGoogleWithAccessToken(app_id, withCompletionBlock: block)
|
95
|
-
end
|
96
|
-
|
97
|
-
def login_anonymously(&block)
|
98
|
-
loginAnonymouslywithCompletionBlock(block)
|
99
|
-
end
|
100
|
-
|
101
25
|
end
|