Tag Archives: Apple

Apple 앱심사 17.2 리젝 사유 대응하기

이번에는 사용자 정보를 입력받아 계정 시스템을 운용하고 있는 서비스 앱들이 종종 받는 리젝 사유에 대해서 알아보겠습니다. 특히 17.2 의 경우에 과도한 사용자 정보를 강제로 요구할 때 발생하는 리젝 사유입니다.

apple_guideline_17.2

앱스토어 리뷰 가이드에 보면 Privacy 라는 항목이 있습니다. 이 부분은 앱내에서 사용자 정보를 어떻게 다루어야 하는지에 대한 가이드라인입니다. 위에 나와있는 17.2의 내용을 보면 “이메일 주소, 생년월일과 같은 개인 정보를 공유하도록 요구하는 앱은 반려될 것이다” 라는 설명이 나와있습니다.

실제 리젝 사유중에 예시로 다음과 같은 내용이 있습니다.

17.2 – Apps that require users to share personal information, such as email address and date of birth, in order to function will be rejected

17.2 Details

We noticed that your app requires users to register with personal information to access non account-based features. Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user.

Specifically, the app requires the user to provided their nationality during registration.

Next Steps

User registration that requires the sharing of personal information must be optional or tied to account-specific functionality. Additionally, the requested information must be relevant to the features.

Details 항목을 볼 때 앱이 유저로 하여금 가입을 해야 앱을 정상적으로 사용할 수 있도록 제한하고 있으며 가입 절차에서 앱 내의 기능을 사용하는데에 불필요한 정보를 요구하고 있음을 의미하는것을 알 수 있습니다. 뒤에 나오는 Specifically의 내용을 보면 가입 과정에서 “국적”을 요구하고 있는데 이것이 문제가 된다는것을 알 수 있습니다. 아마 이 앱에서 가입과정에서 국적을 입력받고 있지만 표면적으로 저 정보가 사용되는 부분이 없었던것이겠지요.

가입과정에서 국적을 입력받는 부분을 제거하거나 선택사항(Optional)로 변경하면 이 부분을 해결할 수 있습니다. 또는 앱내에서 반드시 국적이 필요한 부분이라면 해당 부분을 Resolution Center를 통해서 소명하시면 됩니다.

이번엔 비슷하지만 또다른 리젝 사유를 살펴보겠습니다.

17.2 Details

Thank you for your resubmission. We found that the previous issue is still present in this version: your app requires users to register with personal information to access non account-based features. Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user.

Specifically, the app requires the user to login before browsing the app.

Next Steps

User registration that requires the sharing of personal information must be optional.

문제를 지적 받았지만 해당 부분을 수정하지 않고 또 심사에 넣었나보네요 하하. 마찬가지로 앱의 서비스 기획 차원에서 사용되지 않는 개인정보를 앱에서 요구하고 있어서 발생하는 문제입니다. Specifically 항목을 보니 앱을 사용하기 이전에 로그인을 반드시 해야 하는 상황이라 발생하는 문제인것 같습니다.

이 리젝 사유는 전자와 조금 다른 부분이 있는데요. 전자의 사유는 앱이 계정 기반으로 동작해야 한다는 부분은 인정받았지만 “국적”이라는 정보의 입력 요구가 잘못되었다고 말하고 있고요. 후자의 경우에는 앱자체가 계정 기반일 필요가 없어보여서 받은 리젝입니다. 결론적으로 앱을 사용하기 위해서 반드시 가입-로그인이 필요하지만 막상 앱에 들어가면 계정 기반으로 동작하는 서비스 관점의 기능이 전혀 없다고 판단된 것입니다. 결론적으로 이 앱은 계정 기반 기능을 철회하거나 가입 과정이 선택사항(Optional)일 필요가 있습니다.

만약 앱이 반드시 가입을 해서 사용해야만 하는 서비스라면 해당 부분을 Resolution Center를 통해서 소명하시면 됩니다.

애플와치 Glance 핵심 사항 정리

watchkit_logo

Glance(흘낏 보다)는 당신의 앱에서 중요한 정보를 사용자에게 보여주기 위한 보조적인 방법입니다. 모든 앱이 Glance를 필요로 하지는 않습니다. Glance를 이용하여 적절한 시점에 관련된 정보를 보여줄 수 있습니다. 예를 들어 캘린더 앱의 Glance는 사용자의 다음 미팅 정보를 보여줄 수 있습니다. 항공사 앱이라면 곧 다가올 비행의 공항 게이트 정보를 보여줄 수 있습니다. 다음 그림은 사용자의 To-do 리스트중에 처리한 일과 남은 일의 갯수를 보여주는 예시 화면입니다.

applewatch_glance_essential_01

Glance는 WatchKit 앱과 WatchKit 익스텐션의 일환으로 제공됩니다. 당신의 Glance 인터페이스에는 WatchKit 앱의 스토리보드 파일에 포함되며 이 인터페이스는 커스텀 WKInterfaceController에 의해 관리됩니다. 하지만 Glance 인터페이스 컨트롤러에서 구현할 수 있는 유일한 작업은 Glance를 위한 컨텐츠를 보여주는것 뿐입니다. Glance는 유저의 상호작용(Interactivity)을 구현할 수 없습니다. Glance 화면을 탭할 경우 자동으로 WatchKit 앱을 실행하게 됩니다.

Glance 생명 주기

Glance 인터페이스 컨트롤러의 생명 주기는 사용자에게 빨리 보여주기 위해 좀 더 일찍 초기화 된다는 점을 제외하면 다른 인터페이스 컨트롤러와 동일합니다. Glance가 초기화 되고 사용자에게 보여지기 까지 적지 않은 시간이 소요될 수 있기 때문에 willActivate 메소드에서 보여줄 정보가 업데이트 될 수 있도록 해야 합니다. 인터페이스 컨트롤러의 생명 주기에 대해 더 알아보고 싶을 경우 WatchKit Extension Life Cycle을 확인하십시오.

Glance 인터페이스 가이드라인

XCode는 앱의 컨텐츠를 정렬하는 방법으로 고정된 레이아웃을 제공합니다. 당신의 컨텐츠를 보여주기 위한 적절한 레이아웃을 선택한 다음에는 다음의 가이드라인을 확인하시기 바랍니다.

  • 정보를 신속하게 전달 할 수 있도록 당신의 Glance를 디자인 하십시오. 많은 텍스트를 보여주려 하지 마십시오. 적절한 디자인, 색상, 애니메이션을 사용하여 정보를 제공하십시오.
  • 가장 중요한 정보에 집중하십시오. Glance는 당신의 WatchKit 앱을 대체하는 역할을 하지 않습니다. iOS의 정제된 버전이 WatchKit 앱이라면 Glance는 WatchKit 앱의 정제된 버전입니다.
  • Glance 인터페이스에 상호작용하는 컨트롤을 포함하지 마십시오. 버튼, 스위치, 슬라이더, 메뉴와 같은 상호작용하는 컨트롤들은 사용할 수 없습니다.
  • 당신의 Glance 인터페이스에 테이블이나 지도를 사용하지 마십시오. 이들은 기능적으로 금지되지는 않지만 공간 제약상 테이블과 지도는 효율적으로 정보를 제공하기 어렵습니다.
  • 시점에 적절한 정보를 보여주십시오. 사용자에게 중요한 시간과 위치 정보를 포함하여 모든 사용가능한 리소스를 사용하십시오. 당신의 인터페이스 컨트롤러가 초기화 되고 사용자에게 보여지기 까지 발생하는 변화를 감안하여 Glance 에 보여질 정보를 업데이트 하는것을 잊지 마십시오.
  • 모든 텍스트에 시스템 폰트를 사용하십시오. 당신의 Glance에 커스텀 폰트를 사용하기 위해서는 반드시 커스텀 폰트를 이미지로 렌더링 한 후에 이미지를 보여주십시오.

하나의 앱은 하나의 Glance 인터페이스 컨트롤러만을 가질 수 있기 때문에 이 컨트롤러에서 당신이 보여주고자 하는 정보를 반드시 보여주어야 합니다.

Glance 인터페이스 관리

당신의 XCode 프로젝트에 WatchKit 앱 타겟을 주가할 때 Glance 인터페이스를 원하는지 여부를 선택할 수 있습니다. 프로젝트 초기화 시점에 이것을 잊고 있었다면 나중에도 추가할 수 있습니다. Glance 인터페이스 컨트롤러는 앱의 스토리보드와는 조금 다른 형태를 띄고 있습니다. Glance의 인터페이스 컨트롤러는 Glance 시작 지점에 붙어있고 자체적으로 기본 레이아웃을 가지고 있습니다.

applewatch_glance_essential_02

구동 시점에 당신의 Glance의 컨텐츠를 설정하기 위해서는 WKInterfaceController를 상속한 커스텀 클래스를 사용해야 합니다. 당신의 WatchKit 앱을 구현하는 것과 동일한 방법으로 상속을 받아 구현하시면 됩니다.

앱에 Glance 인터페이스를 추가하기

WatchKit 앱 타겟을 생성할 때 Glance 인터페이스를 구현을 위한 파일들을 생성할지 묻는 “Include Glance Scene” 옵션을 선택할 수 있습니다. 선택할 경우 XCode는 Glance 스토리보드 씬과 커스텀 Glance 인터페이스 컨트롤러 클래스를 제공합니다. 만약 타겟을 추가할 때 이 옵션을 선택하지 못하였다면 다음과 같은 방법으로 수동으로 추가할 수 있습니다.

  1. 당신의 프로젝트에서 WKInterfaceController 를 상속한 클래스를 생성합니다. 새로운 소스 파일을 추가하고 WatchKit 익스텐션 타겟에 추가합니다. GlanceInterfaceController과 같이 적절한 이름으로 만들어 줍시다.
  2. 당신의 스토리보드 파일에서 Glance 인터페이스 컨트롤러를 드래그하여 추가해 줍니다. 이 씬은 위에서 봤었던 스크린샷처럼 Glance 시작 지점 화살표가 붙어있게 됩니다.
  3. 방금 추가한 Glance 인터페이스 컨트롤러를 선택하고 “Identity Inspector”를 선택합니다.
  4. 위에서 생성한 Glance 인터페이스 컨트롤러 클래스를 설정해 줍니다.

WatchKit 앱은 단 하나의 Glance 인터페이스만을 가질 수 있습니다. 당신 앱의 스토리보드에 두개 이상의 Glance 인터페이스 컨트롤러를 추가하지 않도록 주의하십시오.

Glance 인터페이스 컨트롤러를 구현하고 업데이트 하기

Glance 인터페이스 컨트롤러의 구현은 라벨과 이미지들로 이루어진 컨텐츠들의 세팅이기 때문에 상대적으로 간단합니다.

  • init 과 awakeWithContext: 메소드들을 사용하여 Glance 인터페이스를 초기화 하고 라벨과 이미지들의 초기값을 설정하십시오.
  • willActivate 메소드에서 Glance 인터페이스가 화면에 보여지기 전에 표시되어야 하는 정보를 업데이트 하십시오.

Glance가 화면에 보여지고 난 뒤에 컨텐츠를 업데이트 하기 위해서는 NSTimer 객체를 이용하여 주기적으로 업데이트를 할 수 있습니다. 당신은 스스로 업데이트하는 WKInterfaceDate 와 WKInterfaceTimer 객체를 사용하여 업데이트를 할 필요가 없습니다.

Glance로부터의 앱 구동을 커스터마이징하기

사용자가 Glance 화면을 탭하면 애플 와치는 이 Glance에 대응하는 WatchKit 앱을 구동합니다. 일반적으로 메인 인터페이스 컨트롤러가 구동됩니다. Glance로 부터 앱이 구동될 때 해야 할일을 커스터마이징 하기위해서는 다음을 따르기 바랍니다.

  • Glance 인터페이스 컨트롤러에서
    • Glance의 init과 willActivate 메소드들을 일반적인 방법으로 구현합니다.
    • 원하는 시점에 당신의 앱이 필요로하는 부가적인 정보를 userInfo에 담아 updateUserActivity:userInfo:webpageURL: 메소드를 호출합니다. 구동 시점에 여기서 넘겨받은 데이터를 토대로 다른 인터페이스 컨트롤러를 보여줄 수 있습니다.
  • 앱의 메인 인터페이스 컨트롤러에서
    • handleUserActivity: 메소드를 구현하십시오. userInfo Dictionary를 이용하여 적절한 UI를 설정할 수 있습니다.

updateUserActivity:userInfo:webpageURL: 메소드를 호출하면 WatchKit은 메인 인터페이스 컨트롤러의 handleUserActivity: 메소드를 구동시점에 호출하게 됩니다. 이 handleUserActivity: 메소드의 구현부에서 적절한 UI를 선택할 수 있습니다. 예를 들어 페이지 기반 앱의 경우 가장 처음에 보여줄 페이지가 몇페이지인지를 선택하게 할 수 있습니다.

참고 : Glance EssentialsManaging Your Glance Interface