คำถามที่พบบ่อย

เกี่ยวกับ การอธิบาย User Unique Identifier

  1. ระหว่างการเริ่มต้นต้องกรอกสตริงเฉพาะ เพื่อสร้าง UID ที่ไม่ซ้ำ UID นี้ทำหน้าที่เป็นรหัสประจำตัวสำหรับการแจ้งเตือนแบบ Push และไม่เกี่ยวข้องกับอุปกรณ์
  2. เมื่อผู้ใช้ใช้ user_str เดียวกัน ก็จะถูกระบุว่าเป็นผู้ใช้คนเดียวกัน การสมัครรับบนเบราว์เซอร์หรืออุปกรณ์ต่าง ๆ จะเปลี่ยนข้อมูลการสมัครรับเป็นข้อมูลล่าสุดสำหรับส่งข้อความ ตัวอย่างเช่น ผู้ใช้ A สมัครรับด้วย user_str เดียวกัน บนเบราว์เซอร์ a1, a2, a3 ตามลำดับ ในทางทฤษฎี จะมีเฉพาะ a3 ล่าสุดเท่านั้นที่รับข้อความได้ เพื่อป้องกันไม่ให้ผู้ใช้คนเดิมได้รับข้อความหลายครั้งและป้องกันการส่งข้อความมากเกินไป ระบบ backend จะเก็บข้อมูลการสมัครรับล่าสุดสำหรับ UID เดียวเสมอ
  3. การสมัครรับข้อความสามารถยกเลิกได้ และ SDK มี interface สำหรับยกเลิกการสมัคร Interface นี้จะยกเลิกแค่การเชื่อมโยงระหว่าง UID กับข้อมูลการสมัครรับ และจะไม่เปลี่ยนแปลงสิทธิ์การแจ้งเตือนของเบราว์เซอร์
  4. ในทางทฤษฎี user_str ควรแมปแบบหนึ่งต่อหนึ่งกับผู้ใช้จริง ในบางกรณี เช่น โหมดผู้เยี่ยมชม (visitor mode) นักพัฒนาจำเป็นต้องสร้าง user_str ที่เฉพาะเจาะจงโดยขึ้นอยู่กับสถานการณ์จริง SDK จะไม่สร้างค่าเริ่มต้นให้โดยอัตโนมัติเพื่อหลีกเลี่ยงความผิดพลาดหากนักพัฒนาไม่จัดการความสัมพันธ์ระหว่าง user_str กับผู้ใช้จริงอย่างถูกต้อง ซึ่งอาจนำไปสู่ข้อมูลสถิติไม่ตรงตามที่คาดหวัง

เมื่อผู้ใช้เข้าสู่โหมด visitor นักพัฒนาสามารถอ้างอิงฟังก์ชันต่อไปนี้เพื่อสร้าง user_str ที่ไม่ซ้ำโดยใช้เบราว์เซอร์เป็นตัวระบุ โปรดทราบว่าวิธีนี้จะทำให้ผู้ใช้คนเดียวกันสร้าง user_str ใหม่เมื่อเปลี่ยนเบราว์เซอร์ อุปกรณ์ หรือเคลียร์แคช

function randomUid() { const keyStr = 'mtWebPushRandomUid'; let uid = window.localStorage.getItem(keyStr); if (!uid) { uid = new Date().getTime().toString(36) + Math.floor(Math.random() * 10000000).toString(36); window.localStorage.setItem(keyStr, uid); } return uid; } var user_str = randomUid();
              
              function randomUid() {
 const keyStr = 'mtWebPushRandomUid';
 let uid = window.localStorage.getItem(keyStr);
 if (!uid) {
     uid = new Date().getTime().toString(36) + Math.floor(Math.random() * 10000000).toString(36);
     window.localStorage.setItem(keyStr, uid);
 }
 return uid;
}
var user_str = randomUid();

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

แพลตฟอร์มใดบ้างที่รองรับ WebPush?

การรองรับเบราว์เซอร์ตามระบบปฏิบัติการ

Browser Windows PC macOS Android iOS (iPhone, iPad)
Chrome Yes Yes Yes No
Firefox Yes Yes Yes No
Safari No Yes No Yes
Microsoft Edge Yes Yes No No
Opera Yes Yes Yes No

หมายเหตุ 1: Microsoft Edge (อัปเดตในปี 2019), Opera, Samsung Internet, Yandex และ UC Browser พัฒนาบน Chromium และจะถูกแสดงเป็น Chrome ภายใน Engagelab หมายเหตุ 2: Internet Explorer ไม่มีการอัปเดตฟีเจอร์แล้ว Microsoft จึงย้ายการพัฒนาไปที่ Edge หมายเหตุ 3: โหมด ไม่ระบุตัวตน (Incognito), private browsing หรือ guest mode ไม่รองรับ Web Push

รองรับตามเวอร์ชันเบราว์เซอร์

Browser Windows macOS Android
Chrome Chrome 42+ Chrome 42+ Chrome 105+
Firefox Firefox v44+ Firefox v44+ Firefox v104+
Safari / Safari v11.1+ /
Opera Opera v29+ Opera v29+ Opera mobile v64+
Microsoft Edge Edge v17+ Edge v17+ /

คำถามที่พบบ่อยเกี่ยวกับ Safari Web Push

Web Push บน Safari รองรับฟีเจอร์ใดบ้าง?

Feature macOS (<16) macOS (16+) iOS/iPadOS 16.4+
Images No No No
Action Buttons No No No
Launch URL Yes Yes Yes
Custom Site Icon Yes No Yes

ผู้ใช้ iOS/iPadOS จะรับ Safari Web Push ได้อย่างไร?

1. นักพัฒนาต้องตั้งค่า manifest และเพิ่ม attribute ที่ถูกต้องใน html:

<link rel="manifest" href="manifest.json"/>
              
              <link rel="manifest" href="manifest.json"/>

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

ไฟล์ manifest ตัวอย่าง:

{ "$schema": "https://json.schemastore.org/web-manifest-combined.json", "display": "standalone", "start_url": "/webpush/index.html", "name": "Engagelab WebPush Example", "short_name": "Engagelab", "icons": [ { "src": "/icon-large-cb438cac.png", "type": "image/png", "sizes": "1024x1024" } ] }
              
              {
 "$schema": "https://json.schemastore.org/web-manifest-combined.json",
 "display": "standalone",
 "start_url": "/webpush/index.html",
 "name": "Engagelab WebPush Example",
 "short_name": "Engagelab",
 "icons": [
     {
         "src": "/icon-large-cb438cac.png",
         "type": "image/png",
         "sizes": "1024x1024"
     }
 ]
}

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

2. ผู้ใช้ต้อง “เพิ่มลงหน้าจอโฮม” (Add to Home Screen):

  • เยี่ยมชมเว็บไซต์บน Safari บน iOS/iPadOS 16.4+
  • แตะปุ่มแชร์ → “Add to Home Screen”
  • บันทึกแอปลงหน้าจอ → เปิดจากหน้าจอโฮม → สมัครรับการแจ้งเตือน

ควรแสดง banner เพื่อแนะนำผู้ใช้ให้ทำตามขั้นตอนข้างต้น แนะนำใช้งานโครงการ open-source ข้างล่างนี้:

https://github.com/rajatsehgal/add-to-home-screen
              
              https://github.com/rajatsehgal/add-to-home-screen

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

ถ้าเบราว์เซอร์ปิดอยู่ ผู้ใช้จะยังได้รับการแจ้งเตือนไหม?

  • หากใช้ช่องทาง Engagelab: ต้องเปิดเว็บไซต์

  • หากใช้ช่องทาง system:

    • Chrome/Firefox/Opera/Edge (Windows/macOS): แม้ปิดหน้าต่าง แต่หาก process ยังรันใน background ก็จะได้รับ
    • Safari บน macOS: แม้ปิด browser ก็สามารถรับได้
    • Safari บน Windows: ไม่รองรับ

คำถามเกี่ยวกับ Notification Authorization Prompt

เมื่อผู้ใช้คลิก “Block” หรือ “ไม่อนุญาต” แล้วจะมีอีกครั้งเมื่อไหร่?

  • หากผู้ใช้เลือก “Block”/“Don’t Allow”/“Never Allow” จะไม่มี native prompt อีกจนกว่าจะแก้ใน settings
  • Chrome: มีโอกาส 3 ครั้ง หลังปิดครั้งที่ 3 จะล็อกทั้งสัปดาห์
  • Firefox: หลัง versión 70 ปิด native prompt ต้องคลิกลูกศร icon บน address bar, v72+ จะบล็อก auto
  • Safari: มี UI แบบ Quiet เมื่อปฏิเสธบ่อย

วิธีใช้งาน EngageLab Soft Prompt:

  • เมื่อผู้ใช้คลิก “Allow” บน Soft Prompt → เปิด native prompt
  • หากคลิก Cancel บน native prompt → Soft Prompt จะเด้งอีกครั้งครั้งถัดไป
  • หาก user กด Deny บน native prompt → จะไม่สามารถขออีก
  • ถ้ากด Cancel บน Soft Prompt → ระบบจะตั้งค่าไม่ขอ native prompt ตอนนั้น หากผู้ใช้กลับมาอีกครั้ง Soft Prompt จะถามอีกครั้ง

วิธีแก้ปัญหาหากไม่รับการแจ้งเตือน

  1. ตรวจสอบ permission บนหน้า notification bar

  2. เช็ค Settings ของระบบปฏิบัติการ:

    • Windows: ปิด Focus Assist, เปิด Notifications ตั้งค่าที่ Settings > Notifications & actions
    • macOS: Settings > Notifications > เลือก browser แล้วเปิด Allow Notifications และตรวจสอบ Do Not Disturb mode
  3. เปลี่ยนไปใช้ช่องทาง Engagelab หากเบราว์เซอร์ไม่เสถียร


ไม่สามารถ pop up บน Safari ได้?

  1. ตรวจสอบใน Safari Preferences > Websites > Notification
  2. ตรวจสอบ Push service status และ permission
  3. หากโดเมนที่มีหลายหน้า HTML ห้ามลบ permission เดิม ต้องให้สมัครใหม่หลังการลบ

หากผู้ใช้เดียวกันใช้หลายเบราว์เซอร์ ข้อความจะแสดงบนอุปกรณ์ใด?

  • หากใช้ system channel: ส่งผ่าน browser ล่าสุดที่ใช้งาน
  • หากเลือก Jiguang channel: จะส่งข้อความหลายครั้งในหลายเบราว์เซอร์

หากผู้ใช้ล้าง cache/cookies จะยังได้รับ WebPush ไหม?

  • ช่องทาง Jiguang: ยังรับได้
  • ช่องทาง browser: หลังล้าง IndexedDB ข้อมูลการสมัครรับจะหาย permission ยังอยู่แต่ต้อง init SDK ใหม่เพื่อสมัครซ้ำ
  • หาก user ตั้ง permission เป็น Ask หรือ Block → ไม่สามารถสมัครอัตโนมัติได้
  • หากลบใน Settings > Notifications → ไม่สามารถสมัครอัตโนมัติ
  • เมื่อรีสมัครจะได้ registration ID ใหม่ ใช้ window.MTpushInterface.getRegistrationID()

หากส่งข้อความหลายข้อความพร้อมกัน ภาษาแสดงแบบใด?

  • EngageLab channel: ไม่มี overwrite → จะแสดงหลายข้อความ แต่รวมเป็นกลุ่ม
  • Safari: ไม่มี overwrite → แสดงหลายข้อความรวมกลุ่ม
  • Chrome/Edge/Firefox: มี overwrite → จะแสดงแค่ข้อความล่าสุดทับข้อความก่อนหน้า

EngageLab WebPush รองรับการเปลี่ยน domain ไหม?

  • เบราว์เซอร์ผูก subscriber กับ origin (domain) เนื่องจาก same-origin policy

  • ไม่สามารถย้าย subscriber ได้โดยตรง

  • หากเปลี่ยน domain:

    • สร้าง WebPush app ใหม่
    • ส่ง push จากแอปเก่าโดยใช้ launch URL ไปยัง domain ใหม่
    • หลัง 2 สัปดาห์–2 เดือน ให้หยุดใช้งานแอปเก่า
    • ส่งข้อความแจ้งย้าย domain พร้อมแนะนำให้สมัครใหม่
    • เตรียมรับเสีย subscriber ระยะสั้น

EngageLab WebPush รองรับ PWA Push หรือไม่?

1. PWA คืออะไร?

  • แอปที่ใช้ web tech และสามารถใช้งานเหมือน native app ผ่าน browser
  • PWA push จะใช้งาน Web Push เพื่อแจ้งเตือน ถึงแม้แอปจะไม่ทำงานอยู่

2. รองรับ PWA หรือไม่?

  • รองรับ
  • นักพัฒนาต้อง integrate Web SDK ตามเอกสาร เพื่อ register Service Worker และ init Web Push

หมายเหตุ: ต้อง

  1. รันบน browser ที่รองรับ W3C notifications
  2. ใช้ domain และ HTTPS

3. Service Worker ของ PWA และ EngageLab WebPush จะ conflict กันไหม?

  • อาจเกิด conflict เนื่องจาก service worker ตัวเดียวควบคุม scope หนึ่ง

  • หากลง SW สองตัวใน scope เดียวกัน จะอาจเกิดการแทนที่ หรือทำงานพลาด

  • วิธีหลีกเลี่ยง:

    1. รวมฟีเจอร์ทั้งหมดไว้ใน SW ตัวเดียว
    2. หรือแยก scope อย่าให้ overlap

ทำไมเบราว์เซอร์ต่างกัน แต่ได้ regid เหมือนกัน?

ตอบ: ถ้า domain ที่ integrate ตั้งชื่อแอปเดียวกัน และ userStr เหมือนกัน ก็จะได้ rid เดียวกัน ไม่ขึ้นกับเบราว์เซอร์


// Register event listeners before initialization // Callback when the JPush channel disconnects MTpushInterface.mtPush.onDisconnect(function () { console.log("onDisconnect"); }); // Receive push messages (web push, browser vendor channel) MTpushInterface.onMsgReceive((msgData) => { // msgData structure {data:{xxx}, type:0} // type:0 is JPush channel, type:1 is system channel console.log("Received push message:", msgData); }); // Push initialization MTpushInterface.init({ appkey: "", // Required, see application information above user_str: visitorId, // Required, user identifier fail(err) { console.log("Online push creation failed", err); }, success(data) { console.log("Online push created successfully", data); }, webPushcallback(code, tip) { console.log("User received status code and tip", code, tip); }, swUrl: '', // Default: "/sw.min." + sdkEnv.version + ".js" canGetInfo(data) { // Notification configuration data available here // RegId available after this callback console.log(data); // Configuration information console.log("Received RegId", MTpushInterface.getRegistrationID()); }, custom: (fuc) => { // When using custom notification config: // 1. Manually call fuc() to request permission // 2. Only obtainable through custom callback // 3. fuc() requests notification permissions } });
              
              // Register event listeners before initialization
// Callback when the JPush channel disconnects
MTpushInterface.mtPush.onDisconnect(function () {
  console.log("onDisconnect");
});

// Receive push messages (web push, browser vendor channel)
MTpushInterface.onMsgReceive((msgData) => {
  // msgData structure {data:{xxx}, type:0} 
  // type:0 is JPush channel, type:1 is system channel
  console.log("Received push message:", msgData);
});

// Push initialization
MTpushInterface.init({
  appkey: "", // Required, see application information above
  user_str: visitorId, // Required, user identifier
  fail(err) {
    console.log("Online push creation failed", err);
  },
  success(data) {
    console.log("Online push created successfully", data);
  },
  webPushcallback(code, tip) {
    console.log("User received status code and tip", code, tip);
  },
  swUrl: '', // Default: "/sw.min." + sdkEnv.version + ".js"
  canGetInfo(data) {
    // Notification configuration data available here
    // RegId available after this callback
    console.log(data); // Configuration information
    console.log("Received RegId", MTpushInterface.getRegistrationID());
  },
  custom: (fuc) => {
    // When using custom notification config:
    // 1. Manually call fuc() to request permission
    // 2. Only obtainable through custom callback
    // 3. fuc() requests notification permissions
  }
});

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

หากพบปัญหาที่ไม่ได้อยู่ในเอกสารนี้ สามารถติดต่อ customer service ได้เสมอที่ https://www.engagelab.com/contact

icon
ติดต่อฝ่ายขาย