imobile 0.0.6 → 0.0.7

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.0.7. New API for push notifications, better suited for daemons.
2
+
1
3
  v0.0.6. New push certificates read method for Ruby 1.8.6 on Heroku.
2
4
 
3
5
  v0.0.5. Renamed device_token to push_token throughout the API.
data/Manifest CHANGED
@@ -7,7 +7,7 @@ lib/imobile.rb
7
7
  LICENSE
8
8
  Manifest
9
9
  Rakefile
10
- README
10
+ README.textile
11
11
  test/crypto_app_fprint_test.rb
12
12
  test/push_notification_test.rb
13
13
  test/validate_receipt_test.rb
data/README.textile ADDED
@@ -0,0 +1,37 @@
1
+ h1. Imobile
2
+
3
+ This gem/Rails plugin contains common code for powering iPhone applications. It
4
+ is particularly suitable as a server-side partner to the ZergSupport toolkit,
5
+ also available on Github under the MIT license at
6
+ http://github.com/costan/zergsupport
7
+
8
+ h2. Features
9
+
10
+ * <b>In-App Purchase</b> receipts verification - imobile can verify a StoreKit
11
+ receipt with Apple's servers. Apple's response is parsed into a Ruby-friendly
12
+ hash. See Imobile.validate_receipt in validate_receipt.rb
13
+
14
+ * <b>Push Notifications</b> - imobile supports both pushing notifications and
15
+ receiving feedback from Apple's servers. imobile can use the .p12 certificates
16
+ exported by Keychain directly, and it knows to talk to both sandbox and
17
+ production servers. imobile can send notifications in batch mode, ideal for
18
+ daemons and Cron jobs. See Imobile.push_notifications and Imobile.push_feedback
19
+ in push_notification.rb
20
+
21
+ * ZergSupport's CryptoSupport - imobile can validate the application fingerprint
22
+ generated by ZergSupport's CryptoSupport. Useful to know who's pirating your
23
+ applications. See Imobile.crypto_app_fprint in crypto_app_fprint.rb
24
+
25
+ * Production-friendly - imobile has great automated test coverage and all
26
+ methods are reasonably well document. The code is placed under the MIT license.
27
+
28
+ h2. ZergSupport
29
+
30
+ Some of imobile's functionality was designed specifically for use with the
31
+ ZergSupport iPhone application toolkit. The toolkit is available under the MIT
32
+ license at http://github.com/costan/zergsupport
33
+
34
+ h2. Contributions
35
+
36
+ Please don't hesitate to fork the project and send pull requests.
37
+
data/imobile.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{imobile}
5
- s.version = "0.0.6"
5
+ s.version = "0.0.7"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Victor Costan"]
9
- s.date = %q{2009-07-27}
9
+ s.date = %q{2009-07-28}
10
10
  s.description = %q{Library for servers backing iPhone applications.}
11
11
  s.email = %q{victor@zergling.net}
12
- s.extra_rdoc_files = ["CHANGELOG", "lib/imobile/crypto_app_fprint.rb", "lib/imobile/push_notification.rb", "lib/imobile/validate_receipt.rb", "lib/imobile.rb", "LICENSE", "README"]
13
- s.files = ["CHANGELOG", "imobile.gemspec", "lib/imobile/crypto_app_fprint.rb", "lib/imobile/push_notification.rb", "lib/imobile/validate_receipt.rb", "lib/imobile.rb", "LICENSE", "Manifest", "Rakefile", "README", "test/crypto_app_fprint_test.rb", "test/push_notification_test.rb", "test/validate_receipt_test.rb", "testdata/apns_developer.p12", "testdata/apns_production.p12", "testdata/device_attributes.yml", "testdata/encoded_notification", "testdata/forged_sandbox_receipt", "testdata/sandbox_push_token", "testdata/sandbox_push_token.bin", "testdata/valid_sandbox_receipt"]
12
+ s.extra_rdoc_files = ["CHANGELOG", "lib/imobile/crypto_app_fprint.rb", "lib/imobile/push_notification.rb", "lib/imobile/validate_receipt.rb", "lib/imobile.rb", "LICENSE", "README.textile"]
13
+ s.files = ["CHANGELOG", "imobile.gemspec", "lib/imobile/crypto_app_fprint.rb", "lib/imobile/push_notification.rb", "lib/imobile/validate_receipt.rb", "lib/imobile.rb", "LICENSE", "Manifest", "Rakefile", "README.textile", "test/crypto_app_fprint_test.rb", "test/push_notification_test.rb", "test/validate_receipt_test.rb", "testdata/apns_developer.p12", "testdata/apns_production.p12", "testdata/device_attributes.yml", "testdata/encoded_notification", "testdata/forged_sandbox_receipt", "testdata/sandbox_push_token", "testdata/sandbox_push_token.bin", "testdata/valid_sandbox_receipt"]
14
14
  s.homepage = %q{http://github.com/costan/imobile}
15
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Imobile", "--main", "README"]
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Imobile", "--main", "README.textile"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{zerglings}
18
18
  s.rubygems_version = %q{1.3.5}
@@ -51,7 +51,7 @@ end
51
51
  # Reads the available feedback from Apple's Push Notification service.
52
52
  #
53
53
  # Args:
54
- # certificate_or_path:: see Imobile.push_notification
54
+ # path_or_certificate:: see Imobile.push_notification
55
55
  #
56
56
  # The currently provided feedback is the tokens for the devices which rejected
57
57
  # notifications. Each piece of feedback is a hash with the following keys:
@@ -81,6 +81,53 @@ def self.pack_hex_push_token(push_token)
81
81
  [push_token.gsub(/\s/, '')].pack('H*')
82
82
  end
83
83
 
84
+ # Carries state for delivering batched notifications.
85
+ class PushNotificationsContext
86
+ # Sends a notification via this context's APNs connection.
87
+ #
88
+ # Args:
89
+ # notification:: see Imobile.push_notification
90
+ #
91
+ # Raises a RuntimeError if the context's APNs connection was closed.
92
+ def push(notification)
93
+ raise "The context's APNs connection was closed" if @closed
94
+ @socket.write PushNotifications.encode_notification(notification)
95
+ end
96
+
97
+ # Creates a push context for a fixed Apple Push Notifications server.
98
+ #
99
+ # Args:
100
+ # path_or_certificate:: see Imobile.push_notification
101
+ def initialize(path_or_certificate)
102
+ @certificate = PushNotifications.read_certificate path_or_certificate
103
+ @socket = PushNotifications.apns_socket @certificate, :push
104
+ @closed = false
105
+ end
106
+
107
+ # Closes the APNs connection. The context is unusable afterwards.
108
+ def close
109
+ @socket.close unless @closed
110
+ @closed = true
111
+ end
112
+
113
+ # The raw SSL connection to the APNs.
114
+ attr_reader :socket
115
+ # The APNs client certificate.
116
+ attr_reader :certificate
117
+
118
+ # True if the context's APNs connection is closed.
119
+ def closed?
120
+ @closed
121
+ end
122
+
123
+ # Called when the context is garbage-collected.
124
+ #
125
+ # Closes the APNs connection, if it wasn't already closed.
126
+ def finalize
127
+ close unless @closed
128
+ end
129
+ end
130
+
84
131
  # Implementation details for push_notification.
85
132
  module PushNotifications
86
133
  # Reads an APNs certificate from a string or a file.
@@ -203,7 +250,6 @@ module PushNotifications
203
250
  super
204
251
  raw_socket.close
205
252
  end
206
- socket.sync = true
207
253
  socket.connect
208
254
  end
209
255
 
@@ -239,17 +285,17 @@ module PushNotifications
239
285
 
240
286
  # Real implementation of Imobile.push_notifications
241
287
  def self.push_notifications(certificate_or_path, notifications)
242
- socket = apns_socket read_certificate(certificate_or_path), :push
288
+ context = PushNotificationsContext.new certificate_or_path
243
289
  notifications = [notifications] if notifications.kind_of? Hash
244
- notifications.each { |n| socket.write encode_notification(n) }
290
+ notifications.each { |notification| context.push notification }
245
291
  if Kernel.block_given?
246
292
  loop do
247
293
  notifications = yield
248
294
  notifications = [notifications] if notifications.kind_of? Hash
249
- notifications.each { |n| socket.write encode_notification(n) }
295
+ notifications.each { |notification| context.push notification }
250
296
  end
251
297
  end
252
- socket.close
298
+ context.close
253
299
  end
254
300
 
255
301
  # Real implementation of Imobile.push_notification
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imobile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Costan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-27 00:00:00 -04:00
12
+ date: 2009-07-28 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -55,7 +55,7 @@ extra_rdoc_files:
55
55
  - lib/imobile/validate_receipt.rb
56
56
  - lib/imobile.rb
57
57
  - LICENSE
58
- - README
58
+ - README.textile
59
59
  files:
60
60
  - CHANGELOG
61
61
  - imobile.gemspec
@@ -66,7 +66,7 @@ files:
66
66
  - LICENSE
67
67
  - Manifest
68
68
  - Rakefile
69
- - README
69
+ - README.textile
70
70
  - test/crypto_app_fprint_test.rb
71
71
  - test/push_notification_test.rb
72
72
  - test/validate_receipt_test.rb
@@ -89,7 +89,7 @@ rdoc_options:
89
89
  - --title
90
90
  - Imobile
91
91
  - --main
92
- - README
92
+ - README.textile
93
93
  require_paths:
94
94
  - lib
95
95
  required_ruby_version: !ruby/object:Gem::Requirement
data/README DELETED
@@ -1,6 +0,0 @@
1
- This gem/Rails plugin contains common code for powering iPhone applications. It
2
- is particularly suitable as a server-side partner to the ZergSupport toolkit,
3
- also available on Github under the MIT license at
4
- http://github.com/costan/zergsupport
5
-
6
-