รับการแจ้งเตือนแบบพุชขณะที่แอพอยู่เบื้องหน้า iOS


191

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

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo

กำลังถูกเรียกใช้ แต่การแจ้งเตือนไม่แสดงในหน้าจอการแจ้งเตือน

ฉันต้องการแสดงการแจ้งเตือนบนหน้าจอการแจ้งเตือนโดยไม่ขึ้นกับว่าแอปนั้นอยู่ในแบ็คกราวน์หรือโฟร์กราวน์ ฉันเหนื่อยกับการหาทางออก ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก


35
Apple แจ้งว่า : หากคุณได้รับการแจ้งเตือนในพื้นที่หรือระยะไกลในขณะที่แอปของคุณทำงานอยู่เบื้องหน้าคุณจะต้องรับผิดชอบต่อการส่งข้อมูลไปยังผู้ใช้ของคุณในแบบเฉพาะแอป
Lauri Lehmijoki

2
บางคนขึ้นไปวันที่ (ตุลาคม "16) การเชื่อมโยงแอปเปิ้ล: ที่นี่ , มีและมี
azmeuk

1
ไม่สนับสนุนเบื้องหน้าของการแจ้งเตือนแบบพุชสำหรับ iOS 9.3 หรือต่ำกว่า
Anurag Sharma

ลิงค์ @Lauri Lehmijoki? ฉันไม่พบในเว็บไซต์ทางการ
Vyachaslav Gerchicov

1
ฉันกำลังเผชิญปัญหาเดียวกันในไอออนิก ...
Ali

คำตอบ:


206

สำหรับการแสดงข้อความแบนเนอร์ขณะที่แอพอยู่ด้านหน้าให้ใช้วิธีการต่อไปนี้

iOS 10, Swift 3/4 :

// This method will be called when app received push notifications in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 
{
    completionHandler([.alert, .badge, .sound])
}

iOS 10, Swift 2.3 :

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
    //Handle the notification
    completionHandler(
       [UNNotificationPresentationOptions.Alert,
        UNNotificationPresentationOptions.Sound,
        UNNotificationPresentationOptions.Badge])
}

คุณต้องลงทะเบียนผู้แทนแอปของคุณในฐานะตัวแทนสำหรับศูนย์การแจ้งเตือน:

import UserNotifications

// snip!

class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate

// snip!

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      // set the delegate in didFinishLaunchingWithOptions
      UNUserNotificationCenter.current().delegate = self
      ...
   }

เมื่อวิธีนี้เรียกว่า?
Uma Madhavi

กรุณาแนะนำฉันฉันกำลังแสดงการแจ้งเตือนจากด้านบนเมื่อพื้นหลังแอปของฉันหรือเบื้องหน้าตั้งแต่ 2 สัปดาห์ที่ฉันทำงานกับการแจ้งเตือนแบบพุชฉันสามารถรับข้อความ msg จากเซิร์ฟเวอร์
Uma Madhavi

@UmaMadhavi คุณสามารถรับการแจ้งเตือนแบบพุชได้หรือไม่
chengsam

21
อย่าลืมตั้งตัวแทนศูนย์การแจ้งเตือนให้เป็นตัวแทนแอพ: UNUserNotificationsCenter.current().delegate = selfในแอปพลิเคชัน
เสร็จสิ้นการเปิด

2
สำหรับผู้ที่ยังคงดิ้นรน UNUserNotificationCenter ไม่ใช่ UNUserNotificationCenter ด้วย 's' ก่อนกลาง
ราชา

58

รหัสด้านล่างจะทำงานให้คุณ:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  {
    application.applicationIconBadgeNumber = 0;             
    //self.textView.text = [userInfo description];
    // We can determine whether an application is launched as a result of the user tapping the action
    // button or whether the notification was delivered to the already-running application by examining
    // the application state.

    if (application.applicationState == UIApplicationStateActive) {                
        // Nothing to do if applicationState is Inactive, the iOS already displayed an alert view.                
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Did receive a Remote Notification" message:[NSString stringWithFormat:@"Your App name received this notification while it was running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];          
    }    
}

วิธีนี้ใช้ได้ผล ข้อมูลเพิ่มเติมเล็กน้อยเกี่ยวกับสิ่งที่มันทำ; เมื่อแอปพลิเคชันอยู่ในเบื้องหน้ากล่องข้อความแจ้งเตือน UI ดั้งเดิมจะปรากฏพร้อมข้อความแจ้งเตือนอยู่ภายใน ( titleเป็นข้อความที่มีตัวหนาขนาดใหญ่กว่าเล็กน้อยและmessageเป็นข้อความที่เล็กกว่าใต้ปุ่ม 'ตกลง' เพื่อยกเลิกอยู่ที่ด้านล่าง) ตัวเลือก applicationIconBadgeNumber ที่ถูกตั้งค่าเป็น 0 คือการซ่อนหมายเลขที่ปรากฏอยู่ด้านบนของไอคอนแอพใน Springboard (ตัวอย่างเช่นการระบุจำนวนข้อความที่ยังไม่ได้อ่านในแอปอีเมล) ในตัวอย่างนี้ฉันไม่รู้ว่าจำเป็นต้องใช้ตัวเลือกนั้นหรือไม่
jwinn

สิ่งนี้ใช้ได้กับทั้ง UNnotification และ UILocalNotification หรือไม่
user6631314

38

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

ลิงก์ไปที่ GitHub: AGPushNote

การใช้งานนั้นเป็นแบบออนไลน์:

[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];

และดูเหมือนว่าใน iOS7 (iOS6 มีรูปลักษณ์และความรู้สึก iOS6 ... )

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


1
ตอนนี้ reimagined ใน Swift: github.com/charliewilliams/CWNotificationBanner (โดยฉัน)
buildsucceeded

ดี, นี่จะเป็นประโยชน์
无夜之星辰

36

วัตถุประสงค์ C

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

สำหรับiOS 10เราต้องการwillPresentNotificationวิธีการรวมสำหรับแบนเนอร์แจ้งเตือนการแสดงforegroundมา

หากแอปในโหมดเบื้องหน้า (เปิดใช้งาน)

- (void)userNotificationCenter:(UNUserNotificationCenter* )center willPresentNotification:(UNNotification* )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
    NSLog( @“Here handle push notification in foreground" ); 
    //For notification Banner - when app in foreground

    completionHandler(UNNotificationPresentationOptionAlert);

    // Print Notification info
    NSLog(@"Userinfo %@",notification.request.content.userInfo);
}

1
เพียงแค่คัดลอกรหัสและอย่าลืมใช้โปรโตคอล UNUserNotificationCenterDelegate
Nik Kov

ถ้าฉันต้องการที่จะแสดงการแจ้งเตือนแทนการแจ้งเตือนนี้แล้ว?
Mihir Oza

@MihirOza คุณต้องการ UIAlertController?
Ashwini Chougale

ฉันรู้ แต่ฉันไม่ต้องการให้ป๊อปอัปแจ้งเตือนเมื่อแอพทำงาน ฉันต้องการการแจ้งเตือนในแอปของฉันเท่านั้น
Mihir Oza

25

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

  • ตรวจสอบว่าแอปพลิเคชันอยู่ในสถานะใช้งานหรือไม่เมื่อได้รับการ
    แจ้งเตือนระยะไกล หากอยู่ในสถานะเปิดใช้งาน UILocalNotification

    if (application.applicationState == UIApplicationStateActive ) {
    
        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        localNotification.userInfo = userInfo;
        localNotification.soundName = UILocalNotificationDefaultSoundName;
        localNotification.alertBody = message;
        localNotification.fireDate = [NSDate date];
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    }

SWIFT:

if application.applicationState == .active {
    var localNotification = UILocalNotification()
    localNotification.userInfo = userInfo
    localNotification.soundName = UILocalNotificationDefaultSoundName
    localNotification.alertBody = message
    localNotification.fireDate = Date()
    UIApplication.shared.scheduleLocalNotification(localNotification)
}

86
ฉันไม่คิดว่ามันจะช่วยได้ การแจ้งเตือนในท้องถิ่นและระยะไกลจะได้รับการปฏิบัติเหมือนกันและเป็นผลเมื่อการแจ้งเตือนในท้องถิ่นนี้ดับลงและหากแอปทำงานอยู่ตรา / แบนเนอร์หรือเสียงจะไม่แสดง / เล่น
RPM

3
มันจะออกจากรายการในศูนย์การแจ้งเตือนของ iOS
Ab'initio

3
อย่างไรก็ตามฉันจะไม่เปิดการแจ้งเตือนในท้องถิ่นเมื่อมีการแจ้งเตือน ฉันจะเปิดใช้งานพฤติกรรมที่คล้ายกันแทนเช่น @ Rick77 ที่กล่าวถึง: แสดงการแจ้งเตือนหรือเครื่องปิ้งขนมปัง ฉันเดาว่าฉันไม่ต้องผ่านระบบปฏิบัติการอีกครั้งเพื่อหาสิ่งที่ระบบปฏิบัติการกำลังขอให้ฉันจัดการ
Fábio Oliveira

3
โซลูชันนี้ใช้งานได้เนื่องจากมีการจัดการโลคัลและรีโมตในวิธีเดียวกันโดยที่แอพอยู่ในเบื้องหน้าการสร้างการแจ้งเตือนตำแหน่งเมื่อการแจ้งเตือนระยะไกลมาถึงจะไม่แสดงอะไรเลย การใช้การแจ้งเตือนหรือการแจ้งเตือนที่กำหนดเองเป็นวิธีแก้ปัญหา
Hammer

19
มันใช้งานไม่ได้จริง จากเอกสาร UILocalNotification:If the app is foremost and visible when the system delivers the notification, the app delegate’s application:didReceiveLocalNotification: is called to process the notification. Use the information in the provided UILocalNotification object to decide what action to take. The system does not display any alerts, badge the app’s icon, or play any sounds when the app is already frontmost.
Chris Morse

15

หากแอปพลิเคชันทำงานในเบื้องหน้า iOS จะไม่แสดงแบนเนอร์ / การแจ้งเตือน นั่นคือจากการออกแบบ คุณต้องเขียนโค้ดบางอย่างเพื่อจัดการกับสถานการณ์ของแอพของคุณที่ได้รับการแจ้งเตือนขณะที่มันอยู่ในเบื้องหน้า คุณควรแสดงการแจ้งเตือนในวิธีที่เหมาะสมที่สุด (ตัวอย่างเช่นการเพิ่มหมายเลขตราสัญลักษณ์ให้กับUITabBarไอคอนการจำลองแบนเนอร์ของศูนย์การแจ้งเตือน ฯลฯ )


1
แต่ในแอปพลิเคชันอีเมลที่ iOS ทำมาคุณจะได้รับแบนเนอร์แจ้งเตือนใหม่ / แจ้งเตือนขณะที่แอปอีเมลทำงานเบื้องหน้า
Ab'initio

3
@ Ab'initio ฉันไม่ทราบแน่ชัด แต่ใน iOS แอปพลิเคชันทั้งหมดไม่ได้สร้างเท่ากัน ฉันคิดว่าแอปอีเมลสต็อกใช้ API ส่วนตัวบางประเภทที่ไม่มีใน SDK สาธารณะ หรือบางทีรหัสการแจ้งเตือนกำลังทำให้เกิดข้อยกเว้นกับ id แอปอีเมลของ Apple
Daniel Martín

1
อะไร?? ฉันกำลังจะมีการโจมตีโกรธพิณ
Josh

@ DanielMartínคุณสามารถบอกฉันได้อย่างไรว่าฉันจะได้รับการแจ้งเตือนในสถานะเบื้องหน้าใน iOS 8.0 ได้อย่างไร
Dilip Tiwari

10
โปรดจำไว้ว่าคำตอบนี้เป็นจริงสำหรับ iOS 9ขึ้นไปเท่านั้น ตั้งแต่ iOS 10 Apple เปิดตัว API ใหม่เพื่อจัดการการแจ้งเตือน ( UNUserNotificationCenter API) พร้อมกับ API ใหม่ตอนนี้เป็นไปได้ที่จะแสดงการแจ้งเตือนหากแอปพลิเคชันอยู่ในเบื้องหน้า ดังนั้นหากคุณสับสนเพราะคำตอบที่แตกต่างกันในคำถามนี้ก็เป็นเพราะคำตอบบางคำนั้นเก่าเกินไปและอธิบายพฤติกรรมของ iOS 9 และก่อนหน้าเท่านั้นในขณะที่คำตอบอื่น ๆ ไม่ได้คำนึงถึงว่าUNUserNotificationCenter มีเพียง iOS 10.
tomacco

13

Xcode 10 Swift 4.2

หากต้องการแสดงการแจ้งเตือนแบบพุชเมื่อแอปของคุณอยู่เบื้องหน้า -

ขั้นตอนที่ 1:เพิ่มผู้รับมอบสิทธิ์ UNUserNotificationCenterDelegate ในคลาส AppDelegate

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

ขั้นตอนที่ 2:ตั้งค่าผู้รับมอบสิทธิ์ UNUserNotificationCenter

let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.delegate = self

ขั้นตอนที่ 3:ขั้นตอนนี้จะทำให้แอปของคุณแสดง Push Notification แม้ว่าแอปของคุณจะทำงานเบื้องหน้า

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])

    }

ขั้นตอนที่ 4:ขั้นตอนนี้เป็นตัวเลือก ตรวจสอบว่าแอปของคุณอยู่เบื้องหน้าหรือไม่และอยู่ข้างหน้าให้แสดง Local PushNotification

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

        let state : UIApplicationState = application.applicationState
        if (state == .inactive || state == .background) {
            // go to screen relevant to Notification content
            print("background")
        } else {
            // App is in UIApplicationStateActive (running in foreground)
            print("foreground")
            showLocalNotification()
        }
    }

ฟังก์ชั่นการแจ้งเตือนท้องถิ่น -

fileprivate func showLocalNotification() {

        //creating the notification content
        let content = UNMutableNotificationContent()

        //adding title, subtitle, body and badge
        content.title = "App Update"
        //content.subtitle = "local notification"
        content.body = "New version of app update is available."
        //content.badge = 1
        content.sound = UNNotificationSound.default()

        //getting the notification trigger
        //it will be called after 5 seconds
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)

        //getting the notification request
        let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)

        //adding the notification to notification center
        notificationCenter.add(request, withCompletionHandler: nil)
    }

1
นี่เป็นตัวอย่างที่ดีของความจำเป็นในการอ่านคำตอบทั้งหมดของเธรด หัวข้อก่อนหน้านี้พูดถึงวิธีการกว่าผู้แทนและในที่สุดก็เป็นหนึ่งในสามขั้นตอนที่คุณต้องทำ ขอบคุณสำหรับคำตอบที่สมบูรณ์!
3069232

ดีใจที่ได้ทราบว่ามันช่วยคุณได้ Happy coding
Prashant Gaikwad

11

ตามเอกสารประกอบของ Apple คุณสามารถแสดงการแจ้งเตือนขณะที่แอปทำงานอยู่ป้อนคำอธิบายรูปภาพที่นี่


ฉันสามารถเขียนฟังก์ชั่นนั้นในแอพผู้รับมอบสิทธิ์หรือในคลาส specififc ได้ที่ไหน?
นักพัฒนา iOS

เกิดอะไรขึ้นถ้าฉันต้องการที่จะเขียนว่า methd ในมุมมองโหลด?
นักพัฒนา iOS

คุณสามารถเขียนที่ใดก็ได้ แต่เงื่อนไขคือควรสอดคล้องกับUNUserNotificationCenterDelegateโปรโตคอล
SPatel

คุณไม่สามารถเขียนในviewDidLoad
SPatel

1
ฉันแนะนำให้คุณขยาย AppDelegateextension AppDelegate: UNUserNotificationCenterDelegate
SPatel

9

คุณสามารถสร้างการแจ้งเตือนของคุณเองที่เลียนแบบการแจ้งเตือนแบนเนอร์

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

หรือคุณสามารถหา api ที่ทำเพื่อคุณและเพิ่มเป็น podfiles ให้กับโครงการของคุณ

นี่คือคู่ที่ฉันใช้:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages


1
แม้ว่าลิงก์นี้อาจตอบคำถามได้ดีกว่าหากรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
Robert

1
TWMessageBarManagerสามารถเรียกใช้และใช้งานได้อย่างง่ายดายผ่าน appdelegate เองเนื่องจากใช้รูปแบบการออกแบบเดี่ยว ขอบคุณสำหรับลิงค์
Jay Mayu

8

นี่คือรหัสสำหรับรับการแจ้งเตือนแบบพุชเมื่อแอปอยู่ในสถานะใช้งาน (เบื้องหน้าหรือเปิด) เอกสาร UNUserNotificationCenter

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
     completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge])
}

หากคุณต้องการเข้าถึง userInfo ของรหัสการใช้งานการแจ้งเตือน: notification.request.content.userInfo


โหลดฟังก์ชันนี้ในมุมมองไหนโหลด? หรือในมุมมองคลาสคอนโทรลเลอร์?
นักพัฒนา iOS

จะเกิดอะไรขึ้นถ้าฉันสามารถเรียกมันในฟังก์ชั่นเป็นฟังก์ชั่นซ้อนกันมันจะถูกเรียกว่า> ??
นักพัฒนา iOS

1
ใส่สิ่งนี้ในคลาส AppDelegate คุณไม่ต้องเรียกใช้ฟังก์ชั่นนี้
Milan Jayawardane

4

การเพิ่มความสมบูรณ์บรรทัดแฮนด์เลอร์ไปยังวิธีการมอบหมายแก้ไขปัญหาเดียวกันให้ฉัน:

//Called when a notification is delivered to a foreground app.
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

completionHandler([.alert, .badge, .sound])
} 

3

สำหรับ swift 5 เพื่อแยกวิเคราะห์ PushNotification dictionary

    func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
            if application.applicationState == .active {
                if let aps1 = data["aps"] as? NSDictionary {
                    if let dict = aps1["alert"] as? NSDictionary {
                        if let strTitle = dict["title"] as? String , let strBody = dict["body"] as? String {
                            if let topVC = UIApplication.getTopViewController() {
                                //Apply your own logic as per requirement
                                print("strTitle ::\(strTitle) , strBody :: \(strBody)")
                            }
                        }
                    }
                }
            }
        }

วิธีดึงข้อมูล viewController ยอดนิยมที่เราแสดง topBanner

extension UIApplication {

    class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {

        if let nav = base as? UINavigationController {
            return getTopViewController(base: nav.visibleViewController)

        } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
            return getTopViewController(base: selected)

        } else if let presented = base?.presentedViewController {
            return getTopViewController(base: presented)
        }
        return base
    }
}

guardคำสั่งเป็นเพื่อนของคุณ :-)
นิโคลัส Miari

2

ในแอพตัวแทนของคุณใช้รหัสร้อง

import UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
 var currentToken: String?
 var window: UIWindow?
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        application.registerForRemoteNotifications()
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in

            // Enable or disable features based on authorization.
            if granted == true
            {
                print("Allow")
                UIApplication.shared.registerForRemoteNotifications()
            }
            else
            {
                print("Don't Allow")
            }
        }
        UNUserNotificationCenter.current().delegate = self

        return true
    }
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        currentToken = token  //get device token to delegate variable

    }
 public class var shared: AppDelegate {
        return UIApplication.shared.delegate as! AppDelegate
    }
 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
         completionHandler([.alert, .badge, .sound])
    }
}

0

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

GitHub iOS 11 กดดูการแจ้งเตือน


0

วิธีที่ดีที่สุดสำหรับเรื่องนี้คือการเพิ่มUNUserNotificationCenterDelegateในAppDelegateโดยใช้extension AppDelegate: UNUserNotificationCenterDelegate ส่วนขยายที่บอกว่าแอปที่จะสามารถที่จะได้รับการแจ้งเตือนเมื่อมีการใช้งาน

และใช้วิธีนี้

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

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

ดังนั้นการดำเนินการขั้นสุดท้าย:

extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler(.alert)
    }
}

และในการเรียกสิ่งนี้คุณต้องตั้งผู้รับมอบสิทธิ์ใน AppDelegate เพื่อdidFinishLaunchingWithOptionsเพิ่มบรรทัดนี้

UNUserNotificationCenter.current().delegate = self

คุณสามารถปรับเปลี่ยน

completionHandler(.alert) 

กับ

completionHandler([.alert, .badge, .sound]))

0

สำหรับ Swift 5

1) ยืนยันผู้รับมอบสิทธิ์ให้กับ AppDelegate ด้วย UNUserNotificationCenterDelegate

2) UNUserNotificationCenter.current().delegate = selfในdidFinishLaunch

3) AppDelegateดำเนินการดังต่อไปนี้วิธีการใน

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
     print("Push notification received in foreground.")
     completionHandler([.alert, .sound, .badge])
}

แค่นั้นแหละ!


-2

ดังที่ @Danial Martine กล่าวว่า iOS จะไม่แสดงแบนเนอร์ / การแจ้งเตือน นั่นคือจากการออกแบบ แต่ถ้าต้องทำจริง ๆ ก็มีวิธีหนึ่ง ฉันยังบรรลุสิ่งนี้ด้วยเหมือนกัน

1. ดาวน์โหลดงานแยกวิเคราะห์เฟรมจากParse FrameWork

2.Import #import <Parse/Parse.h>

3. เพิ่มรหัสต่อไปนี้ในวิธีการของคุณ didReceiveRemoteNotification

 - (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    [PFPush handlePush:userInfo];
}

PFPush จะดูแลวิธีจัดการกับการแจ้งเตือนระยะไกล หากแอปอยู่เบื้องหน้าจะแสดงการแจ้งเตือนมิฉะนั้นจะแสดงการแจ้งเตือนที่ด้านบน


แจ้งเตือน? คุณหมายถึงมุมมองการแจ้งเตือน?
iphondroid

1
แต่วิธีการโทรกลับสำหรับการกระทำของปุ่มแจ้งเตือน
Charlie

-2

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

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

คุณยังสามารถแสดงตราสัญลักษณ์ไว้ด้านบนหากคุณมีคุณสมบัติดังกล่าวในแอปของคุณ

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