การแจ้งเตือนแบบพุชระยะไกลจำเป็นต้องเพิ่ม UIBackgroundModes ใน Info.plist หรือไม่


104

ฉันได้รวมการแจ้งเตือนแบบพุชระยะไกลไว้แล้ว แต่ฉันได้รับคำเตือนนี้:

didReceiveRemoteNotification:fetchCompletionHandler:]แต่คุณยังคงต้องเพิ่ม " remote-notification" ในรายการที่รองรับ UIBackgroundModeในInfo.plistไฟล์.

เวอร์ชัน Xcode ของฉันคือ 8.3.1 ฉันต้องการเพิ่มสิ่งนี้ในInfo.plist. ฉันได้ทำตามแบบฝึกหัดเช่นกัน แต่พวกเขาไม่ได้พูดถึงเรื่องนี้ด้วย ฉันควรทำอย่างไร

คำตอบ:


245

ใช่คุณควรเปิดใช้โหมดพื้นหลัง / การแจ้งเตือนระยะไกลเพื่อให้สามารถใช้การแจ้งเตือนระยะไกลสำหรับการอัปเดตพื้นหลัง

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

รายการแบบเลื่อนลงโหมดพื้นหลังในการตั้งค่าโครงการ


3
ฉันได้ตรวจสอบช่องนั้นแล้ว แต่ยังคงได้รับข้อผิดพลาดเดิม
Anuj

Anuj ดูคำตอบของฉันด้านล่าง
Joshua Cleetus

1
ฉันไม่เห็นด้วยกับคำตอบนี้ คุณควรเปิดใช้งานโหมดพื้นหลัง -> การแจ้งเตือนระยะไกลเท่านั้นหากคุณใช้การแจ้งเตือนระยะไกลเพื่อทำการอัปเดตพื้นหลัง โปรดดูเอกสารที่นี่การ กำหนดค่าการแจ้งเตือนการอัปเดตเบื้องหลัง
jzeferino

1
@jzeferino ขอบคุณสำหรับการแจ้งเตือนฉันได้เพิ่มคำชี้แจงให้กับคำตอบของฉัน โปรดทราบว่าคำถามเดิมเกี่ยวกับapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)ฟังก์ชันซึ่งใช้สำหรับจัดการการดึงข้อมูล
Tamás Sengel

นี่เป็นสิ่งที่ดี แต่ตอบคำถามว่าคุณต้องการความสามารถในการอัปเดตเบื้องหลังหรือไม่ซึ่งแน่นอนว่าคุณต้องทำ ฉันโพสต์คำตอบว่าคุณจำเป็นต้องตั้งค่าความสามารถของโหมดพื้นหลังสำหรับการแจ้งเตือนแบบพุชหรือไม่ (สปอยล์คุณไม่ทำ)
mobob

30

คุณยังสามารถแก้ไข info.plist ที่จำเป็น (Open As -> Source Code) และวาง:

<dict>
<key>UIBackgroundModes</key>
    <array>
        <string>remote-notification</string>
    </array>

7
ตอนนี้ Xcode เพิ่มโดยอัตโนมัติเมื่อตรวจสอบการแจ้งเตือนระยะไกลในโหมดพื้นหลัง
Vinoth Vino

1
ไม่ใช่สำหรับฉัน: เวอร์ชัน 11.4.1 (11E503a)
paiego

4

ในความเป็นจริงคุณไม่จำเป็นต้องเพิ่ม UIBackgroundModes ใน. plist เพียงเพื่อใช้การแจ้งเตือนระยะไกล

ฉันรู้ว่าฉันกำลังแยกทายาทเล็กน้อย (คำตอบอื่น ๆ ส่วนใหญ่ดีมากและอาจมีบางอย่างใหม่ใน iOS 11) แต่คำถามหมายถึงการแจ้งเตือนแบบพุชที่จำเป็นต้องมีการอัปเดตเบื้องหลังและไม่ทำ

ความแตกต่างที่นี่คือมีสองวิธีที่แตกต่างกันที่ยอมรับการแจ้งเตือนบน AppDelegate

อันนี้ไม่ต้องการให้คุณใช้ UIBackgroundModes:

optional func userNotificationCenter(_ center: UNUserNotificationCenter, 
                         willPresent notification: UNNotification, 
               withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

ข้างต้นแทนที่การเลิกใช้งานเมื่อ iOS 11:

optional func application(_ application: UIApplication, 
didReceiveRemoteNotification userInfo: [AnyHashable : Any])

และสิ่งนี้ต้องการความสามารถในโหมดพื้นหลัง:

optional func application(_ application: UIApplication, 
didReceiveRemoteNotification userInfo: [AnyHashable : Any], 
   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

สิ่งสำคัญที่นี่คืออันเก่า (และอันที่เลิกใช้แล้วมันถูกแทนที่) จะทำงานเฉพาะเมื่อแอพอยู่เบื้องหน้า ส่วนหลังจะทำงานหากแอปอยู่ในพื้นหน้าหรือพื้นหลัง ดูข้อมูลจำเพาะสำหรับนักเก็ตเฉพาะนี้:

ใช้วิธีนี้เพื่อประมวลผลการแจ้งเตือนระยะไกลที่เข้ามาสำหรับแอปของคุณ ซึ่งแตกต่างจากเมธอดแอปพลิเคชัน (_: didReceiveRemoteNotification :) ซึ่งจะเรียกเฉพาะเมื่อแอปของคุณทำงานอยู่เบื้องหน้าระบบจะเรียกเมธอดนี้เมื่อแอปของคุณทำงานอยู่ในส่วนหน้าหรือพื้นหลัง

ดังนั้นหากคุณต้องการการแจ้งเตือนแบบพุชให้ตัดสินใจว่าคุณจำเป็นต้องทำงานในพื้นหลังหรือไม่ - เฉพาะในกรณีที่คุณต้องการทั้งสองอย่างคุณควรใช้วิธีการที่แนะนำโดยคำเตือน


3

มันเกิดขึ้นกับฉันแม้ว่าจะตั้งค่าโหมดพื้นหลังการแจ้งเตือนระยะไกลในความสามารถแล้วก็ตาม ปัญหาคือฉันมีสามเป้าหมายหนึ่งสำหรับการผลิตหนึ่งสำหรับ qa และอีกหนึ่งสำหรับการจัดเตรียม ฉันต้องตั้งค่าการแจ้งเตือนระยะไกลในเป้าหมายทั้งสามและแก้ไขคำเตือนนั้น

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