Skip to content

[FEATURE] 공유하기로 전달된 링크 자동 입력#39

Merged
kbh0218 merged 3 commits into
devfrom
feat/#38-share-link-input
May 18, 2026
Merged

[FEATURE] 공유하기로 전달된 링크 자동 입력#39
kbh0218 merged 3 commits into
devfrom
feat/#38-share-link-input

Conversation

@kbh0218
Copy link
Copy Markdown
Contributor

@kbh0218 kbh0218 commented May 17, 2026

Closes #38

개요

외부 앱에서 URL을 공유했을 때 LinClean 앱이 실행되고, 로그인된 사용자라면 링크 추가 화면으로 이동하도록 구현했습니다.

기존에는 사용자가 앱 내부에서 직접 링크 추가 화면에 진입한 뒤 URL을 복사/붙여넣기 해야 했지만, 이번 작업에서는 브라우저, 메신저 등 외부 앱의 공유하기 기능을 통해 전달된 링크를 LinClean에서 받아오고, 해당 링크를 링크 추가 입력창에 자동으로 입력되도록 개선했습니다.

공유 진입 시에도 기존 인증 흐름은 유지됩니다. 로그인된 상태라면 회원 동기화가 완료된 뒤 링크 추가 화면으로 이동하고, 비로그인 상태라면 기존 로그인 화면으로 진입합니다. 비로그인 상태에서 공유 진입 후 Google 로그인에 성공한 경우에도 공유받은 URL을 유지해 링크 추가 화면에 자동 반영되도록 처리했습니다.

또한 앱이 이미 실행 중인 상태뿐 아니라 종료된 상태에서 공유하기로 앱을 실행하는 cold start 상황에서도 공유 URL을 놓치지 않도록 expo-share-intent 초기화 순서와 라우팅 타이밍을 보완했습니다.

주요 구현 내용

  • expo-share-intent 기반 외부 앱 공유 URL 수신 설정
  • Android 공유 인텐트 text/* 등록
  • 공유 인텐트 수신을 위한 ShareIntentProvider 설정
  • 공유 URL 라우팅을 담당하는 ShareIntentRouter 추가
  • 로그인 및 백엔드 회원 동기화 완료 후에만 공유 URL 라우팅 실행
  • 로그인된 상태에서 공유 진입 시 링크 추가 화면으로 이동
  • 비로그인 상태에서 공유 진입 후 로그인 성공 시 공유 URL 유지 및 링크 추가 화면 이동
  • 공유받은 URL을 링크 추가 입력창에 자동 입력
  • URL 추출/정규화 유틸 추가
  • URL이 없거나 올바르지 않은 공유 데이터에 대한 예외 처리
  • 자동 입력된 URL도 기존 보안 검사 흐름과 동일하게 정규화 후 검사 진행
  • 앱 종료 상태 cold start에서 공유 인텐트 이벤트를 놓치지 않도록 expo-share-intent 패치 추가
  • iOS share extension/prebuild 안정화를 위한 xcode 패치 추가
  • 개발/프리뷰 환경에서 HTTP API 호출이 가능하도록 Android cleartext 설정 보완

파일별 역할

  • app.json: expo-share-intent plugin 및 Android 공유 인텐트 설정
  • app/_layout.tsx: ShareIntentProvider 추가
  • app/(tabs)/_layout.tsx: 로그인 및 회원 동기화 완료 후 ShareIntentRouter 실행
  • app/(auth)/login.tsx: 비로그인 공유 진입 후 로그인 성공 시 공유 URL 처리
  • app/(tabs)/(home)/add-link.tsx: sharedUrl 파라미터를 입력창에 자동 반영
  • components/share-intent-router.tsx: 공유 URL 감지 및 링크 추가 화면 라우팅 처리
  • utils/shared-url.ts: 공유 텍스트에서 HTTP URL 추출 및 정규화
  • plugins/with-android-single-task.js: Android singleTask 및 cleartext 설정 보완
  • package.json, package-lock.json: expo-share-intent, patch-package 의존성 및 postinstall 설정
  • patches/expo-share-intent+5.1.1.patch: cold start 공유 인텐트 수신 순서 보완
  • patches/xcode+3.0.1.patch: iOS prebuild 시 xcode group path 접근 오류 방어

해결한 이슈 목록

  • 외부 앱 공유하기를 통해 전달된 URL을 앱에서 받을 수 있도록 처리
  • 공유하기로 앱이 실행되었을 때 기존 앱 라우팅이 깨지지 않도록 처리
  • 로그인된 상태라면 링크 추가 화면으로 이동
  • 공유받은 URL이 링크 입력창에 자동 입력되도록 처리
  • 자동 입력된 URL로 기존 보안 검사 흐름을 그대로 진행
  • URL이 없거나 올바르지 않은 공유 데이터인 경우 앱이 깨지지 않도록 예외 처리
  • 비로그인 상태에서 공유 진입 시 기존 로그인 화면 및 인증 흐름 유지
  • 비로그인 상태에서 로그인 성공 후 공유 URL이 링크 추가 화면에 반영되도록 처리
  • 앱이 이미 실행 중인 상태와 종료된 상태 모두에서 공유 진입 동작 확인

체크 사항

  • 커밋/코딩 컨벤션에 맞게 작성
  • preview 빌드에서 앱 종료 상태 공유 진입 동작 확인
  • 공유 URL 자동 입력 후 기존 보안 검사 흐름 진행 확인

참고

dev 모드에서는 앱이 꺼진 상태에서 공유하기로 진입했을 때 cold start 공유 흐름이 정상 확인되지 않았습니다.

이후 preview 빌드로 테스트한 결과, 앱이 종료된 상태에서 외부 앱 공유하기로 LinClean을 실행해도 공유 URL이 링크 추가 입력창에 정상 반영되는 것을 확인했습니다.

아래 동영상은 preview 빌드를 통해 실행한 동작 영상입니다.

Screenshots or Video

라인 앱 -> Linclean 앱
https://github.com/user-attachments/assets/240ac752-5cad-45bd-9cb9-1faf152fb73f

@kbh0218 kbh0218 requested review from minsoo0506 and sunm2n May 17, 2026 09:17
@kbh0218 kbh0218 self-assigned this May 17, 2026
@kbh0218 kbh0218 added the feature 기능개발 label May 17, 2026
Copy link
Copy Markdown
Contributor

@sunm2n sunm2n left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다
리뷰 단 내용도 필수 사항은 아니고 제안정도라서 반영하실지는 판단정도만 해주시면 될 거 같습니다.
당장 머지해도 큰 문제가 일어나지 않을 거 같고 다만 추후 배포 이후 실제 앱에서도 잘 동작하는지만 추가 확인을 하면 될 거 같습니다

Comment thread app/(auth)/login.tsx

const sharedUrl = hasShareIntent ? getSharedUrlFromIntent(shareIntent) : null;

if (sharedUrl) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재코드:

  if (sharedUrl) {
    router.replace({ pathname: '/(tabs)/(home)/add-link', params: { sharedUrl }
  });
    resetShareIntent(true);
  } else {
    if (hasShareIntent) {
      resetShareIntent(true);
    }
    router.replace('/(tabs)/(home)');
  }

제안:

  if (hasShareIntent) resetShareIntent(true);
  if (sharedUrl) {
    router.replace({ pathname: '/(tabs)/(home)/add-link', params: { sharedUrl }
  });
  } else {
    router.replace('/(tabs)/(home)');
  }

동작은 동일하고, resetShareIntent를 한 곳에서만 처리해 의도가 더 명확지지 않을까 합니다.
큰 문제는 아니고 가독성 향상을 위한 제안이라 반영할지 넘길지 판단만 해주시면 될 거 같습니다.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 제안 감사합니다. 말씀해주신 대로 share intent가 있는 경우에는 URL 추출 성공 여부와 관계없이 소비한 intent를 정리하는 흐름이라, resetShareIntent(true)를 분기 밖에서 한 번만 처리하도록 반영했습니다.

이렇게 하니 중복도 줄고, 공유 인텐트를 처리한 뒤 정리한다는 의도가 더 명확해지는 것 같습니다.

@kbh0218 kbh0218 merged commit cbdeccc into dev May 18, 2026
@kbh0218 kbh0218 deleted the feat/#38-share-link-input branch May 18, 2026 13:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 기능개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] 공유하기로 전달된 링크 자동 입력

2 participants