From de32d468c653df6eb7e1088b68f84ba64c2b68ba Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 6 Jul 2025 15:33:28 +0900 Subject: [PATCH] feat: ExtensionKit PoC --- Sources/ExtensionKit/iMastExtensionKit.swift | 70 ++++++ ...nPostDetailReactionBarViewController.swift | 62 ++++- .../ExtensionPoint.swift | 33 +++ .../OtherMenu/Settings/SettingsView.swift | 20 ++ iMast.xcodeproj/project.pbxproj | 224 ++++++++++++++++-- 5 files changed, 381 insertions(+), 28 deletions(-) create mode 100644 Sources/ExtensionKit/iMastExtensionKit.swift create mode 100644 Sources/iOS/App/ExternalExtensionSupport/ExtensionPoint.swift diff --git a/Sources/ExtensionKit/iMastExtensionKit.swift b/Sources/ExtensionKit/iMastExtensionKit.swift new file mode 100644 index 000000000..bf1f70ced --- /dev/null +++ b/Sources/ExtensionKit/iMastExtensionKit.swift @@ -0,0 +1,70 @@ +// +// iMastExtensionKit.swift +// +// iMast https://github.com/cinderella-project/iMast +// +// Created by user on 2025/07/01. +// +// ------------------------------------------------------------------------ +// +// Copyright 2017-2021 rinsuki and other contributors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +import ExtensionKit + +public struct SocialUser: Codable { + public var uri: String + public var acct: String + + public init(uri: String, acct: String) { + self.uri = uri + self.acct = acct + } +} + +public struct SocialPost: Codable { + public var uri: String + public var author: SocialUser + + public init(uri: String, author: SocialUser) { + self.uri = uri + self.author = author + } +} + +public enum PostActionResult: Codable { + case composeReply(text: String) +} + +public protocol _SocialExtension: AnyObject, Sendable, AppExtension { + +} + +extension _SocialExtension { +} + +public protocol PostActionExtension: _SocialExtension { + func performAction(for post: SocialPost) -> PostActionResult? +} + +extension PostActionExtension { + public var configuration: ConnectionHandler { + return ConnectionHandler { request in + request.accept { [weak self] (post: SocialPost) in + return self?.performAction(for: post) + } + } + } +} diff --git a/Sources/iOS/App/CustomViews/Post/PostDetail/MastodonPostDetailReactionBarViewController.swift b/Sources/iOS/App/CustomViews/Post/PostDetail/MastodonPostDetailReactionBarViewController.swift index 4e0eb67d9..248f29e41 100644 --- a/Sources/iOS/App/CustomViews/Post/PostDetail/MastodonPostDetailReactionBarViewController.swift +++ b/Sources/iOS/App/CustomViews/Post/PostDetail/MastodonPostDetailReactionBarViewController.swift @@ -25,6 +25,8 @@ import UIKit import Mew import Ikemen import iMastiOSCore +import ExtensionFoundation +import iMastExtensionKit class MastodonPostDetailReactionBarViewController: UIViewController, Instantiatable, Injectable { typealias Input = MastodonPost @@ -126,32 +128,74 @@ class MastodonPostDetailReactionBarViewController: UIViewController, Instantiata } func buildOthersMenu() async throws -> [UIMenuElement] { - var elements = [UICommand]() + var elements = [UIMenuElement]() let version = try await environment.getIntVersion() if version.supportingFeature(.bookmark) { if input.bookmarked { - elements.append(.init(title: "ブックマークから削除", image: UIImage(systemName: "bookmark.slash"), action: #selector(removeFromBookmark))) + elements.append(UICommand(title: "ブックマークから削除", image: UIImage(systemName: "bookmark.slash"), action: #selector(removeFromBookmark))) } else { - elements.append(.init(title: "ブックマーク", image: UIImage(systemName: "bookmark"), action: #selector(addToBookmark))) + elements.append(UICommand(title: "ブックマーク", image: UIImage(systemName: "bookmark"), action: #selector(addToBookmark))) } } if version.supportingFeature(.editPost) { if input.account.acct == environment.screenName { - elements.append(.init(title: L10n.NewPost.edit, image: UIImage(systemName: "pencil"), action: #selector(openEditPostVC))) + elements.append(UICommand(title: L10n.NewPost.edit, image: UIImage(systemName: "pencil"), action: #selector(openEditPostVC))) } } - elements.append(.init(title: L10n.Localizable.PostDetail.share, image: UIImage(systemName: "square.and.arrow.up"), action: #selector(openShareSheet))) - elements.append(.init(title: L10n.Localizable.Bunmyaku.title, image: UIImage(systemName: "list.bullet.indent"), action: #selector(openBunmyakuVC))) + elements.append(UICommand(title: L10n.Localizable.PostDetail.share, image: UIImage(systemName: "square.and.arrow.up"), action: #selector(openShareSheet))) + if #available(iOS 26, *) { + elements.append(UIMenu(title: "拡張機能", image: UIImage(systemName: "puzzlepiece.extension"), children: [UIDeferredMenuElement({ callback in + Task { + let monitor = try? await AppExtensionPoint.Monitor(appExtensionPoint: .postActionExtension) + var items: [UIMenuElement] = [] + for identity in monitor?.identities ?? [] { + items.append(UIAction(title: identity.localizedName, handler: { _ in + self.handleExtension(identity: identity) + })) + } + await MainActor.run { + callback(items) + } + } + })])) + } + elements.append(UICommand(title: L10n.Localizable.Bunmyaku.title, image: UIImage(systemName: "list.bullet.indent"), action: #selector(openBunmyakuVC))) if input.hasCustomEmoji { - elements.append(.init(title: L10n.Localizable.CustomEmojis.title, action: #selector(openEmojiListVC))) + elements.append(UICommand(title: L10n.Localizable.CustomEmojis.title, action: #selector(openEmojiListVC))) } if environment.screenName == input.account.acct { - elements.append(.init(title: L10n.Localizable.PostDetail.delete, image: UIImage(systemName: "trash"), action: #selector(confirmDeletePost), attributes: .destructive)) + elements.append(UICommand(title: L10n.Localizable.PostDetail.delete, image: UIImage(systemName: "trash"), action: #selector(confirmDeletePost), attributes: .destructive)) } - elements.append(.init(title: L10n.Localizable.PostDetail.reportAbuse, image: UIImage(systemName: "exclamationmark.bubble"), action: #selector(openAbuseVC))) + elements.append(UICommand(title: L10n.Localizable.PostDetail.reportAbuse, image: UIImage(systemName: "exclamationmark.bubble"), action: #selector(openAbuseVC))) return elements } + @available(iOS 26, *) + func handleExtension(identity: AppExtensionIdentity) { + let input = self.input.originalPost + Task { + let config = AppExtensionProcess.Configuration(appExtensionIdentity: identity) + let proc = try await AppExtensionProcess(configuration: config) + let connection = try proc.makeXPCSession() + try connection.activate() + try connection.send(SocialPost(uri: "", author: .init(uri: "", acct: input.account.acct))) { (result: Result) in + switch result { + case .success(.composeReply(let text)): + DispatchQueue.main.async { + let post = self.input.originalPost + self.showAsWindow(userActivity: .init(newPostWithMastodonUserToken: self.environment) ※ { + $0.setNewPostReplyInfo(post) + $0.newPostSuffix = text + }, fallback: .push) + } + default: + print(result) + } + connection.cancel(reason: "") + } + } + } + @objc func openReplyVC() { let post = self.input.originalPost showAsWindow(userActivity: .init(newPostWithMastodonUserToken: environment) ※ { diff --git a/Sources/iOS/App/ExternalExtensionSupport/ExtensionPoint.swift b/Sources/iOS/App/ExternalExtensionSupport/ExtensionPoint.swift new file mode 100644 index 000000000..d23263659 --- /dev/null +++ b/Sources/iOS/App/ExternalExtensionSupport/ExtensionPoint.swift @@ -0,0 +1,33 @@ +// +// ExtensionPoint.swift +// +// iMast https://github.com/cinderella-project/iMast +// +// Created by user on 2025/07/01. +// +// ------------------------------------------------------------------------ +// +// Copyright 2017-2021 rinsuki and other contributors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ExtensionFoundation + +@available(iOS 26.0, *) +extension AppExtensionPoint { + @Definition + public static var postActionExtension: AppExtensionPoint { + Name("PostActionV1") + Scope(restriction: .none) + } +} diff --git a/Sources/iOS/App/Screens/OtherMenu/Settings/SettingsView.swift b/Sources/iOS/App/Screens/OtherMenu/Settings/SettingsView.swift index 84892eaad..567f02c95 100644 --- a/Sources/iOS/App/Screens/OtherMenu/Settings/SettingsView.swift +++ b/Sources/iOS/App/Screens/OtherMenu/Settings/SettingsView.swift @@ -25,6 +25,7 @@ import SwiftUI import iMastiOSCore import SDWebImage import SafariServices +import ExtensionKit class NewSettingsViewController: UIHostingController { init() { @@ -393,6 +394,13 @@ struct DeveloperSettingsView: View { Button("OK") { } } + if #available(iOS 26.0, *) { + NavigationLink { + ExtensionManageView() + } label: { + Text("Manage Extensions") + } + } } } .attach(errorReporter: errorReporter) @@ -400,6 +408,18 @@ struct DeveloperSettingsView: View { } } +@available(iOS 26.0, *) +struct ExtensionManageView: View, UIViewControllerRepresentable { + typealias UIViewControllerType = EXAppExtensionBrowserViewController + + func makeUIViewController(context: Context) -> UIViewControllerType { + EXAppExtensionBrowserViewController() + } + + func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { + } +} + struct SettingsView_Previews: PreviewProvider { static var previews: some View { SettingsView() diff --git a/iMast.xcodeproj/project.pbxproj b/iMast.xcodeproj/project.pbxproj index 15a7cca77..1a78c5205 100644 --- a/iMast.xcodeproj/project.pbxproj +++ b/iMast.xcodeproj/project.pbxproj @@ -325,6 +325,10 @@ CEE4E3702377F84200406371 /* MastodonUserToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9AEA1123112E6900EE3B23 /* MastodonUserToken.swift */; }; CEE4E3712377F84400406371 /* genRandomString.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE43BEF523779EE800133C86 /* genRandomString.swift */; }; CEE4E3722377F84400406371 /* IndirectBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECBD35C22D16575004530BA /* IndirectBox.swift */; }; + CEE542672E13B2EB003A6FF4 /* ExtensionPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE542662E13B2EB003A6FF4 /* ExtensionPoint.swift */; }; + CEE5428B2E13B7A7003A6FF4 /* iMastExtensionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE542852E13B7A7003A6FF4 /* iMastExtensionKit.framework */; }; + CEE5428C2E13B7A7003A6FF4 /* iMastExtensionKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CEE542852E13B7A7003A6FF4 /* iMastExtensionKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + CEE542922E13B7B7003A6FF4 /* iMastExtensionKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE542902E13B7B7003A6FF4 /* iMastExtensionKit.swift */; }; CEE674D928B0561600667E04 /* NewPostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE674D828B0561600667E04 /* NewPostView.swift */; }; CEEB1A3C25CAAD6A0080953E /* MastodonWebSocketMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEB1A3B25CAAD6A0080953E /* MastodonWebSocketMessage.swift */; }; CEEB1A3D25CAAD6A0080953E /* MastodonWebSocketMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEB1A3B25CAAD6A0080953E /* MastodonWebSocketMessage.swift */; }; @@ -507,6 +511,13 @@ remoteGlobalIDString = CEE4E31D2377F7D800406371; remoteInfo = iMastMacCore; }; + CEE542892E13B7A7003A6FF4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2AF3520F1EAB9C5500777C2E /* Project object */; + proxyType = 1; + remoteGlobalIDString = CEE542842E13B7A7003A6FF4; + remoteInfo = iMastExtensionKit; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -529,6 +540,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + CEE5428C2E13B7A7003A6FF4 /* iMastExtensionKit.framework in Embed Frameworks */, CE43BE96237775F100133C86 /* iMastiOSCore.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -951,6 +963,9 @@ CEE4E3262377F7D800406371 /* iMastMacCoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iMastMacCoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; CEE4E32D2377F7D800406371 /* iMastMacCoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iMastMacCoreTests.swift; sourceTree = ""; }; CEE4E32F2377F7D800406371 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CEE542662E13B2EB003A6FF4 /* ExtensionPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionPoint.swift; sourceTree = ""; }; + CEE542852E13B7A7003A6FF4 /* iMastExtensionKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = iMastExtensionKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CEE542902E13B7B7003A6FF4 /* iMastExtensionKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iMastExtensionKit.swift; sourceTree = ""; }; CEE674D828B0561600667E04 /* NewPostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewPostView.swift; sourceTree = ""; }; CEE674DA28B08ADF00667E04 /* SeparatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeparatorView.swift; sourceTree = ""; }; CEEB1A3B25CAAD6A0080953E /* MastodonWebSocketMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonWebSocketMessage.swift; sourceTree = ""; }; @@ -1014,6 +1029,7 @@ files = ( CE4800F32DF6DB9700B92D6A /* GRDB in Frameworks */, CE43BE95237775F100133C86 /* iMastiOSCore.framework in Frameworks */, + CEE5428B2E13B7A7003A6FF4 /* iMastExtensionKit.framework in Frameworks */, 0DB50C2D6AF7EB43D6C6CA58 /* Pods_iMastShared_iOS_iMast_iOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1142,6 +1158,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CEE542822E13B7A7003A6FF4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1247,6 +1270,7 @@ CEE4E3262377F7D800406371 /* iMastMacCoreTests.xctest */, CE90CCF3237804CD001C8E80 /* iMastMacShare.appex */, CEC4707025DC725F003E3AEF /* iMast.app */, + CEE542852E13B7A7003A6FF4 /* iMastExtensionKit.framework */, ); name = Products; sourceTree = ""; @@ -1256,6 +1280,7 @@ children = ( CE1C23B02B73FFFF00DA37A3 /* Package */, CE43BED423779E1800133C86 /* Core */, + CEE542912E13B7B7003A6FF4 /* ExtensionKit */, CE3D453423766DBF006F1198 /* iOS */, CEE4E3172377EAFC00406371 /* Mac */, ); @@ -1326,6 +1351,7 @@ CEEE37E62B717B1B00320C49 /* NewPostSceneDelegate.swift */, CEF121631FC828CA008DD494 /* MainTabBarController.swift */, CECD766D2A74164B00A56FD0 /* CodableViewDescriptor+localized.swift */, + CEE542652E13B2E1003A6FF4 /* ExternalExtensionSupport */, CEF4E2D92B798E73008E93DD /* Extensions */, CE8FD55B22D06D6F00331F15 /* ExtendedClasses */, CE4D388023BD17E000543E72 /* Screens */, @@ -2130,6 +2156,22 @@ path = iMastMacCoreTests; sourceTree = ""; }; + CEE542652E13B2E1003A6FF4 /* ExternalExtensionSupport */ = { + isa = PBXGroup; + children = ( + CEE542662E13B2EB003A6FF4 /* ExtensionPoint.swift */, + ); + path = ExternalExtensionSupport; + sourceTree = ""; + }; + CEE542912E13B7B7003A6FF4 /* ExtensionKit */ = { + isa = PBXGroup; + children = ( + CEE542902E13B7B7003A6FF4 /* iMastExtensionKit.swift */, + ); + path = ExtensionKit; + sourceTree = ""; + }; CEF47F652A79338800D1AEAB /* Generated */ = { isa = PBXGroup; children = ( @@ -2247,6 +2289,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CEE542802E13B7A7003A6FF4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -2272,6 +2321,7 @@ CEC6BC0721074EFB003ECE10 /* PBXTargetDependency */, CED6077D21B3658F00F6232E /* PBXTargetDependency */, CE43BE94237775F100133C86 /* PBXTargetDependency */, + CEE5428A2E13B7A7003A6FF4 /* PBXTargetDependency */, ); name = "iMast iOS"; productName = iMast; @@ -2570,13 +2620,33 @@ productReference = CEE4E3262377F7D800406371 /* iMastMacCoreTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + CEE542842E13B7A7003A6FF4 /* iMastExtensionKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = CEE5428D2E13B7A7003A6FF4 /* Build configuration list for PBXNativeTarget "iMastExtensionKit" */; + buildPhases = ( + CEE542802E13B7A7003A6FF4 /* Headers */, + CEE542812E13B7A7003A6FF4 /* Sources */, + CEE542822E13B7A7003A6FF4 /* Frameworks */, + CEE542832E13B7A7003A6FF4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iMastExtensionKit; + packageProductDependencies = ( + ); + productName = iMastExtensionKit; + productReference = CEE542852E13B7A7003A6FF4 /* iMastExtensionKit.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 2AF3520F1EAB9C5500777C2E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1110; + LastSwiftUpdateCheck = 2600; LastUpgradeCheck = 1140; ORGANIZATIONNAME = rinsuki; TargetAttributes = { @@ -2675,6 +2745,9 @@ CreatedOnToolsVersion = 11.1; TestTargetID = CEE4E2EA2377EAF500406371; }; + CEE542842E13B7A7003A6FF4 = { + CreatedOnToolsVersion = 26.0; + }; }; }; buildConfigurationList = 2AF352121EAB9C5500777C2E /* Build configuration list for PBXProject "iMast" */; @@ -2714,6 +2787,7 @@ CE90CCF2237804CD001C8E80 /* iMastMacShare */, CEE4E31D2377F7D800406371 /* iMastMacCore */, CEE4E3252377F7D800406371 /* iMastMacCoreTests */, + CEE542842E13B7A7003A6FF4 /* iMastExtensionKit */, ); }; /* End PBXProject section */ @@ -2851,6 +2925,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CEE542832E13B7A7003A6FF4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -3394,6 +3475,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + CEE542672E13B2EB003A6FF4 /* ExtensionPoint.swift in Sources */, CE54BC7420E033E20034B63E /* StableTableViewController.swift in Sources */, 2AF3521B1EAB9C5500777C2E /* AppDelegate.swift in Sources */, CE102BD32313FB2A007CB778 /* ModalLoadingIndicatorViewController.swift in Sources */, @@ -3797,6 +3879,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CEE542812E13B7A7003A6FF4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CEE542922E13B7B7003A6FF4 /* iMastExtensionKit.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -3902,6 +3992,11 @@ target = CEE4E31D2377F7D800406371 /* iMastMacCore */; targetProxy = CEE4E3312377F7D800406371 /* PBXContainerItemProxy */; }; + CEE5428A2E13B7A7003A6FF4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CEE542842E13B7A7003A6FF4 /* iMastExtensionKit */; + targetProxy = CEE542892E13B7A7003A6FF4 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -4203,12 +4298,12 @@ isa = XCBuildConfiguration; baseConfigurationReference = C7382FE797C7BE7768A87A5A /* Pods-iMastShared-iOS-iMast iOS.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Sources/iOS/App/iMast.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CURRENT_PROJECT_VERSION = 295; DEVELOPMENT_TEAM = 4XKKKM86RN; + EX_ENABLE_EXTENSION_POINT_GENERATION = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2"; INFOPLIST_FILE = Sources/iOS/App/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -4232,12 +4327,12 @@ isa = XCBuildConfiguration; baseConfigurationReference = 3267FBBFB45ED7B9C18FABA4 /* Pods-iMastShared-iOS-iMast iOS.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Sources/iOS/App/iMast.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CURRENT_PROJECT_VERSION = 295; DEVELOPMENT_TEAM = 4XKKKM86RN; + EX_ENABLE_EXTENSION_POINT_GENERATION = YES; HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2"; INFOPLIST_FILE = Sources/iOS/App/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -4261,7 +4356,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 842C27D00EF0D489E74CABE7 /* Pods-iMastShared-iOS-iMast iOS-iMastTests.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 295; INFOPLIST_FILE = Sources/iOS/Tests/iMastTests/Info.plist; @@ -4282,7 +4376,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 24FC0A36F8D2C4618825B671 /* Pods-iMastShared-iOS-iMast iOS-iMastTests.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 295; INFOPLIST_FILE = Sources/iOS/Tests/iMastTests/Info.plist; @@ -4303,7 +4396,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = B653907D1C9AB5BB71C94DDA /* Pods-iMastShared-iOS-iMast iOS-iMastUITests.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CURRENT_PROJECT_VERSION = 295; INFOPLIST_FILE = Sources/iOS/Tests/iMastUITests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -4323,7 +4415,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 599E62B81E7F4F5E82780FF1 /* Pods-iMastShared-iOS-iMast iOS-iMastUITests.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CURRENT_PROJECT_VERSION = 295; INFOPLIST_FILE = Sources/iOS/Tests/iMastUITests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -4417,7 +4508,6 @@ CE43BE9C237775F100133C86 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; @@ -4443,7 +4533,6 @@ CE43BE9D237775F100133C86 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; @@ -4590,7 +4679,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 481D5233CE4FFCB1B5949700 /* Pods-iMastShared-Mac-iMast Mac (with Sparkle).debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; @@ -4624,7 +4712,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 2BEA4FF41088A61C34A3F3A4 /* Pods-iMastShared-Mac-iMast Mac (with Sparkle).release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; @@ -4780,7 +4867,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = FEB0C7B09C32086744A37B6F /* Pods-iMastShared-Mac-iMast Mac (App Store).debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; @@ -4809,7 +4895,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 1DE94967A7D46FD66FC5CC29 /* Pods-iMastShared-Mac-iMast Mac (App Store).release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; @@ -4836,7 +4921,6 @@ CEE4E3122377EAF700406371 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; @@ -4864,7 +4948,6 @@ CEE4E3132377EAF700406371 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; @@ -4891,7 +4974,6 @@ CEE4E3152377EAF700406371 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; @@ -4918,7 +5000,6 @@ CEE4E3162377EAF700406371 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; @@ -5013,7 +5094,6 @@ CEE4E33A2377F7D800406371 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; @@ -5040,7 +5120,6 @@ CEE4E33B2377F7D800406371 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; @@ -5063,6 +5142,104 @@ }; name = Release; }; + CEE5428E2E13B7A7003A6FF4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4XKKKM86RN; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 rinsuki. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = jp.pronama.imast.ExtensionKit; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CEE5428F2E13B7A7003A6FF4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4XKKKM86RN; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 rinsuki. All rights reserved."; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = jp.pronama.imast.ExtensionKit; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -5210,6 +5387,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + CEE5428D2E13B7A7003A6FF4 /* Build configuration list for PBXNativeTarget "iMastExtensionKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CEE5428E2E13B7A7003A6FF4 /* Debug */, + CEE5428F2E13B7A7003A6FF4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */