參考了下另外一個兄弟的代碼簡書
我直接拿個推做的透傳推送測試的.
上兩個代碼.
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;
}
/** 遠程通知注冊成功委托 */
- (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);
// 向個推服務器注冊deviceToken
[GeTuiSdk registerDeviceToken:token];
}
/** 注冊 APNs */
- (void)registerRemoteNotification {
/*
警告:Xcode8 需要手動開啟"TARGETS -> Capabilities -> Push Notifications"
*/
/*
警告:該方法需要開發者自定義,以下代碼根據 APP 支持的 iOS 系統不同,代碼可以對應修改。
以下為演示代碼,注意根據實際需要修改,注意測試支持的 iOS 系統都能獲取到 DeviceToken
*/
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 // Xcode 8編譯會調用
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編譯會調用
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啟動成功返回cid */
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
//個推SDK已注冊,返回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
語音類 科大訊飛
//
// 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]];
//設置音量,取值范圍 0~100
[_iFlySpeechSynthesizer setParameter:@"50"
forKey: [IFlySpeechConstant VOLUME]];
//發音人,默認為”xiaoyan”,可以設置的參數列表可參考“合成發音人列表”
[_iFlySpeechSynthesizer setParameter:@" xiaoyan "
forKey: [IFlySpeechConstant VOICE_NAME]];
//保存合成文件名,如不再需要,設置為nil或者為空表示取消,默認目錄位于library/cache下
[_iFlySpeechSynthesizer setParameter:@" tts.pcm"
forKey: [IFlySpeechConstant TTS_AUDIO_PATH]];
//啟動合成會話
}
return self;
}
-(void)speak:(NSString *)string{
[_iFlySpeechSynthesizer startSpeaking: string];
}
//IFlySpeechSynthesizerDelegate協議實現
//合成結束
- (void) onCompleted:(IFlySpeechError *) error {}
//合成開始
- (void) onSpeakBegin {}
//合成緩沖進度
- (void) onBufferProgress:(int) progress message:(NSString *)msg {}
//合成播放進度
- (void) onSpeakProgress:(int) progress beginPos:(int)beginPos endPos:(int)endPos {}
@end