feat: app group + share extension

This commit is contained in:
Rio Keefe
2025-05-03 10:26:04 +01:00
parent 0a2d27c150
commit 54bb75956c
6 changed files with 354 additions and 5 deletions

View File

@ -3,11 +3,12 @@
archiveVersion = 1;
classes = {
};
objectVersion = 63;
objectVersion = 70;
objects = {
/* Begin PBXBuildFile section */
16C383BC47682E60119C08CB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21497598D6296AB30C0EBA84 /* UIKit.framework */; };
283EED902DC6170E00943E7E /* Haystack.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 283EED862DC6170E00943E7E /* Haystack.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4CF1B89C17C5E734976BEFBE /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C6D4774DE6800DAE9E77C70 /* Metal.framework */; };
6AAF6095EAF01A93F2CE8305 /* libapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C62A99D37C1C342BB06981B /* libapp.a */; };
7123EC8A6063C72E5DA3E659 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE76A4E4971EE0237680C836 /* QuartzCore.framework */; };
@ -21,6 +22,30 @@
E41492640ABA177519E3F513 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2CE665AA7ABC7563C685FAA6 /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
283EED8E2DC6170E00943E7E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 193F5589816ED16BC8109D31 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 283EED852DC6170E00943E7E;
remoteInfo = Haystack;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
283EED912DC6170E00943E7E /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
283EED902DC6170E00943E7E /* Haystack.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0A480F5846CD211418A57C1C /* shortcut.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = shortcut.rs; sourceTree = "<group>"; };
0AF1829A934DE85E03752468 /* utils.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = utils.rs; sourceTree = "<group>"; };
@ -28,6 +53,7 @@
1C223AE96283F8269EFE1D03 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
1ECBDB6420B28D950ADFD5BD /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
21497598D6296AB30C0EBA84 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
283EED862DC6170E00943E7E /* Haystack.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Haystack.appex; sourceTree = BUILT_PRODUCTS_DIR; };
2CE665AA7ABC7563C685FAA6 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
3ADC946E8026E7A68FA70BFA /* main.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = main.rs; sourceTree = "<group>"; };
3B744E798409E96A0E89BC52 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
@ -43,11 +69,25 @@
A96F98DDB426B456946F1D11 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
BE76A4E4971EE0237680C836 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
CD15C8A888D518BB414EB1DE /* screenshot.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = screenshot.rs; sourceTree = "<group>"; };
D4A71980828D15BC10ECF3D2 /* Haystack_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; name = Haystack_iOS.app; path = Haystack.app; sourceTree = BUILT_PRODUCTS_DIR; };
D4A71980828D15BC10ECF3D2 /* Haystack.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Haystack.app; sourceTree = BUILT_PRODUCTS_DIR; };
EBD929FA6D544E53CE3E43F0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
F2840E2A8444B5D60F2DCC9C /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
283EED942DC6170E00943E7E /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 283EED852DC6170E00943E7E /* Haystack */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
283EED872DC6170E00943E7E /* Haystack */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (283EED942DC6170E00943E7E /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Haystack; sourceTree = "<group>"; };
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
26393DAD0BBD67E4F16745AC /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
@ -64,6 +104,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
283EED832DC6170E00943E7E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@ -118,7 +165,8 @@
84D53E3A8587FE554E32F5F0 /* Products */ = {
isa = PBXGroup;
children = (
D4A71980828D15BC10ECF3D2 /* Haystack_iOS.app */,
D4A71980828D15BC10ECF3D2 /* Haystack.app */,
283EED862DC6170E00943E7E /* Haystack.appex */,
);
name = Products;
sourceTree = "<group>";
@ -141,6 +189,7 @@
5D14D0B3A1E4F17999F21EC3 /* Haystack_iOS */,
99B42F02A0EEA086F70E7F36 /* Sources */,
3976EF9B359101EBE231CF77 /* src */,
283EED872DC6170E00943E7E /* Haystack */,
5157718C625E46F07FAC4F7C /* Frameworks */,
84D53E3A8587FE554E32F5F0 /* Products */,
);
@ -165,6 +214,28 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
283EED852DC6170E00943E7E /* Haystack */ = {
isa = PBXNativeTarget;
buildConfigurationList = 283EED952DC6170E00943E7E /* Build configuration list for PBXNativeTarget "Haystack" */;
buildPhases = (
283EED822DC6170E00943E7E /* Sources */,
283EED832DC6170E00943E7E /* Frameworks */,
283EED842DC6170E00943E7E /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
283EED872DC6170E00943E7E /* Haystack */,
);
name = Haystack;
packageProductDependencies = (
);
productName = Haystack;
productReference = 283EED862DC6170E00943E7E /* Haystack.appex */;
productType = "com.apple.product-type.app-extension";
};
28B448F5673D227E72859E56 /* Haystack_iOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 58C375D27CA00AE30B18A640 /* Build configuration list for PBXNativeTarget "Haystack_iOS" */;
@ -173,16 +244,18 @@
2B0A32A8DA58C48417D38579 /* Sources */,
2A76C4DB730794FBF1561ED7 /* Resources */,
26393DAD0BBD67E4F16745AC /* Frameworks */,
283EED912DC6170E00943E7E /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
283EED8F2DC6170E00943E7E /* PBXTargetDependency */,
);
name = Haystack_iOS;
packageProductDependencies = (
);
productName = Haystack_iOS;
productReference = D4A71980828D15BC10ECF3D2 /* Haystack_iOS.app */;
productReference = D4A71980828D15BC10ECF3D2 /* Haystack.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
@ -192,7 +265,13 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 1630;
LastUpgradeCheck = 1430;
TargetAttributes = {
283EED852DC6170E00943E7E = {
CreatedOnToolsVersion = 16.3;
};
};
};
buildConfigurationList = C9EDF156AB15AE44726AF02B /* Build configuration list for PBXProject "Haystack" */;
compatibilityVersion = "Xcode 14.0";
@ -208,11 +287,19 @@
projectRoot = "";
targets = (
28B448F5673D227E72859E56 /* Haystack_iOS */,
283EED852DC6170E00943E7E /* Haystack */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
283EED842DC6170E00943E7E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
2A76C4DB730794FBF1561ED7 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -250,6 +337,13 @@
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
283EED822DC6170E00943E7E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
2B0A32A8DA58C48417D38579 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@ -260,6 +354,14 @@
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
283EED8F2DC6170E00943E7E /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 283EED852DC6170E00943E7E /* Haystack */;
targetProxy = 283EED8E2DC6170E00943E7E /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
17EFD3F6173E3547D2B12EE3 /* release */ = {
isa = XCBuildConfiguration;
@ -269,6 +371,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Haystack_iOS/Haystack_iOS.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = RNK8266B74;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
FRAMEWORK_SEARCH_PATHS = (
@ -302,6 +405,165 @@
};
name = release;
};
283EED922DC6170E00943E7E /* debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = RNK8266B74;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Haystack/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Haystack;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 18.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.haystack.app.Haystack;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = debug;
};
283EED932DC6170E00943E7E /* release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = RNK8266B74;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Haystack/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Haystack;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 18.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.haystack.app.Haystack;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = release;
};
4E8349933047E0253470E886 /* release */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -429,6 +691,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Haystack_iOS/Haystack_iOS.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = RNK8266B74;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
FRAMEWORK_SEARCH_PATHS = (
@ -465,6 +728,15 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
283EED952DC6170E00943E7E /* Build configuration list for PBXNativeTarget "Haystack" */ = {
isa = XCConfigurationList;
buildConfigurations = (
283EED922DC6170E00943E7E /* debug */,
283EED932DC6170E00943E7E /* release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = debug;
};
58C375D27CA00AE30B18A640 /* Build configuration list for PBXNativeTarget "Haystack_iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="j1y-V4-xli">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Share View Controller-->
<scene sceneID="ceB-am-kn3">
<objects>
<viewController id="j1y-V4-xli" customClass="ShareViewController" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" opaque="NO" contentMode="scaleToFill" id="wbc-yd-nQP">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="1Xd-am-t49"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="CEy-Cv-SGf" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<string>TRUEPREDICATE</string>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,30 @@
//
// ShareViewController.swift
// Haystack
//
// Created by Rio Keefe on 03/05/2025.
//
import UIKit
import Social
class ShareViewController: SLComposeServiceViewController {
override func isContentValid() -> Bool {
// Do validation of contentText and/or NSExtensionContext attachments here
return true
}
override func didSelectPost() {
// This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
// Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
override func configurationItems() -> [Any]! {
// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
return []
}
}

View File

@ -1,5 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.haystack.app</string>
</array>
</dict>
</plist>