iOS 앱에서 프레임 워크 간 브리지를 만드는 방법

앱 코드가 다음과 같다면…

"앱의 해당 부분을 내보내고 싶지만 스파게티 플레이트와 같은 나머지 앱과 연결되어 있습니다!"

너무 의존적 인 앱의 작은 부분을 내보내려고합니다.

작업중인 앱의 일부를 모듈화하기 시작했을 때 벽에 부딪 쳤습니다.

서비스 (실제로는 추적 서비스)를 별도의 프레임 워크로 내보내고 싶었습니다. 문제는이 서비스가 앱과 너무 밀접한 관련이 없다는 것입니다. 앱에 깊이 고정 된 다른 서비스를 사용하는 다른 서비스를 사용하고있었습니다.

추적 서비스를 내보내려면 새 프레임 워크에서 전체 서비스 세트를 리팩터링하고 다시 작성해야했습니다!

하지만 사실이 작업을 수행 할 시간이 없었으며 회귀 테스트는 악몽이었을 것입니다. 다른 여러 가지 이유로 프로세스, 예산, 마감일 등이있을 수 있습니다.
그래서 모든 것을 리팩토링하지 않고 앱의이 부분을 내보내는 방법을 찾아야했습니다.

구체적인 예부터 시작합시다!

우리는 일이 어떻게 작동하는지 배우고 이해하는 가장 좋은 방법입니다! (이 게시물 끝에이 예제에 대한 Github 저장소를 제공하려고합니다)
컨텍스트를 설정하겠습니다. 화면이 2 개인 작은 앱이 있습니다.

  • 홈 화면
  • 결제 화면 (해당 화면을 프레임 워크로 내보내려고 함)

결제 페이지에는 카드 번호를 입력하기위한 TextField와 결제 버튼이 있습니다. 버튼을 누르면 결제가 시작됩니다.
그러나! 도전 과제는 지불 방법에 있습니다. 조금 전에 불러 온 몇 가지 이유로 결제 서비스를 내보낼 수 없다고 가정 해 봅시다.

홈 화면 및 결제 화면

우리는이 두 개의 스크린을 두 개의 다른 목표로 선언했습니다. 홈 화면은 기본 앱 대상에서 선언되고 결제 화면은 PaymentModule이라는 다른 모듈에서 선언됩니다. 또한 다음과 같이 기본 앱 대상에 PaymentService가 선언되어 있습니다.

지불 방법은 너무 의존적이므로 앱에서 추출 할 수없는 방법입니다. 그러나 결제 모듈에서 사용하려고합니다.

Payment 모듈에 PaymentViewController가 정의되어 있습니다. PaymentService를 호출하려고하면이 서비스가 모듈에 없기 때문에 오류가 발생합니다. 모듈 내에서 주요 대상을 가져올 수 없습니다 (넌센스)

그러면 PaymentViewController에서이 메소드를 어떻게 사용할 것입니까?

모듈에서 프로토콜 정의

이것은 우리 다리가 될 것입니다. 기본 앱 대상에서 사용하려는 것을 설명하는 방법으로 모듈에서 프로토콜을 정의해야합니다.

pay 메서드를 사용하여 PaymentServiceProtocol이라는 프로토콜을 정의 해 보겠습니다.

앱에서 프로토콜 구현

이제이 프로토콜을 준수하기 위해 PaymentService에 알려야합니다. 우리는 이것을 추가해야합니다 :

"프로토콜에 선언 된 메소드가이 확장에서 구현되지 않은 이유는 무엇입니까?"

프로토콜을 준수 할 때는 그 속성과 메서드를 구현해야합니다. 여기서 트릭은 프로토콜의 메소드 이름이 조금 앞서 선언 한 PaymentService의 메소드 이름과 정확히 동일하다는 것입니다. 이런 방식으로 시스템은 프로토콜 메소드에 액세스 할 때 PaymentService 클래스에 선언 된 메소드 pay를 사용해야한다는 것을 알게됩니다.

두 부분을 연결

이제 두 부분을 결합해야합니다.
HomeViewController에서“결제 페이지로 이동”버튼을 누르면 PaymentViewController를 인스턴스화합니다. 이때 PaymentService 클래스에 대한 참조를 전달하지만 모듈의 지불 컨트롤러는이를 PaymentServiceProtocol 유형으로 간주합니다.

요령은 다음과 같습니다.

PaymentService.self를 전달하고 있으며 모듈의 코드에 PaymentServiceProtocol.Type이 표시됩니다.
이제 우리는 모듈에서 앱에 정의 된 pay 메소드를 호출 할 수 있습니다!

다리 사용

우리가 만든 브리지를 사용하는 것이 매우 쉽습니다.

지불 버튼을 누를 때마다 didTapPayButton 메소드가 호출됩니다 (정확하게 들리나요?). 23 번 라인에서 확인하십시오 : 앱에서 얻은 프로토콜 참조에서 pay 메소드를 호출하고 있습니다.

PaymentService는이 프로토콜을 준수하므로 시스템은 pay 메소드 (PaymentService.swift에 정의 됨) 내에서 코드를 실행합니다.

다시 말해, 우리는 처음에 모듈에서 호출 할 수없는 방법을 사용하고 있습니다! 다리가 설정되었습니다.

지불 버튼을 누를 때의 모습은 다음과 같습니다.

지불 모듈에서 기본 대상에 포함 된 지불 방법 사용

결론

결론적으로이 브리징 방법은 앱의 구성 요소를 프레임 워크로 내보내려는 경우에 사용할 수 있습니다.

이 기술을 사용하면 앱의 해당 부분을 프레임 워크로 내 보내야하지만 이유를 불문하고 모든 것을 내보낼 수없는 경우 그릇에서 국수를자를 수 있습니다.

예를 들어 시간이있을 때 프레임 워크 내부의 전체 구성 요소를 꺼내기 전에 이것이 임시 해결책이라고 생각합니다. (이 시나리오에서는 언젠가 지불 모듈 내에서 지불 방법을 내 보내야합니다)

나는 유니콘과 멋진 물건을 가진 이상적인 세상에서 우리는 그런 것을하지 않을 것이라고 인정합니다. 우리는 오히려 전체 구성 요소를 내보내려고하지만 여러 번 말했듯이 이것이 항상 가능한 것은 아닙니다.

이 프로젝트의 Github 저장소를 찾을 수 있습니다. 다리가 어떻게 진행되는지 확인하고 직접 시도해보십시오.
이 게시물이 도움이되기를 바랍니다. 궁금한 점이 있으면 언제든지 문의하십시오.

이 이야기는 매체에서 가장 큰 창업가 출판물 인 스타트 업 (The Startup)과 +442,678 명의 사람들에게 출판됩니다.

여기서 주요 기사를 받으려면 구독하십시오.