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

        });

    }

    

}];