IOS后臺(tái)語(yǔ)音播報(bào):微信收款成功,收款0.01元

參考了下另外一個(gè)兄弟的代碼簡(jiǎn)書(shū)
我直接拿個(gè)推做的透?jìng)魍扑蜏y(cè)試的.
上兩個(gè)代碼.

appdalegate

//
//  AppDelegate.m
//  Sound
//
//  Created by Mac on 2017/10/25.
//  Copyright ? 2017年 stormrage. All rights reserved.
//

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [GeTuiSdk startSdkWithAppId:@"3ryeF6An5j9KQYURHJXLN9" appKey:@"bvQgtoGnxE7tVrafWK4T78" appSecret:@"c8Jy9QuE9C8SwxF4HWhad6" delegate:self];
    
    [IFlySpeechUtility createUtility:@"appid=59f00a96"];
    [self registerRemoteNotification];
    
    return YES;
}

/** 遠(yuǎn)程通知注冊(cè)成功委托 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"\n>>>[DeviceToken Success]:%@\n\n", token);

    // 向個(gè)推服務(wù)器注冊(cè)deviceToken
    [GeTuiSdk registerDeviceToken:token];
}



/** 注冊(cè) APNs */
- (void)registerRemoteNotification {
    /*
     警告:Xcode8 需要手動(dòng)開(kāi)啟"TARGETS -> Capabilities -> Push Notifications"
     */
    
    /*
     警告:該方法需要開(kāi)發(fā)者自定義,以下代碼根據(jù) APP 支持的 iOS 系統(tǒng)不同,代碼可以對(duì)應(yīng)修改。
     以下為演示代碼,注意根據(jù)實(shí)際需要修改,注意測(cè)試支持的 iOS 系統(tǒng)都能獲取到 DeviceToken
     */
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 // Xcode 8編譯會(huì)調(diào)用
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay) completionHandler:^(BOOL granted, NSError *_Nullable error) {
            if (!error) {
                NSLog(@"request authorization succeeded!");
            }
        }];
        
        [[UIApplication sharedApplication] registerForRemoteNotifications];
#else // Xcode 7編譯會(huì)調(diào)用
        UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge);
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#endif
    } else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
        UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge);
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    } else {
        UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeAlert |
                                                                       UIRemoteNotificationTypeSound |
                                                                       UIRemoteNotificationTypeBadge);
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:apn_type];
    }
}

/** SDK啟動(dòng)成功返回cid */
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
    //個(gè)推SDK已注冊(cè),返回clientId
    NSLog(@"\n>>>[GeTuiSdk RegisterClient]:%@\n\n", clientId);
}

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    completionHandler(UIBackgroundFetchResultNewData);
    NSLog(@"userInfo:%@",userInfo);
    NSString *payload = [userInfo objectForKey:@"payload"];
    NSData * data = [payload dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    NSString *price = [dict objectForKey:@"price"];
    if (price != nil) {
        NSString * string = [NSString stringWithFormat:@"微信收款成功,收到%@元",price];
        [[AVspeech sharedInstance] speak:string];
    }
}



-(void)applicationWillTerminate:(UIApplication *)application{
    UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}



@end

語(yǔ)音類(lèi) 科大訊飛



//
//  AVspeech.m
//  Sound
//
//  Created by Mac on 2017/10/25.
//  Copyright ? 2017年 stormrage. All rights reserved.
//

#import "AVspeech.h"


@implementation AVspeech

+(AVspeech *)sharedInstance
{
    static AVspeech *avspeech = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        avspeech = [[self alloc] init];
    });
    return avspeech;
}

-(instancetype)init{
    if (self = [super init]){
        _iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
        _iFlySpeechSynthesizer.delegate = self;
        [_iFlySpeechSynthesizer setParameter:[IFlySpeechConstant TYPE_CLOUD] forKey:[IFlySpeechConstant ENGINE_TYPE]];
        //設(shè)置音量,取值范圍 0~100
        [_iFlySpeechSynthesizer setParameter:@"50"
                                      forKey: [IFlySpeechConstant VOLUME]];
        //發(fā)音人,默認(rèn)為”xiaoyan”,可以設(shè)置的參數(shù)列表可參考“合成發(fā)音人列表”
        [_iFlySpeechSynthesizer setParameter:@" xiaoyan "
                                      forKey: [IFlySpeechConstant VOICE_NAME]];
        //保存合成文件名,如不再需要,設(shè)置為nil或者為空表示取消,默認(rèn)目錄位于library/cache下
        [_iFlySpeechSynthesizer setParameter:@" tts.pcm"
                                      forKey: [IFlySpeechConstant TTS_AUDIO_PATH]];
        //啟動(dòng)合成會(huì)話
    }
    return self;
}


-(void)speak:(NSString *)string{

    [_iFlySpeechSynthesizer startSpeaking: string];
}


//IFlySpeechSynthesizerDelegate協(xié)議實(shí)現(xiàn)
//合成結(jié)束
- (void) onCompleted:(IFlySpeechError *) error {}
//合成開(kāi)始
- (void) onSpeakBegin {}
//合成緩沖進(jìn)度
- (void) onBufferProgress:(int) progress message:(NSString *)msg {}
//合成播放進(jìn)度
- (void) onSpeakProgress:(int) progress beginPos:(int)beginPos endPos:(int)endPos {}


@end


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容