需求分析
实现类似支付宝微信收款后的语音播报如:支付宝到账xx元。要求是APP在前台运行、锁屏、杀死进程后都会有语音播报。那想到的解决方案就是利用推送了。
功能实现思路分析
上面说了,要使用推送,也就是APNs,这里我使用了极光推送,接下来就是实现手机接收到通知之后播报语音了,关于这个功能的实现在iOS10以后苹果新增了“推送拓展”UNNotificationServiceExtension
,我们可以在这里操作,在这里我用的是苹果官方的AVSpeechSynthesizer
和AVSpeechUtterance
来将接收到的推送内容转换成语音播报,其中在这里,iOS12.1以后,不允许在UNNotificationServiceExtension
中播放语音了,我也查找过很多资料,最终实现了一个比较折中的方法,下面会详细说。
功能实现
一、极光推送
关于极光推送的证书申请啥的就不讲了,官方文档上写的很清楚了,这里只说将极光推送SDK集成到项目之后了。
1、集成极光推送SDK
在项目中的Podfile文件中添加pod 'JPush'
,然后pod install
,等待pod完成。
2、在AppDelegate.m中编写推送功能代码
(其实极光推送的文档里也有)。
(1、在项目中引入所需头文件:
// 引入 JPush 功能所需头文件
#import "JPUSHService.h"
// iOS10 注册 APNs 所需头文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
(2、设置代理
@interface AppDelegate ()<JPUSHRegisterDelegate>
(3、在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中配置推送相关配置
初始化APNs:
- (void)initAPNS {
//Required
//notice: 3.0.0 及以后版本注册可以这样写,也可以继续用之前的注册方式
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
if (@available(iOS 12.0, *)) {
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound|UNAuthorizationOptionProvidesAppNotificationSettings;
//应用内显示通知设置的按钮
} else {
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
}
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// 可以添加自定义 categories
// NSSet<UNNotificationCategory *> *categories for iOS10 or later
// NSSet<UIUserNotificationCategory *> *categories for iOS8 and iOS9
}
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
}
初始化JPUSH:
#pragma mark 初始化jpush
- (void)initJpushWithOptions:(NSDictionary *)launchOptions {
// Optional
// 获取 IDFA
// 如需使用 IDFA 功能请添加此代码并在初始化方法的 advertisingIdentifier 参数中填写对应值
// NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
// Required
// init Push
// notice: 2.1.5 版本的 SDK 新增的注册方法,改成可上报 IDFA,如果没有使用 IDFA 直接传 nil
// 如需继续使用 pushConfig.plist 文件声明 appKey 等配置内容,请依旧使用 [JPUSHService setupWithOption:launchOptions] 方式初始化。
NSString *appKey = @"你申请的推送AppKey";
[JPUSHService setupWithOption:launchOptions appKey:appKey
channel:@"0"
apsForProduction:NO
advertisingIdentifier:nil];
}
/*!
* @abstract 启动SDK
*
* @param launchingOption 启动参数.
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
* @param channel 发布渠道. 可选.
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
* App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
* @param advertisingId