极光推送-iOS语音播报+页面跳转(上篇)

第一次开始写文章:极光推送-iOS语音播报+页面跳转

首先我们需要创建一个Demo(当然你也可以直接拿自己的项目开刀,大不了回档一遍,文章中工程截图是设置过并非从零开始的,但是会教如何配置,BundleId一定要配好推送环境)

创建完成,

  • cd 工程目录
  • 然后vim Podfile
  • 添加Jpush(极光第三方框架)
  • 保存然后pod install,


    极光推送-iOS语音播报+页面跳转(上篇)_第1张图片
    屏幕快照 2018-07-30 下午5.12.17.png
Targets-Capabilities-Background Modes后台语音播报以开启,如下面步骤所示,
极光推送-iOS语音播报+页面跳转(上篇)_第2张图片
Background Modes配置

如果有读者想了解这些勾选的作用可以传入这里iOS Background Modes
这是一篇详细讲解BackgroundModes的文章,该作者如果觉得我的转载很冒昧,请通知我,立刻马上删除...造成的不适不好意思,(以上这两个没有显示出来是因为BundleId并没有推送环境,记得要适配下证书,这里默认各位官已经配置好证书了.)

正常配置好的新工程目录
极光推送-iOS语音播报+页面跳转(上篇)_第3张图片
配置好的目录

如果没有配置的推送的话这个是

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语音播报

你可能感兴趣的:(极光推送-iOS语音播报+页面跳转(上篇))