簡體   English   中英

我可以在不使用google-services.json的情況下初始化Firebase嗎?

[英]Can I initialize Firebase without using google-services.json?

編輯:我應該強調,我有口味,我不想使用任何這些谷歌服務,並嘗試在這種情況下應用谷歌服務插件,沒有適用的google-services.json,將導致構建失敗。

我希望能夠初始化Firebase SDK,特別是使用遠程配置,不使用google-services.json。

我看到FirebaseApp有一個初始化方法,它接收一個FirebaseOptions對象。

我使用google-services.json中提供的值構建了FirebaseOptions,在使用這些選項調用FirebaseApp.initialize之后,我總是得到

FirebaseInitProvider: FirebaseApp initialization unsuccessful

我知道這是使用google-services.json文件的推薦方法,但我需要能夠讓應用程序調用不同的Firebase項目,具體取決於調試/發布版本,同時保持包名稱相同。

我想這樣做的方法是為初始化Firebase所需的所有值設置調試/釋放對,然后動態地進行初始化。

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setApplicationId(appId)
                .setApiKey(apiKey)
                .setGcmSenderId(appContext.getString(
                        isDebug ? R.string.firebase_testing_gcm_sender_id :
                                R.string.firebase_production_gcm_sender_id))
                .setDatabaseUrl(appContext.getString(
                        isDebug ? R.string.firebase_testing_database_url :
                                R.string.firebase_production_database_url))
                .setStorageBucket(
                        appContext.getString(
                                isDebug ? R.string.firebase_testing_storage_bucket :
                                        R.string.firebase_production_storage_bucket))
                .build();
        FirebaseApp.initializeApp(appContext, options);

到目前為止它似乎沒有用。

非常感謝所有幫助!

以下是關於如何在同一個Android項目Firebase博客新配置文檔中使用多個firebase應用程序/數據庫的幾點建議

然而,除了默認應用程序之外,這些還討論了使用輔助應用程序 - 它仍然使用google-services.json。 我做了一些研究,並在他們的Slack頻道中探討。 Firebase使用名為FirebaseInitProvider的ContentProvider。 這使用google-services.json在啟動時初始化DEFAULT應用。 如果json文件不存在則barfs。 我做了以下步驟:

  • 刪除了google-services.json
  • 已刪除com.google.gms.google-services插件。 插件始終查找json文件。
  • FirebaseInitProvider通過清單合並添加。 但是,在頂級清單中,您可以指定node = remove標記,以將其從最終清單中添加。

     <provider android:authorities="${applicationId}.firebaseinitprovider" android:name="com.google.firebase.provider.FirebaseInitProvider" android:exported="false" tools:node="remove"/> 

然而,即使在此之后,我仍然看到一個例外:

java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process myfirebasedemo.net. Make sure to call FirebaseApp.initializeApp(Context) first.
                                                                 at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
                                                                 at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)
                                                                 at com.google.firebase.iid.FirebaseInstanceIdService.zza(Unknown Source)
                                                                 at com.google.firebase.iid.FirebaseInstanceIdService.zzm(Unknown Source)
                                                                 at com.google.firebase.iid.zzb$2.run(Unknown Source)
                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                 at java.lang.Thread.run(Thread.java:818)

FirebaseInstanceIdService看起來仍然在尋找實例應用。 如果禁用該服務,使用相同的清單節點刪除技術,則此異常將消失。 但我認為該服務可以執行重要的同步/消息傳遞。 所以不確定是否明智地刪除它。 長話短說 - 我仍在尋找禁用默認應用程序/不使用google-services.json的完美解決方案。 任何進一步的指示將深表贊賞。

更新:

看起來這個解決方案畢竟有用 - 沒有禁用FirebaseInstanceIdService,只是刪除FirebaseInitProvider,如上所述。 只需要確保Firebase.initializeApp在Application :: onCreate方法中調用了第一個東西。

FirebaseApp.initializeApp(context, new FirebaseOptions.Builder().setApiKey("<VAL>").
                    setApplicationId("<VAL>").
                    setDatabaseUrl("<VAL>").
                    setGcmSenderId("<VAL>").
                    setStorageBucket("<VAL>").build());  

我找到了有趣的解決方法。 請嘗試以下操作:將google-services.json放入任何示例應用谷歌提供的Firebase集成。 編譯它。

看一下路徑app/build/generated/res/google-services/debug/values/應該生成帶有你所描述的錯誤中提到的一串字符串的values.xml文件。 將這些字符串復制到項目的value.xml文件中。 而已。

我也在使用構建變體來為不同的環境應用不同的配置。 我遇到了同樣的問題,因為有些變種在google-services.json文件中沒有相應的條目。 這導致我的一些構建在生成未在firebase中配置的應用程序包時失敗。

我的解決方法是在firebase儀表板上為相關的firebase項目中的缺失包添加虛擬應用程序條目 - 然后從中獲取更新的google-services.json文件。

可能不是最好的做法,但在我的情況下完成了工作。

google-services.json是完全可選的,意味着方便。 因此,如果您覺得不方便,那么一定不要使用它。

您可能已經注意到, json文件僅在構建時使用。 google-services插件將JSON文件轉換為包含一些特定字符串的資源xml文件。 它看起來像這樣:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <! -- Present in all applications -->
    <string name="google_app_id" translatable="false">1:1035469437089:android:73a4fb8297b2cd4f</string>

    <! -- Present in applications with the appropriate services configured -->
    <string name="gcm_defaultSenderId" translatable="false">1035469437089</string>
    <string name="default_web_client_id" translatable="false">337894902146-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com</string>
    <string name="ga_trackingId" translatable="false">UA-65557217-3</string>
    <string name="firebase_database_url" translatable="false">https://example-url.firebaseio.com</string>
    <string name="google_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="google_crash_reporting_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="project_id" translatable="false">mydemoapp</string>

</resources>

您可以在自己的strings.xml文件中創建這些條目,然后FirebaseApp.initializeApp()將在運行時找到它們。 並非所有密鑰都是必需的,這取決於您使用的是哪種服務。 例如,幾乎所有服務都需要google_app_id密鑰。 Firestore只需要它和project_id ,而Firebase Auth也需要google_api_key 試驗並找出你需要的東西應該不難。

一些鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM