FCM กับ AWS SNS


95

ฉันกำลังใช้AWSทรัพยากรสำหรับโปรเจ็กต์ Android ของฉันฉันวางแผนที่จะเพิ่มบริการแจ้งเตือนแบบพุชสำหรับโปรเจ็กต์ของฉันด้วยAWS SNSมีคำถามสองสามข้อที่รบกวนฉันมาก ฉันไม่พบคำถามใด ๆ เกี่ยวกับสิ่งเหล่านี้ยกเว้นหนึ่งหรือสองข้อ แต่มีคำอธิบายที่ไม่ชัดเจน

1. ไม่AWSรองรับFCM? SNSทำงานกับGCM. แต่ Google ขอแนะนำให้ใช้ FCM GCMแทน ฉันไม่พบการสนับสนุนAWSFCM

2. AWSเก็บข้อความ (หรือข้อมูล) ไว้ในฐานข้อมูลแม้ว่าจะส่งการแจ้งเตือนแบบพุชแล้วก็ตาม?

3. ฉันลองใส่คีย์ FCM api ในแพลตฟอร์มแอปพลิเคชัน SNS มันแสดงพารามิเตอร์ที่ไม่ถูกต้องทำไม?


SNS ยังไม่รองรับ FCM ใช้ GCM เวอร์ชันที่เลิกใช้แล้ว คุณได้รับคีย์ API จากที่ไหน
— Arthur Thompson

1
สิ่งที่ฉันลองคือฉันพยายามใส่คีย์ api ของ FCM ใน SNS และไม่ได้ผลหลังจากอ่านเอกสารใน AWS (SNS) ที่พวกเขากล่าวถึงเพื่อใส่รหัสเซิร์ฟเวอร์ ฉันลองแล้วได้ผลดี ฉันสามารถส่งข้อความ Push ผ่าน SNS สำหรับ FCM ได้ ไม่รู้เหตุผลว่าทำไมถึงได้ผล แน่ใจหรือว่า SNS ไม่รองรับ FCM ในขณะนี้
— Naroju

ถูกต้องว่าต้องใช้คีย์เซิร์ฟเวอร์ในการส่งข้อความ GCM (ตอนนี้คือ FCM) ในฝั่งไคลเอ็นต์ (อุปกรณ์เคลื่อนที่) โดยทั่วไป GCM และ FCM จะเหมือนกันดังนั้นทั้งสองจะได้รับข้อความตามที่คาดไว้ อย่างไรก็ตามมีคุณสมบัติบางอย่างของ FCM ที่ใช้งานไม่ได้เช่นการส่งข้อความตามหัวข้อ
— Arthur Thompson

เป็นไปได้ไหมที่จะใช้หัวข้อ sns กับ fmc ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม
— Juan Jose Tugores

ประโยชน์ของการใช้ SNS ในตอนแรกคืออะไร? FCM ไม่ควรเพียงพอหรือไม่?
— Khaled Osman

คำตอบ:


194

FCM เข้ากันได้กับ GCM ขั้นตอนในการตั้งค่า FCM บน AWS จะเหมือนกับขั้นตอนการตั้งค่า GCMและ (อย่างน้อยก็ในขณะนี้) FCM ทำงานอย่างโปร่งใสกับ GCM และ SNS ในส่วนที่เกี่ยวกับการกำหนดค่าฝั่งเซิร์ฟเวอร์

แต่ถ้าคุณกำลังส่งdatapayloads กับอุปกรณ์ Android ที่พวกเขาจะไม่สามารถดำเนินการจนกว่าคุณจะใช้บริการด้านลูกค้าFirebaseMessagingServiceที่ขยาย ตัวสร้างข้อความ JSON เริ่มต้นในคอนโซล AWS จะส่งdataข้อความซึ่งแอปของคุณจะไม่สนใจเว้นแต่จะใช้บริการดังกล่าวข้างต้น ในการหลีกเลี่ยงปัญหานี้สำหรับการทดสอบเบื้องต้นคุณสามารถจัดเตรียมเพย์notificationโหลดที่กำหนดเองซึ่งอุปกรณ์ของคุณจะได้รับ (ตราบใดที่แอปของคุณไม่ได้อยู่เบื้องหน้า)

มีคำแนะนำในการย้ายข้อมูล GCM-FCM ที่จัดทำโดย Google อย่างไรก็ตามการเปลี่ยนแปลงที่คุณต้องทำส่วนใหญ่จะอยู่ที่ฝั่งแอป

ขั้นตอนที่คุณต้องปฏิบัติตามเพื่อทดสอบ GCM / FCM บนแอปของคุณด้วย SNS ได้แก่

  1. สร้างแอปพลิเคชันแพลตฟอร์มใน SNSเลือก Google Cloud Messaging (GCM) เป็นแพลตฟอร์มการแจ้งเตือนแบบพุชและระบุคีย์เซิร์ฟเวอร์ APIของคุณในฟิลด์คีย์ API
  2. เลือก Application Platform และคลิกที่ปลายทางสร้างแพลตฟอร์มปุ่ม
  3. ระบุ InstanceID ( โทเค็นอุปกรณ์ ) ที่สร้างโดยแอปของคุณ คุณต้องขยายFirebaseInstanceIDServiceและแทนที่onTokenRefreshวิธีการเพื่อดูสิ่งนี้ภายในแอป Android ของคุณ เมื่อคุณดำเนินการเสร็จสิ้นแล้วให้ถอนการติดตั้งและติดตั้งแอปของคุณใหม่และโทเค็นของคุณควรถูกพิมพ์ไปยังคอนโซลการแก้ปัญหาใน Android Studio ในการบูตครั้งแรก
  4. คลิกเพิ่มปลายทางปุ่ม
  5. คลิกที่ลิงค์ ARN สำหรับแอปพลิเคชันแพลตฟอร์มของคุณ
  6. เลือกปลายทางที่สร้างขึ้นใหม่สำหรับอุปกรณ์ของคุณและคลิกที่เผยแพร่ไปยังปลายทางปุ่ม
  7. เลือก JSON รูปแบบข้อความและคลิกที่กำเนิดข้อความ JSONปุ่ม
  8. ใส่ข้อความทดสอบและคลิกJSON สร้างปุ่ม
  9. ตอนนี้ "ส่วน gotcha" มาแล้ว

ข้อความที่สร้างโดย SNS จะอยู่ในรูปแบบ:

{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}

ดังที่เราได้กล่าวไว้ก่อนหน้านี้datapayloads จะถูกละเว้นหากไม่มีการนำบริการมาใช้ เราต้องการทดสอบโดยไม่ต้องเขียนโค้ดมากเกินไปดังนั้นเราควรส่งnotificationpayload แทน ในการดำเนินการนี้เพียงแค่เปลี่ยนข้อความ JSON เพื่ออ่าน:

{
"GCM": "{ \"notification\": { \"text\": \"test message\" } }"
}

เมื่อคุณได้กระทำนี้ให้แน่ใจว่าแอปของคุณไม่ได้ทำงานบนอุปกรณ์และตีเผยแพร่ข้อความปุ่ม ตอนนี้คุณควรเห็นการแจ้งเตือนปรากฏขึ้นบนอุปกรณ์ของคุณ

แน่นอนคุณสามารถทำทั้งหมดนี้โดยใช้โปรแกรมผ่าน Amazon SNS API อย่างไรก็ตามตัวอย่างทั้งหมดดูเหมือนจะใช้เพย์dataโหลดดังนั้นคุณต้องคำนึงถึงสิ่งนั้นและสร้างข้อมูลที่เหมาะสมกับกรณีการใช้งานของคุณ


2
คำตอบที่ยอดเยี่ยมขอบคุณ เป็นที่น่าสังเกตว่า json มีรายละเอียดเชิงลึกเกี่ยวกับตัวเลือกการกำหนดค่าโปรดดูdeveloper.google.com/cloud-messaging/concept-optionsแม้ว่าฉันจะยังไม่ได้ทดสอบฟังก์ชันการทำงานเฉพาะ FCM ก็ตาม
— ทอม

dataข้อความทำงานได้ดีโดยใช้ sns แม้ว่าแอปไคลเอ็นต์จะไม่ใช้ FCM แต่เป็น GCM ในแอปของฉันฉันไม่ได้อัปเกรดเป็น FCM ในฝั่งไคลเอ็นต์ แต่ FCM ที่ใช้ SNS ก็ใช้ได้ดีกับdataข้อความเช่นกัน มันไม่ควรทำงาน?
— Sash_KP

2
SNS ใช้ GCM ดังนั้นหากคุณใช้ไคลเอ็นต์ GCM ควรทำงานตามปกติ (จนถึงจุดที่ Google ตัดสินใจเลิกใช้ GCM) คำถามนี้เกี่ยวข้องกับการสนับสนุน FCM บน AWS (ซึ่งรองรับผ่านความเข้ากันได้แบบย้อนหลังในฝั่ง Google API)
— Nathan Dunn

เป็นไปได้ไหมที่จะใช้หัวข้อ sns กับ fmc ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม
— Juan Jose Tugores

ยินดีต้อนรับ - ใช่คุณสามารถสมัครจุดสิ้นสุดการพุชมือถือทีละรายการ (เช่น GCM-> FCM) ไปยังหัวข้อ SNS ได้ตามปกติอย่างไรก็ตามสิ่งนี้จะสร้างข้อความจำนวนมากภายใน AWS หากคุณใช้ฝั่งไคลเอ็นต์ FCM อีกทางเลือกหนึ่งคือการใช้หัวข้อ FCM หรือกลุ่มผู้ใช้ซึ่งจะเดินทางผ่านเซิร์ฟเวอร์ของ Google เท่านั้น
— Nathan Dunn

14

ตอนนี้คุณสามารถไปที่คอนโซล firebase ของคุณ ( https://console.firebase.google.com/ ) เลือกโครงการของคุณคลิกไอคอนรูปเฟืองและเลือกการตั้งค่าโครงการจากนั้นคลิกที่แท็บข้อความบนคลาวด์ ...

คุณจะเห็นรหัสเซิร์ฟเวอร์เดิมซึ่งเป็นคีย์ API ของ GCM และคุณจะมีตัวเลือกในการสร้างคีย์เซิร์ฟเวอร์ใหม่ซึ่งเป็นเวอร์ชัน FCM

SNS จะยอมรับทั้งสองเวอร์ชัน แต่ตัวเลือกเมนูยังคงจัดหมวดหมู่ภายใต้ GCM

นี่คือภาพสำหรับการอ้างอิงของคุณ:

ป้อนคำอธิบายภาพที่นี่

โปรดทราบว่าคุณสามารถ "ลบคีย์เซิร์ฟเวอร์" โดยไม่ได้ตั้งใจ แต่ไม่สามารถลบคีย์เซิร์ฟเวอร์เดิมได้ นอกจากนี้หากคุณคลิกปุ่มเพิ่มคีย์เซิร์ฟเวอร์คุณจะได้รับคีย์เซิร์ฟเวอร์ใหม่ด้านล่างคีย์แรกโดยไม่มีคำเตือน! ... เยี่ยมมาก Google;)


6

อีกหนึ่งข้อสังเกตเพิ่มเติมสำหรับคำตอบที่ยอดเยี่ยมของ Nathan Dunn วิธีส่งข้อมูลด้วยการแจ้งเตือนจาก SNS ไปยัง Firebase

เราจำเป็นต้องเพิ่มข้อมูลใน Json (ภายในการแจ้งเตือน):

{
    "default": “any value", 
     "GCM": "{ \"notification\": { \"body\": \”message body\”, \”title\”: \”message title \”, \"sound\":\"default\" } , \"data\" : {\”key\" : \”value\", \”key2\" : \”value\” } }”
}

ในการใช้งาน FirebaseMessagingService ของคุณ (ตัวอย่าง Xamarin)

public override void OnMessageReceived(RemoteMessage message)
{

    try
    {

        var body = message?.GetNotification()?.Body;
        var title = message?.GetNotification()?.Title;
        var tag = message?.GetNotification()?.Tag;
        var sound = message?.GetNotification()?.Sound;

        var data = message?.Data
        foreach (string key in data.Keys)
        {
            // get your data values here
        }

    }
    catch (Exception e)
    {
    }
}

โทเค็น FCM อยู่ที่ไหน
— JPM

ฉันจะส่ง URL รูปภาพใน payload ได้อย่างไร
— tarek noaman

5

ฉันพยายามใช้โซลูชันกับเพย์โหลดการแจ้งเตือนแทนข้อมูล แต่ฉันไม่ได้รับการแจ้งเตือนแบบพุชบนอุปกรณ์มือถือ ฉันพบบทช่วยสอนนี้https://youtu.be/iBTFLu30dSgพร้อมคำบรรยายภาษาอังกฤษเกี่ยวกับวิธีใช้ FCM กับ AWS SNS ทีละขั้นตอนและตัวอย่างวิธีส่งการแจ้งเตือนแบบพุชจากคอนโซล AWS และนำไปใช้บน php ด้วย aws php sdk มันช่วยฉันได้มาก


3

หมายเหตุเพิ่มเติมสำหรับคำตอบของ Nathan Dunn: ในการเพิ่มเสียงให้ใช้ข้อความ JSON ต่อไปนี้

{
"GCM": "{ \"notification\": { \"text\": \"test message\",\"sound\":\"default\" } }"
}

ฉันจะส่ง URL รูปภาพใน payload ได้อย่างไร
— tarek noaman

0

ฉันใช้เวลาสักพักในการหาวิธีส่งการแจ้งเตือนด้วยเพย์โหลดที่ถูกต้อง (เผยแพร่ในหัวข้อ) เลยจะเอามาฝากค่ะ

private void PublishToTopic(string topicArn)
{
    AmazonSimpleNotificationServiceClient snsClient = 
           new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.EUWest1);
    PublishRequest publishRequest = new PublishRequest();
    publishRequest.TopicArn = topicArn;
    publishRequest.MessageStructure = "json";
    string payload = "\\\"data\\\":{\\\"text\\\":\\\"Test \\\"}";
    publishRequest.Message = "{\"default\": \"default\",\"GCM\":\"{" + payload + "}\"}";
    PublishResponse publishResult = snsClient.Publish(publishRequest);
}    

0

Amazon รองรับ FCM เนื่องจากมีการย้ายรหัสก่อนหน้าทั้งหมดจาก GCM ไปยัง FCM บทความด้านล่างอธิบายรายละเอียด

บทความเผยแพร่โดย Amazon


ควรอ่านเนื่องจาก Amazon ไม่รองรับ GCM
— Siva Karthikeyan

-1

เพื่อตอบคำถาม:

  1. AWS SNS รองรับ FCM
  2. ไม่มี AWS ไม่เก็บข้อความหลังจากส่งการแจ้งเตือนแบบพุช

สำหรับคำแนะนำโดยละเอียดเกี่ยวกับการตั้งค่า FCM ด้วย SNS โปรดอ่านบทความนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.