ProMotion-iap 0.1.0 → 0.2.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 +106 -8
- data/lib/ProMotion-iap.rb +1 -0
- data/lib/ProMotion/iap.rb +23 -18
- data/lib/ProMotion/product.rb +27 -0
- metadata +2 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a58cbbb9a1bfea9bed76bf23bcf61cb8c538bc17
|
4
|
+
data.tar.gz: 2dd27741089d27722aa8a4e7e4fa2fb1153cf75c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a15d8be62ab306ff6fb4fa1ac41736a62f92db1c66e27a1c7a330ec510293c8549c020e459575372c6cd1deaded3cc7709e57e0193c51756524afb727e49140c
|
7
|
+
data.tar.gz: c681697056432c9dee095f61392f4dd7b60bb10a4d9da50f13c081364cda6b26ac89444bcbf375757c3b609d98dc14cd06f78914367ec9be51e44716750a0a46
|
data/README.md
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# ProMotion-iap
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/ProMotion-iap)
|
4
|
+
[](https://travis-ci.org/clearsightstudio/ProMotion-iap)
|
5
|
+
|
3
6
|
ProMotion-iap is in-app purchase notification support for the
|
4
|
-
popular RubyMotion gem [ProMotion](https://github.com/clearsightstudio/ProMotion).
|
7
|
+
popular RubyMotion gem [ProMotion](https://github.com/clearsightstudio/ProMotion).
|
5
8
|
|
6
9
|
## Installation
|
7
10
|
|
@@ -11,7 +14,79 @@ gem 'ProMotion-iap'
|
|
11
14
|
|
12
15
|
## Usage
|
13
16
|
|
14
|
-
###
|
17
|
+
### PM::IAP::Product Class
|
18
|
+
|
19
|
+
The `Product` class is an abstraction layer that provides a simpler interface when working with a single IAP product.
|
20
|
+
If you are dealing with multiple products you will want to use the IAP Module directly (documented below).
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
class PurchaseScreen < PM::Screen
|
24
|
+
|
25
|
+
def on_load
|
26
|
+
|
27
|
+
product = PM::IAP::Product.new("productid")
|
28
|
+
|
29
|
+
product.retrieve do |product, error|
|
30
|
+
# product looks something like the following
|
31
|
+
{
|
32
|
+
product_id: "productid1",
|
33
|
+
title: "title",
|
34
|
+
description: "description",
|
35
|
+
price: <BigDecimal 0.99>,
|
36
|
+
formatted_price: "$0.99",
|
37
|
+
price_locale: <NSLocale>,
|
38
|
+
downloadable: false,
|
39
|
+
download_content_lengths: <?>, # TODO: ?
|
40
|
+
download_content_version: <?>, # TODO: ?
|
41
|
+
product: <SKProduct>
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
product.purchase do |status, transaction|
|
46
|
+
case status
|
47
|
+
when :in_progress
|
48
|
+
# Usually do nothing, maybe a spinner
|
49
|
+
when :deferred
|
50
|
+
# Waiting on a prompt to the user
|
51
|
+
when :purchased
|
52
|
+
# Notify the user, update any affected UI elements
|
53
|
+
when :canceled
|
54
|
+
# They just canceled, no big deal.
|
55
|
+
when :error
|
56
|
+
# Failed to purchase
|
57
|
+
transaction.error.localizedDescription # => error message
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
product.restore do |status, product|
|
62
|
+
if status == :restored
|
63
|
+
# Update your UI, notify the user
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
```
|
71
|
+
|
72
|
+
#### Product.new(product_id)
|
73
|
+
|
74
|
+
Stores the product_id for use in the instance methods.
|
75
|
+
|
76
|
+
#### retrieve(&callback)
|
77
|
+
|
78
|
+
Retrieves the product.
|
79
|
+
|
80
|
+
#### purchase(&callback)
|
81
|
+
|
82
|
+
Begins a purchase of the product.
|
83
|
+
|
84
|
+
#### restore(&callback)
|
85
|
+
|
86
|
+
Begins a restoration of the previously purchased product.
|
87
|
+
|
88
|
+
|
89
|
+
### IAP Module
|
15
90
|
|
16
91
|
Include `PM::IAP` to add some in-app purchase methods to a screen, app delegate, or other class.
|
17
92
|
|
@@ -22,7 +97,7 @@ class PurchaseScreen < PM::Screen
|
|
22
97
|
|
23
98
|
def on_load
|
24
99
|
|
25
|
-
retrieve_iaps
|
100
|
+
retrieve_iaps [ "productid1", "productid2" ] do |products, error|
|
26
101
|
# products looks something like the following
|
27
102
|
[{
|
28
103
|
product_id: "productid1",
|
@@ -54,7 +129,7 @@ class PurchaseScreen < PM::Screen
|
|
54
129
|
end
|
55
130
|
end
|
56
131
|
|
57
|
-
restore_iaps do |status, products|
|
132
|
+
restore_iaps "productid" do |status, products|
|
58
133
|
if status == :restored
|
59
134
|
# Update your UI, notify the user
|
60
135
|
end
|
@@ -65,19 +140,42 @@ class PurchaseScreen < PM::Screen
|
|
65
140
|
end
|
66
141
|
```
|
67
142
|
|
68
|
-
####
|
143
|
+
#### retrieve_iaps(`*`product_ids, &callback)
|
144
|
+
|
145
|
+
Retrieves in-app purchase products in an array of mapped hashes. The callback method should accept `products` and `error`.
|
146
|
+
|
147
|
+
|
148
|
+
#### purchase_iaps(`*`product_ids, &callback)
|
149
|
+
|
150
|
+
Prompts the user to login to their Apple ID and complete the purchase. The callback method should accept `status` and `transaction`.
|
151
|
+
The callback method will be called several times with the various statuses in the process. If more than one `product_id` is provided
|
152
|
+
the callback method will be called several times per product with the applicable transaction.
|
153
|
+
|
154
|
+
|
155
|
+
#### restore_iaps(`*`product_ids, &callback)
|
156
|
+
|
157
|
+
Restores a previously purchased IAP to the user (for example if they have upgraded their device). This relies on the Apple ID the user
|
158
|
+
enters at the prompt. Unfortunately, if there is no purchase to restore for the signed-in account, no error message is generated and
|
159
|
+
will fail silently.
|
160
|
+
|
69
161
|
|
70
|
-
TODO
|
71
162
|
|
72
|
-
```ruby
|
73
163
|
|
74
|
-
```
|
75
164
|
|
76
165
|
Find the Product ID here:
|
77
166
|
|
78
167
|

|
79
168
|
|
80
169
|
|
170
|
+
## Authors
|
171
|
+
| Contributor | Twitter |
|
172
|
+
| Jamon Holmgren | [@jamonholmgren](http://twitter.com/jamonholmgren) |
|
173
|
+
| Kevin VanGelder | [@kevinvangelder](http://twitter.com/kevin_vangelder) |
|
174
|
+
|
175
|
+
## Inspired By
|
176
|
+
- [Helu](https://github.com/ivanacostarubio/helu)
|
177
|
+
- [Mark Rickert's Code Example](https://github.com/OTGApps/TheShowCloser/blob/master/app/helpers/iap_helper.rb)
|
178
|
+
|
81
179
|
|
82
180
|
## Contributing
|
83
181
|
|
data/lib/ProMotion-iap.rb
CHANGED
data/lib/ProMotion/iap.rb
CHANGED
@@ -2,9 +2,9 @@ module ProMotion
|
|
2
2
|
module IAP
|
3
3
|
attr_accessor :completion_handlers
|
4
4
|
|
5
|
-
def
|
5
|
+
def purchase_iaps(*product_ids, &callback)
|
6
6
|
iap_setup
|
7
|
-
retrieve_iaps
|
7
|
+
retrieve_iaps product_ids do |products|
|
8
8
|
products.each do |product|
|
9
9
|
self.completion_handlers["purchase-#{product[:product_id]}"] = callback
|
10
10
|
payment = SKPayment.paymentWithProduct(product[:product])
|
@@ -12,16 +12,18 @@ module ProMotion
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
+
alias purchase_iap purchase_iaps
|
15
16
|
|
16
|
-
def restore_iaps(
|
17
|
+
def restore_iaps(*product_ids, &callback)
|
17
18
|
iap_setup
|
18
|
-
retrieve_iaps
|
19
|
+
retrieve_iaps product_ids do |products|
|
19
20
|
products.each do |product|
|
20
21
|
self.completion_handlers["restore-#{product[:product_id]}"] = callback
|
21
22
|
SKPaymentQueue.defaultQueue.restoreCompletedTransactions
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
26
|
+
alias restore_iap restore_iaps
|
25
27
|
|
26
28
|
def retrieve_iaps(*product_ids, &callback)
|
27
29
|
iap_setup
|
@@ -76,13 +78,28 @@ module ProMotion
|
|
76
78
|
num_formatter.stringFromNumber price
|
77
79
|
end
|
78
80
|
|
81
|
+
def iap_callback(status, transaction, finish=false)
|
82
|
+
product_id = transaction.payment.productIdentifier
|
83
|
+
if self.completion_handlers["purchase-#{product_id}"]
|
84
|
+
self.completion_handlers["purchase-#{product_id}"].call status, transaction
|
85
|
+
self.completion_handlers["purchase-#{product_id}"] = nil if finish
|
86
|
+
end
|
87
|
+
if self.completion_handlers["restore-#{product_id}"]
|
88
|
+
self.completion_handlers["restore-#{product_id}"].call status, transaction
|
89
|
+
self.completion_handlers["restore-#{product_id}"] = nil if finish
|
90
|
+
end
|
91
|
+
SKPaymentQueue.defaultQueue.finishTransaction(transaction) if finish
|
92
|
+
end
|
93
|
+
|
79
94
|
public
|
80
95
|
|
81
96
|
# SKProductsRequestDelegate methods
|
82
97
|
|
83
98
|
def productsRequest(_, didReceiveResponse:response)
|
84
99
|
unless response.invalidProductIdentifiers.empty?
|
85
|
-
|
100
|
+
red = "\e[0;31m"
|
101
|
+
color_off = "\e[0m"
|
102
|
+
puts "#{red}PM::IAP Error - invalid product identifier(s) '#{response.invalidProductIdentifiers.join("', '")}' for application identifier #{NSBundle.mainBundle.infoDictionary['CFBundleIdentifier'].inspect}#{color_off}"
|
86
103
|
end
|
87
104
|
retrieved_iaps_handler(response.products, &self.completion_handlers["retrieve_iaps"]) if self.completion_handlers["retrieve_iaps"]
|
88
105
|
@products_request = nil
|
@@ -115,18 +132,6 @@ module ProMotion
|
|
115
132
|
end
|
116
133
|
end
|
117
134
|
|
118
|
-
def iap_callback(status, transaction, finish=false)
|
119
|
-
product_id = transaction.payment.productIdentifier
|
120
|
-
if self.completion_handlers["purchase-#{product_id}"]
|
121
|
-
self.completion_handlers["purchase-#{product_id}"].call status, transaction
|
122
|
-
self.completion_handlers["purchase-#{product_id}"] = nil if finish
|
123
|
-
end
|
124
|
-
if self.completion_handlers["restore-#{product_id}"]
|
125
|
-
self.completion_handlers["restore-#{product_id}"].call status, transaction
|
126
|
-
self.completion_handlers["restore-#{product_id}"] = nil if finish
|
127
|
-
end
|
128
|
-
SKPaymentQueue.defaultQueue.finishTransaction(transaction) if finish
|
129
|
-
end
|
130
|
-
|
131
135
|
end
|
132
136
|
end
|
137
|
+
::PM = ProMotion unless defined?(::PM)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ProMotion
|
2
|
+
class IAP::Product
|
3
|
+
include PM::IAP
|
4
|
+
|
5
|
+
attr_reader :product_id
|
6
|
+
|
7
|
+
def initialize(product_id)
|
8
|
+
@product_id = product_id
|
9
|
+
end
|
10
|
+
|
11
|
+
def retrieve(&callback)
|
12
|
+
retrieve_iaps(product_id) do |products, error|
|
13
|
+
callback.call products.first, error
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def purchase(&callback)
|
18
|
+
purchase_iaps(product_id, &callback)
|
19
|
+
end
|
20
|
+
|
21
|
+
def restore(&callback)
|
22
|
+
restore_iaps(product_id) do |status, products|
|
23
|
+
callback.call status, products.find{|p| p[:product_id] == product_id }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ProMotion-iap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamon Holmgren
|
@@ -11,20 +11,6 @@ bindir: bin
|
|
11
11
|
cert_chain: []
|
12
12
|
date: 2015-02-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: ProMotion
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '2.0'
|
21
|
-
type: :runtime
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - "~>"
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '2.0'
|
28
14
|
- !ruby/object:Gem::Dependency
|
29
15
|
name: motion-stump
|
30
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,6 +64,7 @@ files:
|
|
78
64
|
- README.md
|
79
65
|
- lib/ProMotion-iap.rb
|
80
66
|
- lib/ProMotion/iap.rb
|
67
|
+
- lib/ProMotion/product.rb
|
81
68
|
homepage: https://github.com/clearsightstudio/ProMotion-iap
|
82
69
|
licenses:
|
83
70
|
- MIT
|