본문 바로가기
Development/Error

[Error] Data-Scheme 설정 후 앱 서랍에서, 앱 아이콘이 사라지는 문제 원인과 해결 방법 완벽 가이드

by 은스타 2020. 3. 22.
반응형

Android 개발 시 Data Scheme 설정 후 앱 서랍에서 아이콘이 사라지는 문제 해결 가이드

안드로이드 앱을 개발하다 보면 특정 URL을 통해 앱을 실행할 수 있도록 Data Scheme을 설정하는 경우가 많습니다. 그런데 이 과정에서 종종 앱 서랍(App Drawer)에서 앱 아이콘이 보이지 않는 문제가 발생합니다. 개발자에게는 당혹스러운 이 상황의 원인과 해결 방법을 자세히 알아보겠습니다.

목차

  1. 문제 상황 이해하기
  2. 발생 원인 분석
  3. 해결 방법 - Intent Filter 수정
  4. 해결 방법 - 런처 카테고리 추가
  5. 주의할 점과 권장 사항
  6. 다양한 상황별 해결 방법
  7. 안드로이드 버전별 차이점
  8. 자주 묻는 질문

문제 상황 이해하기

다음과 같은 상황을 경험해 보셨나요?

  1. 앱에 웹 URL을 처리할 수 있도록 Data Scheme을 설정했습니다.
  2. 앱을 설치한 후 홈 화면의 앱 서랍에서 앱을 찾을 수 없습니다.
  3. 앱은 설치되어 있고 설정 > 앱 목록에서는 확인할 수 있습니다.
  4. 해당 URL을 사용하면 앱이 실행되지만, 일반적인 방법으로는 앱을 시작할 수 없습니다.

이는 AndroidManifest.xml 파일의 Intent Filter 설정과 관련된 문제로, Data Scheme을 추가하면서 런처에 앱이 표시되는 기본 설정이 변경되었기 때문입니다.

발생 원인 분석

이 문제는 주로 다음과 같은 AndroidManifest.xml 설정에서 발생합니다:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="myapp" />
    </intent-filter>
</activity>

이 설정의 문제점은:

  1. android.intent.category.LAUNCHER 카테고리가 없어 앱 서랍에 표시되지 않습니다.
  2. android.intent.action.MAIN 액션이 없어 앱의 주 진입점이 정의되지 않았습니다.
  3. data 요소만 있는 Intent Filter는 특정 URL 스킴을 처리하는 용도로만 설정되었습니다.

해결 방법 - Intent Filter 수정

가장 간단한 해결 방법은 별도의 Intent Filter를 추가하여 앱 런처에 표시되도록 하는 것입니다:

<activity android:name=".MainActivity">
    <!-- 기존 Data Scheme 처리를 위한 Intent Filter -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" />
    </intent-filter>

    <!-- 앱 서랍에 표시하기 위한 Intent Filter -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

이렇게 설정하면:

  • 첫 번째 Intent Filter는 "myapp://" 형식의 URL을 처리합니다.
  • 두 번째 Intent Filter는 앱이 앱 서랍에 표시되고 일반적인 방법으로 실행될 수 있게 합니다.

해결 방법 - 런처 카테고리 추가

기존 Intent Filter를 수정하여 해결할 수도 있습니다:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.LAUNCHER" />
        <data android:scheme="myapp" />
    </intent-filter>
</activity>

하지만 이 방법은 Intent Filter의 동작 방식을 혼란스럽게 만들 수 있으므로, 별도의 Intent Filter를 사용하는 첫 번째 방법이 더 권장됩니다.

주의할 점과 권장 사항

1. BROWSABLE 카테고리 추가하기

Data Scheme을 사용할 때는 BROWSABLE 카테고리를 추가하는 것이 좋습니다:

<category android:name="android.intent.category.BROWSABLE" />

이를 통해 웹 브라우저에서 해당 URL을 처리할 수 있게 됩니다.

2. Intent Filter 분리하기

목적이 다른 Intent Filter는 분리하여 작성하는 것이 좋습니다:

  • URL 처리용 Intent Filter
  • 앱 런처 표시용 Intent Filter
  • 다른 액션 처리용 Intent Filter

3. Data Scheme 테스트하기

설정한 Data Scheme이 제대로 작동하는지 테스트해보세요:

adb shell am start -a android.intent.action.VIEW -d "myapp://example"

다양한 상황별 해결 방법

1. 여러 Activity에서 Data Scheme 처리

여러 Activity에서 다른 URL 패턴을 처리해야 한다면:

<!-- MainActivity에서는 기본 스킴 처리 -->
<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" android:host="main" />
    </intent-filter>
</activity>

<!-- DetailActivity에서는 상세 페이지 스킴 처리 -->
<activity android:name=".DetailActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" android:host="detail" />
    </intent-filter>
</activity>

2. Http/Https URL 처리하기

웹 링크를 통해 앱을 실행하려면 App Links를 설정해야 합니다:

<activity android:name=".MainActivity">
    <!-- 일반 런처 Intent Filter -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- HTTP/HTTPS URL 처리 -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" android:host="example.com" />
        <data android:scheme="https" android:host="example.com" />
    </intent-filter>
</activity>

android:autoVerify="true" 속성을 사용하면 Android 6.0(API 레벨 23) 이상에서 App Links 기능을 활성화할 수 있습니다.

3. pathPrefix 활용하기

특정 경로 패턴만 처리하려면:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" 
          android:host="open" 
          android:pathPrefix="/product/" />
</intent-filter>

이렇게 하면 "myapp://open/product/123"과 같은 URL만 처리할 수 있습니다.

안드로이드 버전별 차이점

안드로이드 버전에 따라 Data Scheme 처리 방식에 약간의 차이가 있을 수 있습니다:

Android 6.0 이상

  • App Links 기능 지원
  • android:autoVerify="true" 속성으로 검증된 웹 도메인 링크 자동 처리

Android 8.0 이상

  • Background Service 제한으로 인해 Intent에서 서비스 시작 시 주의 필요
  • 암시적 브로드캐스트 리시버 제한

Android 10 이상

  • Scoped Storage로 인한 파일 접근 방식 변경
  • 외부 저장소 직접 접근 제한

Android 11 이상

  • Package Visibility 변경으로 다른 앱 쿼리 시 <queries> 요소 필요

자주 묻는 질문

Q1: 앱은 설치되었는데 아이콘이 보이지 않는 이유는 무엇인가요?

A: android.intent.category.LAUNCHERandroid.intent.action.MAIN가 없어서 런처 앱에서 표시되지 않는 것입니다.

Q2: Data Scheme과 App Links의 차이점은 무엇인가요?

A: Data Scheme은 myapp://example과 같은 커스텀 URL을 처리하고, App Links는 https://example.com과 같은 웹 URL을 처리합니다.

Q3: 여러 Data Scheme을 하나의 앱에서 처리할 수 있나요?

A: 네, 여러 개의 Intent Filter를 사용하거나 하나의 Intent Filter 안에 여러 data 요소를 추가하면 됩니다:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" />
    <data android:scheme="altapp" />
</intent-filter>

Q4: Data Scheme URL에서 파라미터를 어떻게 추출하나요?

A: Intent의 데이터 URI에서 추출할 수 있습니다:

Uri uri = getIntent().getData();
if (uri != null) {
    String scheme = uri.getScheme(); // "myapp"
    String host = uri.getHost(); // "example"
    String path = uri.getPath(); // "/product/123"
    String productId = uri.getLastPathSegment(); // "123"

    // 쿼리 파라미터 추출
    String category = uri.getQueryParameter("category"); // "electronics"
}

Q5: 웹에서 내 앱의 Data Scheme URL을 어떻게 사용할 수 있나요?

A: HTML 링크에서 직접 사용할 수 있습니다:

<a href="myapp://example/product/123">앱에서 열기</a>

또는 JavaScript를 사용하여:

location.href = "myapp://example/product/123";

결론

Data Scheme 설정 후 앱 아이콘이 앱 서랍에서 사라지는 문제는 Intent Filter의 구성 방식에서 발생합니다. 이 문제를 해결하기 위해서는 적절한 Intent Filter를 추가하고, 목적에 맞게 세분화하는 것이 중요합니다.

주요 해결 방법을 요약하면:

  1. 앱 런처에 표시하기 위한 별도의 Intent Filter 추가
  2. MAIN 액션과 LAUNCHER 카테고리 포함하기
  3. 목적에 따라 Intent Filter 분리하기

이러한 방법을 적용하면 Data Scheme 기능을 유지하면서 앱 서랍에서도 정상적으로 아이콘을 표시할 수 있습니다.


구글 핵심 키워드

  • Android Data Scheme 앱 아이콘 사라짐
  • 안드로이드 앱 서랍 아이콘 보이지 않음
  • Intent Filter LAUNCHER 설정
  • 안드로이드 매니페스트 Data Scheme 설정
  • 앱 아이콘 표시 안됨 해결 방법
  • Android 앱 URL 스킴 구현
  • 안드로이드 앱 인텐트 필터 문제
  • MAIN과 LAUNCHER 카테고리 설정
  • 안드로이드 커스텀 URL 스킴 설정
  • 앱 드로어 아이콘 추가 방법
반응형