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



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

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

将通知传递到前台时正常播放的声音,但在传递到锁定屏幕时会丢失声音。

以下是我为联合国大学通知中心安排本地通知的代码:

- (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]];

我也有中心将呈现通知方法,但据我所知,它只对前景有用。

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

任何想法我错过了什么?

好的,我终于知道它在 Apple 公共讨论中使用此线程的内容。

这个故事本身很搞笑:我在办公室里构建了我的项目,应用程序保持沉默。然后我回到家,继续使用我的MacBook Pro工作 - 瞧!- 一切正常。我锁定了屏幕,通知弹出并按预期发出声音。前几天,我带着MacBook跑到办公室,构建了相同的代码,但没有任何变化:我的应用程序只是像两天前一样保持沉默。我已经挖出了包括代理和GPS在内的所有东西,但一无所获,因为......

事实证明,代码没问题,问题本身就出在系统中的某个地方。因此该解决方案的关键只是防止您(和您的用户)的Apple Watch重复您的应用程序的通知(仅来自Watch应用程序)。因为如果它重复,它会使iPhone保持沉默。

这可能是为了防止通知用声音和振动触发所有内容,并且只让您知道使用最近的设备发生了令人兴奋的事情(现在手表比任何东西都近,如果它戴在你的手腕上)。这就是为什么当我在家时一切正常的原因:我只是没有戴手表,所以它不必重复通知,所以没有阻止它们。

我只是希望这能让其他人在 iOS 11 上处理通知时花费大量时间。请记住,总是有手表。

最新更新