Skip to content
Merged
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ __pycache__/
*.py[cod]
xcuserdata/
*.xcuserstate
ios/build/

# Release archives are published separately.
dist/*.zip
Expand Down
8 changes: 6 additions & 2 deletions RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ python3 -m unittest discover -s tests -p "test_*.py"
Run the unsigned iOS build from `ios/`:

```bash
xcodebuild \
python3 ../scripts/validate_ios_release.py
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild \
-project SourceBraid.xcodeproj \
-scheme SourceBraid \
-sdk iphonesimulator \
Expand Down Expand Up @@ -103,7 +104,10 @@ Local repository installations can continue to use the complete plugin source.
Confirm that the SourceBraid bundle identifiers, App Group, and Keychain access
group are registered for the selected Apple Developer team before enabling
signing. First validate the unsigned simulator build above. Then use the archive
and export commands in [`ios/README.md`](ios/README.md).
and export commands in [`ios/README.md`](ios/README.md). Validate the archived
`.app` with `scripts/validate_ios_release.py --app-bundle PATH` before uploading
it. This catches stale icons and mismatched app/extension versions in the actual
package rather than only checking the Xcode sources.

Signing and App Store upload credentials are not part of this repository. Never
commit provisioning profiles, certificates, export credentials, review tokens,
Expand Down
29 changes: 24 additions & 5 deletions ios/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,22 @@ The fine-grained GitHub token needs `Contents: Read and write` for the private S
## TestFlight

The project uses automatic distribution signing for Apple Developer team
`H76K2HQUFB`. Before each upload, increment `CURRENT_PROJECT_VERSION` for both
the app and Share Extension. Then archive and upload from Xcode's Organizer, or
run:
`H76K2HQUFB`. The first App Store candidate is version `1.0.0` (build `6`) for
both the app and Share Extension and contains the refreshed SourceBraid app
icon. Before every later upload, increment `CURRENT_PROJECT_VERSION` for both
targets.

Run the release preflight from the repository root before archiving:

```bash
xcodebuild \
python3 scripts/validate_ios_release.py
```

Use a stable Xcode release accepted by App Store Connect. If `xcode-select`
currently points at a beta, select the stable installation for each command:

```bash
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild \
-project SourceBraid.xcodeproj \
-scheme SourceBraid \
-configuration Release \
Expand All @@ -31,7 +41,7 @@ xcodebuild \
-allowProvisioningUpdates \
archive

xcodebuild \
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild \
-exportArchive \
-archivePath build/SourceBraid.xcarchive \
-exportOptionsPlist ExportOptions.plist \
Expand All @@ -42,6 +52,15 @@ The export options upload the archive directly to App Store Connect. Create the
initial app record with bundle ID `de.patrickschiller.sourcebraid` and the
customer-facing name **SourceBraid** before the first upload.

After archiving and before uploading, validate the exact packaged app, including
its generated icon references, embedded Share Extension, privacy manifests,
bundle identifiers, version, and build number:

```bash
python3 ../scripts/validate_ios_release.py \
--app-bundle build/SourceBraid.xcarchive/Products/Applications/SourceBraid.app
```

## Use

In FAZ, Safari, Files, or another app:
Expand Down
16 changes: 8 additions & 8 deletions ios/SourceBraid.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = SourceBraid/Resources/SourceBraid.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 5;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = H76K2HQUFB;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = NO;
Expand All @@ -461,7 +461,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.2.0;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
Expand All @@ -480,7 +480,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = SourceBraid/Resources/SourceBraid.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 5;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = H76K2HQUFB;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = SourceBraid/Resources/Info.plist;
Expand All @@ -489,7 +489,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.2.0;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
Expand All @@ -507,15 +507,15 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CODE_SIGN_ENTITLEMENTS = SourceBraidShare/SourceBraidShare.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 5;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = H76K2HQUFB;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = SourceBraidShare/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.2.0;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid.share;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
Expand All @@ -534,15 +534,15 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CODE_SIGN_ENTITLEMENTS = SourceBraidShare/SourceBraidShare.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 5;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = H76K2HQUFB;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = SourceBraidShare/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 0.2.0;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = de.patrickschiller.sourcebraid.share;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
Expand Down
51 changes: 50 additions & 1 deletion ios/SourceBraid/Resources/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,56 @@
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeOtherUserContent</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeBrowsingHistory</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeOtherDataTypes</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
Expand Down
51 changes: 50 additions & 1 deletion ios/SourceBraidShare/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,56 @@
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeOtherUserContent</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeBrowsingHistory</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeOtherDataTypes</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
Expand Down
Loading