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 ๋Œ“๊ธ€

platform/andoid/res/values/strings.xml์— ์†์ž„์ˆ˜๋‚˜ ์ด์ƒํ•œ ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋นŒ๋“œํ•˜๊ธฐ ์ „์— cordova prepare android๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค(๊ทธ๊ฒƒ ์—†์ด๋„ ์ž‘๋™ํ•ด์•ผ ํ•จ).

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. string.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://github.com/arnesson/cordova-plugin-firebase/issues/11

@raducostea - APN(Apple ํ‘ธ์‹œ ์•Œ๋ฆผ)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งํฌ๋Š” https://github.com/phonegap-build/PushPlugin์ž…๋‹ˆ๋‹ค. iOS์—์„œ ๋งค์šฐ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@ dhruv270 ๋‚˜๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  Google ๋ถ„์„ ๋‚ด๋ถ€์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜: google-services.json ๋ฐ googleService-info.plist ๊ฐ€ ํ”Œ๋žซํผ ํด๋”์— ๋ณต์‚ฌ๋˜์–ด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ํด๋”์™€ json, plist๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
ํ”Œ๋žซํผ ํด๋”์™€ json, plist ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ•˜์ฐฎ์€ ์˜์–ด ์‹ค๋ ฅ์— ์ฃ„์†กํ•˜๋‹ค๋Š” ๋ง์”€์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

์˜ˆ, Firebase ์ฝ˜์†”์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจํ‚ค์ง€ ์ด๋ฆ„/๋ฒˆ๋“ค ID๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Android์˜ ๊ฒฝ์šฐ google-services.json, iOS์˜ ๊ฒฝ์šฐ GoogleService-Info.plist๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ”Œ๋žซํผ์ด๋‚˜ www๊ฐ€ ์•„๋‹Œ โ€‹โ€‹config.xml ๋“ฑ๊ณผ ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์— ํŒŒ์ผ์„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@raducostea @dhruv270 APN ๋ฐ ํ‘ธ์‹œ์— ๊ด€ํ•ด์„œ๋„ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. PushPlugin์€ ๊ฒฐ๊ตญ Firebase FCM์œผ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค(GCM์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ). FCM์€ IOS์šฉ APN์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋™์ผํ•˜์ง€๋งŒ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์ง€๋งŒ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. https://github.com/arnesson/cordova-plugin-firebase/issues/11 ํ™•์ธ

string.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 ํ”Œ๋žซํผ add android)
  • ๋นŒ๋“œ/์‹คํ–‰(cordova run 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๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ฑฐํ•˜๊ณ  ํ”Œ๋žซํผ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์‹œ ์™„์ „ํžˆ ์ •์ƒ์ž…๋‹ˆ๋‹ค.
ionic 2์˜ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

cordova-plugin-firebase ์žฌ์„ค์น˜๊ฐ€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰