Skip to content

Commit 1aeeb21

Browse files
authored
Add post-processing for .xcprivacy and dSYM files (#51)
Adds post-processing of .xcprivacy and dSYM files that can be included in a support package to support cryptography declarations and debugging requirements of recent Xcode versions.
1 parent 3af4857 commit 1aeeb21

File tree

3 files changed

+6
-3
lines changed

3 files changed

+6
-3
lines changed

cookiecutter.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"build": "1",
1414
"python_version": "3.X.0",
1515
"min_os_version": "13.0",
16+
"uses_non_exempt_encryption": false,
1617
"_copy_without_render": [
1718
".gitignore",
1819
"*.png"

{{ cookiecutter.format }}/{{ cookiecutter.class_name }}/{{ cookiecutter.class_name }}-Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
<string>????</string>
2323
<key>CFBundleVersion</key>
2424
<string>{{ cookiecutter.build }}</string>
25+
<key>ITSAppUsesNonExemptEncryption</key>
26+
{{ cookiecutter.uses_non_exempt_encryption|plist_value }}
2527
<key>LSRequiresIPhoneOS</key>
2628
<true/>
2729
<key>UIRequiresFullScreen</key>

{{ cookiecutter.format }}/{{ cookiecutter.formal_name }}.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@
162162
isa = PBXProject;
163163
attributes = {
164164
BuildIndependentTargetsInParallel = YES;
165-
LastUpgradeCheck = 1540;
165+
LastUpgradeCheck = 1630;
166166
ORGANIZATIONNAME = "Russell Keith-Magee";
167167
};
168168
buildConfigurationList = 60796EDD19190F4100A9926B /* Build configuration list for PBXProject "{{ cookiecutter.formal_name }}" */;
@@ -216,7 +216,7 @@
216216
);
217217
runOnlyForDeploymentPostprocessing = 0;
218218
shellPath = /bin/sh;
219-
shellScript = "set -e\n\ninstall_dylib () {\n INSTALL_BASE=$1\n FULL_EXT=$2\n\n # The name of the extension file\n EXT=$(basename \"$FULL_EXT\")\n # The location of the extension file, relative to the bundle\n RELATIVE_EXT=${FULL_EXT#$CODESIGNING_FOLDER_PATH/} \n # The path to the extension file, relative to the install base\n PYTHON_EXT=${RELATIVE_EXT/$INSTALL_BASE/}\n # The full dotted name of the extension module, constructed from the file path.\n FULL_MODULE_NAME=$(echo $PYTHON_EXT | cut -d \".\" -f 1 | tr \"/\" \".\"); \n # A bundle identifier; not actually used, but required by Xcode framework packaging\n FRAMEWORK_BUNDLE_ID=$(echo $PRODUCT_BUNDLE_IDENTIFIER.$FULL_MODULE_NAME | tr \"_\" \"-\")\n # The name of the framework folder.\n FRAMEWORK_FOLDER=\"Frameworks/$FULL_MODULE_NAME.framework\"\n\n # If the framework folder doesn't exist, create it.\n if [ ! -d \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\" ]; then\n echo \"Creating framework for $RELATIVE_EXT\" \n mkdir -p \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\"\n\n cp \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleExecutable -string \"$FULL_MODULE_NAME\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleIdentifier -string \"$FRAMEWORK_BUNDLE_ID\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n fi\n \n echo \"Installing binary for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" \n mv \"$FULL_EXT\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n # Create a placeholder .fwork file where the .so was\n echo \"$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" > ${FULL_EXT%.so}.fwork\n # Create a back reference to the .so file location in the framework\n echo \"${RELATIVE_EXT%.so}.fwork\" > \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME.origin\" \n}\n\necho \"Install standard library extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/python/lib/python{{ cookiecutter.python_version|py_tag }}/lib-dynload\" -name \"*.so\" | while read FULL_EXT; do\n install_dylib python/lib/python{{ cookiecutter.python_version|py_tag }}/lib-dynload/ \"$FULL_EXT\"\ndone\necho \"Install app package extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app_packages\" -name \"*.so\" | while read FULL_EXT; do\n install_dylib app_packages/ \"$FULL_EXT\"\ndone\necho \"Install app extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app\" -name \"*.so\" | while read FULL_EXT; do\n install_dylib app/ \"$FULL_EXT\"\ndone\n\n# Clean up dylib template \nrm -f \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\"\n\necho \"Signing frameworks as $EXPANDED_CODE_SIGN_IDENTITY_NAME ($EXPANDED_CODE_SIGN_IDENTITY)...\"\nfind \"$CODESIGNING_FOLDER_PATH/Frameworks\" -name \"*.framework\" -exec /usr/bin/codesign --force --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" ${OTHER_CODE_SIGN_FLAGS:-} -o runtime --timestamp=none --preserve-metadata=identifier,entitlements,flags --generate-entitlement-der \"{}\" \\; \n";
219+
shellScript = "set -e\n\ninstall_dylib () {\n INSTALL_BASE=$1\n FULL_EXT=$2\n\n # The name of the extension file\n EXT=$(basename \"$FULL_EXT\")\n # The name and location of the module\n MODULE_PATH=$(dirname \"$FULL_EXT\") \n MODULE_NAME=$(echo $EXT | cut -d \".\" -f 1) \n # The location of the extension file, relative to the bundle\n RELATIVE_EXT=${FULL_EXT#$CODESIGNING_FOLDER_PATH/} \n # The path to the extension file, relative to the install base\n PYTHON_EXT=${RELATIVE_EXT/$INSTALL_BASE/}\n # The full dotted name of the extension module, constructed from the file path.\n FULL_MODULE_NAME=$(echo $PYTHON_EXT | cut -d \".\" -f 1 | tr \"/\" \".\"); \n # A bundle identifier; not actually used, but required by Xcode framework packaging\n FRAMEWORK_BUNDLE_ID=$(echo $PRODUCT_BUNDLE_IDENTIFIER.$FULL_MODULE_NAME | tr \"_\" \"-\")\n # The name of the framework folder.\n FRAMEWORK_FOLDER=\"Frameworks/$FULL_MODULE_NAME.framework\"\n\n # If the framework folder doesn't exist, create it.\n if [ ! -d \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\" ]; then\n echo \"Creating framework for $RELATIVE_EXT\" \n mkdir -p \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER\"\n\n cp \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleExecutable -string \"$FULL_MODULE_NAME\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n plutil -replace CFBundleIdentifier -string \"$FRAMEWORK_BUNDLE_ID\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist\"\n fi\n \n echo \"Installing binary for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" \n mv \"$FULL_EXT\" \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n if [ -e \"$MODULE_PATH/$MODULE_NAME.xcprivacy\" ];then \n echo \"Installing XCPrivacy file for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n XCPRIVACY_FILE=\"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/PrivacyInfo.xcprivacy\"\n if [ -e \"$XCPRIVACY_FILE\" ]; then\n rm -rf \"$XCPRIVACY_FILE\"\n fi\n mv \"$MODULE_PATH/$MODULE_NAME.xcprivacy\" \"$XCPRIVACY_FILE\"\n fi\n if [ -e \"$FULL_EXT.dSYM\" ];then \n echo \"Installing dSYM file for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME\"\n DSYM_FILE=\"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM\"\n if [ -e \"$DSYM_FILE\" ]; then\n rm -rf \"$DSYM_FILE\"\n fi\n mv \"$FULL_EXT.dSYM\" \"$DSYM_FILE\"\n plutil -replace CFBundleIdentifier -string \"$FRAMEWORK_BUNDLE_ID\" \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Info.plist\"\n mv \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Resources/DWARF/$EXT\" \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Resources/DWARF/$FULL_MODULE_NAME\"\n find \"$BUILT_PRODUCTS_DIR/$FULL_MODULE_NAME.dSYM/Contents/Resources\" -name \"$EXT.*\" | while read YML; do\n mv \"$YML\" \"$(dirname \"$YML\")/$FULL_MODULE_NAME.yml\"\n done\n fi\n # Create a placeholder .fwork file where the .so was\n echo \"$FRAMEWORK_FOLDER/$FULL_MODULE_NAME\" > ${FULL_EXT%.so}.fwork\n # Create a back reference to the .so file location in the framework\n echo \"${RELATIVE_EXT%.so}.fwork\" > \"$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME.origin\" \n}\n\necho \"Install standard library extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/python/lib/python{{ cookiecutter.python_version|py_tag }}/lib-dynload\" -name \"*.so\" -not -path \"*/*.so.dSYM/*\" | while read FULL_EXT; do\n install_dylib python/lib/python{{ cookiecutter.python_version|py_tag }}/lib-dynload/ \"$FULL_EXT\"\ndone\necho \"Install app package extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app_packages\" -name \"*.so\" -not -path \"*/*.so.dSYM/*\" | while read FULL_EXT; do\n install_dylib app_packages/ \"$FULL_EXT\"\ndone\necho \"Install app extension modules...\"\nfind \"$CODESIGNING_FOLDER_PATH/app\" -name \"*.so\" -not -path \"*/*.so.dSYM/*\" | while read FULL_EXT; do\n install_dylib app/ \"$FULL_EXT\"\ndone\n\n# Clean up dylib template \nrm -f \"$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist\"\n\necho \"Signing frameworks as $EXPANDED_CODE_SIGN_IDENTITY_NAME ($EXPANDED_CODE_SIGN_IDENTITY)...\"\nfind \"$CODESIGNING_FOLDER_PATH/Frameworks\" -name \"*.framework\" -exec /usr/bin/codesign --force --sign \"$EXPANDED_CODE_SIGN_IDENTITY\" ${OTHER_CODE_SIGN_FLAGS:-} -o runtime --timestamp=none --preserve-metadata=identifier,entitlements,flags --generate-entitlement-der \"{}\" \\; \n";
220220
};
221221
609384A628B5B958005B2A5D /* Install target specific Python modules */ = {
222222
isa = PBXShellScriptBuildPhase;
@@ -235,7 +235,7 @@
235235
);
236236
runOnlyForDeploymentPostprocessing = 0;
237237
shellPath = /bin/sh;
238-
shellScript = "set -e\n\nmkdir -p \"$CODESIGNING_FOLDER_PATH/python/lib\"\nif [ \"$EFFECTIVE_PLATFORM_NAME\" = \"-iphonesimulator\" ]; then\n echo \"Installing Python modules for iOS Simulator\"\n rsync -au --delete \"$PROJECT_DIR/Support/Python.xcframework/ios-arm64_x86_64-simulator/lib/\" \"$CODESIGNING_FOLDER_PATH/python/lib/\" \n rsync -au --delete \"$PROJECT_DIR/{{ cookiecutter.class_name }}/app_packages.iphonesimulator/\" \"$CODESIGNING_FOLDER_PATH/app_packages\" \nelse\n echo \"Installing Python modules for iOS Device\"\n rsync -au --delete \"$PROJECT_DIR/Support/Python.xcframework/ios-arm64/lib/\" \"$CODESIGNING_FOLDER_PATH/python/lib\" \n rsync -au --delete \"$PROJECT_DIR/{{ cookiecutter.class_name }}/app_packages.iphoneos/\" \"$CODESIGNING_FOLDER_PATH/app_packages\" \nfi\n";
238+
shellScript = "set -e\n\nmkdir -p \"$CODESIGNING_FOLDER_PATH/python/lib\"\nif [ \"$EFFECTIVE_PLATFORM_NAME\" = \"-iphonesimulator\" ]; then\n echo \"Installing Python modules for iOS Simulator\"\n PYTHON_SLICE=\"$PROJECT_DIR/Support/Python.xcframework/ios-arm64_x86_64-simulator\"\n PACKAGES_PATH=\"$PROJECT_DIR/{{ cookiecutter.class_name }}/app_packages.iphonesimulator\"\nelse\n echo \"Installing Python modules for iOS Device\"\n PYTHON_SLICE=\"$PROJECT_DIR/Support/Python.xcframework/ios-arm64-simulator\"\n PACKAGES_PATH=\"$PROJECT_DIR/{{ cookiecutter.class_name }}/app_packages.iphoneos\"\nfi\n\nrsync -au --delete \"$PYTHON_SLICE/lib/\" \"$CODESIGNING_FOLDER_PATH/python/lib/\" \nif [ -e \"$PYTHON_SLICE/Python.dSYM\" ]; then \n rsync -au --delete \"$PYTHON_SLICE/Python.dSYM\" \"$BUILT_PRODUCTS_DIR\"\nfi\nrsync -au --delete \"$PACKAGES_PATH/\" \"$CODESIGNING_FOLDER_PATH/app_packages\"\n";
239239
showEnvVarsInLog = 0;
240240
};
241241
/* End PBXShellScriptBuildPhase section */

0 commit comments

Comments
 (0)