调用didReceiveRemoteNotification当应用程序推出的第一次 [英] Calling didReceiveRemoteNotification when app is launching for the first time

查看:179
本文介绍了调用didReceiveRemoteNotification当应用程序推出的第一次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经实现了我的didReceiveRemoteNotification方法。它的工作原理,并显示它是通过传递的通知数据的视图控制器。这只能当应用程序已经在前台或者如果它在后台运行。然而,当应用程序不运行,用户点击一个通知,应用程序启动,但它看起来好像没有通知已收到。该通知不写入到文本文件和的ViewController未被推

I have implemented my didReceiveRemoteNotification method. It works and displays a view controller with the notification data which is passed through. This only works when the app was already in the foreground or if it was running in the background. However, when the app is not running and the user clicks a notification, the app launches, but it appears as if no notification has been received. The notification is not written into the text file and the viewcontroller is not being pushed.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if ( application.applicationState == UIApplicationStateActive)
    {
        NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

        NSString *alertMsg = @"";
        NSString *badge = @"";
        NSString *sound = @"";
        NSString *custom = @"";

        if( [apsInfo objectForKey:@"alert"] != NULL)
        {
            alertMsg = [apsInfo objectForKey:@"alert"];
        }


        if( [apsInfo objectForKey:@"badge"] != NULL)
        {
            badge = [apsInfo objectForKey:@"badge"];
        }


        if( [apsInfo objectForKey:@"sound"] != NULL)
        {
            sound = [apsInfo objectForKey:@"sound"];
        }

        if( [userInfo objectForKey:@"Type"] != NULL)
        {
            custom = [userInfo objectForKey:@"Type"];
        }

        // Set your appending text.
        NSString *textToAdd = [NSString stringWithFormat:@":%@", alertMsg];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory];
        NSString *fileContents = [[NSString alloc]  initWithContentsOfFile:fileName usedEncoding:nil error:nil];

        NSString *textToFile;

        if (fileContents == NULL)
        {
            textToFile = alertMsg;
        }

        // Here you append new text to the existing one
        if (fileContents != NULL)
        {
            textToFile = [fileContents stringByAppendingString:textToAdd];
        }

        // Here you save the updated text to that file
        paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        documentsDirectory = [paths objectAtIndex:0];
        fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory];
        NSString *content = textToFile;
        [content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];

        NSArray *fileData = [textToFile componentsSeparatedByString:@":"];

        NSMutableArray *tableDataFromFile;
        tableDataFromFile = [[NSMutableArray alloc] init];

        int i = 0;

        for (i = 1; i < [fileData count]; i++)
        {
            [tableDataFromFile addObject:fileData[i]];
        }

        NotificationViewController *vc = [[NotificationViewController alloc] initWithNibName:@"NotificationViewController" bundle:nil];
        vc.tableData = tableDataFromFile;

        UIViewController *root = self.mainNavController.topViewController;
        NSArray *vcs = [NSArray arrayWithObjects:root, vc, nil];
        [self.mainNavController setViewControllers:vcs animated:YES];
    }
        // app was already in the foreground
    else
    {
        while (done == FALSE)
        {

        }

        NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

        NSString *alertMsg = @"";
        NSString *badge = @"";
        NSString *sound = @"";
        NSString *custom = @"";

        if( [apsInfo objectForKey:@"alert"] != NULL)
        {
            alertMsg = [apsInfo objectForKey:@"alert"];
        }


        if( [apsInfo objectForKey:@"badge"] != NULL)
        {
            badge = [apsInfo objectForKey:@"badge"];
        }


        if( [apsInfo objectForKey:@"sound"] != NULL)
        {
            sound = [apsInfo objectForKey:@"sound"];
        }

        if( [userInfo objectForKey:@"Type"] != NULL)
        {
            custom = [userInfo objectForKey:@"Type"];
        }

        // Set your appending text.
        NSString *textToAdd = [NSString stringWithFormat:@":%@", alertMsg];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory];
        NSString *fileContents = [[NSString alloc]  initWithContentsOfFile:fileName usedEncoding:nil error:nil];

        NSString *textToFile;

        if (fileContents == NULL)
        {
            textToFile = alertMsg;
        }

        // Here you append new text to the existing one
        if (fileContents != NULL)
        {
            textToFile = [fileContents stringByAppendingString:textToAdd];
        }

        // Here you save the updated text to that file
        paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        documentsDirectory = [paths objectAtIndex:0];
        fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory];
        NSString *content = textToFile;
        [content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];

        NSArray *fileData = [textToFile componentsSeparatedByString:@":"];

        NSMutableArray *tableDataFromFile;
        tableDataFromFile = [[NSMutableArray alloc] init];

        int i = 0;

        for (i = 1; i < [fileData count]; i++)
        {
            [tableDataFromFile addObject:fileData[i]];
        }

        NotificationViewController *vc = [[NotificationViewController alloc] initWithNibName:@"NotificationViewController" bundle:nil];
        vc.tableData = tableDataFromFile;

        UIViewController *root = self.mainNavController.topViewController;
        NSArray *vcs = [NSArray arrayWithObjects:root, vc, nil];
        [self.mainNavController setViewControllers:vcs animated:YES];

    }
            // app was just brought from background to foreground


}

可能有人请帮我解决这个问题?一旦didFinishLaunchingWithOptions完成完成的布尔值被设置为true。我只想notificationviewcontroller打开并显示通知,如果通知pssed $ P $而应用程序并不运行在所有。

Could someone please help me solve this problem? The boolean done is set to true once the didFinishLaunchingWithOptions is completed. I just want the notificationviewcontroller to open and display the notification if a notification is pressed while the app is not running at all.

推荐答案

您应该添加像这样到code:

You should add something like this to your code :

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
    *)launchOptions {

        NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

        //Accept push notification when app is not open
        if (remoteNotif) {      
            [self handleRemoteNotification:application userInfo:remoteNotif];
            return YES;
        }

        return YES;
    }

您可以从 didReceiveRemoteNotification 逻辑转移到一些常见的功能,并调用该函数,从两个地方。这如果用户通过点击该通知打开应用程序才有效。如果用户通过点击应用程序图标打开应用程序,通知的数据将无法达到的应用程序。

You can move the logic from didReceiveRemoteNotification to some common function and call that function from both places. This will only work if the user open the app by tapping the notification. If the user opens the app by tapping the app icon, the notification data won't reach the app.

这篇关于调用didReceiveRemoteNotification当应用程序推出的第一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆