Compare commits
No commits in common. "master" and "zoom_pic" have entirely different histories.
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"flutter": "3.32.0"
|
||||
}
|
||||
|
|
@ -5,11 +5,9 @@
|
|||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.build/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
.swiftpm/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
|
|
@ -44,6 +42,3 @@ app.*.map.json
|
|||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
||||
# FVM Version Cache
|
||||
.fvm/
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"dart.flutterSdkPath": ".fvm/versions/3.32.0"
|
||||
}
|
||||
|
|
@ -35,11 +35,6 @@ android {
|
|||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
coreLibraryDesugaringEnabled true
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
|
|
@ -85,14 +80,8 @@ android {
|
|||
shrinkResources false //删除无用资源
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
flutter {
|
||||
source = "../.."
|
||||
}
|
||||
|
||||
dependencies {
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' // 核心库反糖依赖
|
||||
}
|
||||
|
|
@ -4,7 +4,6 @@
|
|||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:enableOnBackInvokedCallback="true">
|
||||
<!-- windowTranslucentStatus 设置顶部状态栏使用-->
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
|
|
@ -13,7 +12,6 @@
|
|||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowTranslucentStatus="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
|
|
@ -40,7 +38,7 @@
|
|||
android:name="flutterEmbedding"
|
||||
android:value="2"/>
|
||||
<!-- Provider -->
|
||||
<!-- <provider
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.fileProvider"
|
||||
android:exported="false"
|
||||
|
|
@ -48,16 +46,6 @@
|
|||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/file_paths"/>
|
||||
</provider> -->
|
||||
<!-- ✅ FileProvider 配置 - 这是必需的! -->
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.fileprovider"
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true">
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/file_paths" />
|
||||
</provider>
|
||||
</application>
|
||||
<!-- 访问电话状态 -->
|
||||
|
|
@ -87,21 +75,25 @@
|
|||
<!-- 屏幕常亮权限 -->
|
||||
<uses-permission
|
||||
android:name="android.permission.WAKE_LOCK"/>
|
||||
<!-- <uses-permission
|
||||
android:name="android.permission.CAMERA"/> -->
|
||||
<uses-permission
|
||||
android:name="android.permission.CAMERA"/>
|
||||
<!-- Permissions options for the `access notification policy` group -->
|
||||
<uses-permission
|
||||
android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
|
||||
<!-- Permissions options for the `notification` group -->
|
||||
<uses-permission
|
||||
android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||
<!-- 注释掉文本处理权限,避免不必要的剪切板访问 -->
|
||||
<!-- <queries>
|
||||
<!-- Required to query activities that can process text, see:
|
||||
https://developer.android.com/training/package-visibility and
|
||||
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||
|
||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||
<queries>
|
||||
<intent>
|
||||
<action
|
||||
android:name="android.intent.action.PROCESS_TEXT"/>
|
||||
<data
|
||||
android:mimeType="text/plain"/>
|
||||
</intent>
|
||||
</queries> -->
|
||||
</queries>
|
||||
</manifest>
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 341 KiB After Width: | Height: | Size: 69 B |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 341 KiB After Width: | Height: | Size: 69 B |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 7.2 KiB |
|
|
@ -3,8 +3,8 @@
|
|||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
<item name="android:windowSplashScreenBackground">#FFFFFF</item>
|
||||
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@
|
|||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
<item name="android:windowSplashScreenBackground">#FFFFFF</item>
|
||||
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@
|
|||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
|
|
|
|||
|
|
@ -1,17 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- 外部存储 -->
|
||||
<external-path name="external_files" path="." />
|
||||
<!-- 应用内部存储 -->
|
||||
<files-path name="files" path="." />
|
||||
<!-- 缓存目录 -->
|
||||
<cache-path name="cache" path="." />
|
||||
<!-- 外部缓存 -->
|
||||
<external-cache-path name="external_cache" path="." />
|
||||
<!-- 下载目录 -->
|
||||
<external-path name="downloads" path="Download/" />
|
||||
|
||||
<!-- 如果你已有其他配置,请保留它们 -->
|
||||
<paths>
|
||||
<external-path path="Android/data/com.yuanxuan.making_school_asignment_app/" name="files_root" />
|
||||
<external-path path="." name="external_storage_root" />
|
||||
</paths>
|
||||
|
|
@ -30,8 +30,8 @@
|
|||
<!-- 屏幕常亮权限 -->
|
||||
<uses-permission
|
||||
android:name="android.permission.WAKE_LOCK"/>
|
||||
<!-- <uses-permission
|
||||
android:name="android.permission.CAMERA"/> -->
|
||||
<uses-permission
|
||||
android:name="android.permission.CAMERA"/>
|
||||
<!-- Permissions options for the `access notification policy` group -->
|
||||
<uses-permission
|
||||
android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
|
||||
|
|
|
|||
|
|
@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
|||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.10.2-all.zip
|
||||
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.6.3-all.zip
|
||||
|
|
@ -18,8 +18,8 @@ pluginManagement {
|
|||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "8.8.0" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
|
||||
id "com.android.application" version "7.3.0" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
type="application/octet-stream" />
|
||||
</item> -->
|
||||
<item>
|
||||
<title>Version 1.0.7+8</title>
|
||||
<title>Version 1.0.3+4</title>
|
||||
#发行说明-读取html方式(2选1)
|
||||
<!-- <sparkle:releaseNotesLink>
|
||||
https://your_domain/your_path/release_notes.html
|
||||
|
|
@ -39,15 +39,16 @@
|
|||
<![CDATA[
|
||||
<ul>
|
||||
<li>1、修复已知BUG</li>
|
||||
<li>2、添加缩放布局和批阅书写</li>
|
||||
<li>2、优化操作布局</li>
|
||||
</ul>
|
||||
]]>
|
||||
</description>
|
||||
<pubDate>Tue, 30 Sep 2025 14:09:13 +0800</pubDate>
|
||||
<pubDate>Fri, 14 Mar 2025 12:00:00 +0800</pubDate>
|
||||
#你更新程序的地址
|
||||
<enclosure url="https://dpc-job-oss.23544.com/infra-app/making_school_asignment_app/1.0.7/3/making_school_asignment_app-1.0.7+8-windows-setup.exe"
|
||||
sparkle:dsaSignature="MEUCIQCwWC4fKrn/dfdH6uzX4Sssv7G6XVgvwjQLklrTM6+cBQIgZDY4INHcwuxrsIREuPQeTvQL4j0mvF9qPQfppjRSgsg=" length="0"
|
||||
sparkle:version="1.0.7+8"
|
||||
<enclosure url="https://dpc-job-oss.23544.com/infra-app/making_school_asignment_app/1.0.3/3/making_school_asignment_app-1.0.3+4-windows-setup.exe"
|
||||
sparkle:dsaSignature="MEYCIQCuU0BodcdWrF+WoJrWRpY8P1pfK+dKkvrl3ZJ5KxnDdAIhAIWqp7VBNO9IaKFj2ypQ+s7DWurBUSaf6MTvexMmuvX+"
|
||||
length="0"
|
||||
sparkle:version="1.0.3+4"
|
||||
sparkle:os="windows"
|
||||
type="application/octet-stream" />
|
||||
</item>
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 296 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 278 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 301 KiB |
|
After Width: | Height: | Size: 292 KiB |
|
|
@ -1,109 +0,0 @@
|
|||
@echo off
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
|
||||
:: 设置 UTF-8 代码页以支持中文显示
|
||||
chcp 65001 > nul
|
||||
|
||||
:: 获取项目根目录
|
||||
for %%I in ("%~dp0.") do set "PROJECT_DIR=%%~fI"
|
||||
|
||||
:: 1. 强制终止所有Java进程(Gradle相关)
|
||||
echo Terminating processes...
|
||||
taskkill /f /im java.exe 2>nul
|
||||
taskkill /f /im gradlew.exe 2>nul
|
||||
timeout /t 2 /nobreak >nul
|
||||
|
||||
:: 修复后的Flutter构建脚本
|
||||
echo Running flutter clean...
|
||||
call flutter clean
|
||||
if !ERRORLEVEL! neq 0 (
|
||||
echo flutter clean failed with error: !ERRORLEVEL!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 3. 强制删除构建目录(带重试机制)
|
||||
echo Removing residual files
|
||||
call :ForceDelete "build"
|
||||
call :ForceDelete ".dart_tool"
|
||||
call :ForceDelete "pubspec.lock"
|
||||
|
||||
echo Running flutter pub get...
|
||||
call flutter pub get
|
||||
if !ERRORLEVEL! neq 0 (
|
||||
echo flutter pub get failed with error: !ERRORLEVEL!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo Running build_runner...
|
||||
call flutter packages pub run build_runner build --delete-conflicting-outputs
|
||||
if !ERRORLEVEL! neq 0 (
|
||||
echo build_runner failed with error: !ERRORLEVEL!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo Building release APK...
|
||||
call flutter build apk --release
|
||||
if !ERRORLEVEL! neq 0 (
|
||||
echo APK build failed with error: !ERRORLEVEL!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 新增:打开APK所在文件夹
|
||||
echo Opening APK directory
|
||||
if exist "build\app\outputs\flutter-apk\" (
|
||||
explorer "build\app\outputs\flutter-apk\"
|
||||
) else (
|
||||
echo APK directory does not exist
|
||||
)
|
||||
|
||||
echo.
|
||||
echo All steps completed successfully!
|
||||
echo APK file generated at: %PROJECT_DIR%\build\app\outputs\flutter-apk\
|
||||
echo.
|
||||
timeout /t 3 /nobreak >nul
|
||||
exit /b 0
|
||||
|
||||
:: 函数区 -------------------------------------------------
|
||||
:ForceDelete
|
||||
setlocal
|
||||
set "target=%~1"
|
||||
set "max_retries=3"
|
||||
set "retry_delay=1"
|
||||
|
||||
:: 检查目标是否存在
|
||||
if not exist "%target%" (
|
||||
endlocal
|
||||
goto :eof
|
||||
)
|
||||
|
||||
:: 尝试多次删除
|
||||
for /l %%i in (1,1,%max_retries%) do (
|
||||
echo Attempting to delete %target% (try %%i of %max_retries%)
|
||||
|
||||
:: 先尝试删除文件
|
||||
del /f /q /s "%target%\*" 2>nul
|
||||
:: 再尝试删除目录
|
||||
rmdir /s /q "%target%" 2>nul
|
||||
|
||||
:: 检查是否删除成功
|
||||
if not exist "%target%" (
|
||||
echo Successfully deleted %target%
|
||||
endlocal
|
||||
goto :eof
|
||||
)
|
||||
|
||||
:: 如果未成功,等待后重试
|
||||
if %%i lss %max_retries% (
|
||||
timeout /t %retry_delay% /nobreak >nul
|
||||
set /a retry_delay*=2 :: 指数退避策略
|
||||
)
|
||||
)
|
||||
|
||||
:: 如果所有尝试都失败
|
||||
echo Warning: Could not completely delete %target%, some files may be in use
|
||||
endlocal
|
||||
goto :eof
|
||||
|
|
@ -1,159 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
# Ensure UTF-8 locale for macOS terminals
|
||||
export LANG=en_US.UTF-8
|
||||
export LC_ALL=en_US.UTF-8
|
||||
|
||||
# Resolve project directory (script location)
|
||||
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
echo "Project dir: $PROJECT_DIR"
|
||||
|
||||
# To save credentials in macOS Keychain for non-interactive uploads, run:
|
||||
# security add-generic-password -s "TransporterCredentials" -w "you@example.com:app-specific-password" -a transporter -U
|
||||
# The script will read that item and expect the stored password string in the form: "APPLE_ID:APPLE_PASSWORD"
|
||||
|
||||
force_delete() {
|
||||
local target="$1"
|
||||
local max_retries=3
|
||||
local retry_delay=1
|
||||
|
||||
if [ ! -e "$PROJECT_DIR/$target" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
for i in $(seq 1 $max_retries); do
|
||||
echo "Attempting to delete $target (try $i of $max_retries)"
|
||||
rm -rf "$PROJECT_DIR/$target" 2>/dev/null || true
|
||||
if [ ! -e "$PROJECT_DIR/$target" ]; then
|
||||
echo "Successfully deleted $target"
|
||||
return 0
|
||||
fi
|
||||
if [ "$i" -lt "$max_retries" ]; then
|
||||
sleep $retry_delay
|
||||
retry_delay=$((retry_delay * 2))
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Warning: Could not completely delete $target, some files may be in use"
|
||||
return 1
|
||||
}
|
||||
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
echo "Running flutter clean..."
|
||||
if ! flutter clean; then
|
||||
echo "flutter clean failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Removing residual files"
|
||||
force_delete build || true
|
||||
force_delete .dart_tool || true
|
||||
force_delete pubspec.lock || true
|
||||
|
||||
echo "Running flutter pub get..."
|
||||
if ! flutter pub get; then
|
||||
echo "flutter pub get failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Running build_runner (if present)..."
|
||||
if ! flutter packages pub run build_runner build --delete-conflicting-outputs; then
|
||||
echo "build_runner failed or not present — continuing"
|
||||
fi
|
||||
|
||||
echo "Building iOS IPA (verbose)..."
|
||||
if ! flutter build ipa --release --verbose; then
|
||||
echo "IPA build failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Try to find the generated .ipa (searching under build/)
|
||||
IPA_PATH="$(find "$PROJECT_DIR/build" -type f -name '*.ipa' -print -quit || true)"
|
||||
if [ -z "$IPA_PATH" ]; then
|
||||
echo "No .ipa found in build output"
|
||||
echo "Build finished but no IPA to upload. Exiting."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found IPA: $IPA_PATH"
|
||||
|
||||
# Upload via Transporter (if installed). Prefer environment vars APPLE_ID and APPLE_PASSWORD (app-specific password).
|
||||
ITMS_TRANSPORTER="/Applications/Transporter.app/Contents/itms/bin/iTMSTransporter"
|
||||
if [ -x "$ITMS_TRANSPORTER" ]; then
|
||||
echo "Using Transporter at $ITMS_TRANSPORTER"
|
||||
|
||||
# Read credentials from env, then try macOS Keychain, otherwise prompt
|
||||
if [ -z "${APPLE_ID:-}" ] || [ -z "${APPLE_PASSWORD:-}" ]; then
|
||||
# Try to read combined credentials from Keychain (service: TransporterCredentials)
|
||||
if command -v security >/dev/null 2>&1; then
|
||||
KC_PAIR="$(security find-generic-password -s "TransporterCredentials" -w 2>/dev/null || true)"
|
||||
if [ -n "$KC_PAIR" ]; then
|
||||
# Expect stored value in form: appleid:app-specific-password
|
||||
APPLE_ID="${KC_PAIR%%:*}"
|
||||
APPLE_PASSWORD="${KC_PAIR#*:}"
|
||||
if [ -n "${APPLE_ID}" ] && [ -n "${APPLE_PASSWORD}" ]; then
|
||||
echo "Credentials loaded from Keychain (service: TransporterCredentials)."
|
||||
else
|
||||
# clear if parsing failed
|
||||
APPLE_ID=""
|
||||
APPLE_PASSWORD=""
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "${APPLE_ID:-}" ] || [ -z "${APPLE_PASSWORD:-}" ]; then
|
||||
echo "Provide App Store Connect credentials for upload. You can set APPLE_ID and APPLE_PASSWORD (app-specific password) in the environment or save a keychain item named 'TransporterCredentials' to avoid prompts."
|
||||
read -p "Apple ID (email): " APPLE_ID
|
||||
read -s -p "App-specific password (will not echo): " APPLE_PASSWORD
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Uploading $IPA_PATH to App Store Connect (this may take a while)..."
|
||||
# Try transporter with a small retry loop
|
||||
UPLOAD_EXIT=0
|
||||
MAX_UPLOAD_TRIES=2
|
||||
for try in $(seq 1 $MAX_UPLOAD_TRIES); do
|
||||
echo "Transporter upload attempt $try of $MAX_UPLOAD_TRIES..."
|
||||
if "$ITMS_TRANSPORTER" -m upload -u "$APPLE_ID" -p "$APPLE_PASSWORD" -f "$IPA_PATH"; then
|
||||
echo "Upload succeeded"
|
||||
UPLOAD_EXIT=0
|
||||
break
|
||||
else
|
||||
UPLOAD_EXIT=$?
|
||||
echo "Transporter upload attempt $try failed (exit $UPLOAD_EXIT)"
|
||||
# small delay before retry
|
||||
sleep $((try * 2))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $UPLOAD_EXIT -ne 0 ]; then
|
||||
echo "Transporter upload failed after $MAX_UPLOAD_TRIES attempts (exit $UPLOAD_EXIT)."
|
||||
echo "Opening Transporter app so you can upload the IPA manually..."
|
||||
# Try to open Transporter GUI with the IPA as argument (may import the file)
|
||||
if command -v open >/dev/null 2>&1; then
|
||||
if open -a Transporter "$IPA_PATH" 2>/dev/null; then
|
||||
echo "Transporter app opened. Please complete the upload there."
|
||||
else
|
||||
echo "Failed to open Transporter with the IPA. Opening Transporter app without file..."
|
||||
open -a Transporter || true
|
||||
echo "Transporter opened. Please drag the IPA ($IPA_PATH) into the app to upload."
|
||||
fi
|
||||
else
|
||||
echo "Cannot open Transporter GUI: 'open' command not found. Please upload IPA manually: $IPA_PATH"
|
||||
fi
|
||||
# Do not exit with error here so the script can finish and user can manually complete upload
|
||||
fi
|
||||
else
|
||||
echo "Transporter not found at $ITMS_TRANSPORTER. Please install Transporter app from the Mac App Store or upload the IPA manually."
|
||||
echo "IPA path: $IPA_PATH"
|
||||
fi
|
||||
|
||||
echo "All steps completed successfully!"
|
||||
echo "IPA: $IPA_PATH"
|
||||
|
||||
exit 0
|
||||
|
|
@ -5,15 +5,12 @@ flutter_native_splash:
|
|||
# 如需恢复默认的白屏,执行如下命令
|
||||
# flutter pub run flutter_native_splash:remove
|
||||
# 设置闪屏页的默认态logo或背景图片路径
|
||||
background_image: assets/images/splash_native.png
|
||||
|
||||
# 全屏模式
|
||||
fullscreen: true
|
||||
|
||||
color: "#FFFFFF"
|
||||
image_ios: assets/images/splash_native.png
|
||||
background_image_android: assets/images/splash_native.png
|
||||
android_12:
|
||||
color: "#FFFFFF"
|
||||
image: assets/images/logo_splash.png
|
||||
image: assets/images/splash2.png
|
||||
android: true
|
||||
ios: true
|
||||
# android_gravity: clip_vertical
|
||||
# ios_content_mode: scaleToFill
|
||||
android_gravity: fill
|
||||
ios_content_mode: scaleToFill
|
||||
|
|
@ -21,6 +21,6 @@
|
|||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>13.0</string>
|
||||
<string>12.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# Uncomment this line to define a global platform for your project
|
||||
# platform :ios, '13.0'
|
||||
# platform :ios, '12.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
|
|
|||
|
|
@ -477,10 +477,9 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
|
|
@ -496,7 +495,7 @@
|
|||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
CURRENT_PROJECT_VERSION = 6;
|
||||
DEVELOPMENT_TEAM = Z778GC45N8;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
|
|
@ -504,7 +503,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)";
|
||||
MARKETING_VERSION = 3;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.yuanxuan.makingS--buneng--choolAsignmentApp";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
|
@ -525,7 +524,7 @@
|
|||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp.RunnerTests;
|
||||
|
|
@ -543,7 +542,7 @@
|
|||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = Z778GC45N8;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
|
|
@ -560,7 +559,7 @@
|
|||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp.RunnerTests;
|
||||
|
|
@ -620,11 +619,10 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
|
|
@ -673,10 +671,9 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
|
|
@ -692,7 +689,7 @@
|
|||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
CURRENT_PROJECT_VERSION = 6;
|
||||
DEVELOPMENT_TEAM = Z778GC45N8;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
|
|
@ -700,7 +697,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)";
|
||||
MARKETING_VERSION = 3;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
|
|
@ -722,7 +719,7 @@
|
|||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
CURRENT_PROJECT_VERSION = 6;
|
||||
DEVELOPMENT_TEAM = Z778GC45N8;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
|
|
@ -730,7 +727,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)";
|
||||
MARKETING_VERSION = 3;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
|
|
@ -55,13 +54,11 @@
|
|||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
enableGPUValidationMode = "1"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import Flutter
|
||||
import UIKit
|
||||
|
||||
@main
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
|
|
|
|||
|
|
@ -1,158 +1,122 @@
|
|||
{
|
||||
"images": [
|
||||
{
|
||||
"size": "20x20",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-20@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "20x20",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-20@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size": "29x29",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-29.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "29x29",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-29@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "29x29",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-29@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size": "40x40",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-40@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "40x40",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-40@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size": "57x57",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-57.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "57x57",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-57@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "60x60",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-60@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "60x60",
|
||||
"idiom": "iphone",
|
||||
"filename": "icon-60@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size": "20x20",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-20-ipad.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "20x20",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-20@2x-ipad.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "29x29",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-29-ipad.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "29x29",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-29@2x-ipad.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "40x40",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-40.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "40x40",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-40@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "50x50",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-50.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "50x50",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-50@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "72x72",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-72.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "72x72",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-72@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "76x76",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-76.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "76x76",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-76@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "83.5x83.5",
|
||||
"idiom": "ipad",
|
||||
"filename": "icon-83.5@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "1024x1024",
|
||||
"idiom": "ios-marketing",
|
||||
"filename": "icon-1024.png",
|
||||
"scale": "1x"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"version": 1,
|
||||
"author": "icon.wuruihong.com"
|
||||
"images": [
|
||||
{
|
||||
"filename": "Icon-App-20x20@2x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "2x",
|
||||
"size": "20x20"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-20x20@3x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "3x",
|
||||
"size": "20x20"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-29x29@1x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "1x",
|
||||
"size": "29x29"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-29x29@2x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "2x",
|
||||
"size": "29x29"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-29x29@3x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "3x",
|
||||
"size": "29x29"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-40x40@2x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "2x",
|
||||
"size": "40x40"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-40x40@3x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "3x",
|
||||
"size": "40x40"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-60x60@2x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "2x",
|
||||
"size": "60x60"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-60x60@3x.png",
|
||||
"idiom": "iphone",
|
||||
"scale": "3x",
|
||||
"size": "60x60"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-20x20@1x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "1x",
|
||||
"size": "20x20"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-20x20@2x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "2x",
|
||||
"size": "20x20"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-29x29@1x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "1x",
|
||||
"size": "29x29"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-29x29@2x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "2x",
|
||||
"size": "29x29"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-40x40@1x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "1x",
|
||||
"size": "40x40"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-40x40@2x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "2x",
|
||||
"size": "40x40"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-76x76@1x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "1x",
|
||||
"size": "76x76"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-76x76@2x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "2x",
|
||||
"size": "76x76"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-83.5x83.5@2x.png",
|
||||
"idiom": "ipad",
|
||||
"scale": "2x",
|
||||
"size": "83.5x83.5"
|
||||
},
|
||||
{
|
||||
"filename": "Icon-App-1024x1024@1x.png",
|
||||
"idiom": "ios-marketing",
|
||||
"scale": "1x",
|
||||
"size": "1024x1024"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "icons_launcher",
|
||||
"version": 1
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 635 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 961 B |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 981 B |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |