Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/build_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@ jobs:
- name: run tests
run: bundle exec fastlane tests

# taking the pictures is a quarter hour of simulators and belongs to the
# release, but a screenshot target that no longer compiles should not wait
# for one to say so
- name: build the screenshot tests
run: >
xcodebuild build-for-testing
-project OpenDocumentReader.xcodeproj
-scheme "ODR Screenshots"
-destination 'generic/platform=iOS Simulator'

- uses: actions/upload-artifact@v7
if: always()
with:
Expand Down
47 changes: 46 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,44 @@ jobs:
build/*.app.dSYM.zip
if-no-files-found: warn

# Beside the build rather than behind it: it signs nothing and uploads nothing,
# it just drives simulators, and it takes about as long. On a dry run too -
# the artifact is the only way to look at the pictures before the store does.
screenshots:
runs-on: macos-26
steps:
- name: checkout
uses: actions/checkout@v7

- uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ env.xcode_version }}

# the lane checks the set it produced, so a language that came out short
# fails here rather than half way up to App Store Connect
- name: photograph both devices in every locale
run: bundle exec fastlane ios screenshots

- name: archive the screenshots
uses: actions/upload-artifact@v7
with:
name: screenshots
path: fastlane/screenshots
if-no-files-found: error
# png, so there is nothing left to squeeze out of them
compression-level: 0

- uses: actions/upload-artifact@v7
if: failure()
with:
name: screenshot-log
path: ~/Library/Logs/snapshot
if-no-files-found: warn

# a job per app, fail-fast off, so "Re-run failed jobs" can retry one half
upload:
needs: build
Expand Down Expand Up @@ -219,7 +257,7 @@ jobs:
# while a build cannot be uploaded twice. No macOS runner: this touches the
# listing, not the app
listing:
needs: upload
needs: [upload, screenshots]
if: ${{ !inputs.dry_run }}
runs-on: ubuntu-24.04
strategy:
Expand All @@ -244,6 +282,13 @@ jobs:
given: ${{ inputs.version }}
run: .github/scripts/resolve-version.py --input "$given" --dry-run "$dry_run"

# where the lane looks for them, and the same set both apps are given
- name: fetch the screenshots
uses: actions/download-artifact@v8
with:
name: screenshots
path: fastlane/screenshots

- name: write ${{ matrix.app }}'s listing
env:
ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }}
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ Carthage/Build
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/screenshots/screenshots.html
fastlane/test_output

.DS_Store
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ once the version tag exists.
the bar ends the edit and shows what was written; a save that failed stays in
it. Saving has left the menu; discarding is still there and now leaves edit
mode.
- The App Store screenshots are taken by the release run, from the build going
out, instead of being made by hand: four per device on a 6.9" iPhone and a
13" iPad, in every locale the app is translated into, of documents written
for the purpose in that language. `-ODRScreenshot` puts a Debug build on one
screen, so nothing has to be tapped to get there.

### Fixed

Expand Down
117 changes: 117 additions & 0 deletions OpenDocumentReader.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
A11E00000000000000000037 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E2F7ED47220B54D600D63515 /* Project object */;
proxyType = 1;
remoteGlobalIDString = E2F7ED4E220B54D600D63515;
remoteInfo = OpenDocumentReader;
};
E22B25312557F0E2001D0C52 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E2F7ED47220B54D600D63515 /* Project object */;
Expand All @@ -49,6 +56,7 @@
A11E00000000000000000013 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
A11E00000000000000000014 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A11E00000000000000000015 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
A11E00000000000000000038 /* OpenDocumentReaderUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OpenDocumentReaderUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
E1EB6C492C1A510D003EC5A0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
E237952F2274844400BA7238 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
E26C39382250DC6E009C484A /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
Expand Down Expand Up @@ -77,9 +85,21 @@
path = OpenDocumentReaderTests;
sourceTree = "<group>";
};
A11E00000000000000000030 /* OpenDocumentReaderUITests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = OpenDocumentReaderUITests;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */

/* Begin PBXFrameworksBuildPhase section */
A11E00000000000000000034 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
A11E00000000000000000003 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
Expand Down Expand Up @@ -171,10 +191,12 @@
A11E00000000000000000009 /* Ads */,
A11E0000000000000000000A /* NoAds */,
A11E00000000000000000022 /* OpenDocumentReaderTests */,
A11E00000000000000000030 /* OpenDocumentReaderUITests */,
E2BB4B64220EF4F20056176B /* Frameworks */,
52A348B12A9262D100DACAB9 /* OpenDocumentReader.app */,
A11E00000000000000000008 /* OpenDocumentReader Lite.app */,
52A348B22A9262D100DACAB9 /* OpenDocumentReaderTests.xctest */,
A11E00000000000000000038 /* OpenDocumentReaderUITests.xctest */,
);
sourceTree = "<group>";
};
Expand Down Expand Up @@ -228,6 +250,27 @@
productReference = 52A348B22A9262D100DACAB9 /* OpenDocumentReaderTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
A11E00000000000000000031 /* OpenDocumentReaderUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = A11E00000000000000000032 /* Build configuration list for PBXNativeTarget "OpenDocumentReaderUITests" */;
buildPhases = (
A11E00000000000000000033 /* Sources */,
A11E00000000000000000034 /* Frameworks */,
A11E00000000000000000035 /* Resources */,
);
buildRules = (
);
dependencies = (
A11E00000000000000000036 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
A11E00000000000000000030 /* OpenDocumentReaderUITests */,
);
name = OpenDocumentReaderUITests;
productName = OpenDocumentReaderUITests;
productReference = A11E00000000000000000038 /* OpenDocumentReaderUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
E2F7ED4E220B54D600D63515 /* OpenDocumentReader */ = {
isa = PBXNativeTarget;
buildConfigurationList = E2F7ED65220B54D700D63515 /* Build configuration list for PBXNativeTarget "OpenDocumentReader" */;
Expand Down Expand Up @@ -266,6 +309,10 @@
A11E00000000000000000001 = {
CreatedOnToolsVersion = 26.0;
};
A11E00000000000000000031 = {
CreatedOnToolsVersion = 26.0;
TestTargetID = E2F7ED4E220B54D600D63515;
};
E22B252B2557F0E2001D0C52 = {
CreatedOnToolsVersion = 12.0;
TestTargetID = E2F7ED4E220B54D600D63515;
Expand Down Expand Up @@ -313,6 +360,7 @@
E2F7ED4E220B54D600D63515 /* OpenDocumentReader */,
A11E00000000000000000001 /* OpenDocumentReader Lite */,
E22B252B2557F0E2001D0C52 /* OpenDocumentReaderTests */,
A11E00000000000000000031 /* OpenDocumentReaderUITests */,
);
};
/* End PBXProject section */
Expand All @@ -333,6 +381,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
A11E00000000000000000035 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E2F7ED4D220B54D600D63515 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
Expand All @@ -358,6 +413,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
A11E00000000000000000033 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
E2F7ED4B220B54D600D63515 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
Expand All @@ -368,6 +430,11 @@
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
A11E00000000000000000036 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = E2F7ED4E220B54D600D63515 /* OpenDocumentReader */;
targetProxy = A11E00000000000000000037 /* PBXContainerItemProxy */;
};
E22B25322557F0E2001D0C52 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = E2F7ED4E220B54D600D63515 /* OpenDocumentReader */;
Expand Down Expand Up @@ -423,6 +490,7 @@
ENABLE_BITCODE = NO;
ENABLE_MODULE_VERIFIER = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_SOURCE_FILE_NAMES = "sample-*";
INFOPLIST_FILE = configs/lite/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "OpenDocument Reader";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
Expand All @@ -441,6 +509,45 @@
};
name = Release;
};
A11E00000000000000000039 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = app.opendocument.OpenDocumentReaderUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = OpenDocumentReader;
};
name = Debug;
};
A11E0000000000000000003A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = app.opendocument.OpenDocumentReaderUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = OpenDocumentReader;
};
name = Release;
};
E22B25342557F0E2001D0C52 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
Expand Down Expand Up @@ -648,6 +755,7 @@
ENABLE_BITCODE = NO;
ENABLE_MODULE_VERIFIER = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_SOURCE_FILE_NAMES = "sample-*";
INFOPLIST_FILE = configs/full/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "OpenDocument Reader";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
Expand All @@ -669,6 +777,15 @@
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
A11E00000000000000000032 /* Build configuration list for PBXNativeTarget "OpenDocumentReaderUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
A11E00000000000000000039 /* Debug */,
A11E0000000000000000003A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
A11E00000000000000000005 /* Build configuration list for PBXNativeTarget "OpenDocumentReader Lite" */ = {
isa = XCConfigurationList;
buildConfigurations = (
Expand Down
Loading