kakao_push 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b4b8321a4fa65fa0a6dfda30ef3b4ca2abd1c980
4
+ data.tar.gz: 4442e21c9ceb76b11368cf5f0dd78ef8ff7b11d6
5
+ SHA512:
6
+ metadata.gz: 7b947d916c75ab047457fdfc2063a545b91562ad6faa3f2d1456258ecccaa76928c8b4acf570c7f928bd2c6b704e401e83075b9dc52f642df0e69fde938b6abd
7
+ data.tar.gz: ac308a07831049dab17dbb3b29ce7cd6271d16b0905bf5ef2336a2031f739d7cf35c05ebee7cddee8e2ccd190b2892afcb67083a6d60cf4e0398c9d9087a4089
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in kakao_push.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 N42Corp
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,105 @@
1
+ # KakaoPush [![Gem Version](https://badge.fury.io/rb/kakao_push.svg)](https://badge.fury.io/rb/kakao_push)
2
+
3
+ 카카오 플랫폼 API에서 제공하는 [푸시알림](https://developers.kakao.com/features/platform#푸시-알림)을 호출하는 젬입니다. iOS, 안드로이드 사용자에게 푸시를 보낼때 유용한 카카오 푸시알림은 REST API로만 제공되고 있기에 이를 젬으로 만들어 봤습니다.
4
+
5
+ [당근마켓](https://www.daangn.com/)([아이폰](https://itunes.apple.com/kr/app/pangyojangteo/id1018769995?l=ko&ls=1&mt=8), [안드로이드](https://play.google.com/store/apps/details?id=com.towneers.www))에서 사용하던 코드를 젬으로 만들었습니다.
6
+
7
+ 주의: 이 젬은 카카오에서 공식적으로 제공하는 젬이 아닙니다. 이점 유의 하시기 바랍니다.
8
+
9
+ ## 설치
10
+
11
+ Gemfile 파일에 다음과 같이 추가하고:
12
+
13
+ ```ruby
14
+ gem 'kakao_push', '~> 0.0.1'
15
+ ```
16
+
17
+ 아래 명령어를 실행합니다:
18
+
19
+ $ bundle
20
+
21
+ 혹은 젬을 직접 설치할 수 있습니다:
22
+
23
+ $ gem install kakao_push
24
+
25
+ ## 사용법
26
+
27
+ ### 클라이언트 객체 생성
28
+
29
+ ```ruby
30
+ client = KakaoPush::Client.new(rest_api_key: 'kakao_admin_key')
31
+ ```
32
+
33
+ ### 토큰 등록
34
+
35
+ 파라미터 및 응답에 관한 자세한 정보는 [카카오 REST API 개발가이드 - 푸시알림](https://developers.kakao.com/docs/restapi#푸시-알림) 참고
36
+
37
+ ```ruby
38
+ res = client.register(uuid: 1, push_type: 'apns', device_id: 'device_id', push_token: 'push_token')
39
+
40
+ res.success? # 등록에 성공한 경우 true
41
+ res.fail? # 등록에 실패한 경우 true
42
+ res.data # 등록에 성공한 경우 숫자 30 반환. 30일 후에 해당 토큰이 만료됨을 의미
43
+ => 30
44
+ ```
45
+
46
+ ### 토큰 조회
47
+
48
+ 파라미터 및 응답에 관한 자세한 정보는 [카카오 REST API 개발가이드 - 푸시알림](https://developers.kakao.com/docs/restapi#푸시-알림) 참고
49
+
50
+ ```ruby
51
+ res = client.tokens(uuid: 1)
52
+
53
+ res.success? # 조희에 성공한 경우 true
54
+ res.fail? # 조회에 실패한 경우 true
55
+ res.data # 조회에 성공한 경우 데이터 반환. 배열로 반환되지만 배열 객체는 1개 뿐이므로 유의
56
+ => [{"user_id":"1","device_id":"a","push_type":"apns","push_token":"aaa","created_at":"2015-12-11T11:34:17Z","updated_at":"2015-12-11T11:34:17Z"}]
57
+ ```
58
+
59
+ ### 토큰 삭제
60
+
61
+ 파라미터 및 응답에 관한 자세한 정보는 [카카오 REST API 개발가이드 - 푸시알림](https://developers.kakao.com/docs/restapi#푸시-알림) 참고
62
+
63
+ ```ruby
64
+ res = client.deregister(uuid: 1, push_type: 'apns', device_id: 'device_id')
65
+ res.success? # 삭제에 성공한 경우 true
66
+ res.fail? # 삭제에 실패한 경우 true
67
+ ```
68
+
69
+ ### 푸시 전송
70
+
71
+ 파라미터 및 응답에 관한 자세한 정보는 [카카오 REST API 개발가이드 - 푸시알림](https://developers.kakao.com/docs/restapi#푸시-알림) 참고
72
+
73
+ ```ruby
74
+ apns = KakaoPush::Apns.new(badge: nil, sound: 'default', push_alert: true, message: nil, custom_field: nil, push_token: nil)
75
+ gcm = KakaoPush::Gcm.new(collapse: nil, delay_while_idle: nil, return_url: nil, custom_field: 'data', push_token: nil)
76
+ res = client.send(uuids: [1], apns: apns, gcm: gcm, bypass: false)
77
+
78
+ res.success? # 전송에 성공한 경우 true
79
+ res.fail? # 전송에 실패한 경우 true
80
+ ```
81
+
82
+ success? 결과가 true이더라도 실제 사용자에 디바이스에 전송되었음을 보장하지 않음. 메시지 포맷이 다르거나 맞지 않아도 success? 값이 true로 반환되기도 하므로 실제 전송 유무는 디바이스에서 테스트가 필요합니다.
83
+
84
+ ### 서버에 저장할 값
85
+
86
+ 디바이스로부터 받은 토큰, 푸쉬 타입(apns, gcm)은 서버에 저장하는것이 좋다. 토큰 삭제를 안할거라면 푸쉬 타입은 굳이 저장할 필요 없습니다. 푸쉬 토큰은 30일이 지나면 토큰 조회 API를 통해서도 조회 할 수 없으므로 될수 있으면 저장하는 편이 좋다고 생각합니다.
87
+
88
+ 예를 들어보자면 디바이스로부터 받은 토큰과 카카오 푸쉬 만료 예정일을 서버에 저장하고 푸쉬 만료 예정일이 되기 전에 다시 토큰 등록 API를 호출하는 사례도 있습니다.
89
+
90
+ ## 에러 상황
91
+
92
+ 정상적인 파라미터를 제공 했음에도 아래와 같은 오류가 발생 한다면 Kakao Developers 사이트에서 앱 설정의 '푸시 알림'을 활성화 하고 gcm, apns 설정을 잘 했는지 확인해야 합니다. 설정하지 않은 경우 아래와 같이 파라미터가 잘못됬다고 에러 메시지가 반환됩니다.
93
+
94
+ ```
95
+ {"code":-2,"msg":"[appName] Invalid Kpusher Param. ( appName=1111, uid=1234, did=dlskjflsk3ksdjfl, pushType=apns, pushToken=lqO_NIwaoAcI0MssA )"}%
96
+ ```
97
+
98
+ ## 도움 주신 분들
99
+
100
+ - [@marocchino](https://github.com/marocchino) : 테스트 코드에서 막혀 있을때 도움 주셨습니다.
101
+ - [@shia](https://github.com/riseshia) : 응답 및 푸시 메시지 구조를 잡는데 도움 주셨습니다.
102
+
103
+ ## Contributing
104
+
105
+ 버그 레포팅과 풀리퀘스트는 GitHub에 남겨주세요. https://github.com/n42corp/kakao_push
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "kakao_push"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'kakao_push/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "kakao_push"
8
+ spec.version = KakaoPush::VERSION
9
+ spec.authors = ["ChangHoon Jung"]
10
+ spec.email = ["iamseapy@gmail.com"]
11
+
12
+ spec.summary = %q{카카오 플랫폼 API에서 제공하는 푸시알림을 호출하는 젬입니다.}
13
+ spec.description = %q{카카오 플랫폼 API에서 제공하는 푸시알림을 호출하는 젬입니다. iOS, 안드로이드 사용자에게 푸시를 보낼때 유용한 카카오 푸시알림은 REST API로만 제공되고 있기에 이를 젬으로 만들어 봤습니다.}
14
+ spec.homepage = "https://github.com/n42corp/kakao_push"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|example)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "multi_json"
22
+ spec.add_dependency "faraday", "~> 0.9.2"
23
+ spec.add_dependency "faraday_middleware", "~> 0.10.0"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.10"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "minitest"
28
+ end
@@ -0,0 +1,23 @@
1
+ module KakaoPush
2
+ class Apns
3
+ def initialize(badge: nil, sound: nil, push_alert: nil, message: nil, custom_field: nil, push_token: nil)
4
+ @badge = badge
5
+ @sound = sound
6
+ @push_alert = push_alert
7
+ @message = message
8
+ @custom_field = custom_field
9
+ @push_token = push_token
10
+ end
11
+
12
+ def to_hash
13
+ for_apns = {}
14
+ for_apns['badge'] = @badge if !@badge.nil?
15
+ for_apns['sound'] = @sound if !@sound.nil?
16
+ for_apns['push_alert'] = @push_alert if !@push_alert.nil?
17
+ for_apns['message'] = @message if !@message.nil?
18
+ for_apns['custom_field'] = @custom_field if !@custom_field.nil?
19
+ for_apns['push_token'] = @push_token if !@push_token.nil?
20
+ for_apns
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,103 @@
1
+ module KakaoPush
2
+ class Client
3
+ API_HOST = "https://kapi.kakao.com"
4
+
5
+ attr_accessor :rest_api_key
6
+
7
+ def initialize(rest_api_key:)
8
+ @rest_api_key = rest_api_key
9
+
10
+ self.connection = build_connection
11
+ end
12
+
13
+ def register(uuid:, push_type:, device_id:, push_token:)
14
+ body = {
15
+ 'uuid' => uuid,
16
+ 'device_id' => device_id,
17
+ 'push_type' => push_type,
18
+ 'push_token' => push_token
19
+ }
20
+
21
+ KakaoPush::Response.new(
22
+ connection.post do |req|
23
+ req.url url_for('/register')
24
+ req.body = body
25
+ end
26
+ )
27
+ end
28
+
29
+ def deregister(uuid:, push_type:, device_id:)
30
+ body = {
31
+ 'uuid' => uuid,
32
+ 'device_id' => device_id,
33
+ 'push_type' => push_type
34
+ }
35
+
36
+ KakaoPush::Response.new(
37
+ connection.post do |req|
38
+ req.url url_for('/deregister')
39
+ req.body = body
40
+ end
41
+ )
42
+ end
43
+
44
+ def tokens(uuid:)
45
+ KakaoPush::Response.new(
46
+ connection.get do |req|
47
+ req.url url_for('/tokens')
48
+ req.params['uuid'] = uuid
49
+ end
50
+ )
51
+ end
52
+
53
+ def send(uuids: [], apns:, gcm:, bypass: false)
54
+ body = {
55
+ 'uuids': uuids.to_json,
56
+ 'push_message': build_message(apns: apns, gcm: gcm).to_json,
57
+ 'bypass': bypass
58
+ }
59
+
60
+ KakaoPush::Response.new(
61
+ connection.post do |req|
62
+ req.url url_for('/send')
63
+ req.body = body
64
+ end
65
+ )
66
+ end
67
+
68
+ def build_connection(&block)
69
+ Faraday.new(faraday_client_options) do |builder|
70
+ builder.request :url_encoded
71
+ if block.nil?
72
+ builder.adapter Faraday.default_adapter
73
+ else
74
+ block.call(builder)
75
+ end
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ attr_accessor :connection
82
+
83
+ def faraday_client_options
84
+ {
85
+ headers: {
86
+ "Authorization" => "KakaoAK #{@rest_api_key}"
87
+ },
88
+ url: API_HOST
89
+ }
90
+ end
91
+
92
+ def url_for(path)
93
+ "/v1/push#{path}"
94
+ end
95
+
96
+ def build_message(apns:, gcm:)
97
+ {
98
+ "for_apns" => apns.to_hash,
99
+ "for_gcm" => gcm.to_hash
100
+ }
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,21 @@
1
+ module KakaoPush
2
+ class Gcm
3
+ def initialize(collapse: nil, delay_while_idle: nil, return_url: nil, custom_field: nil, push_token: nil)
4
+ @collapse = collapse
5
+ @delay_while_idle = delay_while_idle
6
+ @return_url = return_url
7
+ @custom_field = custom_field
8
+ @push_token = push_token
9
+ end
10
+
11
+ def to_hash
12
+ for_gcm = {}
13
+ for_gcm['collapse'] = @collapse if !@collapse.nil?
14
+ for_gcm['delay_while_idle'] = @delay_while_idle if !@delay_while_idle.nil?
15
+ for_gcm['return_url'] = @return_url if !@return_url.nil?
16
+ for_gcm['custom_field'] = @custom_field if !@custom_field.nil?
17
+ for_gcm['push_token'] = @push_token if !@push_token.nil?
18
+ for_gcm
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,57 @@
1
+ require 'multi_json'
2
+
3
+ module KakaoPush
4
+ class Response
5
+ def initialize(faraday_response)
6
+ @raw_body = faraday_response.body
7
+ @raw_status = faraday_response.status
8
+ end
9
+
10
+ def body
11
+ @body ||= MultiJson.load(@raw_body) if !@raw_body.nil? && !@raw_body.empty?
12
+ end
13
+
14
+ def status
15
+ @raw_status
16
+ end
17
+
18
+ def success?
19
+ status == 200
20
+ end
21
+
22
+ def fail?
23
+ !success?
24
+ end
25
+
26
+ def data
27
+ success? ? body : nil
28
+ end
29
+
30
+ def error_code
31
+ if fail? && body.is_a?(Hash) && body.has_key?('code')
32
+ return body['code']
33
+ end
34
+ nil
35
+ end
36
+
37
+ def error_message
38
+ if fail? && body.is_a?(Hash) && body.has_key?('msg')
39
+ return body['msg']
40
+ end
41
+ nil
42
+ end
43
+
44
+ def to_s
45
+ <<-EOS
46
+ KakaoPush::Response
47
+ status : #{status}
48
+ success? : #{success?}
49
+ fail? : #{fail?}
50
+ data : #{data}
51
+ error_code : #{error_code}
52
+ error_message : #{error_message}
53
+
54
+ EOS
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module KakaoPush
2
+ VERSION = "0.1.1"
3
+ end
data/lib/kakao_push.rb ADDED
@@ -0,0 +1,13 @@
1
+ require "faraday"
2
+ require "faraday_middleware"
3
+ require "json"
4
+
5
+ require "kakao_push/response"
6
+ require "kakao_push/client"
7
+ require "kakao_push/apns"
8
+ require "kakao_push/gcm"
9
+ require "kakao_push/version"
10
+
11
+ module KakaoPush
12
+ # Your code goes here...
13
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kakao_push
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - ChangHoon Jung
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: multi_json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday_middleware
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.10.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: "카카오 플랫폼 API에서 제공하는 푸시알림을 호출하는 젬입니다. iOS, 안드로이드 사용자에게 푸시를 보낼때 유용한 카카오
98
+ 푸시알림은 REST API로만 제공되고 있기에 이를 젬으로 만들어 봤습니다."
99
+ email:
100
+ - iamseapy@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - LICENSE
109
+ - README.md
110
+ - Rakefile
111
+ - bin/console
112
+ - bin/setup
113
+ - kakao_push.gemspec
114
+ - lib/kakao_push.rb
115
+ - lib/kakao_push/apns.rb
116
+ - lib/kakao_push/client.rb
117
+ - lib/kakao_push/gcm.rb
118
+ - lib/kakao_push/response.rb
119
+ - lib/kakao_push/version.rb
120
+ homepage: https://github.com/n42corp/kakao_push
121
+ licenses: []
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.4.5
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: "카카오 플랫폼 API에서 제공하는 푸시알림을 호출하는 젬입니다."
143
+ test_files: []