Skip to content

Conversation

@ShapeKim98
Copy link
Contributor

#️⃣연관된 이슈

#146

📝작업 내용

이번 PR에서 작업한 내용을 간략히 설명해주세요(이미지 첨부 가능)

  • Share Extension 타겟을 추가하였습니다.
  • Intro, Splash 화면과 기능을 FeatureLogin로 내렸습니다.
  • 프로비저닝 파일을 새로 발급하였습니다.
  • SocialLoginClient에 구글로그인에 필요한 RootViewController 설정 기능을 추가하였습니다.
  • AppGroups Capability를 추가하고, 앱 그룹간 KeyChain, UserDefault 공유 기능을 활성화 하였습니다.
  • ContentSettingShare Extension 분기를 추가하였습니다.

스크린샷 (선택)

Simulator Screen Recording - iPhone 16 Pro - 2024-10-18 at 15 36 30 Simulator Screen Recording - iPhone 16 Pro - 2024-10-18 at 15 35 58 Simulator Screen Recording - iPhone 16 Pro - 2024-10-18 at 15 37 00

💬리뷰 요구사항(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

Share Extension 타겟을 추가하였습니다.

graph

  • App 프로젝트 내에 App 타겟이 Share Extension을 의존하는 형태로 추가하였습니다.

Intro, Splash 화면과 기능을 LoginFeature로 내렸습니다.

  • Share Extension은 워치앱이나, 위젯처럼 별도의 앱으로 동작합니다. 그렇기 때문에 토큰 관리를 고려할 수 밖에 없었고, 토큰 관련 문제가 발생 시 매번 로그인을 할 수 밖에 없는 상황이었습니다.
    다행이도 저희 Intro기능은 TCA 덕분에 의존성 분리가 잘 되어 있어 재사용이 가능했습니다.
    그래서 Intro기능을 App타겟과 ShareExtension 타겟에서 전부 재사용 하고자 하위 모듈인 FeatureLogin으로 이동시켰습니다.

프로비저닝 파일을 새로 발급하였습니다.

  • 앞서 설명한 대로 Share Extension은 별도의 앱으로 동작하기 때문에, 별도의 프로비저닝 파일이 필요하여, Share Extension에 대한 프로비저닝을 발급하였습니다.
    또한, App Groups, KeyChain Sharing Capability를 사용하기 위해 개발자 계정 사이트에 있는 포킷 App ID에 App Groups Capability를 추가하였는데, 이렇게 App ID를 수정하게 되면 기존 프로비저닝 파일들이 전부 만료가 됩니다.
    물론, 프로비저닝 파일을 다시 갱신해서, xcode로 프로비저닝을 업데이트 해도 되지만, 저희는 CI/CD 환경도 고려해야 하기 때문에, 아예 fastlane으로 새로 발급하는 방향을 선택하였습니다.

SocialLoginClient에 구글로그인에 필요한 RootViewController 설정 기능을 추가하였습니다.

  • 구글 로그인은 로그인 사이트 웹뷰를 띄우기 위해 앱의 root뷰의 컨트롤러를 알아내는 작업이 필요합니다.
    Share Extensionroot뷰의 컨트롤러를 SLComposeServiceViewController 프로토콜을 채용한 컨트롤러로 별도로 만들고, Info.plist에 지정해줘야 하는 방식이기 때문에, 기존에 UIApplication을 활용한 방법이 통하지 않습니다.
    그렇기 때문에 구글 로그인 시 Share Extensionroot뷰의 컨트롤러를 GoogleLoginController에 알려주는 메서드를 구현하였습니다.
func handleControllerAction(_ action: Action.ControllerAction, state: inout State) -> Effect<Action> {
  switch action {
  case let .viewDidLoad(controller, context):
      state.context = context
      state.controller = controller
      socialLogin.setRootViewController(controller)
      return .send(.async(.URL_파싱_수행))
...

AppGroups Capability를 추가하고, 앱 그룹간 KeyChain, UserDefault 공유 기능을 활성화 하였습니다.

  • Intro 기능을 사용하기 위해선 UserDefault의 로그인 정보와, KeyChain에 저장된 토큰들을 불러와야 하는데, Share Extension은 별도의 앱이기 때문에, 기존의 방법으론 불러오는게 불가능 하였습니다.
    그래서 AppGroups라는 Capability를 통해 포킷 앱과 Share Extension앱을 하나의 그룹으로 묶고, UserDefatulClientKeyChainClientApp Group 아이디를 지정하여 같은 그룹 내에서 데이터 공유가 가능하도록 구현하였습니다.
    키체인은 KeyChain Sharing이라는 Capability가 필요하여 추가하였습니다.
let defaults = { UserDefaults(suiteName: "group.com.pokitmons.pokit") }
private struct KeychainController {
  let service: String = "Pokit"
  let group: String = "group.com.pokitmons.pokit"

  func create(_ data: Data?, key: KeychainKey) {
      guard let data = data else {
          print("🗝️ '\(key)' 값이 없어요.")
          return
      }

      let query: NSDictionary = [
          kSecClass: kSecClassGenericPassword,
          kSecAttrService: service,
          kSecAttrAccount: key.rawValue,
          kSecValueData: data,
          kSecAttrAccessGroup as String: group
      ]
...

ContentSettingShare Extension 분기를 추가하였습니다.

  • Share Extension으로 ContentSetting을 호출 시 뒤로가기 버튼을 닫기 버튼으로 바꾸기 위해 분기를 추가하였습니다.

close #146

@ShapeKim98 ShapeKim98 added the Feat 기능구현 label Oct 18, 2024
@ShapeKim98 ShapeKim98 requested a review from stealmh October 18, 2024 07:32
@ShapeKim98 ShapeKim98 self-assigned this Oct 18, 2024
@ShapeKim98
Copy link
Contributor Author

graph

@stealmh 의존성 수정 했습니다 확인해 주세여

@ShapeKim98 ShapeKim98 linked an issue Oct 19, 2024 that may be closed by this pull request
2 tasks
@stealmh
Copy link
Member

stealmh commented Oct 20, 2024

고생 많으셨습니다!
생각보다 간단하게 끝날 기능일 줄 알았는데 내부로직도 수정하고 모듈 의존성도 수정하는 큰 공사였네요..!
PR을 자세히 작성해주셔서 화면 두개 켜놓고 비교해가며 커밋기록과 살펴봤습니다. 전부 잘 작성해주셨습니다😃

인트로와 스플래시분리는 사실 예전부터 필요하다 싶었는데 로그인으로 빼는건 생각을 아예 해본적이 없어서 추후에는 인트로라는 모듈이 따로 필요하지 않을까 라는 의견입니다! 그게 나중에 있어서 테스트하기도 쉽고 여러 방면에서 생각해 볼 필요가 있는데 뭐 이건진짜 나중이니까요.
지금은 괜찮습니다.

마지막으로 ShareExtensionTests 만들어서 머지해주시면 감사하겠습니다!

@ShapeKim98
Copy link
Contributor Author

고생 많으셨습니다! 생각보다 간단하게 끝날 기능일 줄 알았는데 내부로직도 수정하고 모듈 의존성도 수정하는 큰 공사였네요..! PR을 자세히 작성해주셔서 화면 두개 켜놓고 비교해가며 커밋기록과 살펴봤습니다. 전부 잘 작성해주셨습니다😃

인트로와 스플래시분리는 사실 예전부터 필요하다 싶었는데 로그인으로 빼는건 생각을 아예 해본적이 없어서 추후에는 인트로라는 모듈이 따로 필요하지 않을까 라는 의견입니다! 그게 나중에 있어서 테스트하기도 쉽고 여러 방면에서 생각해 볼 필요가 있는데 뭐 이건진짜 나중이니까요. 지금은 괜찮습니다.

마지막으로 ShareExtensionTests 만들어서 머지해주시면 감사하겠습니다!

넹 감사합니당

@ShapeKim98 ShapeKim98 merged commit d059788 into develop Oct 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Feat 기능구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Share Extension 구현

3 participants