Cordova-plugin-firebase: 第二次构建时出错

创建于 2016-06-29  ·  22评论  ·  资料来源: arnesson/cordova-plugin-firebase

你好,
感谢您的这个项目和您的出色工作!

我在离子项目中遇到问题。
首先,我在 config.xml 中添加字符串:
<plugin name="cordova-plugin-firebase" spec="https://github.com/arnesson/cordova-plugin-firebase" />
其次,我将google-services.json (我从 firebase 网络控制台获得)放在根目录中。
我运行我的构建,这有效:

$ cordova run android
Running command: /home/user/android-app/App/hooks/after_prepare/010_add_platform_class.js /home/user/android-app/App
add to body class: platform-android
**Discovered plugin "cordova-plugin-firebase" in config.xml. Adding it to the project**
Fetching plugin "https://github.com/arnesson/cordova-plugin-firebase" via git clone
Repository "https://github.com/arnesson/cordova-plugin-firebase" checked out to git ref "master".
Installing "cordova-plugin-firebase" for android
ANDROID_HOME=/home/user/Android/Sdk/
JAVA_HOME=/opt/java/jdk1.8.0_92
No target specified, deploying to device 'F9AZCY31J032'.
:preBuild UP-TO-DATE

但是我的第二次构建总是失败......

$ cordova run android
Running command: /home/user/android-app/App/hooks/after_prepare/010_add_platform_class.js /home/user/android-app/App
add to body class: platform-android
Error: Invalid data, chunk must be a string or buffer, not object

我试图通过cordova plugin add https://github.com/arnesson/cordova-plugin-firebase.git --save安装插件。 但在这种情况下,即使是第一个构建崩溃Error: Invalid data, chunk must be a string or buffer, not object

当我第一次构建 android 应用程序时,下面的代码对我不起作用:

angular.module('app', ['ionic', 'app.controllers', 'app.routes', 'app.services', 'app.directives', 'firebase'])

.run(function($ionicPlatform) {
  $ionicPlatform.ready(function() {
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
    // for form inputs)
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
      cordova.plugins.Keyboard.disableScroll(true);
    }
    if (window.StatusBar) {
      // org.apache.cordova.statusbar required
      StatusBar.styleDefault();
    }

    window.FirebasePlugin.getInstanceId(function(token) {
      // save this server-side and use it to push notifications to this device
      console.log("Token", token);
    }, function(error) {
      console.error(error);
    });

  });
})

此代码将 ["Token", "null"] 返回到控制台。

先感谢您。

所有22条评论

你在platforms/andoid/res/values/strings.xml中得到任何欺骗或奇怪的值吗?

在构建之前尝试运行cordova prepare android(尽管没有它也可以工作)

同样的问题在这里。 在strings.xml我有:

    <string name="google_app_id">727247059290</string>
    <string name="google_app_id">@string/google_app_id</string>
    <string name="google_api_key">@string/google_api_key</string>

从 string.xml 中删除google_app_id并重试。 我已经删除了,它对我有用。

ios呢? 你有什么主意吗?

不。 我对iOS没有任何想法。 我认为您需要在 iOS 项目中添加 GoogleService-Info.plist 文件并安装 Pod。
对你来说,它现在开始在 Android 上工作了吗?

不,我在尝试模拟时收到错误:无效数据。 我猜科尔多瓦准备挂钩正在将文件改回。

但我更感兴趣的是让它在 ios 中工作。 在 ios 我有一个构建问题: https :

@raducostea - 我建议您使用 APN(Apple 推送通知)。 这是插件的链接: https :

@dhruv270我已经在使用它了。 我希望分析部分的这个插件记录事件并将它们添加到谷歌分析中。

错误:由于google-services.jsongoogleService-info.plist复制到平台文件夹,出现无效数据,如果平台文件夹和 json、plist 不存在,则显示错误。
我通过添加平台文件夹和 json 、 plist 文件来修复。 对不起,我的英语不好

是的,您需要在 firebase 控制台创建项目。 并通过添加您的应用程序包名称/包 ID 在该项目中添加应用程序。 您将获得适用于 Android 的 google-services.json 和适用于 iOS 的 GoogleService-Info.plist。 您需要在项目中添加该文件。

确保将文件放在项目的根目录中,与 config.xml 等一起放置,而不是放在例如平台或 www 中。

@raducostea @dhruv270关于 APN 和推送,我建议也使用这个插件。 PushPlugin 最终也会切换到 Firebase FCM(因为 GCM 已被弃用)。 FCM 为 IOS 使用 APN,所以它是一样的,但您可以获得跨所有平台的通用接口的好处

已经这样做了,但我收到编译错误。 检查https://github.com/arnesson/cordova-plugin-firebase/issues/11

我在strings.xml 中没有任何欺骗或奇怪的值。
我重新安装了cordova-plugin-firebase并制作了“cordova prepare”。 之后,我在 strings.xml 中看到了新值:

<string name="google_app_id">@string/google_app_id</string>
<string name="google_api_key">@string/google_api_key</string>

当我再次构建相同的错误时:
错误:无效数据,块必须是字符串或缓冲区,而不是对象

ios和android平台都加了吗?

构建 android 后,我收到此错误

**意外的顶级例外:
com.android.dex.DexException:多个dex文件定义了Lcom/google/firebase/FirebaseException;
在 com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
在 com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
在 com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
在 com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
在 com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
在 com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
在 com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
在 com.android.dx.command.dexer.Main.run(Main.java:277)
在 com.android.dx.command.dexer.Main.main(Main.java:245)
在 com.android.dx.command.Main.main(Main.java:106)

失败的**

我和@neosekar有同样的问题。 有任何想法吗?

编辑:

在互联网上找到了更多关于此的信息:

由于大依赖,我们似乎达到了方法计数限制。 我会尽力找到解决办法。

编辑2:

我通过执行以下操作修复了它:

  • 从 /plugins/cordova-plugin-firebase/src/android/build.gradle 中删除第 5,6,7 行
  • 从 /plugins/cordova-plugin-firebase/src/android/build-extras.gradle 中删除第 1 行
  • 删除 /platforms/android 文件夹
  • 添加平台(cordova平台添加android)
  • 构建/运行(cordova 运行 android --device)

但是,我认为这仅在您已经通过另一个插件安装了“com.google.gms.google-services”时才有效。

关于多个 dex 文件定义 Lcom/google/firebase/FirebaseException:

这是由重复依赖项引起的,很可能是另一个也在使用 com.google 的插件。 gms:google-services 、Firebase SDK 或其中的一部分。 我自己没有测试过,但您应该能够列出项目中使用的所有依赖项并找到重复项:
http://stackoverflow.com/questions/30648172/gradle-library-duplicates-in-dependencies

在没有 ios 平台时使用 GoogleService-Info.plist 会导致“第二次构建错误”。 我建议仅在平台/ios 存在时才复制 GoogleService-Info.plist....

您可以修补 after_prepare.js 来解决这个问题,尽管我还没有测试过我的补丁。 如果有效,我会发布

@st8st8问题已经解决(在git版本上)

...
if(fileExists("GoogleService-Info.plist") && directoryExists("platforms/ios/")){
...

我刚才遇到了同样的问题,过了一会儿重新下载了 GoogleService-Info.plist 和 google-services.json 文件,它工作得很好。

我面临与离子相同的问题。 我通过删除平台和插件来解决这个问题,然后再次添加平台和插件,然后一切又完全正常了。
对于 ionic 2 中的这个问题,我编写了本教程

重新安装cordova-plugin-firebase对我有用

此页面是否有帮助?
0 / 5 - 0 等级