구글 사인을 사용하다가 ApiException 이 발생할 때가 있다.

 

위 오류를 구글링 해보니, 어느분이 정리를 잘해놓은게 있더군요.

그래서 저도, 잊어버릴까봐 정리를 해놓습니다.

 

이 오류는 핑거프린트 정보가 일치하지 않을 때 발생한다고 하네요.

 

일단 SHA-1 키를 획득합니다. 획득방법은 많은데요. 일단 터미널에서 획득하는 방법입니다.

 

keytool -keystore "키스토어 파일 경로" -list -v

 

터미널에서 위와 같이 명령어를 입력한 후, 암호를 요구합니다. 입력 해주시면 결과가 좌라락 나오고

인증서지문이란 항목에 SHA-1 이 나올겁니다.

 

또는 구글 플레이 콘솔에서도 확인 가능합니다.

 

1. 구글 클라우드 플랫폼으로 들어가서 사용자 인증 정보 만들기 > OAuth 클라이언트 ID 를 선택한다.

 

 

2. 아래 내용 대로 OAuth 클라이언트를 만들어줍니다.

 

 

이렇게 하고, 해보셔요. 될겁니다.

 

그리고, 파이어베이스 콘솔에도 SHA-1 지문이 없으면 디지털 지문 추가하고 google-service.json 다운로드 해서 프로젝트 내부에 넣어두세요.

Posted by 자바리즘
,

1. 구글 개발자 콘솔에서 해당 프로젝트로 이동한 후, 왼쪽 메뉴의 '앱서명' 메뉴로 이동한다.

 

2. 위의 SHA-1 인증서 지문을 복사해둔다.

 

3. 아래 사이트로 가서 복사한 인증서를 넣고 변환한다.

사이트 주소 : base64.guru/converter/encode/hex

 

Hex to Base64 | Base64 Encode | Base64 Converter | Base64

Hex to Base64 The “Hex to Base64” converter is a smart tool which is able to convert online Hex values to Base64 strings. I call him “smart” because it accepts several written representations of hexadecimal values. The conversion process is quite s

base64.guru

 

 

 

4. Base64 로 나온 값을 카카오톡 키해시에 등록하면 인증이 완료 된다.

 

*참고로 페이스북도 동일한 이슈가 있는거 같습니다.

Posted by 자바리즘
,

Text

하이브리드/플러터 2019. 11. 19. 19:25

 

//Widget 생성
//위젯에 속성을 주기 위해서 Container 로 감싸준다.

Widget textSection = Container(
  padding: const EdgeInsets.all(32),		//말그대로 패딩
  
  //child : 자식 엘리먼트 라고 보면 될 것 같다.
  child: Text(	//여러 속성이 존재. 1번째 인자는 text 값이고, 2번째는 줄바꿈 설정을 할 건지를 나타낸다.
    'Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese '
    'Alps. Situated 1,578 meters above sea level, it is one of the '
    'larger Alpine Lakes. A gondola ride from Kandersteg, followed by a '
    'half-hour walk through pastures and pine forest, leads you to the '
    'lake, which warms to 20 degrees Celsius in the summer. Activities '
    'enjoyed here include rowing, and riding the summer toboggan run.',
    softWrap: true,
  ),
);

 

일단은 이렇게 이해를 했는데, 맞는지 모르겠다.

틀리다면, 수정하도록 하겠다.

 

comming soon..

'하이브리드 > 플러터' 카테고리의 다른 글

플러터 개발환경 셋팅  (0) 2019.11.19
Posted by 자바리즘
,

1. 플러터 개발 페이지 접속해서 각 OS 에 맞는 라이브러리 다운로드하기!

https://flutter.dev/docs/get-started/install

 

Install

Select the operating system on which you are installing Flutter:{{site.alert.note}} **Are you on Chrome OS?** If so, see the official [Chrome OS Flutter installation docs!](/docs/get-started/install/chromeos){{site.alert.end}}

flutter.dev

 

2. 환경변수 셋팅 (맥을 기준)

 

Flutter SDK 를 받고 압축을 푼 후, 적당히 폴더에 위치 해 둔다.

해당 폴더의 경로를 복사해두자.

 

자신의 이름이 있는 폴더에서 Shift + Command + . 을 누르면 숨김파일이 보여진다.

.bash_profile 에 경로를 저장해두자.

 

#VI 를 이용한 경로 저장 방법

터미널에서 sudo vi .bash_profile 을 입력하자.

i 를 누른뒤 (insert)

 

export PATH="$PATH:`pwd`/flutter/bin"

 

입력하고, (위 /flutter/bin 은 각자 맥 환경에서 달라진다. 나같은 경우는 /Document/dev/flutter/bin)

 

esc 누르고,

 

:wq  를 입력하고 엔터를 친다. (wq 를 저장후, 종료, :q 는 그냥 종료)

 

터미널에서, flutter 를 입력하면 뭔가 실행되는데, 그렇다면 환경변수가 잘 잡힌것이다!

 

 

 

comming soon...

'하이브리드 > 플러터' 카테고리의 다른 글

Text  (0) 2019.11.19
Posted by 자바리즘
,

NSURLSession 을 이용한 파일업로드에 대해 알아보자.

 

파일 업로드라는게 은근 짜증난다. 값 하나만 안맞아도 업로드가 되지 않는다...

 

다음 코드를 살펴보자.


//self.imageUploadUrl 업로드를 할 url
    
    NSString *POST_BODY_BOURDARY = [[NSUUID UUID] UUIDString];
    NSString *uploadUrl = [self.imageUploadUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    
    //upload single image
    NSURL *url = [NSURL URLWithString:uploadUrl];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0];
    [request setHTTPMethod:@"POST"];
    
    // set Content-Type
    NSString *contentTypeValue = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", POST_BODY_BOURDARY];
    [request setValue:contentTypeValue forHTTPHeaderField:@"Content-type"];
    
    // image jpg 압축
    NSData *imageData = UIImageJPEGRepresentation(image, 0.9);
    
    // post body > form-data 의 name 이 중요하다.
    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POST_BODY_BOURDARY] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileUpload\"; filename=\"%@.jpg\"\r\n", @"ios_upload"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POST_BODY_BOURDARY] dataUsingEncoding:NSUTF8StringEncoding]];
    
    //url session 을 생성하고,
    //NSURLSessionUploadTask 를 생성해서 파일을 업로드 하자.
    //body 데이터를 formData 에 넣어준다.
    NSURLSession *urlSession = [NSURLSession sharedSession];
    NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        if(error) {
            NSLog(@"upload Error %@", [error description]);
        }else {
            if(data) {
                NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                
                //String 값
                //Dictionary 형태가 필요하면 NSJSONSerialization 를 사용하자.
                NSLog(@"-------%@", response);
                
                //response 값을 가지고 수행할 것이 있다면 여기서 하면 된다.
            }
        }
    }];
    
    [uploadTask resume]; //resume 으로 실행시켜준다.

 

휴... 파일업로드 기능은 항상 파라미터 문제로 삽질을 하곤 한다.

Posted by 자바리즘
,

RxAndroid 의 4대 요소

 

  • Observable

  • Observer

  • Scheduler

  • SubScription

Posted by 자바리즘
,

WKWebView 로 웹뷰를 변경하면서, iOS 10 이하에서 post url 로드가 제대로 되지 않는 증상을 발견했다. 순간식겁..대체 왜..

예전에 작업해 놓은걸 잊은채, 또 구글링...

 

iOS 10 이하에서는 WKWebView 에서 post 방식 로드를 다른 방식으로 우회해서 해야만 했다.

 

1. PostUrl Load

//BOOL 변수
@property (nonatomic) BOOL didMakePostRequest;

//URL Load
//iOS 11이상
if (@available(iOS 11, *)) {
	NSMutableURLRequest *autoLoginReq = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://xxx.login.xxx.co.kr"]];
    [autoLoginReq setHTTPMethod:@"POST"];
    [autoLoginReq setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    NSString *body = [NSString stringWithFormat:@"id=%@&pwd=%@", "kkk", "123"]]];
    NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
    [autoLoginReq setHTTPBody:bodyData];
    [self.webView loadRequest:autoLoginReq];
    
//iOS 10 이하    
}else {
	//iOS 10 이하에서 post 방식 제어할 BOOL 변수
    didMakePostRequest = YES;

	//내 리소스중 login.html 의 경로를 가져온다.
    NSString *path = [[NSBundle mainBundle] pathForResource:@"login" ofType:@"html"];
    NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

    [self.webView loadHTMLString:html baseURL:[[NSBundle mainBundle] bundleURL]];
}

 

2. WebView navigation delegate didFinishNavigation

//웹뷰 호출이 끝났을 때 호출하는 delegate, didFinishNavigation
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    NSString *currentUrl = webView.URL.absoluteString;
    
    if(@available(iOS 11, *)) {
        
    }else {
    //POST 방식이라면 파라미터를 만들어준다.
        if(didMakePostRequest) {
            [self makePostRequest];
        }
        
        //NO 로 바꾸어서 페이지 호출할 때마다 불려지는 것을 제어
        didMakePostRequest = NO;
    }
}

 

3. Make Param

- (void)makePostRequest {
    HunetUserInfo *user = [CurrentUser sharedObject].userInfo;
    
    //body data 를 json 형식으로 셋팅
    NSString *body = [NSString stringWithFormat:@"id:'%@', pwd:'%@'",
                      @"kkk",
                      @"123"];
    
    NSString *url = @"https://xxx.login.xxx.co.kr"
    NSString *jscript = [NSString stringWithFormat:@"post('%@', {%@});", url, body];
        
    [self.webView evaluateJavaScript:jscript completionHandler:^(id object, NSError * _Nullable error) {
        if (error) {
            NSLog(@"----------->>>>>>>>>>>>> evaluateJavaScript error : %@", [error localizedDescription]);
            //여기 에러가 찍혔다는 것은 대부분 json data 셋팅이 잘못되어서 나오는 오류이다.
        }
    }];
}

 

위 코드에서 evaluateJavaScript 함수에서 에러를 뱉는다면 json 형식이 잘못되거나 구문이 잘못되어서 에러가 찍히는 것이니 코드를 자세히 확인하기 바랍니다.

 

감사합니다.

Posted by 자바리즘
,