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
AndroidーiOS開発比較〜iOSエンジニアから見たAndroidのアレコレ〜
Search
Takaaki Tanaka
April 25, 2016
Programming
1
1.1k
AndroidーiOS開発比較〜iOSエンジニアから見たAndroidのアレコレ〜
Developers.IO 2016 in Nagoyaでの発表資料です。
Takaaki Tanaka
April 25, 2016
Tweet
Share
More Decks by Takaaki Tanaka
See All by Takaaki Tanaka
Zenn のウラガワ ~エンジニアのアウトプットを支える環境で Google Cloud が採用されているワケ~ #burikaigi #burikaigi_h
kongmingstrap
19
7.4k
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
190
製造の課題に立ち向かう Manufacturing Data Engine と Manufacturing Connect の ご紹介
kongmingstrap
0
750
Tellus の衛星データを見てみよう #mf_fukuoka
kongmingstrap
0
650
JAWS-UG 福岡 #16 re:Invent 現地に行った人のお話 #jawsugfuk #jawsug
kongmingstrap
0
540
AppMod の開発のイマを知るために現地に潜入した私が見たものは・・・? #GoogleCloudNext
kongmingstrap
0
580
Kong Gateway から読みとく、 API統合・API連携サービスの最新情報 #devio2023
kongmingstrap
0
1.7k
Cloud Run に憧れて Google Cloud を推進している話 / CX事業本部で使われている技術
kongmingstrap
0
250
AWS / Google Cloud / Azure それぞれの推しサービス.pdf
kongmingstrap
1
1.4k
Other Decks in Programming
See All in Programming
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.7k
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
240
Pulsar2 を雰囲気で使ってみよう
anoken
0
230
GAEログのコスト削減
mot_techtalk
0
110
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
890
Honoとフロントエンドの 型安全性について
yodaka
4
250
Spring gRPC について / About Spring gRPC
mackey0225
0
220
Linux && Docker 研修/Linux && Docker training
forrep
23
4.5k
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
180
“あなた” の開発を支援する AI エージェント Bedrock Engineer / introducing-bedrock-engineer
gawa
11
1.8k
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
41
15k
CI改善もDatadogとともに
taumu
0
110
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
328
21k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Making Projects Easy
brettharned
116
6k
How GitHub (no longer) Works
holman
313
140k
Optimizing for Happiness
mojombo
376
70k
YesSQL, Process and Tooling at Scale
rocio
171
14k
A Philosophy of Restraint
colly
203
16k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Designing for humans not robots
tammielis
250
25k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
For a Future-Friendly Web
brad_frost
176
9.5k
Transcript
%FWFMPQFST*0 ాதɹ໌ɹϞόΠϧΞϓϦαʔϏε෦ ⡥$MBTTNFUIPE *OD ݄ "OESPJEʔJ04։ൃൺֱʙJ04Τϯ δχΞ͔Βݟͨ"OESPJEͷΞϨίϨʙ
ࣗݾհ w ాத໌ w IUUQEFWDMBTTNFUIPEKQBVUIPSUBOBLBUBLBBLJ w ϞόΠϧΞϓϦαʔϏε෦ॴଐ w J04։ൃ୲
⡥$MBTTNFUIPE *OD
ѪݝʹॅΜͰ͍ͨ͜ͱ͋Γ·͢ ⡥$MBTTNFUIPE *OD
ฐࣾͷΑ͋͘Δཁ݅ w "OESPJEJ04ฒߦ։ൃ w ಉ࣌ϦϦʔε w J04ઌߦϦϦʔεͱ͍͏Ҋ݅͋Γ w "QQMFͷ৹ࠪظؒΛ౿·͑ͯJ04Λલ͠Ͱ։ൃ͢Δͱ͍͏͜ ͱ͋Γ
⡥$MBTTNFUIPE *OD
ฐࣾͷΑ͋͘Δ։ൃମ੍ ⡥$MBTTNFUIPE *OD "OESPJEJ04։ൃऀؒͰίʔυϨϏϡʔΛߦ͏͜ͱ͋Δ
ຊ ⡥$MBTTNFUIPE *OD
ϞόΠϧ։ൃʹ͓͍ͯҙ͢Δ w ରԠ04όʔδϣϯʹ͍ͭͯ w ڞ௨ͷυΩϡϝϯτʹ͍ͭͯ w ࣮ํʹ͍ͭͯ ⡥$MBTTNFUIPE *OD
ϞόΠϧ։ൃʹ͓͍ͯҙ͢Δ w ରԠ04όʔδϣϯʹ͍ͭͯ w ڞ௨ͷυΩϡϝϯτʹ͍ͭͯ w ࣮ํʹ͍ͭͯ ⡥$MBTTNFUIPE *OD
ରԠ04όʔδϣϯʹ͍ͭͯ w "OESPJE ⡥$MBTTNFUIPE *OD IUUQEFWFMPQFSBOESPJEDPNJOUMKBBCPVUEBTICPBSET JOEFYIUNM
ରԠ04όʔδϣϯʹ͍ͭͯ w "OESPJE w YܥγΣΞ͕ఔ͋ΔͷͰαϙʔτͤ͟ΔΛಘͳ͍ঢ় گ͕ଟ͍ w ͔Β8FC7JFX͕$IPSPNFϕʔεʹมߋ͞Ε͍ͯΔͨΊɺ 8FC7JFXΛར༻͢ΔҊ݅ҙ͕ඞཁ
⡥$MBTTNFUIPE *OD
ରԠ04όʔδϣϯʹ͍ͭͯ w J04 ⡥$MBTTNFUIPE *OD IUUQTEFWFMPQFSBQQMFDPNTVQQPSUBQQTUPSFKQ
ରԠ04όʔδϣϯʹ͍ͭͯ w J04 w 4XJGUͰ৽نͰ࡞͢Δ߹J04Ҏ্ਪ w 4XJGU $PDPB1PETͰ&NCFEGSBNFXPSL͕ར༻Ͱ͖Δͨ Ί w
ͻͱͭલͷόʔδϣϯʢJ04ʣରԠͰͷγΣΞ֬อ Ͱ͖Δ ⡥$MBTTNFUIPE *OD
ରԠ04όʔδϣϯʹ͍ͭͯ w J04 w 9DPEFͷόʔδϣϯΞοϓରԠʹҙ w 9DPEFͷόʔδϣϯʹΑͬͯαϙʔτ͞ΕΔ4XJGUͷόʔ δϣϯ͕ҧ͏ w 9DPEF4XJGU
w 9DPEF4XJGU w 9DPEF4XJGU w 9DPEF4XJGU w 9DPEF4XJGU w 9DPEF4XJGU ⡥$MBTTNFUIPE *OD
ରԠ04όʔδϣϯʹ͍ͭͯ w "OESPJE w ରԠ04ଟ͍ w 8FC7JFXରԠʹҙ w #-&Ҋ݅ʹҙ w
J04 w 4XJGUͷόʔδϣϯʹҙ w "54ରԠ ⡥$MBTTNFUIPE *OD
ϞόΠϧ։ൃʹ͓͍ͯҙ͢Δ w ରԠ04όʔδϣϯʹ͍ͭͯ w ڞ௨ͷυΩϡϝϯτʹ͍ͭͯ w ࣮ํʹ͍ͭͯ ⡥$MBTTNFUIPE *OD
ڞ௨ͷυΩϡϝϯτʹ͍ͭͯ ⡥$MBTTNFUIPE *OD w ͓٬༷ͱ։ൃଆؒͰΞϓϦͷػೳΛ࣮ݱ͢ΔͨΊʹඞ ཁͳͷΛચ͍ग़͓ͯ͘͠ w "OESPJEJ04։ൃऀͷؒͰڞ௨ͷೝࣝΛ࣋ͯΔ υΩϡϝϯτΛ࡞͓ͯ͘͠
ڞ௨ͷυΩϡϝϯτʹ͍ͭͯ ⡥$MBTTNFUIPE *OD
ڞ௨ͷυΩϡϝϯτʹ͍ͭͯ ⡥$MBTTNFUIPE *OD ͡ΊΑ͏ཁ݅ఆٛdϏΪφʔ͔Βϕςϥϯ·Ͱ
ϞόΠϧ։ൃʹ͓͍ͯҙ͢Δ w ରԠ04όʔδϣϯʹ͍ͭͯ w ڞ௨ͷυΩϡϝϯτʹ͍ͭͯ w ࣮ํʹ͍ͭͯ ⡥$MBTTNFUIPE *OD
࣮ํʹ͍ͭͯ w ։ൃڥɺ࣮ํʹ͍ͭͯॳظஈ֊Ͱܾఆ͓ͯ͠ ͘ w ܾఆͨ͠༰υΩϡϝϯτͱ͓ͯͯ͘͠͠ w ։ൃڥˠ(JU)VCͷ3&"%.&ʹهࡌ w ࣮ํˠ8JLJʹهࡌ
w ৽ͨͳνʔϜϝϯόʔ͕ՃΘͬͨࡍʹҰཡͰ֬ೝͰ͖ ΔυΩϡϝϯτΛඋ͓ͯ͘͠ʢ8JLJΛ׆༻ʣ w "1*༷ཁ݅ఆٛɺઃܭͷࢿྉ͕ҰཡͰ֬ೝͰ͖ΔΑ͏ʹ͠ ͓ͯ͘ ⡥$MBTTNFUIPE *OD
࣮ํͷڞ༗ ⡥$MBTTNFUIPE *OD ύοέʔδ໊ VJ WJFXͳͲͷը໘දࣔʹؔΘΔΫϥεΛ·ͱΊΔ EPNBJO WJFXͷදࣔʹؔΘΔϩδοΫɺΤϯςΟςΟͳͲ ͷϞσϧΫϥεΛ·ͱΊΔ
JOGSB "1*௨৴ɺ%#ΞΫηεɺσʔλอଘΛ·ͱΊΔ w ύοέʔδྨͷҰྫʢ˞͋͘·ͰҰྫͰ͢ʣ
ͦΕͧΕͷ෦ΛͲ͜ʹஔ͢Δ͔ʜ ⡥$MBTTNFUIPE *OD
VJ ⡥$MBTTNFUIPE *OD
VJ ⡥$MBTTNFUIPE *OD
EPNBJO ⡥$MBTTNFUIPE *OD
EPNBJO ⡥$MBTTNFUIPE *OD
JOGSB ⡥$MBTTNFUIPE *OD
JOGSB ⡥$MBTTNFUIPE *OD
࣮ํʹ͍ͭͯ w ը໘ͷ࡞ํ๏ʹؔͯ͠04ʹґଘ͍ͯ͠Δͱ͜Ζ͕ େ͖͍ͷͰɺϨϏϡʔͰ͖ΔΑ͏ʹͳΔ·Ͱ͕͔͔࣌ؒ Δ w ϓϧϦΫΤετʹमਖ਼ͨ͠ը໘ͷεΫϦʔϯγϣοτ ΛషͬͯΒ͏ w "OESPJE
w 9.-ϑΝΠϧΛΰϦΰϦฤू͢Δ w J04 w 4UPSZ#PBSEΛ͏ ⡥$MBTTNFUIPE *OD
࣮ํʹ͍ͭͯ ⡥$MBTTNFUIPE *OD
࣮ํʹ͍ͭͯ ⡥$MBTTNFUIPE *OD
࣮ํʹ͍ͭͯ w ֤෦ͷ୲ൣғΛ໌֬ʹ͢Δ͜ͱͰίʔυϨϏϡʔ ͷࡍʹ෦Λཧղ͢Δ·ͰͷίετΛܰݮ͢Δ w ϩδοΫɺϞσϧΛ͢Δ͜ͱͰ"OESPJEJ04 ։ൃऀ͕ίʔυϨϏϡʔͰ͖ΔൣғΛ૿͢ w ࣮࿙ΕΛແ͘͢
⡥$MBTTNFUIPE *OD
ΞϨίϨ͋Γ·͕͢ ݁ہࣗΒखΛಈ͔࣮ͯͯ͠͠ ͍͔ͳ͍ͱʹ͔ͭͳ͍ ⡥$MBTTNFUIPE *OD
ࣗΒखΛಈ͔͢
1VTI௨Λ "OESPJEͱJ04Ͱ ࣮ͯ͠ΈΔ
1VTI௨Λ࣮ͯ͠ΈΔ w 1VTIαʔϏεͷొ w ($.ʢ(PPHMF$MPVE.FTTBHJOHʣ w "1/4ʢ"QQMF1VTI/PUJpDBUJPO4FSWJDFʣ w 1VTI௨ͷ࡞ w
1VTIϝοηʔδΛ࡞ w 1VTI௨ͷड৴ w 04ຖʹड৴ॲཧΛߦ͏ ⡥$MBTTNFUIPE *OD
1VTI௨Λ࣮ͯ͠ΈΔ ⡥$MBTTNFUIPE *OD IUUQTBXTBNB[PODPNKQTOT "NB[PO4JNQMF/PUJpDBUJPO4FSWJDF 4/4
"OESPJEଆͷ࡞ۀ ⡥$MBTTNFUIPE *OD w ($.ͷొ w ϥΠϒϥϦͷΠϯϙʔτ w ύʔϛογϣϯͷઃఆ
w 1VTIड৴ॲཧͷ࣮ w "NB[PO$PHOJUP*%ͷऔಘ w "NB[PO4/4τʔΫϯͷૹ৴ w ड৴࣌ͷॲཧͷ࣮
J04ଆͷ࡞ۀ ⡥$MBTTNFUIPE *OD w "1/4ͷొ w ϥΠϒϥϦͷΠϯϙʔτ w "NB[PO$PHOJUP*%ͷऔಘ
w "NB[PO4/4τʔΫϯͷૹ৴ w ड৴࣌ͷॲཧ
"84ଆͷ࡞ۀ ⡥$MBTTNFUIPE *OD w "NB[PO$PHOJUPͰ*EFOUJUZQPPMΛ࡞ w "NB[PO4/4Ͱ(PPHMF"OESPJEͷ1MBUGPSN Λ࡞ w
"NB[PO4/4Ͱ"QQMFJ04%FWͷ1MBUGPSNΛ ࡞ w "NB[PO4/4Ͱ5PQJDΛ࡞
։ൃڥ w "OESPJE w "OESPJE4UVEJP w +BWB w J04 w
9DPEF w $PDPB1PETPS$BSUIBHF w 4XJGU ⡥$MBTTNFUIPE *OD
"OESPJEଆͷ࡞ۀ ⡥$MBTTNFUIPE *OD w ($.ͷొ w ϥΠϒϥϦͷΠϯϙʔτ w ઃఆϑΝΠϧͷΠϯϙʔτ
w ύʔϛογϣϯͷઃఆ w 1VTIड৴ॲཧͷ࣮ w "NB[PO$PHOJUP*%ͷऔಘ w "NB[PO4/4τʔΫϯͷૹ৴ w ड৴࣌ͷॲཧͷ࣮
($.ͷొ ⡥$MBTTNFUIPE *OD IUUQTEFWFMPQFSTHPPHMFDPNDMPVENFTTBHJOH
($.ͷొ ⡥$MBTTNFUIPE *OD w HPPHMFTFSWJDFTKTPOΛμϯϩʔυ͢Δ
($.ͷొ ⡥$MBTTNFUIPE *OD w HPPHMFTFSWJDFTKTPOΛϓϩδΣΫτʹՃ͢Δ
ϥΠϒϥϦͷΠϯϙʔτ ⡥$MBTTNFUIPE *OD … android { … }
dependencies { … compile 'com.amazonaws:aws-android-sdk-cognito:2.+' compile 'com.amazonaws:aws-android-sdk-sns:2.+' } w CVJMEHSBEMFΛฤू w "84ͷ4%,Λࢦఆ͢Δ
ϥΠϒϥϦͷΠϯϙʔτ ⡥$MBTTNFUIPE *OD apply plugin: 'com.google.gms.google-services' android {
… } dependencies { … compile "com.google.android.gms:play-services:8.3.0" … } w CVJMEHSBEMFΛฤू w ($.༻ͷϥΠϒϥϦΛద༻͢Δ
ϥΠϒϥϦͷΠϯϙʔτ ⡥$MBTTNFUIPE *OD w "OESPJE4UVEJP͔ΒϥΠϒϥϦΛΠϯϙʔτ͢Δ w ʮ4ZOD1SPKFDUXJUI(SBEMF'JMFTʯΛ࣮ߦ͢Δ
ύʔϛογϣϯͷઃఆ ⡥$MBTTNFUIPE *OD <?xml version="1.0" encoding="utf-8"?> <manifest package="jp.co.kongmings.android.app" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="com.google.android.c2dm.permission.REGISTER" /> </manifest> w "OESPJE.BOJGFTUYNMΛฤू w ύʔϛογϣϯͷઃఆ
1VTIड৴ॲཧͷ࣮ ⡥$MBTTNFUIPE *OD <application … <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"
> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="jp.co.kongmings.android.app" /> </intent-filter> </receiver> <service android:name=".infra.service.MsgGcmListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service> <service android:name=".infra.service.RegistrationIntentService" android:exported="false" /> <service android:name=".infra.service.MsgInstanceIDListenerService" android:exported="false"> <intent-filter> <action android:name="com.google.android.gms.iid.InstanceID"/> </intent-filter> </service> </application> w "OESPJE.BOJGFTUYNMΛฤू
1VTIड৴ॲཧͷ࣮ ⡥$MBTTNFUIPE *OD public class MsgGcmListenerService extends GcmListenerService {
static final String TAG = MsgGcmListenerService.class.getSimpleName(); @Override public void onMessageReceived(String from, Bundle data) { String message = data.getString("message"); sendNotification(message); sendBroadcast(message); } void sendNotification(String message) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Message received!") .setContentText(message) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(0, notificationBuilder.build()); } void sendBroadcast(String message) { Intent broadcastIntent = new Intent(); broadcastIntent.putExtra("message", message); broadcastIntent.setAction("MESSAGE_RECEIVED"); getBaseContext().sendBroadcast(broadcastIntent); } } w ($.͔Βϝοηʔδ͕ฦ͖ͬͯͨ࣌ͷॲཧ
1VTIड৴ॲཧͷ࣮ ⡥$MBTTNFUIPE *OD … void sendNotification(String message) {
Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Message received!") .setContentText(message) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(0, notificationBuilder.build()); } ... w ௨ηϯλʔʹදࣔͤ͞Δ
1VTIड৴ॲཧͷ࣮ ⡥$MBTTNFUIPE *OD public class MsgGcmListenerService extends GcmListenerService {
… void sendBroadcast(String message) { Intent broadcastIntent = new Intent(); broadcastIntent.putExtra("message", message); broadcastIntent.setAction("MESSAGE_RECEIVED"); getBaseContext().sendBroadcast(broadcastIntent); } } w ϝοηʔδΛड৴ͨ͜͠ͱΛ௨͢Δ
1VTIड৴ॲཧͷ࣮ ⡥$MBTTNFUIPE *OD public class RegistrationIntentService extends IntentService {
public RegistrationIntentService() { super("RegistrationIntentService"); } @Override protected void onHandleIntent(Intent intent) { if (intent != null) { try { InstanceID instanceID = InstanceID.getInstance(this); String token = instanceID.getToken( getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); Prefs.put("token", token); } catch (IOException e) { e.printStackTrace(); } } } } w τʔΫϯऔಘॲཧʹͯτʔΫϯΛอ͓࣋ͯ͘͠
"NB[PO$PHOJUP*%ͷऔಘ ⡥$MBTTNFUIPE *OD void getCognitoId() { new Thread(new Runnable()
{ @Override public void run() { CognitoCachingCredentialsProvider provider = ɹɹɹɹɹɹɹɹɹnew CognitoCachingCredentialsProvider( self, COGNITO_IDENTITY_POOL_ID, AWS_REGION ); final String identityId = provider.getIdentityId(); Prefs.put("cognito_id", identityId); } }).start(); } w $PHOJUP$BDIJOH$SFEFOUJBMT1SPWJEFSʹ $PHOJUP*EFOUJUZ1PPM*%Λࢦఆ͢Δ
"NB[PO4/4τʔΫϯͷૹ৴ ⡥$MBTTNFUIPE *OD void sendToken() { AmazonSNSClient snsClient =
new AmazonSNSClient(mProvider); snsClient.setRegion(Region.getRegion(AWS_REGION)); CreatePlatformEndpointRequest createRequest = new CreatePlatformEndpointRequest(); createRequest.setPlatformApplicationArn(AWS_SNS_APPLICATION_ARN); String token = Prefs.get("token"); createRequest.setToken(token); CreatePlatformEndpointResult platformEndpoint = snsClient.createPlatformEndpoint(createRequest); String endpointArn = platformEndpoint.getEndpointArn(); snsClient.subscribe(AWS_SNS_SUBSCRIBE_TOPIC_ARN, "application", endpointArn); } w ࢦఆͨ͠5PQJDΛ4VTDSJCF͢Δ
ड৴࣌ͷॲཧͷ࣮ ⡥$MBTTNFUIPE *OD private MessageBroadcastReceiver mReceiver; public class
MessageBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); String message = bundle.getString("message"); Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); … mReceiver = new MessageBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("MESSAGE_RECEIVED"); registerReceiver(mReceiver, intentFilter); }
J04ଆͷ࡞ۀ ⡥$MBTTNFUIPE *OD w "1/4ͷొ w ϥΠϒϥϦͷΠϯϙʔτ w "NB[PO$PHOJUP*%ͷऔಘ
w "NB[PO4/4τʔΫϯͷૹ৴ w ड৴࣌ͷॲཧ
"1/4ͷొ ⡥$MBTTNFUIPE *OD IUUQTEFWFMPQFSBQQMFDPNKQEPDVNFOUBUJPO 3FNPUF/PUJpDBUJPOT1(QEG
"1/4ͷొ ⡥$MBTTNFUIPE *OD w ΩʔνΣʔϯΞΫηεΛىಈͯ͠ೝূہʹূ໌ॻΛཁ ٻ͢Δ
"1/4ͷొ ⡥$MBTTNFUIPE *OD
"1/4ͷొ ⡥$MBTTNFUIPE *OD
"1/4ͷొ ⡥$MBTTNFUIPE *OD IUUQTEFWFMPQFSBQQMFDPNMJCSBSZJPTEPDVNFOUBUJPO /FUXPSLJOH*OUFSOFU$PODFQUVBM3FNPUF/PUJpDBUJPOT1( $IBQUFST"QQMF1VTI4FSWJDFIUNM
"1/4ͷొ ⡥$MBTTNFUIPE *OD w 1SPWJTJPOJOH1SPpMF͕ਖ਼͘͠ࢦఆ͞Ε͍ͯΔ͔֬ ೝ͢Δ
ϥΠϒϥϦͷΠϯϙʔτ ⡥$MBTTNFUIPE *OD platform :ios, '8.0' use_frameworks! target 'App'
do pod 'AWSSNS' end w $PDPB1PETܦ༝ͰΠϯϙʔτ͢Δ w 1PEpMFΛฤू
ϥΠϒϥϦͷΠϯϙʔτ ⡥$MBTTNFUIPE *OD w $PDPB1PETܦ༝ͰΠϯϙʔτ͢Δ w QPEJOTUBMMίϚϯυΛ࣮ߦ ➜ app
git:(develop) ✗ bundle exec pod install
"NB[PO$PHOJUP*%ͷऔಘ ⡥$MBTTNFUIPE *OD func application( application: UIApplication, didFinishLaunchingWithOptions launchOptions:
[NSObject: AnyObject]?) -> Bool { let credentialsProvider = AWSCognitoCredentialsProvider( regionType: AWSRegionType.APNortheast1, identityPoolId: CognitoIdentityPoolId) let defaultServiceConfiguration = AWSServiceConfiguration( region: AWSRegionType.APNortheast1, credentialsProvider: credentialsProvider) AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration self.registerForRemoteNotifications() return true } w "844FSWJDF.BOBHFSͷઃఆΛ࣮ࢪ w $PHOJUP*EFOUJUZ1PPM*E"84Ͱ࡞ͨ͠ͷΛࢦఆ͢Δ
"NB[PO4/4τʔΫϯͷૹ৴ ⡥$MBTTNFUIPE *OD func application( application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken:
NSData) { let deviceTokenString = "\(deviceToken)" .stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString:"<>")) .stringByReplacingOccurrencesOfString(" ", withString: "") … } w τʔΫϯऔಘ࣌ʹݺΕΔϝιου͔ΒτʔΫϯΛऔ ಘ͢Δ
"NB[PO4/4τʔΫϯͷૹ৴ ⡥$MBTTNFUIPE *OD … let sns = AWSSNS.defaultSNS() let
request = AWSSNSCreatePlatformEndpointInput() request.token = deviceTokenString request.platformApplicationArn = AWSSNSApplicationArn sns.createPlatformEndpoint(request).continueWithExecutor( AWSExecutor.mainThreadExecutor(), withBlock: { (task: AWSTask!) -> AnyObject! in if task.error != nil { print("Error: \(task.error)") } else { let createEndpointResponse = task.result as! AWSSNSCreateEndpointResponse let subscribeRequest = AWSSNSSubscribeInput() subscribeRequest.topicArn = self.AWSSNSSubscribeTopicArn subscribeRequest.endpoint = createEndpointResponse.endpointArn subscribeRequest.protocols = "Application" sns.subscribe(subscribeRequest) } return nil }) } w ࢦఆͨ͠5PQJDΛ4VTDSJCF͢Δ
ड৴࣌ͷॲཧ ⡥$MBTTNFUIPE *OD func application( application: UIApplication, didReceiveRemoteNotification userInfo:
[NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { if application.applicationState == .Active { if let aps = userInfo["aps"] { if let alert = aps["alert"] { let alertController = UIAlertController( title: nil, message: alert, preferredStyle: .Alert) alertController.addAction( UIAlertAction( title: "OK", style: .Default, handler: nil)) self.window?.rootViewController?.presentViewController( alertController, animated: true, completion: nil) } } } } w 1VTIΛड৴ͨ࣌͠ͷॲཧΛهࡌ͢Δ
"84ଆͷ࡞ۀ ⡥$MBTTNFUIPE *OD w "NB[PO$PHOJUPͰ*EFOUJUZQPPMΛ࡞ w "NB[PO4/4Ͱ(PPHMF"OESPJEͷ1MBUGPSN Λ࡞ w
"NB[PO4/4Ͱ"QQMFJ04%FWͷ1MBUGPSNΛ ࡞ w "NB[PO4/4Ͱ5PQJDΛ࡞
"NB[PO$PHOJUPͰ*EFOUJUZQPPMΛ࡞ ⡥$MBTTNFUIPE *OD IUUQBXTBNB[PODPNKQDPHOJUP
"NB[PO$PHOJUPͰ*EFOUJUZQPPMΛ࡞ ⡥$MBTTNFUIPE *OD
"NB[PO4/4Ͱ(PPHMF"OESPJEͷ1MBUGPSNΛ࡞ ⡥$MBTTNFUIPE *OD IUUQTBXTBNB[PODPNKQTOT
"NB[PO4/4Ͱ"QQMFJ04%FWͷ1MBUGPSNΛ࡞ ⡥$MBTTNFUIPE *OD IUUQTBXTBNB[PODPNKQTOT
"NB[PO4/4Ͱ5PQJDΛ࡞ ⡥$MBTTNFUIPE *OD IUUQTBXTBNB[PODPNKQTOT
%&.0 ⡥$MBTTNFUIPE *OD
⡥$MBTTNFUIPE *OD
⡥$MBTTNFUIPE *OD
·ͱΊ ⡥$MBTTNFUIPE *OD w ڞ௨ͷυΩϡϝϯτΛ༻ҙ͢Δ w ϊΠζΛݮΒͯ͠։ൃऀಉ͕࢜ίʔυϨϏϡʔͰ͖Δ ൣғΛ૿͢ w
खΛಈ͔͢
%FWFMPQFST*0 ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ εϥΠυޙϒϩάͰެ։͠·͢ɻ " ⡥$MBTTNFUIPE *OD #cmdevio2016