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
firebase勉強会資料
Search
gupuru
October 03, 2016
Programming
780
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
100
ng-fukuoka-meetup-1
gupuru
0
420
AngularとAzureのCustom Vision Serviceを使って 画像認識サイトを作ってみた
gupuru
0
670
紙について少し詳しくなる10分間
gupuru
0
410
make bot, fun bot
gupuru
0
340
iOS and Android SVG
gupuru
0
380
Firebaseについて
gupuru
1
220
BLEを使って、すれ違い通信をやってみるよー
gupuru
0
2.3k
HiyokoDeveloperMeeting
gupuru
1
140
Other Decks in Programming
See All in Programming
Vite+ Unified Toolchain for the Web
naokihaba
0
320
AI 輔助遺留系統現代化的經驗分享
jame2408
1
700
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5.5k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
290
Agentic UI
manfredsteyer
PRO
0
170
Oxcを導入して開発体験が向上した話
yug1224
4
320
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
560
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
6.7k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
200
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
550
Contextとはなにか
chiroruxx
1
330
Featured
See All Featured
The browser strikes back
jonoalderson
0
1.3k
How STYLIGHT went responsive
nonsquared
100
6.2k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
WENDY [Excerpt]
tessaabrams
11
38k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
GraphQLとの向き合い方2022年版
quramy
50
15k
Site-Speed That Sticks
csswizardry
13
1.2k
Into the Great Unknown - MozCon
thekraken
41
2.6k
Optimizing for Happiness
mojombo
378
71k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
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
࠷ޙʹݴ͍Εͨ͜ͱ͕...
ࣾͷ໊લɺϋφͪΌΜͰ͢ʢসʣ
͝ਗ਼ௌɺ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ