ããã«ã¡ã¯ãã¢ã¬ã¯ãµã³ããŒã»ãããœãã§ããNetcrackerã§ã·ãã¢ãœãããŠã§ã¢éçºè ãšããŠåããŠãããããžãããŽãŽããã®GDGãçããŠããŸãã ç§ã¯Googleãé·ãééçºããŠãããã¯ãããžãŒãè¿œãç¶ããŠããŸããããä»åã¯Firebaseãééã§ããŸããã§ããã å€ãã®å€æŽãããããããã¯ããèªäœãæŠå¿µçã§ãããæçµçã«ãFirebaseèªäœãã¢ãã€ã«ããã¯ãšã³ããæ§ç¯ããããã®1ã€ã®å€§ããªãµãŒãã¹ã«å€ããŸãã
ãã®ãã¬ãŒã³ããŒã·ã§ã³ã«ã¯éåžžã«æéãåããã®ã§ãå人çã«æ°æ©èœã䜿çšããŠãAndroidã®äŸ¿å©ã§é«éãªéçºã®ãã®é©ãã¹ãäžçãžã®ç¬¬äžæ©ãèžã¿åºãæ¹æ³ãå ±æããããšã«ããŸããã
èæ¯
GoogleãšFirebaseã®å ±åæŽå²ã¯2014幎ã«å§ãŸããŸããããã®åŸãFirebaseããŒã å šäœãåã«Googleã«åãæ¿ããŠè£œåã®éçºãç¶ããGoogle Cloud Platformããã®ä»ã®Googleãã¯ãããžãŒã®ã¯ã©ãŠãæ©èœã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸããã åœæãFirebaseã¯å®éãè€æ°ã®ã¯ã©ã€ã¢ã³ãéã§ããŒã¿ãä¿åããã³åæããããã«èšèšãããã¯ã©ãŠãNoSQLããŒã¿ããŒã¹ãããã³é¢é£ããèªèšŒããã³ãã¹ãã£ã³ã°ãµãŒãã¹ã管çããããã®RESTãµãŒãã¹ã®ã»ããã§ããã 次ã®ããã«ãªããŸããã
2016幎ã«ã¯ããžã¥ããªãŒ10åç®ã®Google I / Oãéå¬ãããFirebaseã®æ°æ©èœã玹ä»ãããŸãã 圌ã¯ãéçºã®ããã ãã§ãªããã¢ããªã±ãŒã·ã§ã³ã®ããã¢ãŒã·ã§ã³ãšåçåãä¿é²ããããã«èšèšããã15ã®è£œåã»ããã«æé·ãæçãæ¡å€§ããŸããã ãããã®è£œåã¯ãããŒãºã«å¿ããŠåå¥ã«ããŸãã¯çµã¿åãããŠäœ¿çšââã§ããŸãã
è¯ãæ¹æ³ã§ã¯ããããã®å補åã¯ãå€ãã®äŸãšã³ãŒããå«ãåå¥ã®èšäºå°çšã«ããå¿ èŠããããŸãã ããããããã«ã¯æéãããããŸãããã®ãããFirebaseã«åºã¥ããŠå°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããããšããäžæ¹ã§ãããã€ãã®ïŒç§ã®æèŠã§ã¯æãèå³æ·±ãïŒå¯èœæ§ã«ç²Ÿéãããã¯ãããžãŒã®ãå³ããæããŠã¿ãŠãã ãã...äŸãšããŠãç°¡åãªãã£ãããã¡ãã»ãŒãžãäœæããŸãã¯ã©ãŠãã«ä¿åããã察話è ã«é¢ããæ å ±ã ãã®ãããªãã®ãéçºããã®ãã©ãã»ã©ç°¡åã ã£ããä¿¡ããããŸããã
1. Firebase-æåã®ã¹ããã
æºåäœæ¥ãç»é²ãèªå¯
空ã®ããŒã¯ã¢ããã䜿çšããŠåçŽãªãããžã§ã¯ãïŒcom.google.simplefirebasechatãšåŒã³ãŸãããïŒãäœæããŸãã éå§ãããã®ã§ãFirebaseã«æ¥ç¶ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãFirebaseã管çããããã®ã¡ã€ã³ããŒã«ïŒ ã³ã³ãœãŒã«ïŒã«ç§»åã ã[æ°ãããããžã§ã¯ããäœæ]ãã¯ãªãã¯ããŸãã
Androidã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ãããããææ¡ããããªãã·ã§ã³ããéžæããå¿ èŠããããŸãã
ã·ã¹ãã ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ååãšSHA1圢åŒã®ã»ãã¥ãªãã£ããŒã瀺ãããã«ä¿ããŸã
泚ïŒææããŠããããŒãå¿ããå Žåã¯ãWindowsã³ã³ãœãŒã«ïŒWin + RãCMDãEnterïŒãéããdebug.keystoreããæœåºããŸãã ãããè¡ãã«ã¯ã次ã®ã³ãã³ããå ¥åããŸãã
keytool -exportcert -alias androiddebugkey -keystore %USERPROFILE%/.android/debug.keystore -list -v
ãããŠããããã°ãªããžããªãããã¹ã¯ãŒãã§ãã°ã€ã³ããŸãïŒããã©ã«ãã¯ãandroidãã§ã ïŒ
å¿ èŠãªãã¹ãŠã®ããŒã¿ãæäŸãããšããã©ãŠã¶ãŒã¯ãåäœã«å¿ èŠãªã¡ã¿ããŒã¿ãšãšãã«çæãããjson Firebaseèšå®jsonãèªåçã«ããŠã³ããŒãããŸãã çµæã®ãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®appãã£ã¬ã¯ããªã«é 眮ããå¿ èŠããããŸãã ãããžã§ã¯ãã¬ãã«ã®build.gradleã§ã察å¿ããã©ã€ãã©ãªã«äŸåé¢ä¿ãè¿œå ããå¿ èŠããããŸã
classpath 'com.google.gms:google-services:3.0.0'
ãŸããappãã£ã¬ã¯ããªã®build.gradleã®æåŸã«æ¬¡ã®è¡ãè¿œå ããå¿ èŠããããŸã
apply plugin: 'com.google.gms.google-services'
ããã¯ãæ§æJSONaã®åŠçãšã¡ã€ã³ã®com.google.gmsïŒgoogle-servicesã©ã€ãã©ãªã®æ¥ç¶ã«å¿ èŠãªãã©ã°ã€ã³ãGoogleãµãŒãã¹ãããžã§ã¯ãã«æ¥ç¶ããŸãã
åºæ¥äžããïŒ Firebaseã¯ããã«ããè©Šã¿ãããšãã§ããã¢ããªã±ãŒã·ã§ã³ã«é¢é£ä»ããããŠããŸãïŒ
Firebaseã®ããã©ãŒãã³ã¹ã確èªãã
次ã®ã¹ãããã¯ããã¹ãŠãæ£åžžã«åäœããŠããããšã確èªããããšã§ããå®éã«æ¥ç¶ããŸããã ãããè¡ãã«ã¯ãããŒã¿ããŒã¹ã«ããã€ãã®ã¬ã³ãŒããè¿œå ããã¢ããªã±ãŒã·ã§ã³ã§ããããèªã¿åããŸãã
Firebaseã³ã³ãœãŒã«ãéãã[ããŒã¿ããŒã¹]ã¿ããæ¢ããŠãã¡ãã»ãŒãžãä¿åããããã®ç°¡åãªJSONãäœæããŸãã ã³ã³ãœãŒã«ã€ã³ã¿ãŒãã§ã€ã¹ã«ããããããç°¡åã«è¡ãããšãã§ããŸãã
å ¥åããããŒã¿ãèªã¿åããã¢ããªã±ãŒã·ã§ã³ã«èŠæ±ããŸã...ã¢ã¯ã»ã¹ããŠã€ã³ã¿ãŒãã§ãŒã¹ã«è¡šç€ºã§ããããã«ããããã«ãbuild.gradleã«å¯Ÿå¿ããäŸåé¢ä¿ãããã€ãè¿œå ããŸãã
compile 'com.google.firebase:firebase-database:9.0.0' compile 'com.firebaseui:firebase-ui-database:0.4.0' compile 'de.hdodenhof:circleimageview:1.3.0' compile 'com.github.bumptech.glide:glide:3.6.1'
ãŸãããã£ããã¡ãã»ãŒãžãšããŒã¯ã¢ããã®æ°ããã¯ã©ã¹ãè¿œå ããŠè¡šç€ºããŸãã å¿ èŠãªæºåãå®äºããããããŒã¿ããŒã¹ããåãåã£ãã³ã³ãã³ãã衚瀺ããŸãã
ãããè¡ãã«ã¯ãã¡ã€ã³ã¢ã¯ãã£ããã£ãäœæããFirebaseã®åäœããã¹ãããã®ã«åœ¹ç«ã€ã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãé 眮ããå¿ èŠããããŸãã ã¡ãã»ãŒãžãå ¥åãããã£ãŒã«ããéä¿¡ãã¿ã³ãããŒã¿ãããŒãããProgressBarãããã³ããŒã¿ããŒã¹ããããŒã¿ã衚瀺ããRecyclerViewãè¿œå ããã¯ã©ã¹èªäœã«æ°è¡ã®ã³ãŒããè¿œå ããŸãã
ããã§ãç§ãã¡ã¯äœãåŸãŸããïŒ
package com.google.simplefirechat; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.InputFilter; import android.text.TextWatcher; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import com.google.android.gms.common.api.GoogleApiClient; import com.google.firebase.database.DatabaseReference; import com.firebase.ui.database.FirebaseRecyclerAdapter; import com.google.firebase.database.FirebaseDatabase; import de.hdodenhof.circleimageview.CircleImageView; import com.bumptech.glide.Glide; public class MainActivity extends AppCompatActivity { private DatabaseReference mSimpleFirechatDatabaseReference; private FirebaseRecyclerAdapter<ChatMessage, FirechatMsgViewHolder> mFirebaseAdapter; private RecyclerView mMessageRecyclerView; private LinearLayoutManager mLinearLayoutManager; private ProgressBar mProgressBar; public static class FirechatMsgViewHolder extends RecyclerView.ViewHolder { public TextView msgTextView; public TextView userTextView; public CircleImageView userImageView; public FirechatMsgViewHolder(View v) { super(v); msgTextView = (TextView) itemView.findViewById(R.id.msgTextView); userTextView = (TextView) itemView.findViewById(R.id.userTextView); userImageView = (CircleImageView) itemView.findViewById(R.id.userImageView); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mProgressBar = (ProgressBar) findViewById(R.id.progressBar); mMessageRecyclerView = (RecyclerView) findViewById(R.id.messageRecyclerView); mLinearLayoutManager = new LinearLayoutManager(this); mLinearLayoutManager.setStackFromEnd(true); mMessageRecyclerView.setLayoutManager(mLinearLayoutManager); mSimpleFirechatDatabaseReference = FirebaseDatabase.getInstance().getReference(); mFirebaseAdapter = new FirebaseRecyclerAdapter<ChatMessage, FirechatMsgViewHolder>( ChatMessage.class, R.layout.chat_message, FirechatMsgViewHolder.class, mSimpleFirechatDatabaseReference.child("messages")) { @Override protected void populateViewHolder(FirechatMsgViewHolder viewHolder, ChatMessage friendlyMessage, int position) { mProgressBar.setVisibility(ProgressBar.INVISIBLE); viewHolder.msgTextView.setText(friendlyMessage.getText()); viewHolder.userTextView.setText(friendlyMessage.getName()); if (friendlyMessage.getPhotoUrl() == null) { viewHolder.userImageView .setImageDrawable(ContextCompat .getDrawable(MainActivity.this, R.drawable.ic_account_circle_black_36dp)); } else { Glide.with(MainActivity.this) .load(friendlyMessage.getPhotoUrl()) .into(viewHolder.userImageView); } } }; mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); int chatMessageCount = mFirebaseAdapter.getItemCount(); int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition(); if (lastVisiblePosition == -1 || (positionStart >= (chatMessageCount - 1) && lastVisiblePosition == (positionStart - 1))) { mMessageRecyclerView.scrollToPosition(positionStart); } } }); mMessageRecyclerView.setLayoutManager(mLinearLayoutManager); mMessageRecyclerView.setAdapter(mFirebaseAdapter); } }
ãã®æ®µéã§ã¯ãæ¿èªããŒã«ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããªãã£ããããFirebaseã³ã³ãœãŒã«ã§ããŒã¿ããŒã¹ããã®äžæ£ãªèªã¿åãã®æš©å©ãä»äžããã ãã§ãã ãããè¡ãã«ã¯ã[ã«ãŒã«]ã¿ãã«ç§»åããŠã次ã®ããã«èšå®ãå€æŽããŸãã
ããŠããããäœããæ¥ãã®ãããã§ãã¯ããæã§ãã ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãããã衚瀺ãããŸããããŒã¿ããŒã¹ã®ã¬ã³ãŒããã以åã«éä¿¡ãããã¡ãã»ãŒãžãšããŠè¡šç€ºãããŸããã
ããã§ãã1ã€ç¢ºèªã§ããŸãã ããŒã¿ããŒã¹ã«ããã«ããã€ãã®ã¡ãã»ãŒãžãè¿œå ããŠã¿ãŠãã ããã ãã¹ãŠãæ£ããè¡ããããšããããã®ã¡ãã»ãŒãžããªã¢ã«ã¿ã€ã ã§ãã£ããã«è¡šç€ºãããŸãã æ®å¿µãªãããã¢ããªã±ãŒã·ã§ã³ãããããã«çããããšãã§ããªãããã楜ãã¿ãçµããŠã¢ããªã±ãŒã·ã§ã³ã®æ©èœãå®æãããŸãã
2. Firebaseãžã®æžã蟌ã¿
ããã§ã¯ãã¹ãŠãç°¡åã§ãã éä¿¡ãã¿ã³ãã³ãã©ãŒãMainActivityã«è¿œå ããŸãã
mSendButton = (Button) findViewById(R.id.sendButton); mSendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ChatMessage friendlyMessage = new ChatMessage(mMsgEditText.getText().toString(), mUsername, mPhotoUrl); mSimpleFirechatDatabaseReference.child("messages") .push().setValue(friendlyMessage); mMsgEditText.setText(""); } });
ãããŠããã ãã§ãïŒ ã¢ããªã±ãŒã·ã§ã³ãå床å®è¡ããŠãã楜ãã¿ãã ããã ããã¹ããå ¥åãã[éä¿¡]ãã¿ã³ãã¯ãªãã¯ãããšããã£ããã«è¡šç€ºããã察å¿ããã¬ã³ãŒããå³åº§ã«ããŒã¿ããŒã¹ã«è¡šç€ºãããŸããããã¯ãFirebaseã³ã³ãœãŒã«ã§ç¢ºèªã§ããŸãã å¿ èŠãªæåŸã®æ©èœã§ãããŠãŒã¶ãŒèªèšŒãè¿œå ããŸãã
3. Firebaseã§ã®èªèšŒ
ãŸããèš±å¯ãããŠããªããŠãŒã¶ãŒããããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ã奪ããŸãã ãã¹ãçšã«ã®ã¿å«ãŸããŠããŸãã ã³ã³ãœãŒã«ã®[ã«ãŒã«]ã»ã¯ã·ã§ã³ã«ç§»åãããã¹ãŠãèšå®ããŸãã
ãã®åŸã[èªèšŒ]ã¿ãã«ç§»åããèªèšŒæ¹æ³ãéžæããŸã-ãã®å ŽåãGoogleãä»ããŠïŒ
build.gradleãå床æŽæ°ããèªèšŒã©ã€ãã©ãªãžã®äŸåé¢ä¿ãè¿œå ããŸã
compile 'com.google.firebase:firebase-auth:9.0.0' compile 'com.google.android.gms:play-services-auth:9.0.0'
é©åãªããŒã¯ã¢ããïŒ AuthorizationActivity.classããã³activiti_auth.xm lïŒã䜿çšããŠããã£ããã«å ¥ãããã®è¿œå ã®ã¢ã¯ãã£ããã£ãå¿ èŠã§ãã ãããã§ã¹ãã«ç»é²ããããšãå¿ããªãã§ãã ããã ãŸããã¢ã«ãŠã³ããçµäºãããªãã·ã§ã³ïŒ main_menu.xml ïŒãè¿œå ããå Žæãããããã«ãã¡ãã¥ãŒããããšäŸ¿å©ã§ãã æåŸã«ãMainActivityãå°ãä¿®æ£ããŸãã
èªå¯ãã€ãªã
ãŸããGoogleApiClient.OnConnectionFailedListenerã€ã³ã¿ãŒãã§ãŒã¹ããActivityãç¶æ¿ãããã®ã€ã³ã¿ãŒãã§ãŒã¹èªäœãå®è£ ããå¿ èŠããããŸãã
@Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); }
次ã«ãæ¿èªãåŠçãããšã³ãã£ãã£ãè¿œå ããŸãã
ãã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒ
private GoogleApiClient mGoogleApiClient; private FirebaseAuth mFirebaseAuth; private FirebaseUser mFirechatUser;
onCreateã§ã®åæåïŒ
mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API) .build(); mFirebaseAuth = FirebaseAuth.getInstance(); mFirechatUser = mFirebaseAuth.getCurrentUser(); if (mFirechatUser == null) { startActivity(new Intent(this, AuthorizationActivity.class)); finish(); return; } else { mUsername = mFirechatUser.getDisplayName(); if (mFirechatUser.getPhotoUrl() != null) { mPhotoUrl = mFirechatUser.getPhotoUrl().toString(); } }
第äžã«ããŠãŒã¶ãŒããã°ã¢ãŠãã§ããããã«ãã¡ãã¥ãŒããåŒã³åºããè¿œå ããŸãã
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.sign_out_menu: mFirebaseAuth.signOut(); Auth.GoogleSignInApi.signOut(mGoogleApiClient); mUsername = DEFAULT_NAME; startActivity(new Intent(this, AuthorizationActivity.class)); return true; default: return super.onOptionsItemSelected(item); } }
ããã§ãGoogleã¢ã«ãŠã³ããä»ããæ¿èªã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã³ãã¹ãã§ããŸãã
ã¡ãã»ãŒãžã¯æ¬¡ã®ããã«ãªããŸãã
ãŸããFirebaseã³ã³ãœãŒã«ã®[èªèšŒ]ã¿ãã§ãã¢ããªã±ãŒã·ã§ã³ã§æ¿èªããããŠãŒã¶ãŒã確èªã§ããŸãã
ãã®ãããåçŽãªã¢ããªã±ãŒã·ã§ã³ãããããã®ããã¯ãšã³ãã¯å®å šã«Firebaseã§äœæãããŠããŸãã ãããã®æ©èœã¯ä»¥åã«å©çšå¯èœã§ããããFirebaseããŒã«ã«ç²Ÿéããã°ãããªã®ã§ãä»ãããã£ãšé¢çœãããšãå§ããŸãããã
4. Firebaseéç¥ã䜿çšããéç¥
Firebase Notificationsã䜿çšãããšãFirebaseã³ã³ãœãŒã«ããçŽæ¥ãŠãŒã¶ãŒããã€ã¹ã«éç¥ãéä¿¡ã§ããŸãã ãŸãããã¹ãŠã®ãŠãŒã¶ãŒãç¹å®ã®ã°ã«ãŒãïŒçµ±åã¯æ°ããFirebaseããŒã«Audiencesã§ãæ©èœããŸãïŒããŸãã¯äžè¬çã«ç¹å®ã®ããã€ã¹ã®ãŠãŒã¶ãŒã«éä¿¡ã§ããŸãã ãã ãããããã®éç¥ãåŠçããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«éç¥ãåãå ¥ããŠãé©åãªãµãŒãã¹ãæ§æããå¿ èŠããããŸãã
Firebaseéç¥ãæ¥ç¶ãã
ãŸããé©åãªbuild.gradleãè¿œå ããŸã...ïŒäŸåé¢ä¿ãã³ãã³ããªã©ïŒ
compile 'com.google.firebase:firebase-messaging:9.0.0'
次ã«ãçä¿¡FCMã¡ãã»ãŒãžïŒFirebase Cloudsã¡ãã»ãŒãžïŒã管çããããã«äœ¿çšããSimpleFirechatMessagingServiceãµãŒãã¹ãäœæããŸãã å¿ èŠãªã®ã¯ãonMessageReceivedïŒRemoteMessage remoteMessageïŒã¡ãœãããåå®çŸ©ããŠãçä¿¡éç¥ãäœããã®æ¹æ³ã§åŠçããããšã ãã§ãã
FCMããžãã¯ã管çããããã®SimpleFirechatInstanceIdServiceãµãŒãã¹ãäœæããå¿ èŠããããŸãã éåžžãæ°ããããŒã¯ã³ãçæãããããšãã¢ããªã±ãŒã·ã§ã³ã«éç¥ãããã®ããŒã¯ã³ãååŸããããã«äœ¿çšãããŸãã onTokenRefreshïŒïŒã¡ãœããããªãŒããŒã©ã€ãããã ãã§ã
æ®ã£ãŠããã®ã¯ããµãŒãã¹ããããã§ã¹ãã«ç»é²ããããšã§ãããã®åŸããã¹ãŠãæ©èœããã¯ãã§ãã
<service android:name=".SimpleFirechatMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:name=".SimpleFirechatInstanceIdService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service>
éç¥ããã¹ããã
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããFirebaseã³ã³ãœãŒã«ã®[éç¥]ã¿ãã«ç§»åããŠãåŸ æã®ã¡ãã»ãŒãžãéä¿¡ããŸãã çµæã¯ãã¹ããŒããã©ã³ã®ãã£ã¹ãã¬ã€ãŸãã¯ãšãã¥ã¬ãŒã¿ãŒã«å³åº§ã«è¡šç€ºãããŸãã
Firebaseã³ã³ãœãŒã«ã®é©åãªã»ã¯ã·ã§ã³ã§éç¥ãéä¿¡ããçµæãç¥ãããšãã§ããŸãã
5. Firebase Remote Config-ã¢ããªã±ãŒã·ã§ã³ããã®å Žã§å€æŽããŸã
Firebase Remote Configã䜿çšãããšããµãŒããŒãããªã¢ãŒãã§æŽæ°ã§ããã¢ããªã±ãŒã·ã§ã³ã®å€ãã®ãã©ã¡ãŒã¿ãŒãèšå®ã§ããŸãã ãããã£ãŠã.apkå šäœãæŽæ°ããããšãªããã¢ããªã±ãŒã·ã§ã³ã¹ãã¢ã«ããŠã³ããŒããããã®ãåŸ ããã«ãããã€ã¹ã®æŽæ°ãè¡ãããšãªããã¢ããªã±ãŒã·ã§ã³ã®æ©èœïŒèšèšã翻蚳ãªã©ïŒã確èªã§ããŸãã äŸãšããŠããã®æ©èœã䜿çšããŠã¡ãã»ãŒãžéä¿¡ãã¿ã³ã®ããã¹ããå€æŽããŠã¿ãŸãããã
æ©èœãè¿œå ãã
æåã«ã[ãªã¢ãŒãæ§æ]ã¿ãã«ç§»åããbutton_nameå€æ°ãäœæããŸã
次ã«ãã¢ããªã±ãŒã·ã§ã³ãæ§æããå¿ èŠããããŸãã
以åã®ããã«ãé©åãªäŸåé¢ä¿ãbuild.gradleã«è¿œå ããããšããåã³å§ããŸãã
compile 'com.google.firebase:firebase-messaging:9.0.0'
...ãããŠfetchconfigã¡ãœãããè¿œå ããŸãããã®ã¡ãœããã§ã¯ããµãŒããŒããæ§æãååŸããŠãã¿ã³åã«é©çšããŸãã
public void fetchConfig() { long cacheExpiration = 3600; // 1 hour in seconds // If developer mode is enabled reduce cacheExpiration to 0 so that // each fetch goes to the server. This should not be used in release // builds. if (mFirebaseRemoteConfig.getInfo().getConfigSettings() .isDeveloperModeEnabled()) { cacheExpiration = 0; } mFirebaseRemoteConfig.fetch(cacheExpiration) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // Make the fetched config available via // FirebaseRemoteConfig get<type> calls. mFirebaseRemoteConfig.activateFetched(); mSendButton.setText(mFirebaseRemoteConfig.getString("button_name")); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { mSendButton.setText(mFirebaseRemoteConfig.getString("button_name")); } }); }
onCreateããã³ãã®ããã«äœæãããã¡ãã¥ãŒé ç®ã§ãã®ã¡ãœãããåŒã³åºããŸãã ãããè¡ãã«ã¯ãmain_menu.xmlã«æ¬¡ã®è¡ãè¿œå ããŸãã
<item android:id="@+id/reconfig" android:title="Reconfig" app:showAsAction="never"/>
onCreateã§ïŒ
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); FirebaseRemoteConfigSettings firebaseRemoteConfigSettings = new FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(true) .build(); Map<String, Object> defaultConfigMap = new HashMap<>(); defaultConfigMap.put("button_name", "Send");
...ããã³onOptionsItemSelectedå ïŒ
case R.id.reconfig: fetchConfig(); return true;
çµæã確èªãã
ãã¹ãã¢ã«ãŽãªãºã ã¯éå»ãšåæ§ã§ãã ã¢ããªã±ãŒã·ã§ã³ãèµ·åããããã¹ããã¿ã³ãèŠãŠãFirebaseã³ã³ãœãŒã«ã«ç§»åãããã®å€ãbutton_nameãVariableã«å€æŽããã¡ãã¥ãŒããreconfigãåŒã³åºããŸãã
ãã®ããã«ã30åã§ãæ¿èªãã¯ã©ãŠãéç¥ãFirebaseæ©èœã«åºã¥ããªã¢ãŒãèšå®ã䜿çšããŠãã£ãããäœæããŸããã
PSïŒ ãããããããžã§ã¯ããããŠã³ããŒãããŠèªåã§æãäžããããšãã§ããŸãã
ä»æ¥ã¯ååãªç·Žç¿ãåšåº«ãåãæéã ãšæããŸãã
çµæãšããŠåŸããã®
ã¡ãã»ãŒãžãä¿åããããã«ãNoSQLã¯ã©ãŠãããŒã¿ããŒã¹ã管çãããµãŒãã¹ã§ããRealtime Databaseã䜿çšããŸãã ã ãããã䜿çšãããšãæ¥ç¶ãããŠãããã¹ãŠã®ããã€ã¹ãšæ°ããªç§ã§ããŒã¿ãä¿åããã³åæã§ããŸãã æŽæ°ãããããŒãžã§ã³ã§ã¯ãããŒã¿ã¯ã¡ã¢ãªãŸãã¯ããã€ã¹ã®ãã£ã¹ã¯ã«ä¿åãããããããããã¯ãŒã¯ãžã®æ¥ç¶ã倱ãããŠãã¢ããªã±ãŒã·ã§ã³ã¯åäœãç¶ããŸãããã¡ãããæ¥ç¶ã埩å ãããåŸãããŒã¿ã¯åæãããŸãã
æ¿èªã«ã¯ã èªèšŒãµãŒãã¹ïŒãŠãŒã¶ãŒãèå¥ããã³ç®¡çããããã®ãµãŒãã¹ïŒã䜿çšããŸããã é»åã¡ãŒã«ãšãã¹ã¯ãŒãã®ãã¢ããœãŒã·ã£ã«ãããã¯ãŒã¯ïŒFacebookãTwitterãGitHubãGoogle +ïŒã«ããèªèšŒããµããŒãããä»ã®æ¢åã®èªèšŒã·ã¹ãã ãšçµ±åã§ããŸãã
éç¥ããã¹ãããããã«ãéç¥ã䜿çšããŸãããããã¯ãæ°ããUIãæäŸãããµãŒãã¹ã§ãçµã¿èŸŒã¿ã³ã³ãœãŒã«ããã¢ã¯ã»ã¹ã§ããFirebase Cloud Messagingã«åºã¥ããŠããŸãã Googleã¯ã©ãŠãã¡ãã»ãŒãžã³ã°ãã¯ãããžãŒã«ä»£ãããã®ã§ããã1è¡ã®ã³ãŒããèšè¿°ããããšãªããŠãŒã¶ãŒã«éç¥ãéä¿¡ããŸãã Firebase Analyticsãšã®çµ±åã«ãããäºåã«æ§æããããŠãŒã¶ãŒã°ã«ãŒãã«éç¥ãéä¿¡ã§ããŸã
ãã®æè¡ã¯ ãFirebaseãšãæã人æ°ã®ããã¡ãã»ãŒãžã³ã°ãµãŒãã¹ã§ããGoogle Cloud Messagingãçµã¿åããããµãŒãã¹ã§ããCloud Messagingãããžã§ã¯ããšå¯æ¥ã«ãªã³ã¯ãããŠããŸãã ã¯ã©ãŠãã¡ãã»ãŒãžã³ã°ã¯ââã¯ãã¹ãã©ãããã©ãŒã ã§ãããiOSãAndroidãããã³Webã¢ããªã±ãŒã·ã§ã³ã§å®è¡ãããŸãã
æåŸã«ããªã¢ãŒãèšå®ã«ã¯ãå®å šãªããã±ãŒãžã¢ããã°ã¬ãŒããã¢ããªã±ãŒã·ã§ã³ã¹ãã¢ã§ã®æ¯èŒçé·ããã§ãã¯ã«é Œããã«ã¢ããªã±ãŒã·ã§ã³ã®äžéšãå€æŽããã³æŽæ°ã§ãããµãŒãã¹ã§ããRemote Configã䜿çšããŸããã ã»ãã¥ãªãã£ãšæäœãç°¡åã«ããããã«ããªã¢ãŒãã§æŽæ°ãããã®ãäºåã«èããããŒãšå€ã®ãããªãã¢ã«é©åãªãã©ã¡ãŒã¿ãŒãèšå®ããå¿ èŠããããŸãã ããã§ã¯ããµãŒããŒåŽã§ãããã®ãã©ã¡ãŒã¿ãŒã®å€ã眮ãæããããšã«ãããã¢ããªã±ãŒã·ã§ã³ã®æäœãšå€èŠ³ãå€æŽã§ããŸãã ããšãã°ãäŒæ¥ã®ã¢ããªã±ãŒã·ã§ã³ã®èšèšãæŽæ°ãããã¹ãŠãå ã©ããã«æ»ãããšãã§ããŸãã é·ãã¬ãã¥ãŒããããŸããã ä»ã®å€ãã®FirebaseèŠçŽ ãšåæ§ã«ãéç¥ã¯Firebase Analyticsã«çµ±åãããŸãã ã€ãŸããããŸããŸãªãŠãŒã¶ãŒã®ã°ã«ãŒãïŒæ°åããã³æ°çŸã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠèªåçã«çæãããïŒãéžæãããããã«æŽæ°ãéä¿¡ã§ããŸã...
çµè«ãšããŠãããŒã¿ãä¿åãããµãŒãã¹ãããFirebaseã¯äŸ¿å©ã§äœ¿ããããã€ã³ã¿ãŒãã§ã€ã¹ãšã¢ããªã±ãŒã·ã§ã³ãžã®æãç°¡åãªçµ±åãåããã¢ãã€ã«éçºè åãã®ãŠãããŒãµã«ãã©ãããã©ãŒã ã«å€ãã£ããšèšããããšæããŸãïŒã芧ã®ããã«ãå®éã«æ°åã¯ãªãã¯ããã ãã§ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ã§ããŸãïŒã ãã®ãããªäŸ¿å©ã§èå³æ·±ãããŒã«ã®åºåã«æ³šæãæããªãããšã¯å€§ããªééãã ãšæããŸãã è©ŠããŠã¿ãŠãã ããã 圌ã¯æ¬åœã«éåžžã«ã¯ãŒã«ã§ã...
ä»æ¥ã¯ããã§ååã§ãã ãã ãããã®ãããã¯ã«ç¢ºå®ã«æ»ã£ãŠãæ°ããFirebaseã®æ®ãã®æ©èœïŒããŒã¿ã¹ãã¬ãŒãžããŒã«ãã¢ããªã±ãŒã·ã§ã³ãã¹ããåçåãåºåãµãŒãã¹ãæåŸ ç¶ãä¿¡é Œã§ãããªã³ã¯ãªã©ã®äŸ¿å©ã§äŸ¿å©ãªãã³ïŒã«ã€ããŠæ€èšããŸãã ãããŠããã¡ããããããŸã§ã§æãã¯ãŒã«ãªã®ã¯ãä»ã®ãã¹ãŠã®æ©èœã«ç·å¯ã«çµ±åãããæã匷åãªåæãšãŠãŒã¶ãŒã°ã«ãŒãåã§ãã
ãæž èŽããããšãããããŸããïŒ æçš¿ã¯éåžžã«å€§ããããšãå€æããŸãããç§ãã¡ã¯å šå¡ã§ãã®ã§ãã¿ã€ããã¹ãééããèŠã€ããå Žåã¯ãPMã«é£çµ¡ããŠãã ãããããã«ä¿®æ£ããŸãã ãããŠãã³ã¡ã³ãã«è³ªåãæ®ããŠãã ããã :)