[MOBILE-007][중급] 알림을 눌러 원하는 화면을 안전하게 열기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[MOBILE-007][중급] 알림을 눌러 원하는 화면을 안전하게 열기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 131회 작성일 26-09-03 00:38

본문

[이번 수업]
알림, 백그라운드 작업, 딥링크를 연결해 앱 밖에서 허용된 화면까지 안전하게 이동하는 흐름을 배웁니다.

[선수지식]
MOBILE-003의 화면 이동, MOBILE-004의 생명주기, MOBILE-006의 캐시와 URL 구조를 알아야 합니다.

[학습목표]
1. 알림 권한과 상태를 올바르게 다룬다.
2. 백그라운드 작업의 중복 결과를 막는다.
3. 딥링크를 허용 목록으로 검증한다.

[핵심개념]
알림 권한을 요청하고, 거부되어도 핵심 기능이 동작하게 합니다. Android 13(API 33) 이상은 일반 알림에 `POST_NOTIFICATIONS` 런타임 권한이 필요합니다. iOS도 권한을 요청하며 사용자가 설정을 바꿀 수 있으므로 현재 상태를 확인합니다.

백그라운드 작업은 정해진 시각에 도는 타이머가 아닙니다. 운영체제가 실행을 미룰 수 있습니다. Android에서 앱 종료나 재시작 뒤에도 이어질 지연 가능한 작업은 WorkManager로 예약하고 조건과 재시도 정책을 둡니다. iOS는 짧은 갱신에 `BGAppRefreshTask`, 긴 유지 작업에 `BGProcessingTask`를 고릅니다. 실행되지 않으면 다음 앱 실행 때 갱신하는 대체 경로가 필요합니다.

작업은 여러 번 실행되어도 결과가 같아야 합니다. 이 성질을 멱등성(Idempotency)이라 하며 작업 ID와 완료 여부로 중복 저장·발송을 막습니다.

딥링크(Deep Link)는 특정 화면으로 가는 주소입니다. Android App Links와 iOS Universal Links처럼 사이트와 앱의 관계를 검증하는 HTTPS 링크를 우선합니다. 앱은 스킴·호스트·경로를 허용 목록으로 검사하고, 로그인과 소유권은 화면을 열 때 다시 확인합니다.

[따라하기]
링크 검증과 작업 중복 방지를 로컬에서 확인합니다. `mobile_flow.py`로 저장하세요.

```python
from urllib.parse import urlparse

def route_link(raw):
    url = urlparse(raw)
    if url.scheme != "https" or url.hostname != "app.example":
        return "거부"
    parts = [p for p in url.path.split("/") if p]
    if len(parts) == 2 and parts[0] == "tasks" and parts[1].isdigit():
        return f"작업 상세({int(parts[1])})"
    return "홈"

completed = set()
def run_job(job_id):
    if job_id in completed:
        return f"이미 처리: {job_id}"
    completed.add(job_id)
    return f"동기화 완료: {job_id}"

print(route_link("https://app.example/tasks/42"))
print(route_link("http://evil.example/tasks/42"))
print(run_job("sync-001"))
print(run_job("sync-001"))
```

Windows PowerShell에서는 `py mobile_flow.py`, macOS·Linux에서는 `python3 mobile_flow.py`를 실행합니다. 예상 결과입니다.

```text
작업 상세(42)
거부
동기화 완료: sync-001
이미 처리: sync-001
```

[흔한 실수]
- 첫 실행과 동시에 이유 없이 알림 권한을 요청한다.
- 백그라운드 작업이 정각에 실행된다고 가정한다.
- 재시도 때 같은 알림이나 저장을 반복한다.
- 모든 URL을 화면이나 웹뷰로 그대로 연다.

[보안 주의]
알림과 URL은 잠금 화면·기록에 노출될 수 있으므로 토큰·개인정보를 넣지 않습니다. HTTPS와 검증된 도메인을 쓰고 경로와 ID 형식을 제한합니다. 링크로 연 화면에서도 로그인·역할·소유권을 확인합니다. 알 수 없는 주소는 홈으로 보내거나 거부하며 실습은 본인 소유 로컬 환경에서만 합니다.

[직접 해볼 과제]
`/notices/7`만 `공지 상세(7)`로 여는 규칙을 추가하세요. 외부 호스트, 문자 ID, 알 수 없는 경로의 결과도 기록합니다.

[확인문제]
1. 백그라운드 작업의 정확한 실행 시각을 보장할 수 없는 이유는 무엇인가요?
2. 재시도되어도 중복 결과를 막는 성질은 무엇인가요?
3. 검증된 딥링크로 열어도 화면에서 권한을 다시 확인해야 하는 이유는 무엇인가요?

[다음 학습]
다음 IOT-007에서는 장치 데이터 형식과 명령을 설계합니다.

[공식 참고 자료]
- Android 알림 권한: https://developer.android.com/develop/ui/compose/notifications/notification-permission
- Android WorkManager: https://developer.android.com/develop/background-work/background-tasks/persistent
- Android 딥링크: https://developer.android.com/training/app-links/create-deeplinks
- Apple 알림 권한: https://developer.apple.com/documentation/usernotifications/asking-permission-to-use-notifications
- Apple 백그라운드 작업: https://developer.apple.com/documentation/backgroundtasks/choosing-background-strategies-for-your-app
- Apple Universal Links: https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
3,900
어제
6,862
최대
16,772
전체
769,851
Copyright © 소유하신 도메인. All rights reserved.