Speaker Deck
Speaker Deck Pro
Sign in
Sign up
for free
firebase勉強会資料
gupuru
October 03, 2016
Programming
3
620
firebase勉強会資料
https://github.com/gupuru/firebase-hands-on
gupuru
October 03, 2016
Tweet
Share
More Decks by gupuru
See All by gupuru
gupuru
0
48
gupuru
0
220
gupuru
0
380
gupuru
0
200
gupuru
0
180
gupuru
0
260
gupuru
1
150
gupuru
0
1.4k
gupuru
1
100
Other Decks in Programming
See All in Programming
cwozaki
1
1.6k
asumikan
0
280
adoranwodo
0
190
saki4869
0
170
hirotokirimaru
1
390
line_developers_tw
0
370
hr01
0
1.6k
akatsukinewgrad
0
130
yamotuki
0
120
canon1ky
3
340
hanhan1978
0
290
akatsukinewgrad
0
130
Featured
See All Featured
jakevdp
774
200k
matthewcrist
73
7.5k
andyhume
62
3.3k
jmmastey
8
530
schacon
145
6.6k
colly
66
3k
aarron
258
36k
notwaldorf
13
1.5k
eitanlees
111
9.9k
zenorocha
297
39k
productmarketing
5
640
cromwellryan
101
5.9k
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
࠷ޙʹݴ͍Εͨ͜ͱ͕...
ࣾͷ໊લɺϋφͪΌΜͰ͢ʢসʣ
͝ਗ਼ௌɺ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ