导言

前两天产品司理期望在B端的App上实现订单告诉的语音提示功用,类似于微信、支付宝的收款到账告诉。遂展开调研,最终在拜读各位大佬的文章后,终于依据 Notification Service Extension 实现此功用,在此记录一笔。

何为 Notification Service Extension

Notification Service Extension 是 iOS 10 推出的体系扩展。它提供了对长途推送告诉音讯的阻拦预处理功用。

实现思路

创立一个推送扩展(Notification Service Extension),在长途告诉音讯到达时进行阻拦并解析音讯中的内容,再依据订单类型,对告诉的声响差异化设置。然后达到播映不同的语音的目的。

1. 创立 Extension 的 AppID

Extension是依赖于主App的插件。其生命周期受体系办理,不受主App办理。首要咱们需要登录苹果的开发者账号,为推送扩展创立它自己的App ID

Notification Service Extension 实现语音播报

创立ID时,我在capabilities中选中了App Group项。App Group用于创立Extension与主App的共享数据空间。便利今后存储在线生成的语音文件,用来播报订单号与金额。(写本文时没有这个需求,所以暂时不必设置)

Notification Service Extension 实现语音播报

2. 创立描绘文件 Profile

依照正常流程,创立Extension的描绘文件。

Notification Service Extension 实现语音播报

3. 项目工程添加 Notification Extendsion

3.1 主工程装备

主工程的Background Mode依照如下勾选:

Notification Service Extension 实现语音播报

3.2 创立扩展

点击 File -> New -> Target,创立一个Notification Service Extension

Notification Service Extension 实现语音播报
Notification Service Extension 实现语音播报

3.3 装备扩展

创立完结后,导入描绘文件。

Notification Service Extension 实现语音播报

4. 生成语音文件

经过上面的步骤,咱们的扩展已经装备完结。下面持续生成语音文件。因为现在项目中订单的各种状态所对应的提示是固定的。所以直接运用科大讯飞的在线语音合成,得到不同的语音文件。

现在语音文件一致放到了主项目中的Resource文件目录下:

Notification Service Extension 实现语音播报

5. Extension 编码

完结Extendsion装备,并准备好语音文件后。咱们可以进入到编码部分。 对长途推送的阻拦处理,都集中在NotificationService.m文件。

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
  self.contentHandler = contentHandler;
  self.bestAttemptContent = [request.content mutableCopy];
  /// 解析推送音讯
  NSMutableDictionary *extras = [NSMutableDictionary dictionaryWithDictionary: self.bestAttemptContent.userInfo];
  /// 拿到订单类型
  NSNumber *msgType = extras[@"msgType"];
  /// 依据订单类型,拿到对应音频文件名称
  NSString *soundName = [self soundNameByNotifyType:msgType.integerValue];
  /// 差异化设置推送声响
  self.bestAttemptContent.sound = ISNOTEMPTY_STRING(soundName) ? [UNNotificationSound soundNamed:soundName] : [UNNotificationSound defaultSound];
  NSLog(@"(%@)%@", soundName, msgType);
  self.contentHandler(self.bestAttemptContent);
}
-(NSString *)soundNameByNotifyType:(MDBShopMallOrderType)type{
  NSString *soundName = @"";
  switch (type) {
      case MDBShopMallOrderTypeNew:
          soundName = @"新订单.mp3";
          break;
      case MDBShopMallOrderTypeWriteOff:
          soundName = @"核销.mp3";
          break;
      case MDBShopMallOrderTypeError:
          soundName = @"配送反常.mp3";
          break;
      case MDBShopMallOrderTypeRefund:
          soundName = @"退款.mp3";
          break;
      default:
          soundName = @"";
          break;
  }
  return soundName;
}

调试

我运用Knuff模拟长途推送告诉音讯。具体的音讯格局,请自行查阅推送平台的文档阐明。

Notification Service Extension 实现语音播报
最重要的是,假如期望Notification Extension生效,那么mutable-content字段必须设置为 1

感谢

iOS15适配本地告诉功用及语音播报探索

iOS13微信收款到账语音提示开发总结