본문 바로가기
프로그래밍/Xcode-iOS

4.8 Design: Sign in with Apple Rejected

by Mr-후 2020. 7. 30.
반응형

세상에나, 이런 사태를 만나게 될 줄은 미처 몰랐다. 그래서 현업 실무 개발자가 계속 모니터링하고 주시해야 이런 상황을 피해갈 수 있을 것이라고 보는데 그게 여의치 않아 이런 상황이 생긴 것으로 판단한다. 

어제 심사 대기중에서 심사중으로 바뀌고 얼마되지 않아 바이너리가 거부되었다고 메일을 받게 되었다. ㅠ.ㅠ 

번거로운 일이 생겼다. 

왜 이런 사항을 강제하는 것일까? 이럴때는 Apple이 나쁘다. 

 

 



정확하게 사용하는 위치를 스크린샷으로 찍어 보냈다. Apple 로그인을 반드시 넣어야 한다는 이야기다. .지난 4월까지에서 6월까지 유예기간을 두었고 7월부터 업데이트 되는 앱은 반드시 함께 적용을 해야 한다고... 덴장. 

하는 수 없이 아침에 출근해서 회의를 소집하고 기획/디자인/웹/앱 회의를 한 후 정책과 방향을 정했다. 

우선 아이폰에서만 적용하는데 iOS13 부터만 적용하는 방향으로 결정되었다. 13이하의 경우 Apple로그인 버튼을 보이지 않도록 처리하고 Native 영역에서 Capability를 추가해서 진행하는 방식이다. 

Objective-C 코드 예제는 다음 링크를 그대로 따라 할 경우 원하는 값을 얻을 수 있다. 

https://stackoverflow.com/questions/58813712/how-to-integrate-sign-in-with-apple-flow-in-ios-objective-c

 

How to integrate 'Sign in with Apple' flow in iOS Objective-C?

I want to integrate 'Sign in with Apple' in my iOS app. I have found many code examples for this but all are in Swift and I need Objective-C.

stackoverflow.com

 

- (void)handleAuthrization:(UIButton *)sender {
    if (@available(iOS 13.0, *)) {
        // A mechanism for generating requests to authenticate users based on their Apple ID.
        ASAuthorizationAppleIDProvider *appleIDProvider = [ASAuthorizationAppleIDProvider new];

        // Creates a new Apple ID authorization request.
        ASAuthorizationAppleIDRequest *request = appleIDProvider.createRequest;
        // The contact information to be requested from the user during authentication.
        request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];

        // A controller that manages authorization requests created by a provider.
        ASAuthorizationController *controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];

        // A delegate that the authorization controller informs about the success or failure of an authorization attempt.
        controller.delegate = self;

        // A delegate that provides a display context in which the system can present an authorization interface to the user.
        controller.presentationContextProvider = self;

        // starts the authorization flows named during controller initialization.
        [controller performRequests];
    }
}

 

delegate method 영역은 다음과 같다. 

 - (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization  API_AVAILABLE(ios(13.0)){

    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%@", controller);
    NSLog(@"%@", authorization);

    NSLog(@"authorization.credential:%@", authorization.credential);

    NSMutableString *mStr = [NSMutableString string];
    mStr = [appleIDLoginInfoTextView.text mutableCopy];

    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        // ASAuthorizationAppleIDCredential
        ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
        NSString *user = appleIDCredential.user;
        [[NSUserDefaults standardUserDefaults] setValue:user forKey:setCurrentIdentifier];
        [mStr appendString:user?:@""];
        NSString *familyName = appleIDCredential.fullName.familyName;
        [mStr appendString:familyName?:@""];
        NSString *givenName = appleIDCredential.fullName.givenName;
        [mStr appendString:givenName?:@""];
        NSString *email = appleIDCredential.email;
        [mStr appendString:email?:@""];
        NSLog(@"mStr:%@", mStr);
        [mStr appendString:@"\n"];
        appleIDLoginInfoTextView.text = mStr;

    } else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
        ASPasswordCredential *passwordCredential = authorization.credential;
        NSString *user = passwordCredential.user;
        NSString *password = passwordCredential.password;
        [mStr appendString:user?:@""];
        [mStr appendString:password?:@""];
        [mStr appendString:@"\n"];
        NSLog(@"mStr:%@", mStr);
        appleIDLoginInfoTextView.text = mStr;
    } else {
         mStr = [@"check" mutableCopy];
        appleIDLoginInfoTextView.text = mStr;
    }
}


- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error  API_AVAILABLE(ios(13.0)){

    NSLog(@"%s", __FUNCTION__);
    NSLog(@"error :%@", error);
    NSString *errorMsg = nil;
    switch (error.code) {
        case ASAuthorizationErrorCanceled:
            errorMsg = @"ASAuthorizationErrorCanceled";
            break;
        case ASAuthorizationErrorFailed:
            errorMsg = @"ASAuthorizationErrorFailed";
            break;
        case ASAuthorizationErrorInvalidResponse:
            errorMsg = @"ASAuthorizationErrorInvalidResponse";
            break;
        case ASAuthorizationErrorNotHandled:
            errorMsg = @"ASAuthorizationErrorNotHandled";
            break;
        case ASAuthorizationErrorUnknown:
            errorMsg = @"ASAuthorizationErrorUnknown";
            break;
    }

    NSMutableString *mStr = [appleIDLoginInfoTextView.text mutableCopy];
    [mStr appendString:errorMsg];
    [mStr appendString:@"\n"];
    appleIDLoginInfoTextView.text = [mStr copy];

    if (errorMsg) {
        return;
    }

    if (error.localizedDescription) {
        NSMutableString *mStr = [appleIDLoginInfoTextView.text mutableCopy];
        [mStr appendString:error.localizedDescription];
        [mStr appendString:@"\n"];
        appleIDLoginInfoTextView.text = [mStr copy];
    }
    NSLog(@"controller requests:%@", controller.authorizationRequests);
    /*
     ((ASAuthorizationAppleIDRequest *)(controller.authorizationRequests[0])).requestedScopes
     <__NSArrayI 0x2821e2520>(
     full_name,
     email
     )
     */
}

//! Tells the delegate from which window it should present content to the user.
 - (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller  API_AVAILABLE(ios(13.0)){

    NSLog(@"window:%s", __FUNCTION__);
    return self.view.window;
}

- (void)dealloc {

    if (@available(iOS 13.0, *)) {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:ASAuthorizationAppleIDProviderCredentialRevokedNotification object:nil];
    }
}

 

그 외에 developer사이트에서 앱 Identifiers에서 앱 아이디의 설정에 Sign in with Apple항목을 체크해주고 프로비저닝을 다시 수정후 받아서 넣으면 구현 가능하고, 로그인 버튼 관련해서 리젝이 된다고 하니 가이드를 따라 하면 될 것 같다. 

저녁에 다시 심사 요청을 해바야겠다. 

 

반응형