การแจ้งเตือนแบบพุชระยะไกลของ macOS ไม่แสดงแบนเนอร์การแจ้งเตือน

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

ฉันเพิ่มโค้ดต่อไปนี้เพื่อดูว่าใบสมัครของฉันได้รับหรือไม่

func application(_ application: NSApplication, didReceiveRemoteNotification userInfo: [String : Any]) {
    print(userInfo)
}

และหลังจากที่ฉันส่งการแจ้งเตือน ฉันก็เห็นสิ่งต่อไปนี้ในคอนโซล

["aps": {
    alert = "Alert - Hello World";
    sound = "ping.aiff";
}]

ดูเหมือนว่าอุปกรณ์จะเข้าถึงได้ เพียงแต่ไม่แสดงการแจ้งเตือน

ฉันได้ทดสอบการตั้งค่าเดียวกันทุกประการบน iOS แล้ว และใช้งานได้ดีและแสดงการแจ้งเตือนที่นั่น ดังนั้นฉันจึงขาดอะไรบางอย่างไปโดยเฉพาะใน macOS

ฉันได้ลองทำสิ่งต่อไปนี้เพื่อแก้ไขปัญหานี้:

  1. ทดสอบโดยปิดและเปิดแอปพลิเคชัน (ไม่ทำงานทั้งสองครั้ง)
  2. ตรวจสอบให้แน่ใจว่าเปิดใช้งานการแจ้งเตือนสำหรับแอปพลิเคชันในการตั้งค่าระบบ

อิมเมจการตั้งค่าระบบ

  1. หากฉันสร้างการแจ้งเตือนในพื้นที่ด้วยตนเองด้วยโค้ด มันจะทำงานได้อย่างสมบูรณ์ และแบนเนอร์การแจ้งเตือนจะปรากฏขึ้น
  2. ฉันไม่สามารถทดสอบกับ macOS เวอร์ชันเก่าได้เนื่องจาก API การแจ้งเตือนแบบพุชที่ฉันใช้เพิ่งเปิดตัวใน macOS Mojave
  3. ฉันได้ลองสร้างโปรเจ็กต์ทดสอบอื่นแล้ว แต่ปัญหาเดียวกันก็เกิดขึ้น
  4. ฉันแน่ใจว่าปิดห้ามรบกวนแล้ว และได้ตรวจสอบในศูนย์การแจ้งเตือนเพื่อดูการแจ้งเตือนแล้ว แต่จะไม่แสดงที่นั่นเช่นกัน

ฉันจะทำให้มันแสดงแบนเนอร์และเล่นเสียงบน macOS ได้อย่างไร


person Charlie Fish    schedule 03.11.2018    source แหล่งที่มา
comment
ฉันรู้ว่าคุณระบุสิ่งนี้ในคำตอบของคุณแล้ว แต่ฉันไม่เห็นเมื่อผ่านเข้ามา ดังนั้นฉันคิดว่านี่อาจช่วยให้บางคนเห็นภาพนี้ ![ป้อนคำอธิบายรูปภาพที่นี่](i.stack.imgur.com/3cC1S.png)   -  person ScottyBlades    schedule 21.03.2019


คำตอบ (2)


ใน iOS รหัสต่อไปนี้ใช้งานได้ดี:

UNUserNotificationCenter.current().requestAuthorization(options: options) { granted, _ in
    guard granted else { return }

    DispatchQueue.main.async {
        application.registerForRemoteNotifications()
    }
}

สำหรับ macOS ฉันเปลี่ยนรหัสนั้นเป็น:

UNUserNotificationCenter.current().requestAuthorization(options: options) { granted, _ in
    guard granted else { return }

    DispatchQueue.main.async {
        NSApplication.shared.registerForRemoteNotifications()
    }
}

ปรากฎว่าบรรทัด NSApplication.shared.registerForRemoteNotifications() ไม่ถูกต้อง บน macOS คุณต้องส่งตัวเลือกเดียวกับที่คุณระบุไว้ในการโทรนี้

การเปลี่ยนบรรทัดนั้นเป็นสิ่งต่อไปนี้ใช้งานได้

NSApplication.shared.registerForRemoteNotifications(matching: [.alert, .sound, .badge])

สิ่งที่ฉันพบว่าแปลกคือในเอกสารประกอบของ Apple มันบอกว่าวิธีการนั้นคือ เลิกใช้แล้วและเราควรใช้ registerForRemoteNotifications() แทน ซึ่งทำให้ฉันคิดว่ามีข้อบกพร่องบางประเภทกับ registerForRemoteNotifications() ที่การแจ้งเตือนไม่ปรากฏอย่างถูกต้อง

อีกสิ่งหนึ่งที่จะกล่าวถึง ต้องใช้เวลาเล็กน้อย (สองสามนาที) และส่งการแจ้งเตือนเล็กน้อยเพื่อให้การแจ้งเตือนปรากฏขึ้นจริงหลังจากทำการเปลี่ยนแปลง ไม่แน่ใจว่าเป็นเพราะการเชื่อมต่ออินเทอร์เน็ตที่ช้าหรืออะไร แต่ตอนนี้พวกมันปรากฏตัวเร็วมากหลังจากถูกส่งไป


แก้ไข

Apple แจ้งฉันว่าสิ่งนี้ได้รับการแก้ไขแล้วใน macOS 10.14.4 ฉันยังไม่สามารถอัปเกรดเป็นรุ่นที่ดีที่สุดและทดสอบได้ จึงไม่สามารถยืนยันได้ ณ จุดนี้ ฉันจะอัปเดตสิ่งนี้เมื่อฉันมีโอกาสทดสอบบน macOS 10.14.4

person Charlie Fish    schedule 04.11.2018
comment
› ซึ่งทำให้ฉันคิดว่ามีข้อผิดพลาดบางประเภทกับ registerForRemoteNotifications() ซึ่งการแจ้งเตือนไม่ปรากฏอย่างถูกต้อง ฉันเห็นด้วย - person erkanyildiz; 08.11.2018
comment
@erkanyildiz คุณประสบปัญหาเดียวกันหรือไม่? - person Charlie Fish; 08.11.2018
comment
ใช่. การโทร requestAuthorization บน UNUserNotificationCenter แล้วโทร registerForRemoteNotifications ไม่ทำงาน แม้ว่าแอพจะปรากฏในบานหน้าต่างการตั้งค่าการแจ้งเตือนของ macOS พร้อมตัวเลือก Badges, Sounds, Banners แต่การแจ้งเตือนจะไม่แสดง เมื่อฉันใช้วิธี registerForRemoteNotificationTypes เท่านั้นจึงจะได้ผล - person erkanyildiz; 09.11.2018

เพื่อชี้แจงให้ชัดเจนว่านี่คือ macOS และ NSApp เป็นเพียง NSApplication.shared

ที่จริงฉันต้องแก้ไขคำตอบของฉันเพราะฉันมีผลลัพธ์ที่ไม่สอดคล้องกัน ดังนั้นตอนนี้ฉันก็มีแล้ว

if #available(OSX 10.14, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] (success, error) in
        if let error = error {
        // LOG
        } else {
            NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound])
            UNUserNotificationCenter.current().setNotificationCategories(varWithMyCategories)
        }
    }
} else {
    NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound])
}
person fernandomorgan    schedule 14.02.2019
comment
NSApp คือ NSapplication.shared: developer.apple.com/documentation/appkit/nsapp - person fernandomorgan; 15.02.2019
comment
และเอกสารสำหรับ NSApp.registerForRemoteNotifications() อยู่ที่นี่: developer apple.com/documentation/appkit/nsapplication/ - person fernandomorgan; 15.02.2019
comment
โดยปกติคุณควรระบุรหัสการทำงาน แค่พูดว่า NSApp จะไม่คอมไพล์ นอกจากนี้ NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound]) ไม่ใช่วิธีการใน macOS ด้วยซ้ำ registerForRemoteNotifications ไม่ยอมรับพารามิเตอร์ใดๆ ใน macOS คุณอ่านคำตอบของฉันแล้วหรือยัง? คำตอบของฉันมีปัญหาหรือเปล่า? ตามข้อผิดพลาดที่ฉันยื่นกับ Apple สิ่งนี้ได้รับการแก้ไขแล้วใน macOS 10.14.4 ฉันยังไม่มีเวลาอัปเกรดและทดสอบเลย - person Charlie Fish; 16.02.2019
comment
NSApp ทำการคอมไพล์ มันอยู่ใน macOS ตั้งแต่ 10.0: macOS 10.0+ registerForRemoteNotifications(matching: [.alert, .badge, .sound]) คือ developer.apple.com/documentation /appkit/nsapplication/ และมีให้บริการตั้งแต่ macOS 10.7 และเลิกใช้แล้วใน 10.14 Mojave - โปรดค้นหาเอกสารประกอบของ Mac ก่อนที่จะแสดงความคิดเห็น - person fernandomorgan; 19.02.2019
comment
ดี. คุณยังไม่ตอบคำถามของฉันเลย และฉันไม่แน่ใจว่าทำไมคุณถึงแนะนำให้ใช้วิธีที่เลิกใช้แล้ว... - person Charlie Fish; 19.02.2019
comment
มันเลิกใช้แล้ว แต่ใช้งานได้ใน 10.14.3 ตอนแรกฉันใช้เฉพาะวิธี NSUserNotification แบบเก่าเท่านั้น (เนื่องจากแอปของฉันรองรับ 10.11 และใหม่กว่า) แต่เพิ่มตัวเลือก 10.14 เนื่องจากการรองรับหมวดหมู่ ขออภัยหากฉันไม่เข้าใจคำถาม - person fernandomorgan; 19.02.2019
comment
ฉันยังสงสัยจริงๆ ว่าทำไมคำตอบนี้ถึงจำเป็น จากข้อมูลของ Apple นี่เป็นข้อผิดพลาดที่ได้รับการแก้ไขใน 10.14.4 ดูคำตอบของฉันด้านบน ฉันไม่แน่ใจว่าคำตอบนี้จะเพิ่มอะไรในกระทู้นี้ - person Charlie Fish; 19.02.2019
comment
10.14.4 ดูดีมากแต่ยังไม่ออก และแม้ว่าจะวางจำหน่ายแล้ว ก็ไม่ใช่ทุกคนที่จะอัปเดตทันที (ซึ่งจะอยู่ในรุ่นผลิตภัณฑ์ประมาณวันที่ 25 กุมภาพันธ์ 2019) แม้ว่าฉันจะดีใจที่ Apple กำลังแก้ไขจุดบกพร่อง แต่จะไม่ช่วยเหลือผู้ใช้เวอร์ชัน 10.14.[0-3] เลย และนี่คือจุดบกพร่องที่ได้รับการแก้ไขแล้วใน 10.14.4 แต่ใช่แล้ว สำหรับการใช้งานในอนาคต ไม่จำเป็นต้องใช้วิธีที่เลิกใช้แล้ว เพียง NSApp. NSApp.registerForRemoteNotifications() - person fernandomorgan; 20.02.2019
comment
คุณจะรู้ได้อย่างไรว่าจะเปิดตัวในช่วงผลิตภัณฑ์ประมาณวันที่ 25/02/19 คำตอบนี้ยังไม่ได้เพิ่มคุณค่าใด ๆ ในความคิดของฉัน ฉันบอกว่าการเปลี่ยนบรรทัดเป็น NSApplication.shared.registerForRemoteNotifications(matching: [.alert, .sound, .badge]) ได้ผล คำตอบของคุณเพิ่มมูลค่านอกเหนือจากนั้นได้อย่างไร - person Charlie Fish; 20.02.2019
comment
ขออภัย เข้าใจผิดตรงนี้ ฉันมีปัญหาเดียวกัน แต่ฉันจำเป็นต้องจัดส่งในสัปดาห์นี้ ไม่ใช่คุณ และฉันแค่อธิบายว่า NSApp เป็นส่วนหนึ่งของกรอบงาน Cocoa จริงๆ ไม่จำเป็นต้องใช้ NSApplication.shared - เป็นเพียงการชี้แจง ขออภัยด้วย - person fernandomorgan; 20.02.2019