iOS 앱 심사 리젝 해결하기 (Design - Login Services)

소요 시간: 5분

Apple 앱 심사에서 거절 메시지를 받았다. 메시지의 핵심은 Guideline 4.8, 즉 로그인 서비스와 관련된 내용이었다. 나의 앱은 제3자 로그인 서비스를 사용하고 있지만, Apple이 요구하는 여러 조건을 충족하지 못한 것으로 보인다.


거절 메시지

The app uses a third-party login service, but does not appear to offer an equivalent login option with the following features:

Next Steps

Revise the app to offer an equivalent login option that meets all of the above requirements.

If the app already includes a login option that meets the above requirements, reply to App Review in App Store Connect, identify which login option meets the requirements, and explain why it meets the requirements.

Note that Sign in with Apple meets the requirements specified in guideline 4.8.

Resources

Learn about the benefits of Sign in with Apple.

Support


거절 사유의 분석  

Apple의 거절 메시지는 세 가지 주요 문제를 지적하고 있다. 첫째, 데이터 수집 제한에 관한 사항이다. 앱은 사용자의 이름과 이메일 주소만 수집해야 한다. 그러나 제3자 로그인 서비스가 사용자의 추가 데이터를 수집하고 있다면 이는 문제가 될 수 있다. 예를 들어, 사용자의 위치정보나 기기 정보 등을 수집하는 경우가 이에 해당한다. 이와 같은 정보가 수집되고 있었는지 점검했었다.

둘째, 이메일 비공개 옵션에 대한 요구가 있다. Apple은 사용자가 자신의 이메일을 비공개로 유지할 수 있는 기능을 제공해야 한다고 명시하고 있다. 현재 제3자 로그인 서비스에서 이 기능이 제공되지 않으면, 심사에서 거절당할 수밖에 없다.

셋째, 사용자 상호작용 데이터 수집에 대한 사항이다. Apple은 광고 목적으로 사용자 데이터를 수집하는 데 있어서 명시적인 동의가 필요하다고 강조하고 있다. 만약 앱이 동의 없이 사용자의 활동 데이터를수집하고 있었다면, 이는 거절 사유가 된다.


문제 해결 방안

이 문제를 해결하기 위한 방안을 모색해야 한다. 가장 간단한 해결책은 Sign in with Apple 기능을 추가하는 것이다. Apple은 이 기능이 Guideline 4.8을 완벽하게 충족한다고 명시하고 있다. 이 기능은 사용자가 이름과 이메일 주소만 수집하고, 이메일 비공개 옵션도 제공하므로 심사 통과 가능성을 높일 수 있다.

1. Xcode에서 프로젝트에 Sign in with Apple 기능을 추가한다.

2. Apple Developer 계정에서 Sign in with Apple 기능을 활성화한다.

3. 클라이언트와 서버에서 로그인 흐름을 구현하고, 사용자가 선택적으로 이메일 주소를 비공개로 설정할 수 있도록 옵션을 제공한다.

import AuthenticationServices

func signInWithApple() {
    let request = ASAuthorizationAppleIDProvider().createRequest()
    request.requestedScopes = [.fullName, .email]
    
    let controller = ASAuthorizationController(authorizationRequests: [request])
    controller.delegate = self
    controller.performRequests()
}

extension YourViewController: ASAuthorizationControllerDelegate {
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let userIdentifier = appleIDCredential.user
            let email = appleIDCredential.email
            // 사용자 정보를 서버에 저장하거나 로그인 처리
        }
    }
}

다른 옵션으로는 제3자 로그인 서비스를 수정하는 방법이 있다. 우선, 데이터 수집 정책을 검토하고 사용자의 이름과 이메일 주소 외의 정보를 수집하지 않도록 수정해야 한다. 만약 서비스에서 위치나 기기 정보를 요청하고 있다면, 이를 제거하는 것이 중요하다.

또한, 사용자가 이메일을 비공개로 설정할 수 있는 옵션이 없다면, 이 점도 반드시 해결해야 할 문제다. 이러한 기능이 없다면 다른 로그인 옵션으로 전환하는 것을 고려해야 한다.


사용자 동의 확인 및 광고 데이터 수집 절차

사용자가 광고 목적으로 사용자 상호작용 데이터를 수집하는 경우, 명확한 동의를 요청해야 한다. 이를 위해 동의 체크박스를 추가하고, 사용자가 동의하지 않는 경우 데이터 수집이 이루어지지 않도록 설정해야 한다.

예시 코드:

@IBAction func acceptDataCollection(_ sender: UISwitch) {
    if sender.isOn {
        // 데이터 수집 동의
    } else {
        // 데이터 수집 거부
    }
}


심사 거절에 대한 답변 준비

심사가 진행되는 동안, 만약 내가 Apple의 요구 사항을 이미 충족하고 있다고 판단되면, 심사 팀에 명확한 설명과 함께 답변을 작성해야 한다. 어떤 로그인 옵션이 요구 사항을 충족하는지, 그 이유를 상세히 설명할 수 있어야 한다. 예를 들어, “우리 앱은 Sign in with Apple을 통해 사용자가 이름과 이메일 주소만 수집하고, 이메일 비공개 옵션을 제공합니다.”라는 식으로 말이다.


결론

오늘의 심사 거절은 나에게 중요한 교훈이 되었다. Sign in with Apple 기능을 도입하는 것이 가장 간편하고 확실한 방법임을 깨달았다. 제3자 로그인 서비스의 수집 방식을 수정하는 것도 가능하지만, 그 과정에서 실수가 발생할 수 있다는 점이 걱정된다. 무엇보다, 심사 팀에 보내는 답변이 명확하고 전문적으로 작성되어야 한다는 점을 명심하겠다. 앞으로의 심사 과정이 성공적으로 진행될 수 있도록 준비하겠다.

iOS 리스트