Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iqon_ios_growth_hack
Search
WorldDownTown
February 20, 2014
Programming
3
4.3k
iqon_ios_growth_hack
2014/02/20 at VASILY
iQON, Growth Hack, iOS, Objective-C
WorldDownTown
February 20, 2014
Tweet
Share
More Decks by WorldDownTown
See All by WorldDownTown
WWDC動画鑑賞会📹🍱を支える技術 / WWDC Video Lunch
worlddowntown
0
280
Live Renderingとの上手い付き合い方
worlddowntown
1
520
In-App Purchase / Subscription with StoreKit
worlddowntown
3
3k
20150225_iqon.pdf
worlddowntown
0
80
ios_push_local_notification
worlddowntown
0
130
Other Decks in Programming
See All in Programming
機械学習って何? 5分で解説頑張ってみる
kuroneko2828
0
200
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
920
Enterprise Web App. Development (2): Version Control Tool Training Ver. 5.1
knakagawa
1
110
TypeScript LSP の今までとこれから
quramy
1
500
Go1.25からのGOMAXPROCS
kuro_kurorrr
0
160
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
110
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
120
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
350
FormFlow - Build Stunning Multistep Forms
yceruto
1
160
ReadMoreTextView
fornewid
1
360
F#で自在につくる静的ブログサイト - 関数型まつり2025
pizzacat83
0
290
Gleamという選択肢
comamoca
6
700
Featured
See All Featured
Become a Pro
speakerdeck
PRO
28
5.4k
Embracing the Ebb and Flow
colly
86
4.7k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
How GitHub (no longer) Works
holman
314
140k
KATA
mclloyd
29
14k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Building an army of robots
kneath
306
45k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Documentation Writing (for coders)
carmenintech
71
4.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
Transcript
άϩʔεͤ͞ΔͨΊͷJ04 ։ൃख๏ ϩάऩूฤ 7"4*-:J04νʔϜ
"HFOEB wͳͥϩάऩूΛ͢Δͷ͔ wJ04Ͱߦ͍ͬͯΔϩάऩूख๏ͷࣄྫ wϩάऩू։ൃςΫχοΫ w·ͱΊ
ࣗݾհ w໊લߥҪ༐ี w'BDFCPPLBSBSBKQ w1)1 3VCZ 0CKFDUJWF$ 1FSM +BWB4DSJQUͳͲগʑ w7"4*-:ͰʮJ20/ʯͷJ04ΞϓϦΛ୲
ͳͥJ04ΤϯδχΞͷ ͕ͨͪϩάऩूʹ͍ͭͯ ޠΖ͏ͱ͍ͯ͠Δͷ͔
ϓϩμΫτͷάϩʔεʹ ϩάऩू͕ඞཁෆՄܽ
άϩʔεͤ͞ΔͨΊͷ ϩάऩूͷॏཁੑ wάϩʔεϋοΫݱঢ়ͷѲͱվળͷ܁Γฦ͕͠ॏཁ wϩάूܭΛߦͬͯվળΛߦ͍ɺԾઆΛ࣮ূ͍ͯ͘͠ ੳ վળ ϩάऩू ϓϩμΫτͷ
J04Ͱಛʹॏཁ w J04Ͱ"OESPJE8FCʹൺͯ 6*ͷදݱ͕෯͍ w ը໘Λදࣔ͢ΔʹɺϙοϓΞοϓɺ ϞʔμϧɺϑΣʔυΠϯͳͲزͭͷ ํ๏͕ߟ͑ΒΕΔ w Կ͕࠷దͳ6*ͳͷ͔ɺԿ͕Ұ൪ͬͯ
Β͑ͯϓϩμΫτ͕άϩʔε͢Δͷ͔Λ ΔͨΊʹࡉ͔ͳܭଌ͕ඞਢ
ϩάऩूํ๏ͷࣄྫ
wΞϓϦͷϩάऩू ʢJ20/༻தͷΠϕϯτʣ wΞϓϦ֎ͷϩάऩू J20/Λىಈ͍ͯ͠ͳ͍߹ͷ164)Πϕϯτ wαʔϏε֎ͷϩάऩू J20/Λͬͨࣄ͕ͳ͍߹ͷμϯϩʔυΠϕϯτ
ΞϓϦͷϩά ͯ͢ऩू
φϏήʔγϣϯ ϝχϡʔΘΕ͍ͯΔʁ ͓ؾʹೖΓϦετ ؾ͔ͮΕ͍ͯΔʁ ϑΟϧλʔԡ͞Ε͍ͯΔʁ
λϒ ͲΕ͕Ұ൪ԡ͞ΕΔͷʁ ྑ͋͘ΔΈ͚ͩͲJ20/Ϣʔβʔ ͦͦλϒ͏ʁ
ϝχϡʔ ΞίʔσΟΦϯදݱͬͯ ೝࣝ͞Ε͍ͯΔʁ λϒͱͲͪΒ͕ΘΕͯ ͍Δʁ φϏήʔγϣϯͷϑΟϧ λʔͱͲͪΒ͕ΘΕͯ ͍Δʁ
λϒϘλϯ
ಛఆͷ݅Ͱग़Δ7JFX FY ίʔσ࡞ͨ͠ޙʹදࣔ -*,&͕ݸ͍ͭͨޙʹදࣔ ! ͦͦදࣔͲΕ͘Β͍͞Ε͍ͯΔͷʁ ϢʔβͲΕΛબͿʁ ͜ͷ1PQVQΛग़͢ࣄʹΑͬͯޮՌ͋Γͦ͏ʁ
εΫϩʔϧ Ͳ͜·ͰεΫϩʔϧ͔ͨ͠ εΫϩʔϧΛࢭΊͯԿΛݟ͍ͯΔ͔
ϖʔδͷܭଌ ΞϓϦ͕όοΫάϥϯυҠಈ ͢ΔࡍʹɺϢʔβʔ͕࠷ޙʹͲͷ ϖʔδ 7JFX$POUSPMMFS Λݟ͍ͯͨ ͔Λϩάʹམͱ͍ͯ͠Δ
શ෦ϩάͱͬͯ·͢
ͦͷFWFOU
wΞϓϦͰͷϩάऩू wΞϓϦ֎͔Βͷϩάऩू wαʔϏε֎͔Βͷϩάऩू
164)ͷϩάऩू
Կͷ164)௨Λ ͲͷϢʔβʔ͕։͍͔ͨ ͯ͢ऩू͍ͯ͠·͢
ࣗͷͲͷίʔσͷ17͕ᮢΛ͑ͨ ࣗͷͲͷίʔσʹίϝϯτ͞Εͨ ࣗͷͲͷίʔσʹίϝϯτ͞Εͨ ࣗͷίʔσΛ-*,&͞Εͨ ࣗͷίʔσͷ-*,&ͷᮢΛ͑ͨ -*,&ͯ͠ΔΞΠςϜΛͬͨίʔσ͕ߘ͞Εͨ -*,&ͯ͠ΔΞΠςϜΛ୭͔͕-*,&ͨ͠ -*,&ͯ͠ΔΞΠςϜ͕Լ͕Γ࣌ J20/͔Βͷ͓Βͤ ϑΥϩʔ͞Εͨ
ಛఆͷ݅Λୡͨ͠Β ಧ͘164)௨ -*,&͍ͯ͠ΔΞΠςϜ͕εϖγϟϧϖʔδʹΘΕͨ -*,&͍ͯ͠Δίʔσ͕εϖγϟϧϖʔδʹΘΕͨ ࣗͷίʔσ͕εϖγϟϧϖʔδʹΘΕͨ -*,&͍ͯ͠ΔϒϥϯυʹۙिؒΞΠςϜ͕Ճ͞Εͨ -*,&͍ͯ͠Δϒϥϯυͷࡏݿ͕͘͢ͳ͍ ϨϏϡʔͰݶఆΞΠςϜ͕ϓϨθϯτ͞Εͨ ͍ͷQVTI͕ૹ৴͞Εͨ ͕ࣗ࡞ͬͨίϨΫγϣϯ͕-*,&͞Εͨ ͕ࣗ࡞ͬͨίϨΫγϣϯ͕-*,&ͷᮢΛ͑ͨ ͕ࣗ࡞ͬͨίʔσ͕ίϨΫγϣϯʹΘΕͨ GBDFCPPLͷ༑ୡ͕J20/Λ࢝Ίͨ
ҙͷλΠϛϯάͰૹΔ 164)௨ ίϯςετ։࢝ ίϯςετ݁Ռൃද ίϯςετऴྃؒۙ ͓Βͤ ϚΠϖʔδ ਓؾͷΞΠςϜ ਓؾͷελΠϦετ -*,&ΞΠςϜίʔσ
ਓؾͷΞΠςϜ ͕͢͞τοϓ ΞΠςϜݕࡧ -1 ਓؾͷ·ͱΊ ৽ண·ͱΊ ·ͱΊৄࡉ ϗʔϜ ΤσΟλʔτοϓ ίʔσৄࡉ ΞΠςϜৄࡉ ਓؾͷίʔσ ελοϑΦεεϝͷίʔσ ελοϑΦεεϝͷελΠϦετ ϑΥϩʔ͍ͯ͠Δਓͷίʔσ ৽ணͷίʔσ ελοϑΦεεϝͷ·ͱΊ ϥϯΩϯά
164)Λىಈͨ࣌͠ͷ ΞϓϦͷঢ়ଶͱ͍ͬͯ·͢ w ΞϓϦ༻தʹ164)௨͔Βड͚औͬͨ w ΞϓϦ͕όοΫάϥϯυʹ͋Δঢ়ଶͰ164)௨ ͔ΒΞϓϦΛىಈͨ͠ w ΞϓϦ͕ىಈ͍ͯ͠ͳ͍ঢ়ଶͰ164)௨͔ΒΞ ϓϦΛىಈͨ͠
164)௨ʹΑΔ3FUFOUJPO ࠶๚
wΞϓϦͰͷϩάऩू wΞϓϦ֎͔Βͷϩάऩू wαʔϏε֎͔Βͷϩάऩू
টػೳ 5XJUUFS 'BDFCPPL -*/& ࿈བྷઌ ͷ༑ୡΛট͢Δػೳ ͢ͰʹJ20/Ϣʔβʔͷ༑ୡͱͭ ͳ͕Δ͜ͱ͕Ͱ͖Δ
ট͔Β%-·Ͱͷܭଌ ͲͷιʔγϟϧϝσΟΞ͔Βͷট͕%-ʹ݁ ͼ͍͔ͭͨΛɺটϝοηʔδҰͭҰͭʹ ͍ͭͯܭଌ͍ͯ͠Δ
ϩάूܭ ։ൃςΫχοΫ
ࣗݾհ • ঙ࢘ ܒี • twitter/github: WorldDownTown • iOSྺ1 iQONͷiOSΤϯδχΞ
2େྔͷϩάͷຒΊࠐΈ ͬͯͲ͏ͬͯΔͷʁ
"ϩάूܭܥͷॲཧ ϝιουҰߦ
#import "IQLocalyticsUtil.h" #import "LocalyticsSession.h" #import "UIApplication+UIID.h" ! @implementation IQLocalyticsUtil !
#pragma mark - public method ! + (void)openSession { @try { if (LOCALYTICS_DEBUG) { LocalyticsSession.sharedLocalyticsSession.loggingEnabled = YES; } [LocalyticsSession.sharedLocalyticsSession startSession:kLocalyticsAppKey]; } @catch (NSException * e) {} } ϩάूܭͷ໘ͳॲཧ6UJMJUZΫϥεʹ·ͱΊͯ ϝιουҰߦͰϩάΛམͱͤΔΑ͏ʹ͍ͯ͠Δ ·ͨɺڞ௨ॲཧͰͲͷΠϕϯτܭଌʹඞͣ VTFS@JEؚ͕·ΕΔΑ͏ʹͳ͍ͬͯΔ - (IBAction)likeButtonPressed:(id)sender { // LIKEボタンのタップイベントをログに落とす [IQLocalyticsUtil tagEvent:@"/tap/item/like/"]; ! // LIKE処理 // ... }
2ͦΜͳʹͨ͘͞Μ ϩάΛऩूͯ͠Δ͚Ͳɺ ύϑΥʔϚϯεʹӨڹʁ
"ϩάΛΞοϓϩʔυ ͢Δ௨৴࠷খݶʹ ͓͍͑ͯ͞ΔͷͰେৎ
ྫ εΫϩʔϧͷܭଌ Ϧετදࣔ6*5BCMF7JFXͰ࡞ΒΕ͍ͯͯɺ UBCMF7JFXXJMM%JTQMBZ$FMMGPS3PX"U*OEFY1BUI ͰͲΕ͚ͩηϧΛද͔ࣔͨ͠ΛTRMJUFʹཷΊࠐΜ Ͱ͍Δɻ ! ৗʹϩάΛΞοϓϩʔυ͢ΔͨΊͷ௨৴ߦΘͣɺ ΞϓϦέʔγϣϯ͕όοΫάϥϯυʹ͍ͬͨ࣌ ʹ·ͱΊͯૹ৴͍ͯ͠ΔɻͦͷͨΊεΫϩʔϧύ
ϑΥʔϚϯεͷӨڹͳ͍ɻ
2164)͔Βͷىಈͬ ͯͲ͏ͬͯ ܭଌͯ͠Δͷʁ
"ΞϓϦىಈ࣌ʹ QBZMPBEΛνΣοΫ
1̨̪̝௨ΛΧελϚΠζ +40/QBZMPBEͷҰྫ { aps: { alert: 'あなたのコーデがLIKEされました', badge: 1, sound:
'default' }, id: 'like' // ログ用パラメータ }
1̨̪̝௨ΛΧελϚΠζ 164)௨͔ΒΞϓϦΛىಈ͢ΔࡍʹQBZMPBEͷ σʔλΛΈͯͲͷ164)͔Βىಈ͔ͨ͠Λಛఆ QBZMPBEͷσʔλΛड͚औΔʹɺ "QQ%FMFHBUF̎ͭͷϝιουͰ࣮͠·͢ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
1̨̪̝௨ΛΧελϚΠζ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSMutableDictionary *payload =
[launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] mutableCopy]; payload[@"type"] = @"not_running"; if (payload) { // アプリの未起動時にプッシュ通知を受け取り、ユーザーがアクションボタンをタップしたとき // payload[@"id"] -> like [self startWithPayload:payload]; } return YES; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSMutableDictionary *payload = userInfo.mutableCopy; if (application.applicationState == UIApplicationStateActive) { // フォアグラウンドでプッシュ通知を受け取ったとき payload[@"type"] = @"active"; } else { // アプリがサスペンド中にプッシュ通知を受け取り、ユーザーがアクションボタンをタップしたとき payload[@"type"] = @"background"; } // payload[@"id"] -> like [self startWithPayload:payload]; }
2%-ܭଌͲ͏ͬ ͯΔͷʁ
"J20/ಠࣗͷΈ
%-ܭଌͷσʔλϑϩʔ
2˓˓ͷσʔλ͕ཉ ͍͠Μ͚ͩͲʁ ϦϦʔεޙʹ
"ੜϩάΛཷΊࠐΜͰ ͍ΔͷͰղੳͰ͖·͢
None
LocalyticsͰਂ͍ੳΛߦ͏ͨΊɺ ऩूͨ͠ੜσʔλΛamazonS3ʹΤΫεϙʔτ Ͱ͖ɺ͜ΕΛಠࣗʹղੳ͍ͯ͠Δɻ -PDBMZUJDTΛ͍ͬͯ·͢
·ͱΊ
ࠓճհͨ͠ࡉ͔͍ूܭ ϓϩμΫτΛάϩʔεͤ͞Δ खஈͷҰʹ͗͢ͳ͍
༏लͳάϩʔεϋοΧʔ ͕͍ͯΤϯδχΞ͕ΈΛ ࡞Εͳ͚ΕάϩʔεͰ͖ͳ͍
άϩʔεΛҙࣝͯ͠։ൃͷ ஈ֊͔ΒΤϯδχΞ ͱ͜ͱΜ)"$,͠·͠ΐ͏
WANTED https://www.wantedly.com/projects/5530 iOSΤϯδχΞืूதʂ