Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
firebase勉強会資料
Search
gupuru
October 03, 2016
Programming
790
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
firebase勉強会資料
https://github.com/gupuru/firebase-hands-on
gupuru
October 03, 2016
More Decks by gupuru
See All by gupuru
fukuoka_kt_1
gupuru
0
110
ng-fukuoka-meetup-1
gupuru
0
440
AngularとAzureのCustom Vision Serviceを使って 画像認識サイトを作ってみた
gupuru
0
680
紙について少し詳しくなる10分間
gupuru
0
410
make bot, fun bot
gupuru
0
340
iOS and Android SVG
gupuru
0
380
Firebaseについて
gupuru
1
230
BLEを使って、すれ違い通信をやってみるよー
gupuru
0
2.3k
HiyokoDeveloperMeeting
gupuru
1
150
Other Decks in Programming
See All in Programming
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
350
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
130
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
340
setup-vp GitLab対応の裏側
naokihaba
0
150
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
190
すこし踏み込む CancellationToken
htkym
2
1.6k
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
140
自サークルのIdPからログアウトできるようになるまで
taiseiue
0
110
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
910
contenteditable と日本語入力に向き合う
colorful12
0
140
AWSに止められる覚悟してますか?
morizo_1984
2
510
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
14
6.7k
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
210
Un-Boring Meetings
codingconduct
0
440
Test your architecture with Archunit
thirion
2
2.4k
A Tale of Four Properties
chriscoyier
163
24k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Prompt Engineering for Job Search
mfonobong
0
480
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
270
Design in an AI World
tapps
1
350
Raft: Consensus for Rubyists
vanstee
142
7.7k
Transcript
None
About me ৽ݟ ߊฏ גࣜձࣾηϑϦͱ͍͏ձࣾͰɺYAMAPͷAndroidΞϓϦΛ࡞͍ͬͯΔ iOSΤϯδχΞͰ͢ɻ ࠷ۙɺTensorFlow, Docker, Angular2ͳͲ͍ͬͯͯiOSશવ Ͱ͖ͯͳ͍ʢٽʣ
» Twitter: @gupuru » GitHub: gupuru
ηϑϦɺͲΜͳاۀ͔ͱݴ͏ͱ…͕ࣾݘͰ͢ʂ
FirebaseͬͯɺԿʁ
Firebase » mBaaS » ΞϓϦWeb։ൃʹඞཁͳػೳ͕ଟ͘ఏڙ͞Ε͍ͯΔ » Google͕ӡӦ͍ͯ͠ΔαʔϏε » 2011ελʔτ(2014ޙʹGoogle͕ങऩ) »
ແྉͰ͔ͭ͑Δͷ͕ଟ͍
None
None
͕࣌ؒڐ͢ݶΓɺհ͍ͯ͘͠Αʔ
Analytics
Analytics » ϞόΠϧΞϓϦʹಛԽͨ͠ Google ΞφϦςΟΫεΈ͍ͨͳͷ » Πϕϯτܕੳπʔϧ » ແྉ »
iOS, Android
iOSͷಋೖ pod 'Firebase/Core' import UIKit import Firebase @UIApplicationMain class AppDelegate:
UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { //Ճ FIRApp.configure() return true } }
Androidͷಋೖ compile 'com.google.firebase:firebase-core:9.6.1' public class MainActivity extends AppCompatActivity { private
final MainActivity self = this; private FirebaseAnalytics mFirebaseAnalytics; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); } }
None
Cloud Messaging
Cloud Messaging » ϓογϡ௨ » iOS, Android, Web » ແྉ
» Notification MessageͱData Messageͷ̎छྨ
Notification Message { "to" : "HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification" : { "body"
: "΅Ͱ͍", "title" : "͍ͨͱΔ", "icon" : "myicon" } } curl --header "Authorization: key=...guQidTc7xzs8" \ --header Content-Type:"application/json" \ https://fcm.googleapis.com/fcm/send \ -d "{\"to\": \"...ifS-oaJevN_VwU0Y\",\"priority\":\"high\",\"notification\": {\"title\": \"this is title\", \"body\": \"this is body\"}}"
Data Message { "to" : "xUdFQ3P1...", "data" : { "name"
: "fox", "body" : "neko", "Place" : "horaana" }, } curl --header "Authorization: key=...guQidTc7xzs8" \ --header Content-Type:"application/json" \ https://fcm.googleapis.com/fcm/send \ -d "{\"to\": \"...aJevN_VwU0Y\",\"priority\":\"high\",\"data\": {\"custom_title\": \"this is custom title\", \"custom_body\": \"this is custom body\", \"icon\": \"ic_stat_ic_notification\"}}"
Androidͷಋೖ compile 'com.google.firebase:firebase-messaging:9.6.1'
tokenऔಘ FirebaseInstanceId.getInstance().getToken();
௨ͷϋϯυϦϯά public class MyFirebaseMessagingService extends FirebaseMessagingService { public void onMessageReceived(RemoteMessage
remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); if (remoteMessage.getData() != null) { //data } if (remoteMessage.getNotification() != null) { //notification } } } <service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
Notifications
Notifications » ϓογϡ௨ » Webίϯιʔϧ͔Β͏(ίʔυΛॻ͘ඞཁͳ͠) » ແྉ » iOS, Android
None
Authentication
Authentication » ϩάΠϯपΓ » ϝΞυ, ಗ໊ΞΧϯτ, Google, Facebook, Twitter, GitHubͳͲʹରԠ
» ແྉ » FirebaseUIΛ͑ɺuiͳͲ؆୯ʹ࣮Ͱ͖Δ » iOS, Android, Web
None
Androidͷಋೖ(firebase UI) compile 'com.firebaseui:firebase-ui-auth:0.6.0' FirebaseAuth auth = FirebaseAuth.getInstance(); if (auth.getCurrentUser()
!= null) { //ϩάΠϯࡁΈ } else { startActivityForResult( AuthUI.getInstance().createSignInIntentBuilder().build(), RC_SIGN_IN); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { if (resultCode == RESULT_OK) { // ϩάΠϯޭ } } }
Webͷ߹ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Firebase ui sample</title>
<!-- firebaseͷ͋ΕΛషͬͯ͜͜ʹ --> <script src="https://www.gstatic.com/firebasejs/ui/live/0.5/firebase-ui-auth.js"></script> <link type="text/css" rel="stylesheet" href="https://www.gstatic.com/firebasejs/ui/live/0.5/firebase-ui-auth.css" /> <script type="text/javascript"> // FirebaseUI config. var uiConfig = { 'signInSuccessUrl': 'ޭޙͷurl', 'signInOptions': [ firebase.auth.FacebookAuthProvider.PROVIDER_ID, firebase.auth.EmailAuthProvider.PROVIDER_ID ], }; var ui = new firebaseui.auth.AuthUI(firebase.auth()); ui.start('#firebaseui-auth-container', uiConfig); </script> </head> <body> <div id="firebaseui-auth-container"></div> </body> </html>
None
Realtime Database
Realtime Database » NoSQL JSON σʔλϕʔε » ϦΞϧλΠϜಉظ(ΦϑϥΠϯରԠ) » iOS,
Android, Web » ༗ྉ(ແྉ͋Γ)
iOSͷಋೖ pod 'Firebase/Database' import UIKit import Firebase @UIApplicationMain class AppDelegate:
UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { //Ճ FIRApp.configure() return true } }
import UIKit import FirebaseDatabase class ViewController: UIViewController { let rootRef
= FIRDatabase.database().reference() override func viewDidLoad() { super.viewDidLoad() //ಡΈࠐΈ rootRef.observe(.value, with: { snapshot in print("\(snapshot.key) -> \(snapshot.value)") }) //ॻ͖ࠐΈ rootRef.child("food").setValue("ΓΜ͝͞·") } }
None
Storage
Storage » ετϨʔδ(S3ʹ͍͔ۙ) » ը૾, ಈը, ԻͳͲͷμϯϩʔυ, Ξοϓϩʔυ » iOS,
Android, Web » ༗ྉ(ແྉ͋Γ)
iOSͷಋೖ pod 'Firebase/Storage' import UIKit import Firebase @UIApplicationMain class AppDelegate:
UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { //Ճ FIRApp.configure() return true } }
Ξοϓϩʔυ import FirebaseStorage class ViewController: UIViewController { let storage =
FIRStorage.storage() override func viewDidLoad() { super.viewDidLoad() let storageRef = storage.reference(forURL: "gs://fir-handson-ce2a8.appspot.com") if let data = UIImagePNGRepresentation(UIImage(named: "ie")!) { let riversRef = storageRef.child("images/ie.png") riversRef.put(data, metadata: nil, completion: { metaData, error in print(metaData) print(error) }) } } }
None
μϯϩʔυ import FirebaseStorage class ViewController: UIViewController { let storage =
FIRStorage.storage() override func viewDidLoad() { super.viewDidLoad() let storageRef = storage.reference(forURL: "gs://fir-handson-ce2a8.appspot.com") let ieRef = storageRef.child("images/hogehoge.png") ieRef.data(withMaxSize: 1 * 1024 * 1024) { (data, error) -> Void in if (error != nil) { print(error) } else { let image: UIImage! = UIImage(data: data!) } } } }
None
Hosting
Hosting » WebαΠτެ։ » HTTP/2, SSL » ༗ྉ(ແྉ͋Γ) » ಠࣗυϝΠϯՄೳ(ແྉ)
ಋೖ npm install -g firebase-tools ॳظԽ firebase init
None
ެ։ firebase deploy ֬ೝ firebase open
Crash Reporting
Crash Reporting » ΫϥογϡϨϙʔτ » ϕʔλ » ແྉ » iOS,
Android
Androidͷಋೖ compile 'com.google.firebase:firebase-crash:9.6.1'
None
Remote Config
Remote Config » ΫϥυͰϞόΠϧΞϓϦͷઃఆΛཧͰ͖ΔαʔϏε » iOS, Android » ແྉ
Androidͷಋೖ compile 'com.google.firebase:firebase-config:9.6.1'
σϑΥϧτͷઃఆ <?xml version="1.0" encoding="utf-8"?> <defaultsMap> <entry> <key>test</key> <value>ͯ͢</value> </entry> </defaultsMap>
FirebaseRemoteConfig remoteConfig; remoteConfig = FirebaseRemoteConfig.getInstansce(); //σϕϩούʔϞʔυࢦఆ FirebaseRemoteConfigSettings configSettings = new
FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(BuildConfig.DEBUG) .build(); remoteConfig.setConfigSettings(configSettings); //σϑΥϧτͷΛಡΈࠐΉ remoteConfig.setDefaults(R.xml.remote_config_defaults); remoteConfig.fetch(43200) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { //Λө remoteConfig.activateFetched(); } else { //fetchࣦഊ } } });
None
App Indexing
App Indexing » ΣϒαΠτͱΞϓϦΛඥ͚Δ » ແྉ » iOS, Android
ɹσΟʔϓϦϯΫͷઃఆ(Andoirdͷ߹) <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.VIEW" /> <data android:scheme="https" android:host="fir-sample-51a1e.firebaseapp.com" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
ςετ adb shell am start -a android.intent.action.VIEW -d "url" com.example.hoe
Dynamic Links
Dynamic Links » ΞϓϦͷΠϯετʔϧଅਐ » ແྉ » iOS, Android
Androidͷಋೖ compile 'com.google.firebase:firebase-invites:9.6.1'
None
Invites
Invites » γΣΞػೳ » ແྉ » iOS, Android
Androidͷಋೖ compile 'com.google.firebase:firebase-invites:9.6.1' ※Dynamic Linksͷ༗ޮ͕ඞཁ
ট Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title)) .setMessage(getString(R.string.invitation_message)) .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link))) .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image))) .setCallToActionText(getString(R.string.invitation_cta))
.build(); startActivityForResult(intent, REQUEST_INVITE); ݁Ռ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_INVITE) { if (resultCode == RESULT_OK) { String[] ids = AppInviteInvitation.getInvitationIds(resultCode, data); for (String id : ids) { Log.d(TAG, "onActivityResult: sent invitation " + id); } } } }
ड৴ @Override protected void onCreate(Bundle savedInstanceState) { mGoogleApiClient = new
GoogleApiClient.Builder(this) .addApi(AppInvite.API) .enableAutoManage(this, this) .build(); boolean autoLaunchDeepLink = true; AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink) .setResultCallback( new ResultCallback<AppInviteInvitationResult>() { @Override public void onResult(AppInviteInvitationResult result) { if (result.getStatus().isSuccess()) { Intent intent = result.getInvitationIntent(); String deepLink = AppInviteReferral.getDeepLink(intent); String invitationId = AppInviteReferral.getInvitationId(intent); } } }); }
·ͱΊ
Firebaseศརͩͧ(ŋТŋ)b
࠷ޙʹݴ͍Εͨ͜ͱ͕...
ࣾͷ໊લɺϋφͪΌΜͰ͢ʢসʣ
͝ਗ਼ௌɺ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ