Cordova-plugin-firebase: (Android) ์•Œ๋ฆผ์„ ํด๋ฆญํ•ด๋„ onNotificationOpen ์ฝœ๋ฐฑ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 09์›” 21์ผ  ยท  28์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: arnesson/cordova-plugin-firebase

์ฝ”๋ฅด๋„๋ฐ” 6.3.1
Phonegap Firebase ํ”Œ๋Ÿฌ๊ทธ์ธ 0.1.12
์žฅ์น˜: Android 6.0.1์ด ์„ค์น˜๋œ LG G5

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
`var ์•ฑ = {
// ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ์ž
์ดˆ๊ธฐํ™”: ํ•จ์ˆ˜() {
this.bindEvents();
},
// ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฐ”์ธ๋”ฉ
//
// ์‹œ์ž‘ ์‹œ ํ•„์š”ํ•œ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ด๋ฒคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
// '๋กœ๋“œ', '์žฅ์น˜ ์ค€๋น„', '์˜คํ”„๋ผ์ธ' ๋ฐ '์˜จ๋ผ์ธ'.
bindEvents: ํ•จ์ˆ˜() {
document.addEventListener('์žฅ์น˜ ์ค€๋น„', this.onDeviceReady, ๊ฑฐ์ง“);
},
// deviceready ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
//
// 'this'์˜ ๋ฒ”์œ„๋Š” ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. 'receivedEvent'๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด
// ํ•จ์ˆ˜, ์šฐ๋ฆฌ๋Š” ๋ช…์‹œ์ ์œผ๋กœ 'app.receivedEvent(...);'๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
onDeviceReady: ํ•จ์ˆ˜() {
console.log("Estamos en onDeviceReady");
if (navigator.connection.type == Connection.NONE) {
navigator.notification.alert('์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค');
} ๋˜ ๋‹ค๋ฅธ {
window.FirebasePlugin.onNotificationOpen(ํ•จ์ˆ˜(์•Œ๋ฆผ) {
console.log(์•Œ๋ฆผ);
navigator.notification.alert("๋ ˆ์‹œ๋น„๋„");
}, ํ•จ์ˆ˜(์˜ค๋ฅ˜) {
console.log(์˜ค๋ฅ˜);
});
}
},

};
์•ฑ ์ดˆ๊ธฐํ™”();`

๋‚˜๋Š” ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์‹œ์Šคํ…œ์˜ ํŠธ๋ ˆ์ด์—์„œ ์•Œ๋ฆผ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค: ๋ฐฑ๊ทธ๋ผ์šด๋“œ์˜ ์•ฑ, ํฌ๊ทธ๋ผ์šด๋“œ ๋ฐ ๋‹ซํžŒ ์•ฑ ๊ทธ๋ฆฌ๊ณ  ์•Œ๋ฆผ์„ ํด๋ฆญํ•˜๋ฉด ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ์— ์•ฑ์ด ์—ด๋ ค ์žˆ์ง€๋งŒ ์ฝœ๋ฐฑ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ „์ฒด onNotificationOpen ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ๊ฑฐ์˜ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์•Œ๋ฆผ์€ ํฌ๊ทธ๋ผ์šด๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ๋„์ฐฉํ•˜๊ณ  ์•Œ๋ฆผ์„ ์—ด๊ณ  ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์—์„œ onNotificationOpen ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์Œ).
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ์•Œ๋ฆผ์ด ๋„์ฐฉํ•˜๊ณ  ์•Œ๋ฆผ์ด ์—ด๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜๋˜๊ณ  onNotificationOpen ๊ฐ€ ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์Œ).

๋‚จ์€ ์œ ์ผํ•œ ๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ(์•„์ง ์‚ดํŽด๋ณด์ง€ ์•Š์€ ๊ฒฝ์šฐ) ์—ด ํ•„์š” ์—†์ด ์ฆ‰์‹œ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ฆผ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์•ฝ๊ฐ„์˜ Android ๋ฉ์ฒญํ•œ ์‚ฌ๋žŒ์ด๋ฏ€๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

OnNotificationOpe nReceiver:onReceive ์ด์ œ ๋‹จ์ˆœํžˆ ํ˜ธ์ถœ

FirebasePlugin.onBroadcastReceive(context, intent);

FirebasePlugin ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

  • callbackContext์—์„œ WeakReference ์ œ๊ฑฐ
  • onBroadcastReceive ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€, ์˜๋„ ๋ฐ์ดํ„ฐ๋ฅผ onNotificationOpen์— ์ „๋‹ฌ
  • onNewIntent ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€, ์˜๋„ ๋ฐ์ดํ„ฐ๋ฅผ onNotificationOpen์— ์ „๋‹ฌ
  • onNotificationOpen์˜ ์ด์ „ ๋ฒ„์ „์„ ๋ณต์›ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

    • WeakReference ๋ผ์ธ ์ œ๊ฑฐ

    • PluginResult๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝœ๋ฐฑ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด setKeepCallback(true)์„ ํ˜ธ์ถœํ•˜์—ฌ ์ฒซ โ€‹โ€‹๋ฒˆ์งธ ํ˜ธ์ถœ ํ›„ ์ฝœ๋ฐฑ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    private static CallbackContext callbackContext;
    // ...
    private void registerOnNotificationOpen(final CallbackContext callbackContext) {
        FirebasePlugin.callbackContext = callbackContext;
    }

    // called when in foreground
    public static void onBroadcastReceive(Context context, Intent intent) {
        Log.d("FirebasePlugin", "onBroadcastReceive");
        Bundle data = intent.getExtras();
        FirebasePlugin.onNotificationOpen(data);
    }

    // called when in background
    <strong i="32">@Override</strong>
    public void onNewIntent(Intent intent) {
        Log.d(TAG, "new intent " + intent);
        super.onNewIntent(intent);
        FirebasePlugin.onNotificationOpen(intent.getExtras());
    }

    public static void onNotificationOpen(Bundle bundle) {
        if (FirebasePlugin.callbackContext == null ) {
            Log.d("FirebasePlugin", "no callback context, onNotificationOpen ignored");
            return;
        }
        if (callbackContext != null && bundle != null) {
            JSONObject json = new JSONObject();
            Set<String> keys = bundle.keySet();
            for (String key : keys) {
                try {
                    json.put(key, bundle.get(key));
                } catch (JSONException e) {
                    Log.d("FirebasePlugin", "onNotificationOpen: json exception");
                    PluginResult result = new PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage());
                    result.setKeepCallback(true);
                    callbackContext.sendPluginResult(result);
                    return;
                }
            }
            Log.d("FirebasePlugin", "onNotificationOpen: send notification to javascript");
            PluginResult result = new PluginResult(PluginResult.Status.OK, json);
            result.setKeepCallback(true);
            callbackContext.sendPluginResult(result);
        }
    }

๋ชจ๋“  28 ๋Œ“๊ธ€

๋™์ผํ•œ ๋ฌธ์ œ, Android ์•Œ๋ฆผ์ด ๋„์ฐฉํ•˜์ง€๋งŒ ์•ฑ ๋‚ด๋ถ€์—์„œ๋Š” ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
v. 0.1.12

@voidbrain @Kibukita ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์—์„œ ์ตœ์‹  ๋ฒ„์ „์„ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. ๊ณต๊ฐœ ์•Œ๋ฆผ์„ ๊ฐœ์„ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@BugsBunnyBR ๋ฐฉ๊ธˆ ์ตœ์‹  ๋ฒ„์ „์˜

@superheroben , ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ƒ˜ํ”Œ์„ ์ €์žฅ์†Œ์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•Œ๋ฆผ์„ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ฃผ์ œ ๋ฉ”์‹œ์ง€๋กœ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
getInstanceId() ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜๊ณ  ์•Œ๋ฆผ์ด ๋„์ฐฉํ•˜์ง€๋งŒ onNotificationOpen()์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ:

if (window.FirebasePlugin)
{
  window.FirebasePlugin.getInstanceId(
    function(token) {
        thiss.saveToken(token);
    }, 
    function(error) {
        console.log(error);
    }
  );

  window.FirebasePlugin.onNotificationOpen(
    function(notification) {                  
      alert("Yeah!!!");                  
    }, 
    function(error) {
      alert("Error!");
      console.error(error);
    }
  );

  window.FirebasePlugin.grantPermission();
}

๋‚ด ์•Œ๋ฆผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ:

(
    [to] => (device token)
    [notification] => Array
        (
            [title] => Title
            [text] => Test message
            [sound] => default
            [vibrate] => 1
            [badge] => 2
        )
)

๋‚ด ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ(PHP):

$jsonData = json_encode($data);

$ch     = curl_init("https://fcm.googleapis.com/fcm/send");
$header = array(
    'Content-Type: application/json',
    "Authorization: key=".MY_GCM_API_KEY
);

curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, true);
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);

$result = curl_exec($ch);
curl_close($ch);

Cordova Android 5.2.2์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋œ ๊ธฐ๊ธฐ๋Š” Android 4.4.2๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒ„์ „ 0.1.12.

@arivanbastos , github ์ €์žฅ์†Œ๋ฅผ ๊ฐ€๋ฆฌ์ผœ

github์—์„œ ์„ค์น˜ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

cordova plugin remove cordova-plugin-firebase
cordova plugin add https://github.com/arnesson/cordova-plugin-firebase/

์ด์ œ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ onNotificationOpen() ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
์•ฑ์ด ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ ์•Œ๋ฆผ์ด ๋„์ฐฉํ•˜๊ณ  onNotificationOpen()์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ฑ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์Œ:
์‚ฌ์šฉ์ž๋Š” ์žฅ์น˜ ์ž์ฒด์— ๋Œ€ํ•œ ์•Œ๋ฆผ ์—†์ด JavaScript ์ฝœ๋ฐฑ์—์„œ ์•Œ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค(์ด๋Š” ํ‘ธ์‹œ ์•Œ๋ฆผ์˜ ์ผ๋ฐ˜์ ์ธ ๋™์ž‘์ด๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Œ)

๋ฐ์ดํ„ฐ ๋ณธ๋ฌธ ์—†์ด "์•Œ๋ฆผ" ์œ ํ˜•์˜ ํ‘ธ์‹œ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ์•ฑ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์•Œ๋ฆผ ๋ฐ์ดํ„ฐ์— "๋ฐ์ดํ„ฐ" ์„น์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

(
    [to] => (device token)
    [notification] => Array
        (
            [title] => Title
            [text] => Test message
        )
    [data] => Array
        (
            [test] => 1
        )
)

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

"์•Œ๋ฆผ" ์„น์…˜์˜ ์ด๋ฆ„์„ "๋ฐ์ดํ„ฐ"๋กœ ๋ฐ”๊พธ๋ฉด ์•Œ๋ฆผ์ด ๋„์ฐฉํ•  ๋•Œ ์•ฑ์ด ์ถฉ๋Œ("์•ฑ์ด ์ค‘์ง€๋จ")๋ฉ๋‹ˆ๋‹ค.

(
    [to] => (device token)
    [data] => Array
        (
            [title] => Title
            [text] => Test message
        )
)

https://firebase.google.com/docs/cloud-messaging/android/receive
์—ฌ๊ธฐ ์•„์ฃผ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์•Œ๋ฆผ์ด ์‹œ์Šคํ…œ ํŠธ๋ ˆ์ด๋กœ ์ด๋™ํ•˜๊ณ  ์•ฑ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ๊ฒฝ์šฐ onMessageReceived()๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”์‹œ์ง€์— ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ํ•ญ์ƒ onMessageReceived()๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

onMessageReceived() ๊ตฌํ˜„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ํ•ด์„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ถ”์ถœ
  • NotificationBuilder๋กœ ์•Œ๋ฆผ ์ž‘์„ฑ
  • NotificationManager๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ

NotificationManager.notify(id, notification)๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„์— ํ‘œ์‹œ๋  ์•Œ๋ฆผ์„ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ FCM์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์ƒํƒœ ํ‘œ์‹œ์ค„์— ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์•ฑ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ  ์ฝœ๋ฐฑ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Android ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์•„๋งˆ๋„ ํ‹€๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์„ค๋ช… ๋œ ๋™์ž‘์€ ๊ทธ๊ฒƒ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
BugsBunnyBR์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์—์„œ arivanbastos๊ฐ€ github ์ €์žฅ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝœ๋ฐฑ์„ ๊ฐ€์ ธ์˜ด์„ ์„ค๋ช…ํ•˜๋Š” OnNotificationOpenReceiver๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์•Œ๋ฆผ์€ ํ…์ŠคํŠธ ๋˜๋Š” ์ œ๋ชฉ(์•Œ๋ฆผ ๋˜๋Š” ๋ฐ์ดํ„ฐ)์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ (OnNotificationOpenReceiver ๋ฐ NotificationManager๋กœ) ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, StatusBar์— ํ‘œ์‹œ๋˜๋Š” NotificationManager์— ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์•ฑ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@arivanbastos
๋‚ด๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ๋ญ”๊ฐ€ ์ž˜๋ชป ๋งํ–ˆ๋‹ค. ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค.
์ด repo ๋ฒ„์ „์„ ๊ฐ€๋ฆฌ์ผœ ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

@packowitz ๋ฐ @robertarnesson . ์ข‹์•„, ๋‚ด ๊ตฌํ˜„์€ ํ•ญ์ƒ* ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” Firebase ์ž๋™ ํ‘œ์‹œ ์•Œ๋ฆผ ๋˜๋Š” onMessageReceived ๋‚ด๋ถ€์˜ ๋นŒ๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
onNotificationOpen ์ฝœ๋ฐฑ์€ onMessageReceived ๊ฐ€ ํ˜ธ์ถœ๋˜๊ฑฐ๋‚˜ ์•Œ๋ฆผ์— ๋ฐ์ดํ„ฐ ๋ฐ ์•Œ๋ฆผ ๋ณธ๋ฌธ์ด ๋™์‹œ์— ์žˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. onNotificationOpen ๋ฅผ ์†Œ๊ฐœํ•œ ํ™๋ณด ์—์„œ ๋‚˜๋Š” ์•Œ๋ฆผ ์œ ํ˜•์˜ ํ‘ธ์‹œ ์•Œ๋ฆผ์ด ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ฝœ๋ฐฑ์„ ๊ฐ์ง€ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ญ์ƒ ๋ฐ์ดํ„ฐ ๋ณธ๋ฌธ๊ณผ ์•Œ๋ฆผ ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•ญ์ƒ ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ํ‘œ์ค€ Firebase ์•Œ๋ฆผ ๋™์ž‘์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ Android ์•ฑ ๊ฐœ๋ฐœ์ž๋Š” ์•ฑ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์‹œ์Šคํ…œ ํŠธ๋ ˆ์ด์— ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ฑ„ํŒ… ์•ฑ๊ณผ ๊ฐ™์ด ์ด๋Ÿฌํ•œ ๋™์ž‘์ด ์ข‹์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Android ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ฑ„ํŒ… ์•ฑ ์š”๊ตฌ ์‚ฌํ•ญ์ด๋‚˜ Firebase ์ค€์ˆ˜ ์—ฌ๋ถ€์— ๋Œ€ํ•ด์„œ๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1) ์•ฑ์ด ์—ด๋ ธ์„ ๋•Œ ์„ค์ •๋  ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ "์–ด์ด, ์•ฑ์ด ์—ด๋ ค ์žˆ์„ ๋•Œ๋„ ์•Œ๋ฆผ์„ ๋ณด์—ฌ์คฌ์œผ๋ฉด ํ•ด"๋ผ๊ณ  ๋งํ•˜์—ฌ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์„ ์—ด ๋•Œ ํ•ญ์ƒ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ €์žฅ์†Œ์— ์œ ์ง€๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

2) ์ด ์ค„์— ์ฃผ์„์„ ๋‹ฌ๊ณ  ์•ฑ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ ์•Œ๋ฆผ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

_ํ•ญ์ƒ_ -> ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์•Œ๋ฆผ ๋ณธ๋ฌธ์—์„œ "ํ…์ŠคํŠธ" ๋˜๋Š” "์ œ๋ชฉ"์„ ์ฐพ๋Š” ๊ฒฝ์šฐ.

@BugsBunnyBR ๋‚˜๋Š” ํ–‰๋™์„ ์„ ํƒํ•  ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
JS ์ฝœ๋ฐฑ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” OnNotificationOpenReceiver์—์„œ NotificationManager๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๋ฉ”์‹œ์ง€์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ํ™•์ธ์„ ๋„์ž…ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์•Œ๋ฆผ์„ ์œ„ํ•ด์„œ๋Š” ๊นƒ๋ฐœ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@BugsBunnyBR ๋ฐฉ๊ธˆ github
๊ทธ๋Ÿฌ๋‚˜ ์ฝœ๋ฐฑ์€ ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ;)

์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ฒ„์ „ 0.1.13์œผ๋กœ ์ธํ•ด ์•ฑ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ ์•ฑ์ด ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ 0.1.12๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ฆผ์€ repo ๋ฒ„์ „์—์„œ ํ˜„๋ช…ํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์•Œ๋ฆผ์ด ์—ด๋ฆฌ๊ธฐ ์ „์— onNotificationOpen ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋ฌด์‹œ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/android/FirebasePlugin.java#L123

registerOnNotificationOpen ์—์„œ notificationBundle ๋Œ€๊ธฐ ์ค‘์ธ ๊ฒฝ์šฐ์—๋งŒ ์ฝœ๋ฐฑ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๊ฒฝ์šฐ ์•ฑ์ด ๋‹ค์‹œ ๋กœ๋“œ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์œ ๋Š” OnNotificationOpenReceiver ์— ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/android/OnNotificationOpenReceiver.java#L17

onNotificationOpen ์ฝœ๋ฐฑ์ด ๋“ฑ๋ก๋  ๋•Œ notificationBundle ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ๋กœ๋“œํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด onNotificationOpen ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ๊ฑฐ์˜ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์•Œ๋ฆผ์€ ํฌ๊ทธ๋ผ์šด๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ๋„์ฐฉํ•˜๊ณ  ์•Œ๋ฆผ์„ ์—ด๊ณ  ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์—์„œ onNotificationOpen ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์Œ).
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ์•Œ๋ฆผ์ด ๋„์ฐฉํ•˜๊ณ  ์•Œ๋ฆผ์ด ์—ด๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜๋˜๊ณ  onNotificationOpen ๊ฐ€ ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์Œ).

๋‚จ์€ ์œ ์ผํ•œ ๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ(์•„์ง ์‚ดํŽด๋ณด์ง€ ์•Š์€ ๊ฒฝ์šฐ) ์—ด ํ•„์š” ์—†์ด ์ฆ‰์‹œ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ฆผ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์•ฝ๊ฐ„์˜ Android ๋ฉ์ฒญํ•œ ์‚ฌ๋žŒ์ด๋ฏ€๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

OnNotificationOpe nReceiver:onReceive ์ด์ œ ๋‹จ์ˆœํžˆ ํ˜ธ์ถœ

FirebasePlugin.onBroadcastReceive(context, intent);

FirebasePlugin ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

  • callbackContext์—์„œ WeakReference ์ œ๊ฑฐ
  • onBroadcastReceive ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€, ์˜๋„ ๋ฐ์ดํ„ฐ๋ฅผ onNotificationOpen์— ์ „๋‹ฌ
  • onNewIntent ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€, ์˜๋„ ๋ฐ์ดํ„ฐ๋ฅผ onNotificationOpen์— ์ „๋‹ฌ
  • onNotificationOpen์˜ ์ด์ „ ๋ฒ„์ „์„ ๋ณต์›ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

    • WeakReference ๋ผ์ธ ์ œ๊ฑฐ

    • PluginResult๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝœ๋ฐฑ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด setKeepCallback(true)์„ ํ˜ธ์ถœํ•˜์—ฌ ์ฒซ โ€‹โ€‹๋ฒˆ์งธ ํ˜ธ์ถœ ํ›„ ์ฝœ๋ฐฑ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    private static CallbackContext callbackContext;
    // ...
    private void registerOnNotificationOpen(final CallbackContext callbackContext) {
        FirebasePlugin.callbackContext = callbackContext;
    }

    // called when in foreground
    public static void onBroadcastReceive(Context context, Intent intent) {
        Log.d("FirebasePlugin", "onBroadcastReceive");
        Bundle data = intent.getExtras();
        FirebasePlugin.onNotificationOpen(data);
    }

    // called when in background
    <strong i="32">@Override</strong>
    public void onNewIntent(Intent intent) {
        Log.d(TAG, "new intent " + intent);
        super.onNewIntent(intent);
        FirebasePlugin.onNotificationOpen(intent.getExtras());
    }

    public static void onNotificationOpen(Bundle bundle) {
        if (FirebasePlugin.callbackContext == null ) {
            Log.d("FirebasePlugin", "no callback context, onNotificationOpen ignored");
            return;
        }
        if (callbackContext != null && bundle != null) {
            JSONObject json = new JSONObject();
            Set<String> keys = bundle.keySet();
            for (String key : keys) {
                try {
                    json.put(key, bundle.get(key));
                } catch (JSONException e) {
                    Log.d("FirebasePlugin", "onNotificationOpen: json exception");
                    PluginResult result = new PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage());
                    result.setKeepCallback(true);
                    callbackContext.sendPluginResult(result);
                    return;
                }
            }
            Log.d("FirebasePlugin", "onNotificationOpen: send notification to javascript");
            PluginResult result = new PluginResult(PluginResult.Status.OK, json);
            result.setKeepCallback(true);
            callbackContext.sendPluginResult(result);
        }
    }

ํ ... ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹คํ–‰ ์ค‘์ด ์•„๋‹ ๋•Œ(์ข…๋ฃŒ๋จ) ์•Œ๋ฆผ์ด (์žฅ์น˜๋กœ) ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

Firebase์—์„œ ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” ์•Œ๋ฆผ์„ ์—ด๊ณ  ๋™์ž‘์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ์ฃผ์š” ํ™œ๋™์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€์—ฐ ๋ผ์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. 0.1.13์œผ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•Œ๋ฆผ์ด ์—ด๋ฆฐ ํ›„ ์•ฑ์ด ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์†Œ์‹?

0.1.17์„ ์‚ฌ์šฉํ•˜๋Š” Android์—์„œ onNotificationOpen ์ฝœ๋ฐฑ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์žˆ๋Š” API ๋˜๋Š” GUI๋ฅผ ํ†ตํ•œ ์ „์†ก์€ ๋ชจ๋‘ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ œ์•ˆ?

@Mehuge๊ฐ€ ๊ฒŒ์‹œํ•œ ํ•ด๋‹น ์ฝ”๋“œ๋กœ pull ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Android์—์„œ๋Š” ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ •์ƒ์ ์ธ ์‹คํ–‰ ์˜๋„๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด FirebasePlugin์—์„œ onNewIntent๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ ๋‚ด onNewIntent ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<strong i="6">@Override</strong>
public void onNewIntent(Intent intent) {
  Log.d(TAG, "new intent " + intent);
  super.onNewIntent(intent);
  Bundle data = intent.getExtras();
  if (data != null) {
    String id = data.getString("id");
    if (null != id) {
      FirebasePlugin.handleNotificationBundle(data);
    } else {
      Log.d(TAG, "Not a notification intent, ignored");
    }
  }
}

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์™„์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์„œ๋ฒ„ ์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ๋ณด๋‚ด๋Š” ์˜๋„ ๋ฒˆ๋“ค์—์„œ id ์†์„ฑ์„ ์ฐพ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ/๋ฉ”์‹œ์ง€๋กœ ์˜๋„๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒˆ๋“ค์— GCM ๋˜๋Š” FBM์ด ์•ˆ์ •์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์ผ๋ถ€ Google ์†์„ฑ์ด ์ถ”๊ฐ€๋˜์ง€๋งŒ(ํŠธ๋ ˆ์ด์—์„œ ์•Œ๋ฆผ์„ ์—ฌ๋Š” ๊ฒฝ์šฐ) ๋ฉ”์‹œ์ง€ ๋ฐ ์•Œ๋ฆผ์ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ์— ์ง์ ‘ ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ์˜๋„์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฉ”์‹œ์ง€์˜ ๋ฐ์ดํ„ฐ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜ ์•Œ๋ฆผ ๋•Œ๋ฌธ์—.

์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Mehuge ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ๋กœ ์š”์ ์„ ๋งŒ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ž, ์—ฌ๊ธฐ https://gist.github.com/Mehuge/374ee24d9e18a6c7ccc171d3e521b7ad์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ๊ธฐ์—๋Š” ์šฐ๋ฆฌ ์•ฑ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋น„ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ๋กœ ์˜ฎ๊ธฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ์ด์ผœ ์ƒ๊ฐํ•ด๋ณด๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํฌํฌํ•˜๊ณ  ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ˆ˜์ •ํ–ˆ์–ด์•ผ ํ–ˆ์ง€๋งŒ ์ด ์‹œ์ ์—์„œ ์ €๋Š” ์ผ์ •์ด ๋„ˆ๋ฌด ๋Šฆ์–ด์„œ ๋ชจ๋“  ๊ฒƒ์— ์ง€์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋น„ํŠธ๋Š” ์ƒ๋‹นํžˆ ๋ช…ํ™•ํ•˜๋ฏ€๋กœ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‚ด๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋œ ์‹œ๊ฐ„(๋˜๋Š” ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ ์ผ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)์„ ์•Œ์•„์•ผ ์•Œ๋ฆผ์„ ์ƒ์„ฑํ• ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Android ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํฌ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ ์ „์†ก๋˜๋Š” ์•Œ๋ฆผ์„ ์›ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ฒ˜๋ฆฌํ•  ํด๋ผ์ด์–ธํŠธ์— ์ง์ ‘ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์— ํด๋ผ์ด์–ธํŠธ์˜ ์ผ์‹œ ์ค‘์ง€ ์ƒํƒœ๋ฅผ ์•Œ๋ฆฌ๋ ค๋ฉด ๊ธฐ๋ณธ ํ™œ๋™์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

<strong i="9">@Override</strong>
protected void onResume() {
    FirebasePlugin.setPaused(false);
    super.onResume();
}

<strong i="10">@Override</strong>
protected void onPause() {
    FirebasePlugin.setPaused(true);
    super.onPause();
}

ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ๋™์•ˆ ๋„์ฐฉํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ Android ์•Œ๋ฆผ์„ ์—ฌ๋Š” ๋Œ€์‹  ์•ฑ์„ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์•ฑ์˜ ๊ฒฝ์šฐ ์—ด์ง€ ์•Š์€ ์•Œ๋ฆผ์„ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ƒํ™ฉ์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ์— ์™„์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ถ”๊ฐ€๋œ ์ถ”๊ฐ€ ํ‚ค ์ค‘ ์ผ๋ถ€๋Š” ์‹คํ—˜์ ์ด์—ˆ๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ œ๊ฑฐํ•˜์ง€ ์•Š์•˜์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์ด๋‚˜ ์ œ์•ˆ๋œ ๊ฐœ์„  ์‚ฌํ•ญ ๋˜๋Š” ๊ฒฐํ•จ์„ ์ง€์ ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํŠนํžˆ ์ผ๋ฐ˜ ์ถœ์‹œ์—์„œ GCM ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ์‹œ ์˜๋„๋ฅผ ๋” ์ž˜ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Google ์†์„ฑ์€ ํŠน์ • ์ƒํ™ฉ์—์„œ๋งŒ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์•Œ๋ฆผ(is_push, is_notify, broadcast)์„ ๊ฐ์ง€ํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

#108 ์ฐธ์กฐ

๋‚˜๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์ฒญ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "registration_ids": [...tokens],
  "notification" : {
        "title": "Notf title",
        "body": "Notification body"
     },
     "data": {
        "click_action": "/call/dwEugLJ9PTVdcFb064CX"
     }
}

๊ทธ๋Ÿฌ๋‚˜ click_action์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜๋™์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค(์ €๋Š” react ์•ฑ๊ณผ ํ•จ๊ป˜ cordova๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค).

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