第一次开始写简书文章:极光推送-iOS语音播报+页面跳转
首先我们需要创建一个Demo(当然你也可以直接拿自己的项目开刀,大不了回档一遍,文章中工程截图是设置过并非从零开始的,但是会教如何配置,BundleId一定要配好推送环境)
创建完成,
- cd 工程目录
- 然后vim Podfile
- 添加Jpush(极光第三方框架)
-
保存然后pod install,
Targets-Capabilities-Background Modes后台语音播报以开启,如下面步骤所示,
如果有读者想了解这些勾选的作用可以传入这里iOS Background Modes
这是一篇详细讲解BackgroundModes的文章,该作者如果觉得我的转载很冒昧,请通知我,立刻马上删除...造成的不适不好意思,(以上这两个没有显示出来是因为BundleId并没有推送环境,记得要适配下证书,这里默认各位官已经配置好证书了.)
正常配置好的新工程目录
如果没有配置的推送的话这个是
iOS极光推送SDK官网进行配置
在AppDelegate.m文件中直接导入
// 引入JPush功能所需头文件
#import "JPUSHService.h"
// iOS10注册APNs所需头文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import
#endif
// 如果需要使用idfa功能所需要引入的头文件(可选)
#import
#import "KELPSpeechSynthesizer.h"
@interface AppDelegate ()
@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;
@end
在implement中实现相关极光方法,
- [self receiveNotification:userInfo] 为笔者自定义的方法,用于封装语音内容方法
#pragma mark- JPUSHRegisterDelegate
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter*)center willPresentNotification:(UNNotification*)notification withCompletionHandler:(void(^)(NSInteger))completionHandler {
// Required
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter*)center didReceiveNotificationResponse:(UNNotificationResponse*)response withCompletionHandler:(void(^)())completionHandler {
// Required
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(); // 系统要求执行这个方法
}
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler {
// Required, iOS 7 Support
[JPUSHService handleRemoteNotification:userInfo];
// [JPUSHService handleRemoteNotification:userInfo];
[self receiveNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo {
// Required,For systems with less than or equal to iOS6
[JPUSHService handleRemoteNotification:userInfo];
}
- 这里就是笔者实现的内容,这里的KELPSpeechSynthesizer是关于播放的问题,里面对于iOS的版本出现的语音异常做了处理,但是注释了,读者有兴趣可以尝试一下
//跳转问题
- (void)receiveNotification:(NSDictionary*)userInfo{
NSDictionary*aps = [userInfovalueForKey:@"notifyMessage"];
NSString*content = [userInfovalueForKey:@"soundMessage"];
NSString *version = [UIDevice currentDevice].systemVersion;
// 针对 10.0 以下的iOS系统进行处理
[[KELPSpeechSynthesizer sharedSpeechSynthesizer] isSpeaking];
[[KELPSpeechSynthesizer sharedSpeechSynthesizer] speakString:content];
[JPUSHService handleRemoteNotification:userInfo];
}
//实现一下backgroundPlayerID:这个方法:
+(UIBackgroundTaskIdentifier)backgroundPlayerID:(UIBackgroundTaskIdentifier)backTaskId{
//设置并激活音频会话类别
AVAudioSession *session=[AVAudioSession sharedInstance];
[sessionsetCategory:AVAudioSessionCategoryPlayback error:nil];
[sessionsetActive:YESerror:nil];
//允许应用程序接收远程控制
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//设置后台任务ID
UIBackgroundTaskIdentifier newTaskId=UIBackgroundTaskInvalid;
newTaskId=[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
if(newTaskId!=UIBackgroundTaskInvalid&&backTaskId!=UIBackgroundTaskInvalid){
[[UIApplication sharedApplication] endBackgroundTask:backTaskId];
}
returnnewTaskId;
}
最后我们在applicationDidEnterBackground这个方法中添加
// 开启后台处理多媒体事件
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
AVAudioSession *session=[AVAudioSession sharedInstance];
[sessionsetActive:YESerror:nil];
// 后台播放
[sessionsetCategory:AVAudioSessionCategoryPlayback error:nil];
// 这样做,可以在按home键进入后台后 ,播放一段时间,几分钟吧。但是不能持续播放网络歌曲,若需要持续播放网络歌曲,还需要申请后台任务id,具体做法是:
_backgroundTaskIdentifier=[AppDelegate backgroundPlayerID:_backgroundTaskIdentifier];
// 其中的_bgTaskId是后台任务UIBackgroundTaskIdentifier _bgTaskId;
即可完成,顺便附上我的一个小Demo吧.配置好证书只需要在demo里更换极光的key值和工程项目的BundleId(这两个都是你自己的)就可以直接用极光推送啦。
这个Demo里面有个语音播放的小demo,(修复别人ios8出现语速异常问题)
感谢大佬的文章 CoderRocker_Axl
Github地址: iOS语音播报