본문으로 건너뛰기
cccskills
무료GitHub에 공개

platform-permissions

Use when a feature needs camera, location, photos, notifications, contacts, microphone, Bluetooth, or local network - the per-platform request flow, every denial state, and how to actually test the denied path when the shared test device auto-grants permissions.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md3.7 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Platform Permissions

Overview

A permission request handled only for the happy path (granted) crashes or dead-ends for a meaningful share of real users. Every state needs a designed response, and the denied path is the one app reviewers and store checks hit first.

iOS

  • Every permission needs an NS*UsageDescription string in Info.plist before the request is made — a missing one terminates the app immediately when the request fires, not a graceful denial.
  • The system prompt shows once. After a denial, there is no re-prompt API: deep-link to Settings with UIApplication.openSettingsURLString and explain why, rather than repeatedly calling the request API hoping for a different answer.

Android

  • Check shouldShowRequestPermissionRationale to decide whether to show an explanation before requesting, or whether the user already chose "don't ask again" (in which case rationale won't show and you go straight to a Settings deep-link).
  • POST_NOTIFICATIONS is a runtime permission since API 33 — request it like any other dangerous permission, not assumed granted.
  • Prefer the Photo Picker over READ_MEDIA_IMAGES/READ_MEDIA_VIDEO when the feature only needs the user to pick specific media — it needs no permission at all.
  • Request coarse location before fine location when both are relevant, and only request what the feature actually uses.
  • A local-network permission applies on recent Android versions for apps that discover devices on the LAN — verify the exact permission name against the current platform docs when you're about to use it; don't guess.

Flutter

  • permission_handler: check .isPermanentlyDenied to distinguish "ask again" from "must deep-link to settings" (openAppSettings()).

Every state needs a response

granted · denied (show rationale, allow retry) · restricted (parental controls/MDM — no retry is possible, say so) · permanently denied (deep-link to Settings) — the feature degrades gracefully without the permission in every case; a denial never crashes or silently dead-ends the flow.

Testing reality in TaskTrooper

The shared Android test device auto-grants permissions (appium:autoGrantPermissions: true), so the denied/restricted/permanently-denied paths cannot be exercised by requesting on that device — a manual test there will always show "granted" regardless of what you're verifying. Test those paths with a fake permission service injected in a widget/unit test instead (stub it to return denied/restricted/permanently-denied and assert the UI responds correctly), and say explicitly in the closing message that the denied path was verified via a fake, not on-device.

Common Mistakes

  • Requesting a permission with no prior rationale, as a wall of prompts at first launch.
  • Missing NS*UsageDescription for a permission the code requests.
  • Treating "permanently denied" the same as "denied" and calling the request API again (it won't re-prompt).
  • Assuming the shared device's auto-grant means the denied path was tested.
  • READ_MEDIA_IMAGES for a simple "pick one photo" feature instead of the Photo Picker.

Red Flags

  • A permission-gated feature with no denied/restricted/permanently-denied UI at all.
  • A closing message claiming "tested denied path" with a device known to auto-grant and no fake-service test in the diff.
  • A Settings deep-link with no explanation of why the user is being sent there.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

makifbaysal/tasktrooper1172026년 10월 18일 업데이트

Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

makifbaysal/tasktrooper1172026년 10월 18일 업데이트

Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

makifbaysal/tasktrooper1172026년 10월 18일 업데이트

Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

makifbaysal/tasktrooper1172026년 10월 18일 업데이트

How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

makifbaysal/tasktrooper1172026년 10월 18일 업데이트

Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

makifbaysal/tasktrooper1172026년 10월 18일 업데이트

makifbaysal의 스킬 모두 보기

이 스킬의 문제 신고