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
4.4k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iqon_ios_growth_hack
2014/02/20 at VASILY
iQON, Growth Hack, iOS, Objective-C
WorldDownTown
February 20, 2014
More Decks by WorldDownTown
See All by WorldDownTown
WWDC動画鑑賞会📹🍱を支える技術 / WWDC Video Lunch
worlddowntown
0
340
Live Renderingとの上手い付き合い方
worlddowntown
1
610
In-App Purchase / Subscription with StoreKit
worlddowntown
3
3.1k
20150225_iqon.pdf
worlddowntown
0
110
ios_push_local_notification
worlddowntown
0
170
Other Decks in Programming
See All in Programming
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
220
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
510
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.5k
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
130
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.5k
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
290
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
680
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
100
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
アクセシビリティから考える情報設計
high_g_engineer
0
310
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
HDC tutorial
michielstock
2
850
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Rails Girls Zürich Keynote
gr2m
96
14k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
The Curious Case for Waylosing
cassininazir
1
500
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ΤϯδχΞืूதʂ