在显示来自viewDidload的警报之前显示来自app delegate的警报

我试图通过parse.com文档中概述的app delegate显示推送通知中包含的消息。

我遇到的问题是,在我的第一个视图控制器的viewdidload方法中,我提出了一个用户在使用应用程序之前必须看到的警报。

在用户从viewdidload方法中看到警报后,如何从我的应用程序委托中调用该方法?

编辑:

所以,正如评论中所建议的那样,我添加了一个全局变量,一旦我从我的ViewDidload方法显示警报,我就设置为true,但是我的appDelegate的通知警报仍然没有出现。

这是我的app delegate.m文件:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [Parse setApplicationId:@"xxxxxxxxxxxxxxxx" clientKey:@"xxxxxxxxxxxx"]; // Register for Push Notitications, if running iOS 8 if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; } else { // Register for Push Notifications before iOS 8 [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; } return YES; NSDictionary *notificationPayload = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (Notification == true) { if (![pushText isEqual: @""]) { pushText = [[notificationPayload objectForKey:@"aps"] objectForKey:@"alert"]; UIAlertView *alert_news = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"News", "") message:pushText delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; [alert_news show]; } } } 

这是我的viewdidload方法:

  RoadSafetyAppAppDelegate *AppDelegate; - (void)viewDidLoad { AppDelegate = (RoadSafetyAppAppDelegate *)[[UIApplication sharedApplication] delegate]; [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. backgroundImage.alpha = 0.3; toRecipients = [[NSArray alloc]initWithObjects:@"records@shellharbour.nsw.gov.au", nil]; static int appCounter; if ( appCounter < 1 ) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Disclaimer", "") message:NSLocalizedString(@"Using a mobile phone whilst driving is against the law. Ensure that you are not behind the wheel when using this app.", "") delegate:nil cancelButtonTitle:@"I agree to not use a mobile phone while driving" otherButtonTitles: nil]; [alert show]; appCounter = appCounter+1; AppDelegate.NotificationAlert = @"1"; AppDelegate.Notification = true; } } 

因为您想要显示免责声明一次,并确保用户在显示任何通知之前在同意按钮上看到并点按了。 你可以使用简单的本地通知来做到这一点。

在委托中(… didFinishLaunchingWithOptions 🙂

  -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ //......you code here if ([[NSUserDefaults standardUserDefaults] boolForKey:@"disclaimerShown"]==nil) [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"disclaimerShown"]; [[NSUserDefaults standardUserDefaults] synchronize]; } //......you code here if ([[NSUserDefaults standardUserDefaults] boolForKey:@"disclaimerShown"]){ //YES if (![pushText isEqual: @""]) { pushText = [[notificationPayload objectForKey:@"aps"] objectForKey:@"alert"]; UIAlertView *alert_news = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"News", "") message:pushText delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; [alert_news show]; } } } -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{ NSString *value=[NSString stringWithFormat:@"%@",[notification.userInfo valueForKey:@"key"]]; if ([value isEqualToString:@"disclaimerShown"]) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"disclaimerShown"]; [[NSUserDefaults standardUserDefaults] synchronize]; ///continue handle parse.com notification } } 

在你的ViewController:

 -(void)viewDidLoad{ //... if ([[NSUserDefaults standardUserDefaults] boolForKey:@"disclaimerShown"]==NO){ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Disclaimer", "") message:NSLocalizedString(@"Using a mobile phone whilst driving is against the law. Ensure that you are not behind the wheel when using this app.", "") delegate:nil cancelButtonTitle:@"I agree to not use a mobile phone while driving" otherButtonTitles: nil]; alert.tag = 1; [alert show]; } //... } 

pragma mark – UIAlertViewDelegate

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (alertView.tag == 1) {//the disclaimer alert if (buttonIndex == 0) { UILocalNotification *alarm = [[UILocalNotification alloc] init]; alarm.userInfo = @{@"key": @"disclaimerShown"}; alarm.fireDate = [NSDate date]; alarm.timeZone = [NSTimeZone defaultTimeZone]; [[UIApplication sharedApplication] scheduleLocalNotification:alarm]; } } } 

而不是AppDelegate bool标志属性使用NSUserDefaults ;

AppDelegate中更新此行:

 if (Notification == true) 

 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Notification"] == YES) 

并在ViewController – > viewDidLoad方法更新行中:

 AppDelegate.Notification = true; 

 [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"Notification"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

希望这可以帮助。