5.2. Lib (iOS) - GiGAGenie-VoiceKit/UserGuide GitHub Wiki
1. ์์ฑ ๋ น์/์ฌ์ ๊ด๋ จ
NSString *const UIVoiceAssistCompletePlayNotification = @"UIVoiceAssistCompletePlayNotification"; // 2017.07 JK ์ฌ์ ์๋ฃ Notification ์ถ๊ฐ.
-(OSStatus) Record:(id)sender withFileName:(CFStringRef) inRecordFileName noEpd:(BOOL) noEPD {
โฆ.
}
-(OSStatus) PlayBack:(id)sender withFileName:(CFStringRef) inPalybackFile {
OSStatus recRetErrCode = 0;
if ([[avrController sharedAVRController] IsRunning] == YES) // If we are currently recording, stop and save the file.
{
[[avrController sharedAVRController] StopPlay];
recRetErrCode = 1;
}
else
{
// 2017.07 JK
if(noErr != (recRetErrCode = [[avrController sharedAVRController] StartPlay:inPalybackFile]))
{
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"audio error" message:@"you should reboot appliation" delegate:nil cancelButtonTitle:@"ํ์ธ" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
return recRetErrCode;
}
2. API ์ธ์ฆ
2.1 ์์คํ ์ธ์ฆ
// ๊ธฐ๊ฐ์ง๋๊ฐ๋ฐ์ํฌํธ์์ ์ธ์ฆํ client(์์คํ )์ ๋ํ oauth ์ธ์ฆ
-(void) SetAuth:(NSString*)userName password:(NSString*) password svcId:(NSString*)svcId keyId:(NSString*)keyId forDelegate:(UIViewController*)view withCallbackBlock:(void(^)(id)) handler
{
// URL Components.
NSURLComponents *components = [NSURLComponents new];
components.scheme = @"http";
components.host = @(KT_AUTH_SERVER_HOST);
components.port = @(KT_AUTH_SERVER_PORT);
components.path = @"/oauth/token";
// Authorization header.
NSString *authStr = [NSString stringWithFormat:@"%@:%@", userName, password]; // ๋ฐ๊ธ๋ฐ์ ์์คํ
์ ์ /๋น๋ฐ๋ฒํธ
NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodingWithLineLength:80]];
// ์ ์ก ํ๋ผ๋ฉํฐ(POST Type ์ด์ง๋ง Content_Type์ด x-www-form-urlencoded์ด๊ธฐ ๋๋ฌธ์ key, value๋ก body์ ํ๋ผ๋งคํฐ๋ฅผ ์
๋ ฅ)
NSURLQueryItem *grantType = [NSURLQueryItem queryItemWithName:@"grant_type" value:@"client_credentials"]; // ์ธ์ฆ ์ ํ
components.queryItems = @[ grantType ];
AjaxJson *jsonCon = [AjaxJson new];
// Key ์ ํจ์ฑ ์กฐํ.
[jsonCon loadPostData:components contentType:X_FORM_URL param:nil withAuthorization:authValue forDelegate:view withCallbackBlock:^(id resObj) {
// response callback block
NSString *status = [resObj objectForKey:@"status"];
NSString *accessToken = [resObj objectForKey:@"access_token"];
// ์ฑ๊ณต
if(accessToken.length > 0){
// ์๋ต ์ ๋ณด ์ ์ฅ.
self.gui_ip = [resObj objectForKey:@"VOICE_API_IP"]; // ์์ฑClient์ผ ๊ฒฝ์ฐ, ์์ฑ์์คํ
์ ๋ํ IP๋ฅผ ์ ๊ณต
self.gui_port = [[resObj objectForKey:@"VOICE_API_PORT"] intValue];
// ์๋น์ค ํค ์ธ์ฆ
[self validationVoiceAPISvcId:svcId keyId:keyId accessToken:accessToken forDelegate:view withCallbackBlock:handler];
}else{
NSString *error = [resObj objectForKey:@"error"];
NSString *error_description = [resObj objectForKey:@"error_description"];
[[MsgHelper new] showError:view title:@"์์คํ
์ธ์ฆ ์คํจ" withErrorMessage:error andDetail:error_description completeCallback:^(UIAlertAction *action) {
}];
// Callback copy.
ajaxCompletionHandler = [handler copy];
ajaxCompletionHandler(resObj);
}
}];
}
2.2 ์ฌ์ฉ์ ์ธ์ฆ
// ๊ธฐ๊ฐ์ง๋๊ฐ๋ฐ์ํฌํธ์์ ๋ฐ๊ธํ Key(์์ฑAPI ์๋น์ค)์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฆ API
-(void) validationVoiceAPISvcId:(NSString*)svcId keyId:(NSString*)keyId accessToken:(NSString ) token forDelegate:(UIViewController)view withCallbackBlock:(void(^)(id)) handler
{
// URL Components.
NSURLComponents *components = [NSURLComponents new];
components.scheme = @"http";
components.host = @(KT_AUTH_SERVER_HOST);
components.port = @(KT_AUTH_SERVER_PORT);
components.path = [@"/api/voice/v0.9/" stringByAppendingFormat:@"svc/%@/key/%@", svcId, keyId]; // ๊ธฐ๊ฐ์ง๋๊ฐ๋ฐ์ํฌํธ์์ ์ ์ฒญํ API์๋น์ค์ id, key id
// Authorization header.
NSString *authValue = [NSString stringWithFormat:@"Bearer %@", token]; // ์์คํ
์ธ์ฆ์ ๋ฐ์ ํ ํฐ.
// ์ ์ก ํ๋ผ๋ฉํฐ(POST Type ์ด์ง๋ง Content_Type์ด x-www-form-urlencoded์ด๊ธฐ ๋๋ฌธ์ key, value๋ก body์ ํ๋ผ๋งคํฐ๋ฅผ ์
๋ ฅ)
//NSURLQueryItem *svc = [NSURLQueryItem queryItemWithName:@"svc" value:svcId]; // ๊ธฐ๊ฐ์ง๋๊ฐ๋ฐ์ํฌํธ์์ ์ ์ฒญํ API์๋น์ค์ id, key id
//NSURLQueryItem *key = [NSURLQueryItem queryItemWithName:@"key" value:keyId];
//components.queryItems = @[ svc, key ];
AjaxJson *jsonCon = [AjaxJson new];
// Key ์ ํจ์ฑ ์กฐํ.
[jsonCon loadGetData:components contentType:X_FORM_URL param:nil withAuthorization:authValue forDelegate:view withCallbackBlock:^(id resObj) {
// response callback block
NSString *status = [resObj objectForKey:@"status"];
// ์ฑ๊ณต
if([status intValue] == 200){
[resObj setValue:self.gui_ip forKey:@"VOICE_API_IP"];
[resObj setValue:@(self.gui_port) forKey:@"VOICE_API_PORT"];
}else{
//NSString *resultCode = [resObj objectForKey:@"resultCode"]; // ์ ๋ฌธ ์ค๊ณ์์ ์ ์ํ ์ฝ๋(ํ์ฌ ๋ค๋ฅด๊ฒ ๋์ด)
//NSString *resultMessage = [resObj objectForKey:@"resultMessage"];
NSString *error = [resObj objectForKey:@"error"];
NSString *message = [resObj objectForKey:@"message"];
[[MsgHelper new] showError:view title:@"์๋น์ค ํค ์ธ์ฆ ์คํจ" withErrorMessage:error andDetail:message completeCallback:^(UIAlertAction *action) {
}];
}
// Callback copy.
ajaxCompletionHandler = [handler copy];
ajaxCompletionHandler(resObj);
}];
}
2.3 ์๋น์ค ํค ์ธ์ฆ
// ์์คํ ์ธ์ฆ ๋ฐ ์์ฑ ์ธ์ ์๋ฒ ์ ๋ณด ์กฐํ.
[[VoiceAssistController sharedVoiceAssist] SetAuth:@(KT_ClIENT_ID) password:@(KT_ClIENT_PASSWORD) svcId:@(KT_SERVICE_ID) keyId:@(KT_SERVICE_KEY) forDelegate:self withCallbackBlock:^(id resObj) {
NSString *statusCode = [resObj objectForKey:@"statusCode"];
// ์์ฑ์ธ์ ์๋ฒ ์ ์ ์ ๋ณด
self.serverIP = [resObj objectForKey:@"VOICE_API_IP"];
self.serverPort = [[resObj objectForKey:@"VOICE_API_PORT"] intValue];
self.serviceKey = 5;
self.mediaType = 5;
// ์ฑ๊ณต
if([statusCode integerValue] == 200){
// ์ธ์ ์๋ฒ ์ธ์ฆ ํค ์์ฑ.
self.Certification = [self CertificationKeyMake:self.serviceKey];
NSLog(@"@@@@@ SetParameter serverIP[%@] serverPort[%li] Certification[%@] mediaType[%li]", self.serverIP, (long)self.serverPort, self.Certification, (long)self.mediaType);
// ์๋น์ค ํค ์ธ์ฆ
if(NO == [[VoiceAssistController sharedVoiceAssist] SetParameter:self.serverIP port:self.serverPort Certification:self.Certification reqcontype:self.mediaType]){
[[MessageHelper new] showError:self title:@"VOICE API ์๋ฒ ์ ์ ์คํจ" withErrorMessage:@"" andDetail:@"" completeCallback:^(UIAlertAction *action) {
// setTimeout
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.navigationController popToRootViewControllerAnimated:YES]; // go to root view controller
});
}];
}
}else{
// setTimeout
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.navigationController popToRootViewControllerAnimated:YES]; // go to root view controller
});
}
}];