Wallet-related changes

This commit is contained in:
Ali 2020-04-01 21:56:51 +04:00
parent 4e8cf117b7
commit 13831f909f
5 changed files with 85 additions and 147 deletions

View File

@ -1,28 +1,7 @@
include Utils.makefile
APP_VERSION="1.0" APP_VERSION="1.0"
CORE_COUNT=$(shell sysctl -n hw.logicalcpu) CORE_COUNT=$(shell sysctl -n hw.logicalcpu)
CORE_COUNT_MINUS_ONE=$(shell expr ${CORE_COUNT} \- 1) CORE_COUNT_MINUS_ONE=$(shell expr ${CORE_COUNT} \- 1)
WALLET_BUCK_OPTIONS=\
--config custom.appVersion="1.0" \
--config custom.developmentCodeSignIdentity="${DEVELOPMENT_CODE_SIGN_IDENTITY}" \
--config custom.distributionCodeSignIdentity="${DISTRIBUTION_CODE_SIGN_IDENTITY}" \
--config custom.developmentTeam="${DEVELOPMENT_TEAM}" \
--config custom.baseApplicationBundleId="${WALLET_BUNDLE_ID}" \
--config custom.buildNumber="${BUILD_NUMBER}" \
--config custom.entitlementsApp="${WALLET_ENTITLEMENTS_APP}" \
--config custom.developmentProvisioningProfileApp="${WALLET_DEVELOPMENT_PROVISIONING_PROFILE_APP}" \
--config custom.distributionProvisioningProfileApp="${WALLET_DISTRIBUTION_PROVISIONING_PROFILE_APP}" \
--config custom.apiId="${API_ID}" \
--config custom.apiHash="${API_HASH}" \
--config custom.appCenterId="0" \
--config custom.isInternalBuild="${IS_INTERNAL_BUILD}" \
--config custom.isAppStoreBuild="${IS_APPSTORE_BUILD}" \
--config custom.appStoreId="${APPSTORE_ID}" \
--config custom.appSpecificUrlScheme="${APP_SPECIFIC_URL_SCHEME}" \
--config buildfile.name=BUCK
BAZEL=$(shell which bazel) BAZEL=$(shell which bazel)
ifneq ($(BAZEL_CACHE_DIR),) ifneq ($(BAZEL_CACHE_DIR),)
@ -42,37 +21,10 @@ BAZEL_OPT_FLAGS=\
--swiftcopt=-whole-module-optimization \ --swiftcopt=-whole-module-optimization \
--swiftcopt='-num-threads' --swiftcopt='16' \ --swiftcopt='-num-threads' --swiftcopt='16' \
wallet_deps: check_env kill_xcode:
$(BUCK) query "deps(//Wallet:AppPackage)" --output-attribute buck.type \ killall Xcode || true
${WALLET_BUCK_OPTIONS} ${BUCK_RELEASE_OPTIONS}
wallet_project: check_env kill_xcode wallet_app_debug_arm64:
$(BUCK) project //Wallet:workspace --config custom.mode=project ${WALLET_BUCK_OPTIONS} ${BUCK_DEBUG_OPTIONS}
open Wallet/WalletWorkspace.xcworkspace
build_wallet: check_env
$(BUCK) build \
//Wallet:AppPackage#iphoneos-arm64,iphoneos-armv7 \
//Wallet:Wallet#dwarf-and-dsym,iphoneos-arm64,iphoneos-armv7 \
//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#dwarf-and-dsym,shared,iphoneos-arm64,iphoneos-armv7 \
//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared,iphoneos-arm64,iphoneos-armv7 \
//submodules/AsyncDisplayKit:AsyncDisplayKit#dwarf-and-dsym,shared,iphoneos-arm64,iphoneos-armv7 \
//submodules/AsyncDisplayKit:AsyncDisplayKit#shared,iphoneos-arm64,iphoneos-armv7 \
//submodules/Display:Display#dwarf-and-dsym,shared,iphoneos-arm64,iphoneos-armv7 \
//submodules/Display:Display#shared,iphoneos-arm64,iphoneos-armv7 \
${WALLET_BUCK_OPTIONS} ${BUCK_RELEASE_OPTIONS} ${BUCK_THREADS_OPTIONS} ${BUCK_CACHE_OPTIONS}
wallet_package:
PACKAGE_DEVELOPMENT_TEAM="${DEVELOPMENT_TEAM}" \
PACKAGE_CODE_SIGN_IDENTITY="${DISTRIBUTION_CODE_SIGN_IDENTITY}" \
PACKAGE_PROVISIONING_PROFILE_APP="${WALLET_DISTRIBUTION_PROVISIONING_PROFILE_APP}" \
PACKAGE_ENTITLEMENTS_APP="Wallet/${WALLET_ENTITLEMENTS_APP}" \
PACKAGE_BUNDLE_ID="${WALLET_BUNDLE_ID}" \
sh package_app.sh iphoneos-arm64,iphoneos-armv7 $(BUCK) "wallet" $(WALLET_BUCK_OPTIONS) ${BUCK_RELEASE_OPTIONS}
wallet_app: build_wallet wallet_package
bazel_wallet_debug_arm64:
WALLET_APP_VERSION="${APP_VERSION}" \ WALLET_APP_VERSION="${APP_VERSION}" \
build-system/prepare-build.sh Wallet distribution build-system/prepare-build.sh Wallet distribution
"${BAZEL}" build Wallet/Wallet ${BAZEL_CACHE_FLAGS} ${BAZEL_COMMON_FLAGS} ${BAZEL_DEBUG_FLAGS} \ "${BAZEL}" build Wallet/Wallet ${BAZEL_CACHE_FLAGS} ${BAZEL_COMMON_FLAGS} ${BAZEL_DEBUG_FLAGS} \
@ -81,7 +33,7 @@ bazel_wallet_debug_arm64:
--watchos_cpus=armv7k,arm64_32 \ --watchos_cpus=armv7k,arm64_32 \
--verbose_failures --verbose_failures
bazel_wallet: wallet_app:
WALLET_APP_VERSION="${APP_VERSION}" \ WALLET_APP_VERSION="${APP_VERSION}" \
build-system/prepare-build.sh Wallet distribution build-system/prepare-build.sh Wallet distribution
"${BAZEL}" build Wallet/Wallet ${BAZEL_CACHE_FLAGS} ${BAZEL_COMMON_FLAGS} ${BAZEL_OPT_FLAGS} \ "${BAZEL}" build Wallet/Wallet ${BAZEL_CACHE_FLAGS} ${BAZEL_COMMON_FLAGS} ${BAZEL_OPT_FLAGS} \
@ -95,7 +47,7 @@ bazel_wallet_prepare_development_build:
BAZEL_CACHE_DIR="${BAZEL_CACHE_DIR}" \ BAZEL_CACHE_DIR="${BAZEL_CACHE_DIR}" \
build-system/prepare-build.sh Wallet development build-system/prepare-build.sh Wallet development
bazel_wallet_project: kill_xcode bazel_wallet_prepare_development_build wallet_project: kill_xcode bazel_wallet_prepare_development_build
WALLET_APP_VERSION="${APP_VERSION}" \ WALLET_APP_VERSION="${APP_VERSION}" \
BAZEL_CACHE_DIR="${BAZEL_CACHE_DIR}" \ BAZEL_CACHE_DIR="${BAZEL_CACHE_DIR}" \
build-system/generate-xcode-project.sh Wallet build-system/generate-xcode-project.sh Wallet

View File

@ -2,62 +2,26 @@
This is the source code and build instructions for a TON Testnet Wallet implementation for iOS. This is the source code and build instructions for a TON Testnet Wallet implementation for iOS.
1. Install Xcode 11.1 1. Install Xcode 11.4
``` ```
https://apps.apple.com/ae/app/xcode/id497799835?mt=12 https://apps.apple.com/app/xcode/id497799835
``` ```
Make sure to launch Xcode at least once and set up command-line tools paths (Xcode — Preferences — Locations — Command Line Tools) Make sure to launch Xcode at least once and set up command-line tools paths (Xcode — Preferences — Locations — Command Line Tools)
2. Install Homebrew 2. Build the app (IPA)
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
3. Install the required tools
```
brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
brew install cmake ant
```
4. Build Buck
```
mkdir -p $HOME/buck_source
cd tools/buck-build
sh ./prepare_buck_source.sh $HOME/buck_source
```
5. Now you can build Wallet application (IPA)
Note: Note:
It is recommended to use an artifact cache to optimize build speed. Prepend any of the following commands with It is recommended to use an artifact cache to optimize build speed. Prepend any of the following commands with
``` ```
BUCK_DIR_CACHE="path/to/existing/directory" BAZEL_CACHE_DIR="path/to/existing/directory"
``` ```
``` ```
BUCK="$HOME/buck_source/buck/buck-out/gen/programs/buck.pex" \ sh wallet_env.sh make wallet_app
BUILD_NUMBER=30 \
DISTRIBUTION_CODE_SIGN_IDENTITY="iPhone Distribution: XXXXXXX (XXXXXXXXXX)" \
DEVELOPMENT_TEAM="XXXXXXXXXX" WALLET_BUNDLE_ID="wallet.bundle.id" \
WALLET_DISTRIBUTION_PROVISIONING_PROFILE_APP="wallet distribution provisioning profile name" \
CODESIGNING_SOURCE_DATA_PATH="$HOME/wallet_codesigning" \
sh Wallet/example_wallet_env.sh make -f Wallet.makefile wallet_app
``` ```
6. If needed, generate Xcode project 3. If needed, generate Xcode project
``` ```
BUCK="$HOME/buck_source/buck/buck-out/gen/programs/buck.pex" \ sh wallet_env.sh make wallet_project
BUILD_NUMBER=30 \
DEVELOPMENT_CODE_SIGN_IDENTITY="iPhone Developer: XXXXXXX (XXXXXXXXXX)" \
DISTRIBUTION_CODE_SIGN_IDENTITY="iPhone Distribution: XXXXXXX (XXXXXXXXXX)" \
DEVELOPMENT_TEAM="XXXXXXXXXX" WALLET_BUNDLE_ID="wallet.bundle.id" \
WALLET_DEVELOPMENT_PROVISIONING_PROFILE_APP="wallet development provisioning profile name" \
WALLET_DISTRIBUTION_PROVISIONING_PROFILE_APP="wallet distribution provisioning profile name" \
CODESIGNING_SOURCE_DATA_PATH="$HOME/wallet_codesigning" \
sh Wallet/example_wallet_env.sh make -f Wallet.makefile wallet_project
``` ```

View File

@ -39,22 +39,6 @@ def clean_copy_files(dir, destination_dir):
continue continue
mkdir_p(destination_dir + "/" + dir_path) mkdir_p(destination_dir + "/" + dir_path)
def clean_files(base_dir, dirs, files):
for file in files:
if file == '.DS_Store':
os.remove(base_dir + '/' + file)
for dir in dirs:
if re.match('.*\\.xcodeproj', dir) or re.match('.*\\.xcworkspace', dir):
shutil.rmtree(base_dir + '/' + dir, ignore_errors=True)
def clean_dep_files(base_dir, dirs, files):
for file in files:
if re.match('^\\.git$', file) or re.match('^.*/\\.git$', file):
os.remove(base_dir + '/' + file)
for dir in dirs:
if re.match('^\\.git$', dir) or re.match('^.*/\\.git$', dir):
shutil.rmtree(base_dir + '/' + dir, ignore_errors=True)
if len(sys.argv) != 2: if len(sys.argv) != 2:
print('Usage: extract_wallet_source.py destination') print('Usage: extract_wallet_source.py destination')
sys.exit(1) sys.exit(1)
@ -96,13 +80,15 @@ additional_paths = [
"build-system/copy-provisioning-profiles-Wallet.sh", "build-system/copy-provisioning-profiles-Wallet.sh",
"build-system/prepare-build-variables-Wallet.sh", "build-system/prepare-build-variables-Wallet.sh",
".bazelrc", ".bazelrc",
"Utils.makefile",
"Wallet.makefile",
"wallet_env.sh", "wallet_env.sh",
] ]
for file_path in additional_paths: for file_path in additional_paths:
if os.path.isdir(file_path): if os.path.isdir(file_path):
clean_copy_files(file_path, destination + '/' + file_path) clean_copy_files(file_path, destination + "/" + file_path)
else: else:
shutil.copy(file_path, destination + '/' + file_path) shutil.copy(file_path, destination + "/" + file_path)
shutil.copy("Wallet.makefile", destination + "/" + "Makefile")
shutil.copy("Wallet/README.md", destination + "/" + "README.md")

View File

@ -170,7 +170,7 @@ private final class WalletReceiveScreenNode: ViewControllerTracingNode {
self.textNode = ImmediateTextNode() self.textNode = ImmediateTextNode()
self.textNode.textAlignment = .center self.textNode.textAlignment = .center
self.textNode.maximumNumberOfLines = 3 self.textNode.maximumNumberOfLines = 5
self.qrImageNode = TransformImageNode() self.qrImageNode = TransformImageNode()
self.qrImageNode.clipsToBounds = true self.qrImageNode.clipsToBounds = true
@ -287,33 +287,6 @@ private final class WalletReceiveScreenNode: ViewControllerTracingNode {
func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) {
self.validLayout = (layout, navigationHeight) self.validLayout = (layout, navigationHeight)
var insets = layout.insets(options: [])
insets.top += navigationHeight
let inset: CGFloat = 22.0
let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - inset * 2.0, height: CGFloat.greatestFiniteMagnitude))
let textFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width) / 2.0), y: insets.top + 24.0), size: textSize)
transition.updateFrame(node: self.textNode, frame: textFrame)
let makeImageLayout = self.qrImageNode.asyncLayout()
let imageSide: CGFloat = 215.0
let imageSize = CGSize(width: imageSide, height: imageSide)
let imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), emptyColor: nil))
let _ = imageApply()
let imageFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - imageSize.width) / 2.0), y: textFrame.maxY + 20.0), size: imageSize)
transition.updateFrame(node: self.qrImageNode, frame: imageFrame)
transition.updateFrame(node: self.qrButtonNode, frame: imageFrame)
if let qrCodeSize = self.qrCodeSize {
let (_, cutoutFrame, _) = qrCodeCutout(size: qrCodeSize, dimensions: imageSize, scale: nil)
self.qrIconNode.updateLayout(size: cutoutFrame.size)
transition.updateBounds(node: self.qrIconNode, bounds: CGRect(origin: CGPoint(), size: cutoutFrame.size))
transition.updatePosition(node: self.qrIconNode, position: imageFrame.center.offsetBy(dx: 0.0, dy: -1.0))
}
if self.urlTextNode.attributedText?.string.isEmpty ?? true { if self.urlTextNode.attributedText?.string.isEmpty ?? true {
var url = urlForMode(self.mode) var url = urlForMode(self.mode)
if case .receive = self.mode { if case .receive = self.mode {
@ -335,18 +308,69 @@ private final class WalletReceiveScreenNode: ViewControllerTracingNode {
self.urlTextNode.attributedText = NSAttributedString(string: sliced, font: addressFont, textColor: self.presentationData.theme.list.itemPrimaryTextColor, paragraphAlignment: .justified) self.urlTextNode.attributedText = NSAttributedString(string: sliced, font: addressFont, textColor: self.presentationData.theme.list.itemPrimaryTextColor, paragraphAlignment: .justified)
} }
let addressInset: CGFloat = 12.0 var insets = layout.insets(options: [])
let urlTextSize = self.urlTextNode.updateLayout(CGSize(width: layout.size.width - addressInset * 2.0, height: CGFloat.greatestFiniteMagnitude)) insets.top += navigationHeight
transition.updateFrame(node: self.urlTextNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - urlTextSize.width) / 2.0), y: imageFrame.maxY + 23.0), size: urlTextSize)) let inset: CGFloat = 22.0
let buttonSideInset: CGFloat = 16.0 let buttonSideInset: CGFloat = 16.0
let bottomInset = insets.bottom + 10.0 let bottomInset = insets.bottom + 10.0
let buttonWidth = layout.size.width - buttonSideInset * 2.0 let buttonWidth = layout.size.width - buttonSideInset * 2.0
let buttonHeight: CGFloat = 50.0 let buttonHeight: CGFloat = 50.0
let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - inset * 2.0, height: CGFloat.greatestFiniteMagnitude))
let addressInset: CGFloat = 12.0
let urlTextSize = self.urlTextNode.updateLayout(CGSize(width: layout.size.width - addressInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
var buttonOffset: CGFloat = 0.0 var buttonOffset: CGFloat = 0.0
if let _ = self.secondaryButtonNode.attributedTitle(for: .normal) { if let _ = self.secondaryButtonNode.attributedTitle(for: .normal) {
buttonOffset = -60.0 buttonOffset = -60.0
}
let imageSide: CGFloat = 215.0
let imageSize = CGSize(width: imageSide, height: imageSide)
let buttonTopEdge = layout.size.height - bottomInset - buttonHeight + buttonOffset
var topTextSpacing: CGFloat = 24.0
var imageSpacing: CGFloat = 20.0
var urlSpacing: CGFloat = 23.0
var contentHeight: CGFloat = insets.top
contentHeight += topTextSpacing + textSize.height
contentHeight += imageSpacing + imageSide
contentHeight += urlSpacing + urlTextSize.height
if contentHeight >= buttonTopEdge - 10.0 {
let factor: CGFloat = 0.5
topTextSpacing = floor(topTextSpacing * factor * 0.3)
imageSpacing = floor(imageSpacing * factor)
urlSpacing = floor(urlSpacing * factor)
}
let textFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width) / 2.0), y: insets.top + topTextSpacing), size: textSize)
transition.updateFrame(node: self.textNode, frame: textFrame)
let makeImageLayout = self.qrImageNode.asyncLayout()
let imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), emptyColor: nil))
let _ = imageApply()
let imageFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - imageSize.width) / 2.0), y: textFrame.maxY + imageSpacing), size: imageSize)
transition.updateFrame(node: self.qrImageNode, frame: imageFrame)
transition.updateFrame(node: self.qrButtonNode, frame: imageFrame)
if let qrCodeSize = self.qrCodeSize {
let (_, cutoutFrame, _) = qrCodeCutout(size: qrCodeSize, dimensions: imageSize, scale: nil)
self.qrIconNode.updateLayout(size: cutoutFrame.size)
transition.updateBounds(node: self.qrIconNode, bounds: CGRect(origin: CGPoint(), size: cutoutFrame.size))
transition.updatePosition(node: self.qrIconNode, position: imageFrame.center.offsetBy(dx: 0.0, dy: -1.0))
}
transition.updateFrame(node: self.urlTextNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - urlTextSize.width) / 2.0), y: imageFrame.maxY + urlSpacing), size: urlTextSize))
if let _ = self.secondaryButtonNode.attributedTitle(for: .normal) {
self.secondaryButtonNode.frame = CGRect(x: floor((layout.size.width - buttonWidth) / 2.0), y: layout.size.height - bottomInset - buttonHeight, width: buttonWidth, height: buttonHeight) self.secondaryButtonNode.frame = CGRect(x: floor((layout.size.width - buttonWidth) / 2.0), y: layout.size.height - bottomInset - buttonHeight, width: buttonWidth, height: buttonHeight)
} }

View File

@ -50,6 +50,18 @@ if [ "$WALLET_DISTRIBUTION_PROVISIONING_PROFILE_APP" == "" ]; then
exit 1 exit 1
fi fi
if [ "$CODESIGNING_DATA_PATH" == "" ]; then
echo "Set CODESIGNING_DATA_PATH to the path to a folder containing valid provisioning profiles corresponding to the chosen bundle ID ($WALLET_BUNDLE_ID)"
echo "Example: export CODESIGNING_DATA_PATH=\"\$HOME/wallet-provisioning-profiles\""
exit 1
fi
if [ "$BUILD_NUMBER" == "" ]; then
echo "Set BUILD_NUMBER to a number that will be used as a version string for the build"
echo "Example: export BUILD_NUMBER=100"
exit 1
fi
export DEVELOPMENT_CODE_SIGN_IDENTITY="$DEVELOPMENT_CODE_SIGN_IDENTITY" export DEVELOPMENT_CODE_SIGN_IDENTITY="$DEVELOPMENT_CODE_SIGN_IDENTITY"
export DISTRIBUTION_CODE_SIGN_IDENTITY="$DISTRIBUTION_CODE_SIGN_IDENTITY" export DISTRIBUTION_CODE_SIGN_IDENTITY="$DISTRIBUTION_CODE_SIGN_IDENTITY"
export WALLET_DEVELOPMENT_TEAM="$WALLET_DEVELOPMENT_TEAM" export WALLET_DEVELOPMENT_TEAM="$WALLET_DEVELOPMENT_TEAM"