代码之家  ›  专栏  ›  技术社区  ›  Maria Scanavie

iOS本地通知不会在锁定的屏幕上播放声音

  •  1
  • Maria Scanavie  · 技术社区  · 6 年前

    我的应用程序应该通过iBeacon范围显示位置感知广告。这没有问题:当“看到”某些信标并安排及时发送的本地通知时,应用程序会在后台唤醒。

    问题是,发送到锁定屏幕的本地通知不会点亮屏幕,甚至不会播放任何声音或振动,这对营销团队来说是一场灾难。

    在将通知发送到前台时,声音正常播放,但在发送到锁定屏幕时,声音丢失。

    以下是我为UNUserNotificationCenter安排本地通知的代码:

    - (void)scheduleLocalNotificationImageWithTitle:(NSString*)title andBody:(NSString*)body andImagePath:(NSString*)imagePath{
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    UNNotificationAction *deleteAction = [UNNotificationAction actionWithIdentifier:@"Close"
                                                                              title:@"Close" options:UNNotificationActionOptionDestructive];
    
    UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"NOT_CategoryImage"
                                                                              actions:@[deleteAction] intentIdentifiers:@[]
                                                                              options:UNNotificationCategoryOptionNone];
    NSSet *categories = [NSSet setWithObject:category];
    
    [center setNotificationCategories:categories];
    
    UNNotificationAttachment *imageAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"SaleNOTIF_Image" URL:[NSURL fileURLWithPath:imagePath] options:nil error:nil];
    
    UNMutableNotificationContent *content = [UNMutableNotificationContent new];
    content.title = title;
    content.body = body;
    content.sound = [UNNotificationSound defaultSound];
    content.attachments = @[imageAttachment];
    
    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.1 repeats:NO];
    
    NSString *identifier = @"NotificationImage";
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
    
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (error != nil) {
            NSLog(@"Something went wrong: %@",error);
        }
    }];
    }
    

    以及didFinishLaunching中UNUserNotificationCenter的代码:

        UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
        if( !error ){
    
        }
    }];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    
    
    UNNotificationCategory* generalCategory = [UNNotificationCategory
                                               categoryWithIdentifier:@"GENERAL"
                                               actions:@[]
                                               intentIdentifiers:@[]
                                               options:UNNotificationCategoryOptionAllowInCarPlay];
    
    
    
    // Register the notification categories.
    [center setNotificationCategories:[NSSet setWithObjects:generalCategory, nil]];
    

    我也有center willPresentNotification方法,但据我所知,它只对前台有用。

    -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{    
    CLS_LOG(@"Userinfo %@", notification.request.content.body);
    
    completionHandler(UNNotificationPresentationOptionSound + UNNotificationPresentationOptionAlert);
    }
    

    你知道我错过了什么吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Maria Scanavie    6 年前

    好吧,我终于知道它在用什么了 this 苹果公开讨论线程。

    故事本身很搞笑:我在办公室里创建了我的项目,而应用程序却保持沉默。然后我回到家,继续和我的MacBook Pro一起工作——瞧一切正常。我锁上了我的屏幕,通知弹了出来,听起来就像他们应该做的那样。前几天,我带着我的MacBook跑到办公室,编写了相同的代码,但没有任何改变:我的应用程序就像两天前一样保持沉默。我查了所有东西,包括代理和GPS,但什么也没找到,因为。。。

    结果证明代码是正确的,问题本身就存在于系统的某个地方。所以 钥匙 解决方案就是防止你(和你的用户)的Apple Watch重复你的应用程序的通知(只是从Watch应用程序)。因为如果它重复出现,iPhone就会静音。

    我只是希望在iOS 11上处理通知时,这可以让其他人花很多时间。只要记住,总有手表。