iOS中的UILocalNotification中未显示操作和类别

时间:2015-08-27 00:58:01

标签: ios objective-c cocoa-touch uilocalnotification appdelegate

我从苹果文档here中得到以下内容,我需要为UILocalNotification添加一个类别:

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


    UIMutableUserNotificationAction *acceptAction =
    [[UIMutableUserNotificationAction alloc] init];

    // Define an ID string to be passed back to your app when you handle the action
    acceptAction.identifier = @"ACCEPT_IDENTIFIER";

    // Localized string displayed in the action button
    acceptAction.title = @"Accept";

    // If you need to show UI, choose foreground
    acceptAction.activationMode = UIUserNotificationActivationModeBackground;

    // Destructive actions display in red
    acceptAction.destructive = NO;

    // Set whether the action requires the user to authenticate
    acceptAction.authenticationRequired = NO;


    // First create the category
    UIMutableUserNotificationCategory *inviteCategory =
    [[UIMutableUserNotificationCategory alloc] init];

    // Identifier to include in your push payload and local notification
    inviteCategory.identifier = @"INVITE_CATEGORY";

    // Add the actions to the category and set the action context
    [inviteCategory setActions:@[acceptAction]
                    forContext:UIUserNotificationActionContextDefault];

    // Set the actions to present in a minimal context
    [inviteCategory setActions:@[acceptAction]
                    forContext:UIUserNotificationActionContextMinimal];

    NSSet *categories = [NSSet setWithObjects:inviteCategory, nil];



    UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:categories];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

    // Handle launching from a notification
    UILocalNotification *localNotif =
    [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotif) {
        NSLog(@"Recieved Notification %@",localNotif);
    }

    return YES;
}

以下是我构建本地通知的方式:

NSDate *dateChosen = [self.reminderDatePicker date];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:dateChosen];
    NSInteger hour = [components hour];
    NSInteger minute = [components minute];

//    NSCalendar *calendar = [NSCalendar currentCalendar];
//    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay: 3];
    [components setMonth: 7];
    [components setYear: 2012];
    [components setHour: hour];
    [components setMinute: minute];
    [components setSecond: 0];
    [calendar setTimeZone: [NSTimeZone defaultTimeZone]];
    NSDate *dateToFire = [calendar dateFromComponents:components];



    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
            localNotification.fireDate = dateToFire;

            [localNotification setRepeatInterval: kCFCalendarUnitDay];
            NSLog(@"Notification will be shown on: %@ ",localNotification.fireDate);
            localNotification.userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:self.dayPeriod, @"name", nil];
            localNotification.timeZone = [NSTimeZone defaultTimeZone];
            localNotification.alertBody = alertMessage;
            localNotification.alertAction = NSLocalizedString(@"View details", nil);
            localNotification.repeatInterval = NSDayCalendarUnit;
            localNotification.soundName = UILocalNotificationDefaultSoundName;
            localNotification.applicationIconBadgeNumber = -1;

            [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

它只显示带有关闭按钮的默认通知,而不是我的接受按钮。

如何在本地通知中显示此“接受”按钮?

1 个答案:

答案 0 :(得分:4)

您在UILocalNotification的主体代码中遗漏的一件事是明确告诉它是基于类别的通知。

将类别属性添加到通知中:

localNotification.category = @"INVITE_CATEGORY";