Xcode 12.x Simulator에서 Telegram-iOS 빌드 및 실행

hubo.dev의 거울

Unsplash에 Xavi Cabrera의 사진

Telegram 은보다 정기적 인 일정으로 클라이언트 소스 코드를 공개하기 위해 [ iOS 및 Android 용 재현 가능한 빌드 ] 프로그램을 시작했습니다 . 훌륭한 움직임이지만 최소한의 효과로 iOS 프로젝트를 빌드하고 실행하는 방법이 여전히 혼란 스러울 수 있습니다. 공식 가이드 빌드를 확인하기 위해 존재하는 패러랠 가상 머신 내부의 맥 OS 카탈리나, 엑스 코드 11.x의, 및 기타 도구의 설치를 요구하는 재현이다.

이 가이드에는 코드 작업을 원하는 개발자에게 문제가 있습니다.

-macOS 및 Xcode의 다른 복제본을 실행하려면 강력한 시스템이 필요합니다.
-Xcode 11.x는 구식이며 최신 Xcode 12.x는 코드 완성시 15 배 더 빠릅니다 .
-Xcode IDE에서 프로젝트를 여는 방법을 보여주지 않고 자동화 스크립트 파일을 실행하여 IPA 파일을 생성합니다.
-Xcode 시뮬레이터에서 빌드하고 실행하는 방법은 다루지 않습니다.

이 튜토리얼은 문제를 해결하는 방법을 보여줍니다. 필요한 도구를 설치하고 프로젝트 코드의 일부를 수정하여 작동하도록합니다. 세부 사항을 읽고 싶지 않은 경우 마지막 섹션으로 빨리 이동할 수 있습니다.

Buck 설치

내 개발 컴퓨터는 Xcode 12.2 (12B45b)와 함께 macOS Catalina 10.15.7을 실행합니다. Telegram-iOS는 buck 을 사용 하여 타사 라이브러리를 빌드하고 Xcode 작업 공간 파일을 생성합니다. Homebrew를 통해 buck 및 종속성 JDK 8을 설치할 수 있습니다.

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
brew tap facebook/fb
brew install buck

$ java -version
openjdk version "1.8.0_272"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_272-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.272-b10, mixed mode)
$ buck --version
buck version 2020.10.21.01

# 1 코드 확인

git clone --recursive https://github.com/TelegramMessenger/telegram-ios.git
cd telegram-ios

Telegram-iOS를 사용하면 개발자가 자신의 클라이언트 변형을 사용자 정의하고 빌드 할 수 있으므로 빌드 시스템은 설정을 제공하기 위해 많은 환경 변수를 사용합니다. 재현 가능한 빌드 가이드의 설정을 시뮬레이터에서만 실행하고 싶으므로 재사용 할 수 있습니다.

build-system / verify.sh 의 원래 설정에 사소한 조정을 추가합니다 .

  • BUCK변수를 추가 하십시오. 는 makefile벅 명령을 찾을 수에 달려.
  • BUILD_NUMBER변수를 추가 하십시오.
  • 플립 IS_INTERNAL_BUILDtrueIS_APPSTORE_BUILDfalse.

Config / utils.bzl 에 추가하여 모든 모듈에 대해 데드 코드 제거를 활성화해야합니다 .

그렇지 않으면 Xcode로 프로젝트를 빌드하는 동안 다음 오류가 발생할 수 있습니다.

# 4 mozjpeg의 빌드 설정 조정

일부 타사 라이브러리의 빌드 설정 x86_64에는 Apple M1 컴퓨터가없는 한 시뮬레이터에 필요한 대상 이 없습니다 . 우리 스스로 추가해야합니다.

mozjpeg조정이 필요한 그들 중 하나입니다. third-party / mozjpeg / BUCK 내부 에서 arm64및의 두 대상을 선언합니다 armv7. 우리는 변경할 수 있습니다 armv7x86_64우리가 필요로하지 않는 armv7시뮬레이터와 대부분의 장치에.

# 5 webrtc-ios 용 빌드 수정

Telegram-iOS webrtc-ios는 올해 수입 된 거대한 모듈 인를 기반으로 화상 통화를 구축합니다 . 작업 공간 파일을 생성하기 전에 벅차게 프레임 워크에 빌드해야합니다. 불행히도 공식 리포지토리의 코드는 Xcode 12.x로 컴파일되지 않으며 x86_64대상을 지원하지 않습니다 .

첫 번째 변경 사항은 빌드 시스템 의 일부인 Python 스크립트 find_sdk.py 입니다 webrtc-ios. Xcode.app에서 SDK 경로를 찾는 데 도움이됩니다. ^MacOSX(10\.\d+)\.sdk$SDK 경로 이름이 .x로 변경되었으므로 원래 정규식 은 Xcode 12.x에서 작동하지 않습니다 Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk. 식을로 변경해야 합니다. ^MacOSX(1[01]\.\d+)\.sdk$이는 MacOSX10MacOSX11SDK 이름 과 모두 일치 합니다.

다른 수정 사항은 x86_64다음과 같이 대상 을 추가하는 것입니다 .

# 6 작업 공간 파일 생성

이제 아래 명령을 실행하여 라이브러리를 빌드하고 작업 공간 파일을 생성 할 준비가되었습니다.

make project

시뮬레이터에서 빌드 및 실행

Xcode가 실행되는 것을 보는 것은 흥미롭지 만 마지막으로 필요한 변경 사항이 하나 있습니다. 그렇지 않으면 시뮬레이터에서 실행할 빌드 프로세스가 많은 링크 단계 오류와 함께 실패합니다.

Undefined symbols for architecture x86_64:
  "static UIKit.UIPointerShape.defaultCornerRadius.getter : CoreGraphics.CGFloat", referenced from:
      Display.(PointerInteractionImpl in _B39DD7E7F85F24DF4F7212BCFE28692F).pointerInteraction(_: __C.UIPointerInteraction, styleFor: __C.UIPointerRegion) -> __C.UIPointerStyle? in PointerInteraction.o
  "enum case for UIKit.UIPointerShape.roundedRect(UIKit.UIPointerShape.Type) -> (__C.CGRect, CoreGraphics.CGFloat) -> UIKit.UIPointerShape", referenced from:
      Display.(PointerInteractionImpl in _B39DD7E7F85F24DF4F7212BCFE28692F).pointerInteraction(_: __C.UIPointerInteraction, styleFor: __C.UIPointerRegion) -> __C.UIPointerStyle? in PointerInteraction.o
  "enum case for UIKit.UIPointerEffect.highlight(UIKit.UIPointerEffect.Type) -> (__C.UITargetedPreview) -> UIKit.UIPointerEffect", referenced from:
      Display.(PointerInteractionImpl in _B39DD7E7F85F24DF4F7212BCFE28692F).pointerInteraction(_: __C.UIPointerInteraction, styleFor: __C.UIPointerRegion) -> __C.UIPointerStyle? in PointerInteraction.o

이제 시뮬레이터에서 Telegram-iOS를 빌드, 실행 및 디버그 할 수 있습니다.

빨리 감기

복잡한 빌드 시스템으로 싸우는 재미를 즐길 시간이없고 최종 단계로 빨리 나아가고 싶다면 Telegram-iOS의 분기 된 저장소에 패치 파일로 변경 사항을 저장했습니다 . 공식 저장소를 확인하고 명령을 실행하여 프로세스를 단순화하는 패치를 다운로드하고 사용할 수 있습니다.

Suggested posts

Swift를 사용하고 타사 라이브러리없이 최신 iOS 입력 레이 오버 생성

Swift를 사용하고 타사 라이브러리없이 최신 iOS 입력 레이 오버 생성

앱에서 개발자는 종종 앱 내의 여러 지점에서 특정 정보를 요구합니다. 이 정보를 요청하려면 레이 오버를 생성하고 애플리케이션 어디에서나이를 트리거해야합니다.

SwiftUI에서 이미지 크기 조정

왜곡없이 이미지 크기를 가로 세로 비율로 조정하는 방법

SwiftUI에서 이미지 크기 조정

Vrbo ™ ️ (Expedia Group ™의 일부) iOS 앱에서 최근 일부 기존 UIKit보기를 SwiftUI로 변환했으며 이미지 크기를 조정할 때 문제가 발생했습니다. 문제는 이미지를 특정 크기로 크기를 조정하고 왜곡없이 종횡비를 유지해야 할 때 발생합니다.

Related posts

Swift— 프로토콜은 어떻게 작동합니까?

프로토콜과 위임은 Swift의 기본 개념입니다. 작동 방식과 사용 방법에 대해 알아 보려면이 빠른 가이드를 읽어보세요.

Swift— 프로토콜은 어떻게 작동합니까?

프로토콜은 Swift에서 매우 간단하지만 기본적인 개념입니다. 프로토콜은 코드 계약과 같습니다.

Mac App Store에없는 Mac에서 iOS / iPadOS 앱을 실행하는 방법

Mac App Store에없는 Mac에서 iOS / iPadOS 앱을 실행하는 방법

M1 칩을 실행하는 Mac이있는 경우 Mac App Store에 나열된 iOS / iPadOS 앱만 실행할 수 있습니다. 하지만 Mac App Store에 나열되지 않은 iOS / iPadOS 앱은 어떻습니까? 공식적으로는 할 수 없습니다.

더 접근하기 쉬운 오디오 플레이어

실명 및 시각 장애가있는 사람들을위한 공감력으로 구축하는 법 배우기

더 접근하기 쉬운 오디오 플레이어

작성자 : Francis Mariano, iOS 엔지니어 Headspace의 대담한 사명 선언문 인 세상의 건강과 행복을 개선합니다. 우리가 그곳에 사는 사람들의 다양한 경험을 인식하게 만드는 것.

SwiftUI를 사용하여 원 안에 텍스트를 표시하는 방법

SwiftUI를 사용하여 원 안에 텍스트를 표시하는 방법

이번에는 SwiftUI를 사용하여 원 안에 텍스트 레이블을 표시하는 몇 가지 방법을 살펴 보겠습니다. ZStack보기를 사용하여 세 가지 다른 방법을 자세히 살펴 보겠습니다.