Uygulama ön planda iOS'tayken push bildirimi alın


191

Uygulamamda push bildirim hizmeti kullanıyorum. Uygulama arka planda olduğunda bildirim ekranında bildirim görebiliyorum (iOS cihazının üstünden aşağı kaydırdığımızda ekran gösteriliyor). Ancak uygulama ön planda ise temsilci yöntemi

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

aranıyor ancak bildirim ekranında bildirim görüntülenmiyor.

Uygulamanın arka planda mı yoksa ön planda mı olduğundan bildirim ekranında bildirim göstermek istiyorum. Bir çözüm arayarak bıktım. Herhangi bir yardım büyük beğeni topluyor.


35
Apple diyor ki : Uygulamanız ön planda çalışırken yerel veya uzak bildirimler alırsanız, bilgileri uygulamalarınıza özgü bir şekilde kullanıcılarınıza aktarmak sizin sorumluluğunuzdadır.
Lauri Lehmijoki

2
Bazı güncel (Ekim "16) elma bağlantıları: burada , orada ve orada
azmeuk

1
9.3 ve daha önceki sürümler için push bildiriminin ön plan desteği değil mi?
Anurag Sharma

@Lauri Lehmijoki bağlantısı? Resmi web sitesinde bulamadım
Vyachaslav Gerchicov

1
Ben iyonik aynı sorunla karşı karşıya ...
Sayed Mohd Ali

Yanıtlar:


206

Uygulama ön plandayken başlık mesajını görüntülemek için aşağıdaki yöntemi kullanın.

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])
}

Ayrıca uygulama temsilcinizi bildirim merkezinin temsilcisi olarak kaydetmelisiniz:

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
      ...
   }

Bu yöntem ne zaman çağrılır?
Uma Madhavi

Benim app arka plan veya ön planda zaman yukarıdan bildirim görüntülemek beni vurdu Lütfen bana rehberlik. 2 haftadan beri ben push bildirimleri ile çalışıyorum. Sunucudan msg alabilirim.
Uma Madhavi

@UmaMadhavi Anlık bildirimler alabilir misiniz?
chengsam

21
Bildirim Merkezi temsilcisini uygulama temsilcisi olarak ayarlamayı unutmayın: UNUserNotificationsCenter.current().delegate = selfUygulamada didFinishLaunchingWithOptions
Achintya Ashok

2
Hala mücadele edenler için UNUserNotificationCenter değil UNUserNotificationsCenter merkezden önce 's' ile
Raj

58

Aşağıdaki kod sizin için çalışacaktır:

- (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];          
    }    
}

Bu çalışıyor. Ne yaptığı hakkında biraz daha bilgi; uygulama ön planda olduğunda, içinde bildirim metni bulunan yerel bir kullanıcı arabirimi uyarı kutusu görünür ( titlebiraz daha kalın bir metindir ve bunun messagealtındaki daha küçük metindir. Kapatmak için 'Tamam' düğmesi alttadır). 0 olarak ayarlanan applicationIconBadgeNumber seçeneği, Springboard'daki uygulama simgesinin üstünde görüntülenen sayıyı gizlemektir (örneğin, bir posta uygulamasındaki okunmamış ileti sayısını belirtme). Bu örnekte, bu seçeneğin gerekli olup olmadığını bilmiyorum.
jwinn

Bu hem UNnotification hem de UILocalNotification için işe yarıyor mu?
user6631314

38

Herkes ilgilenebilir, ben sonunda sistem itme afiş gibi görünüyor özel bir görünüm oluşturma sona erdi ama bir kapatma düğmesi (küçük mavi X) ve özel eylem için mesaja dokunun bir seçenek ekler. Ayrıca, kullanıcının eski olanları okumak / kapatmak için zamana sahip olmadan önce birden fazla bildirim gelmesi durumu da desteklenir (Kaç tanesinin birikebileceği konusunda bir sınır yoktur ...)

GitHub'a bağlantı: AGPushNote

Kullanım temel olarak astar üzerindedir:

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

Ve iOS7'de böyle görünüyor (iOS6'nın bir iOS6 görünümü ve hissi var ...)

resim açıklamasını buraya girin


1
Ayrıca şimdi Swift'te yeniden tasarlandı: github.com/charliewilliams/CWNotificationBanner (benim tarafımdan)
builds

Güzel , bu yararlı olacaktır.
星辰 夜 之 星辰

36

Hedef C

resim açıklamasını buraya girin

Çünkü bildirim başlığını göstermek için iOS 10birleştirme willPresentNotificationyöntemine ihtiyacımız var foreground.

Uygulama ön plan modundaysa (etkin)

- (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
Sadece kodu kopyalayın ve UNUserNotificationCenterDelegate protokolünü kullanmayı unutmayın.
Nik Kov

bu bildirim yerine uyarı göstermek istersem?
Mihir Oza

@MihirOza UIAlertController ister misiniz?
Ashwini Chougale

Biliyorum ama uygulama etkinken bildirim pop-up'ı istemiyorum. Yalnızca uygulamamda uyarı istiyorum.
Mihir Oza

25

Uygulama ön planda çalışıyorsa iOS bir bildirim başlığı / uyarısı göstermez. Bu tasarım gereğidir. Ama bunu UILocalNotificationaşağıdaki gibi kullanarak başarabiliriz

  • Uzaktan
    bildirim alırken uygulamanın etkin durumda olup olmadığını kontrol edin . Aktif durumda bir UILocalNotification ateş.

    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
Bunun yardımcı olacağını düşünmüyorum. Yerel ve uzak bildirimler aynı şekilde ele alınır ve sonuç olarak bu yerel bildirim tetiklendiğinde ve uygulama çalışıyorsa, rozet / banner veya ses gösterilmez / oynatılmaz.
RPM

3
Ayrıca iOS Bildirim Merkezi'ne bir giriş bırakacak
Ab'initio

3
Ancak, push bildirimi geldiğinde yerel bir bildirim başlatmazdım. Yerine @ Rick77 gibi benzer bir davranış başlatmak istiyorsunuz: bir uyarı veya bazı ekmek kızartma makinesi gösteren. Sanırım işletim sisteminin benden çalışmasını istediği bir şey için işletim sisteminden tekrar geçmek zorunda değilim.
Fábio Oliveira

3
Bu çözüm, yerel ve uzaktan aynı şekilde işlendiği için, uygulama ön planda olduğunda, uzaktan bildirim geldiğinde bir konum bildirimi oluşturmanın hiçbir şey göstermeyeceği şekilde çalışıyor. Uyarı veya özel uyarı kullanmak çözümdür
Hammer

19
Bu aslında işe yaramıyor. UILocalNotification dokümanlarından: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

Uygulama ön planda çalışıyorsa iOS bir bildirim başlığı / uyarısı göstermez. Bu tasarım gereğidir. Uygulamanızın ön planda iken bildirim alma durumuyla başa çıkmak için bazı kodlar yazmanız gerekir. Bildirimi en uygun şekilde göstermelisiniz (örneğin, bir UITabBarsimgeye rozet numarası ekleme , Bildirim Merkezi başlığını taklit etme vb.).


1
ancak iOS posta uygulamasında bunu yaptılar, posta uygulaması ön planda iken yeni bildirim başlığı / uyarısı
alacaksınız

3
@ Ab'initio Emin değilim, ancak iOS'ta tüm uygulamalar eşit oluşturulmaz. Stok Posta uygulaması, genel SDK'da bulunmayan bir tür özel API kullanıyor varsayalım. Veya bildirim kodu Apple'ın Posta uygulama kimliğiyle bir istisna yapıyor olabilir.
Daniel Martín

1
Ne?? Sert bir öfke saldırısı yapmak üzereyim.
Josh

@ DanielMartín bana iOS 8.0'da ön planda nasıl bir bildirim alacağımı söyleyebilir
Dilip Tiwari

10
Bu yanıtın yalnızca iOS 9 ve sonraki sürümler için geçerli olduğunu unutmayın . İOS 10'dan beri Apple, bildirimleri ( UNUserNotificationCenter API) işlemek için yeni bir API tanıttı . Yeni API ile birlikte, artık uygulama ön planda ise bildirimleri göstermek mümkündür. Bu nedenle, bu sorudaki farklı cevaplar nedeniyle kafanız karıştıysa, bunun nedeni bazı cevapların çok eski olması ve yalnızca iOS 9 ve öncesi için davranışı tanımlaması, diğerlerinin UNUserNotificationCenter ise sadece iOS 10.
tomacco

13

Xcode 10 Swift 4.2

Uygulamanız ön planda olduğunda Anlık Bildirimi göstermek için -

Adım 1: AppDelegate sınıfına temsilci UNUserNotificationCenterDelegate ekleyin.

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

Adım 2: UNUserNotificationCenter temsilcisini ayarlayın

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

3. Adım: Bu adım, uygulamanız ön planda olsa bile uygulamanızın Anında Bildirim göstermesine olanak tanır

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

    }

Adım 4: Bu adım isteğe bağlıdır . Uygulamanızın ön planda olup olmadığını ve ön planda olup olmadığını kontrol edin, ardından Yerel PushNotification'i gösterin.

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()
        }
    }

Yerel Bildirim işlevi -

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
Bu, bir konuya verilen tüm cevapları okuma ihtiyacına harika bir örnektir. Daha önceki iş parçacıkları, temsilci daha nihayet bu yöntemden bahseder ve son olarak bu üç adımda da yapmanız gerekir. TEŞEKKÜR EDERİZ Tam bir cevap için Prashant!
user3069232

Bunun size yardımcı olduğunu bilmek güzel. Mutlu kodlama
Prashant Gaikwad

11

Apple belgelerine göre , Evet uygulama çalışırken bildirim görüntüleyebilirsinizresim açıklamasını buraya girin


Nerede bu temsilci uygulama ya da bir Specifc sınıfta yazabilirsiniz?
iOS Geliştirici

görünümünde bu methd yazmak mı yazmak istersem?
iOS Geliştirici

herhangi bir yere yazabilirsiniz ancak durum UNUserNotificationCenterDelegateprotokole uygun olmalıdır
SPatel

yazamazsınviewDidLoad
SPatel

1
Ben AppDelegate uzatmak öneririzextension AppDelegate: UNUserNotificationCenterDelegate
SPatel

9

Banner uyarısını taklit eden kendi bildiriminizi oluşturabilirsiniz.

Bunun bir yolu, afiş gibi görünen ve dokunma hareketlerini canlandırabilen ve yanıt verebilen özel bir uiview oluşturmaktır. Bunu akılda tutarak, daha fazla işlevsellik ile daha da iyi bannerlar oluşturabilirsiniz.

Ya da sizin için bunu yapan bir api arayabilir ve bunları projenize pod dosyaları olarak ekleyebilirsiniz.

İşte kullandığım bir çift:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages


1
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Robert

1
TWMessageBarManagersingleton tasarım deseni kullandığı için appdelegate'in kendisi aracılığıyla kolayca çağrılabilir ve kullanılabilir. Bağlantılar için teşekkürler.
Jay Mayu

8

Uygulama etkin durumdayken (ön plan veya açık) Anında Bildirim alma kodu. UNUserNotificationCenter belgeleri

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

Bildirim kullanım kodunun userInfo öğesine erişmeniz gerekiyorsa: notification.request.content.userInfo


görünümünde bu işlevi nereye yazmak yüklendi? ya da görünüm denetleyicisi sınıf?
iOS Geliştirici

iç içe bir işlev olarak bir işlevde çağırabilsem> ??
iOS Geliştirici

1
bunu AppDelegate sınıfına koyun. Bu işlevi çağırmanız gerekmez.
Milan Jayawardane

4

Temsilci yöntemine completionHandler satırını eklemek benim için aynı sorunu çözdü:

//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

Hızlı 5'i PushNotification sözlüğünü ayrıştırmak için

    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)")
                            }
                        }
                    }
                }
            }
        }

Üst görünümü almak için topBanner'ı gösterdiğimiz denetleyici

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İfadesi arkadaşınız :-) olduğunu
Nicolas Miari

2

Uygulama temsilcinizde aşağıdaki kodu kullanın

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

Yukarıda belirtildiği gibi, UserNotification.framework başarmak için . Ama benim amacım için zaten app göstermek zorunda ve iOS 11stil var istedim , bu yüzden belki küçük bir yardımcı görünüm oluşturdum, belki birisi için yararlı olacaktır.

GitHub iOS 11 Anlık Bildirim Görünümü .


0

Bunun için en iyi yaklaşım eklemektir UNUserNotificationCenterDelegateiçinde AppDelegatekullanarakextension AppDelegate: UNUserNotificationCenterDelegate kullanım sırasında bildirim elde edebilmek için uygulamayı O uzantı söyler

Ve bu yöntemi uygulayın

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

Bu yöntem, yalnızca uygulama Ön Plandaysa temsilci üzerinde çağrılır .

Nihai Uygulama:

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

Ve bu çağırmak için içeri AppDelegate içinde temsilci ayarlamanız gerekir didFinishLaunchingWithOptionsbu satırı ekleyin

UNUserNotificationCenter.current().delegate = self

Değiştirebilirsiniz

completionHandler(.alert) 

ile

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

0

Swift 5 için

1) AppDelegate'e delege ile onaylayın UNUserNotificationCenterDelegate

2) UNUserNotificationCenter.current().delegate = selfiçindedidFinishLaunch

3) Aşağıdaki yöntemi uygulayın AppDelegate.

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

Bu kadar!


-2

@Danial Martine'nin dediği gibi iOS bir bildirim başlığı / uyarısı göstermeyecek. Bu tasarım gereğidir. Ama eğer gerçekten yapmak zorundaysa, o zaman bir yolu var. Bunu da aynı şekilde başardım.

Ayrıştırma çerçeve çalışmalarını Ayrıştırma FrameWork'ten indirin

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

3. aşağıdaki kodu didReceiveRemoteNotification Yönteminize ekleyin

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

PFPush uzaktan bildirimin nasıl ele alınacağına dikkat edecektir. Uygulama ön plandaysa, uyarıyı gösterir, aksi takdirde üstteki bildirimi gösterir.


uyarmak? Uyarı görünümü mü demek istiyorsun?
iphondroid

1
ama uyarı düğmesi eylemleri için nasıl geri
Charlie

-2

Uygulamanız ön plandaysa, şu anda aynı uygulamayı kullandığınız anlamına gelir. Bu nedenle, genellikle üstte bildirim göstermeye gerek yoktur.

Ancak yine de bu durumda bildirim göstermek istiyorsanız, özel Uyarı Görünümünüzü veya Tost gibi Özel Görünümünüzü veya kullanıcıya bildiriminizin olduğunu göstermek için başka bir şeyi oluşturmanız gerekir.

Uygulamanızda bu tür bir özelliğe sahipseniz üstte bir rozet de gösterebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.