Soru İOS push bildirimi alındığında bir görünüm denetleyicisi açın


Bir kullanıcı, alınan push bildirim mesajını tıkladığında belirli bir view kontrolörü açmak istiyorum, ancak bir push bildirim mesajı aldığımda ve mesajı tıkladığında, sadece uygulama açılır, ancak belirli bir view controller'a yönlendirilmez.

Kodum

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    if (applicationIsActive) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Bildirim"
                                                            message:[NSString stringWithFormat:@"%@ ",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]
                                                           delegate:self cancelButtonTitle:@"Ok" 
                                                  otherButtonTitles:nil];
        [alertView show];

        UIViewController *vc = self.window.rootViewController;
        PushBildirimlerim *pvc = [vc.storyboard instantiateViewControllerWithIdentifier:@"PushBildirimlerim "];

        [vc presentViewController:pvc animated:YES completion:nil];
     }
}

Sorum şu iOS push bildirimleriyle ilgilidir.


25
2017-12-24 08:19


Menşei


Cevabımı şuradan kontrol et: stackoverflow.com/questions/42940629/... - Joe


Cevaplar:


İle ilgili sorunlar yaşıyor olabilirsiniz if (applicationIsActive) şart.

Üzerinde bir breakpoint koy -didReceiveRemoteNotification Farklı senaryolarda çalışıp çalışmadığını ve Eğer-şart.

(belli bir ölçüde ilgisiz ama kontrol etmeye değer) bu soru:
arka planda olduğunda didReceiveRemoteNotification


Not:

-didReceiveRemoteNotification uygulamanız şu anda çalışmıyorsa (başlangıçta) kapalı ve uygulamayı açmak için push bildirimi üzerine tıkladım.
Uygulama, uygulama ön plandayken veya uygulama arka plandan ön plana geçtiğinde bir itme bildirimi alındığında yürütülür.

Apple Referansı: https://developer.apple.com/documentation/uikit/uiapplicationdelegate

Uygulama çalışıyorsa ve bir uzaktan bildirim alırsa, uygulama   bildirimi işlemek için bu yöntemi çağırır. Uygulamanız   Bu yöntem uygun bir ders almak için bildirimi kullanmalıdır   eylem
  ...
  İtme bildirimi geldiğinde uygulama çalışmıyorsa, yöntem   uygulamayı başlatır ve uygun bilgileri sağlar   başlatma seçenekleri sözlüğü. Uygulama bu yöntemi işlemek için çağırmıyor   Bu itme bildirim. Bunun yerine, uygulamanızın    Uygulama: willFinishLaunchingWithOptions: veya    Uygulama: didFinishLaunchingWithOptions: yönteminin   bildirim yükü verilerini itin ve uygun şekilde yanıtlayın.


Yani ... uygulama olduğunda koşmak yok ve kullanıcı itme bildirimine tıkladığında itme bildirimi alınır, uygulama başlatılır ve şimdi... itme bildirim içerikleri -didFinishLaunchingWithOptions: yönteminde launchOptions parametre.

Diğer bir deyişle... -didReceiveRemoteNotification Bu kez yürütmeyecek ve ayrıca bunu yapmanız gerekir:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //...
    NSDictionary *userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

    if(apsInfo) {
        //there is some pending push notification, so do something
        //in your case, show the desired viewController in this if block
    }
    //...
}

Ayrıca okumak Yerel ve Uzak Bildirimleri Kullanırken Apple'ın Belgesi


44
2017-12-24 08:46



Uygulamanız arka planda ise ve kullanıcı ön plana girer, çünkü kullanıcı bir itme bildirimine dokunduğunda, uygulama appliaction:didFinishLaunchingWithOptions (zaten başlatıldığı için) ve tetikleyiciler application:didReceiveRemoteNotification: - zbMax
Cevabınız için teşekkürler, kodunuzu kullandım ve ayrıca denedim ([apsInfo objectForKey: @ "alert"]! = NULL) {Denetleyiciyi görüntülemek için} tuşuna basın, ancak uygulama kapatıldığında, uygulama ana ekranda mesaj görünümü kontrolünde kalmaz. - cdsoft
@cdsoft: Üzgünüm, seni izlemedim. push bildirimini tıkladığınızda ve uygulama başlatıldığında, if-condition'i yürütür, ancak bekleyen push bildirimleri olmadığında, uygulamanız normal şekilde başlatılır. - staticVoidMan
Yardımcı olduğunuz için teşekkür ederim, kod bloğunuzu kullandım, didFinishLaunchingWithOptions'da aynı kodu yazdım ve PushBildirimlerim görünümüne yönlendirme kodu yazdım. Uygulama kapalıysa ve yeni push bildirimi tıklatırsam, uygulama açılır ancak PushBildirimlerim görünümünü yeniden yönlendirmez. Bu sorunu çözemedim. - cdsoft
Hadi bu tartışmaya sohbete devam et - cdsoft


Tanımlayıcı adında fazladan boşluk var. Çıkarın ve deneyin:

UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
PushBildirimlerim* pvc = [mainstoryboard instantiateViewControllerWithIdentifier:@"PushBildirimlerim"];
[self.window.rootViewController presentViewController:pvc animated:YES completion:NULL];

6
2017-12-24 08:26



tamam, güncellenmiş cevabı kontrol et. - Toseef Khilji
uygulama kapalı olduğunda didReceiveRemoteNotification çağrılmıyor, uygulamanızın etkin durumda olduğu veya bildirim merkezinden bildirim üzerine dokunduğunuzda çağrılır. - Toseef Khilji
Bu süreyi size göre kullanmalı mıyım? - cdsoft
@staticVoidMan'ın cevabını düzgün okuyalım, açıklamıştı. - Toseef Khilji
@Virussmca, Cevabınız için teşekkürler ama bu benim problemimi çözdü ... UIViewController * viewController = (UIViewController*)[[NSClassFromString(@"ViewControllerName") alloc] init]; - Zaid Pathan


Uygulama askıya alındığında / sonlandırıldığında ve itme bildirimi geldiğinde uygulamamın yalnızca açıldığını ve çözümün söz konusu bildirimine karşılık gelen belirli bir ekrana yönlendirilmediğiyle aynı sorunu yaşıyordum.

içinde - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions bu yöntem parametre launchOptions belirli bir ekrana yönlendirme yöntemini çağırmamız gerektiğini kontrol ederek bildirime sahip olup olmadığını bildirir.

kod aşağıdaki gibidir ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //your common or any code will be here at last add the below code..

    NSMutableDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    if (notification)
    {
//this notification dictionary is same as your JSON payload whatever you gets from Push notification you can consider it as a userInfo dic in last parameter of method -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
        NSLog(@"%@",notification);
        [self showOfferNotification:notification];
    }

     return YES;
}

sonra yöntem showOfferNotification: bildirim kullanıcı gibi ilgili ekrana yönlendirebilirsiniz ...

//** added code for notification
-(void)showOfferNotification:(NSMutableDictionary *)offerNotificationDic{
//This whole is my coding stuff.. your code will come here..
    NSDictionary *segueDictionary = [offerNotificationDic valueForKey:@"aps"];

    NSString *segueMsg=[[NSString alloc]initWithFormat:@"%@",[segueDictionary valueForKey:@"alert"]];

    NSString *segueID=[[NSString alloc]initWithFormat:@"%@",[offerNotificationDic valueForKey:@"id"]];

    NSString *segueDate=[[NSString alloc]initWithFormat:@"%@",[offerNotificationDic valueForKey:@"date"]];

    NSString *segueTime=[[NSString alloc]initWithFormat:@"%@",[offerNotificationDic valueForKey:@"time"]];

    NSLog(@"Show Offer Notification method : segueMsg %@ segueDate %@ segueTime %@ segueID %@",segueMsg,segueDate,segueTime,segueID);

    if ([segueID isEqualToString:@"13"]){

        NSString *advertisingUrl=[[NSString alloc]initWithFormat:@"%@",[offerNotificationDic valueForKey:@"advertisingUrl"]];

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:segueMsg forKey:@"notificationMsg"];
        [defaults setObject:segueDate forKey:@"notifcationdate"];
        [defaults setObject:segueTime forKey:@"notifcationtime"];
        [defaults setObject:advertisingUrl forKey:@"advertisingUrl"];
        [defaults synchronize];

        navigationController = (UINavigationController *)self.window.rootViewController;
        UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
        FLHGAddNotificationViewController *controller = (FLHGAddNotificationViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"offerViewController"];
        [navigationController pushViewController:controller animated:YES];
    }
}

2
2017-12-28 13:20