mirror of
https://github.com/yonaskolb/XcodeGen.git
synced 2024-12-11 07:16:40 +03:00
Merge branch 'master' into external-target-ref
This commit is contained in:
commit
0a43435af3
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
@ -4,17 +4,14 @@ on:
|
||||
pull_request: {}
|
||||
jobs:
|
||||
run:
|
||||
runs-on: macos-latest
|
||||
runs-on: macOS-latest
|
||||
name: Xcode ${{ matrix.xcode }}
|
||||
strategy:
|
||||
matrix:
|
||||
xcode: [
|
||||
"10.3",
|
||||
"11",
|
||||
]
|
||||
xcode: ["10.3", "11"]
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- name: Xcode version
|
||||
- name: Set Xcode
|
||||
run: |
|
||||
echo "Available Xcode versions:"
|
||||
ls /Applications | grep Xcode
|
||||
@ -35,4 +32,3 @@ jobs:
|
||||
run: scripts/diff-fixtures.sh
|
||||
- name: Build fixtures
|
||||
run: scripts/build-fixtures.sh
|
||||
|
||||
|
12
CHANGELOG.md
12
CHANGELOG.md
@ -2,8 +2,20 @@
|
||||
|
||||
## Next Version
|
||||
|
||||
#### Added
|
||||
|
||||
- Scheme Templates [#672](https://github.com/yonaskolb/XcodeGen/pull/672) @bclymer
|
||||
|
||||
#### Fixed
|
||||
- Fixed macOS unit test setting preset [#665](https://github.com/yonaskolb/XcodeGen/pull/665) @yonaskolb
|
||||
- Add `rcproject` files to sources build phase instead of resources [#669](https://github.com/yonaskolb/XcodeGen/pull/669) @Qusic
|
||||
- Prefer default configuration names for generated schemes [#673](https://github.com/yonaskolb/XcodeGen/pull/673) @giginet
|
||||
- Fixed some resource files being placed to "Recovered References" group [#679](https://github.com/yonaskolb/XcodeGen/pull/679) @nivanchikov
|
||||
|
||||
#### Internal
|
||||
|
||||
- Updated to SwiftCLI 5.3.2 [#667](https://github.com/yonaskolb/XcodeGen/pull/667) @giginet
|
||||
- Fixed tests in case-sensitive file system [#670](https://github.com/yonaskolb/XcodeGen/pull/670) @Qusic
|
||||
|
||||
#### Added
|
||||
- Support External Target Reference. [#655](https://github.com/yonaskolb/XcodeGen/pull/655) @kateinoigakukun
|
||||
|
@ -23,6 +23,7 @@
|
||||
- [Aggregate Target](#aggregate-target)
|
||||
- [Target Template](#target-template)
|
||||
- [Scheme](#scheme)
|
||||
- [Scheme Template](#scheme-template)
|
||||
- [Swift Package](#swift-package)
|
||||
|
||||
## General
|
||||
@ -782,6 +783,39 @@ schemes:
|
||||
revealArchiveInOrganizer: false
|
||||
```
|
||||
|
||||
### Scheme Template
|
||||
|
||||
This is a template that can be referenced from a normal scheme using the `templates` property. The properties of this template are the same as a [Scheme](#scheme). This functions identically in practice to [Target Template](#target-template).
|
||||
Any instances of `${scheme_name}` within each template will be replaced by the final scheme name which references the template.
|
||||
Any attributes defined within a scheme's `templateAttributes` will be used to replace any attribute references in the template using the syntax `${attribute_name}`.
|
||||
|
||||
```yaml
|
||||
schemes:
|
||||
MyModule:
|
||||
templates:
|
||||
- FeatureModuleScheme
|
||||
templateAttributes:
|
||||
testTargetName: MyModuleTests
|
||||
|
||||
schemeTemplates:
|
||||
FeatureModuleScheme:
|
||||
templates:
|
||||
- TestScheme
|
||||
build:
|
||||
targets:
|
||||
${scheme_name}: build
|
||||
|
||||
TestScheme:
|
||||
test:
|
||||
gatherCoverageData: true
|
||||
targets:
|
||||
- name: ${testTargetName}
|
||||
parallelizable: true
|
||||
randomExecutionOrder: true
|
||||
```
|
||||
|
||||
The result will be a scheme that builds `MyModule` when you request a build, and will test against `MyModuleTests` when you request to run tests. This is particularly useful when you work in a very modular application and each module has a similar structure.
|
||||
|
||||
## Swift Package
|
||||
Swift packages are defined at a project level, and then linked to individual targets via a [Dependency](#dependency).
|
||||
|
||||
@ -807,6 +841,7 @@ targets:
|
||||
- package: Yams
|
||||
```
|
||||
|
||||
|
||||
## External Project
|
||||
|
||||
External project references are defined at a project level, and then you can use the project name to refer its target via a [Scheme](#scheme)
|
||||
|
@ -60,8 +60,8 @@
|
||||
"repositoryURL": "https://github.com/jakeheis/SwiftCLI.git",
|
||||
"state": {
|
||||
"branch": null,
|
||||
"revision": "5318c37d3cacc8780f50b87a8840a6774320ebdf",
|
||||
"version": "5.2.2"
|
||||
"revision": "ba2268e67c07b9f9cfbc0801385e6238b36255eb",
|
||||
"version": "5.3.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -69,7 +69,7 @@
|
||||
"repositoryURL": "https://github.com/tuist/xcodeproj.git",
|
||||
"state": {
|
||||
"branch": null,
|
||||
"revision": "0f563e2d7d604499e7b57a28c78ff23d5c545acd",
|
||||
"revision": "aefcbf59cea5b0831837ed2f385e6dfd80d82cc9",
|
||||
"version": "7.1.0"
|
||||
}
|
||||
},
|
||||
|
@ -4,6 +4,7 @@ import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "XcodeGen",
|
||||
platforms: [.macOS(.v10_13)],
|
||||
products: [
|
||||
.executable(name: "xcodegen", targets: ["XcodeGen"]),
|
||||
.library(name: "XcodeGenKit", targets: ["XcodeGenKit"]),
|
||||
@ -16,7 +17,7 @@ let package = Package(
|
||||
.package(url: "https://github.com/kylef/Spectre.git", from: "0.9.0"),
|
||||
.package(url: "https://github.com/onevcat/Rainbow.git", from: "3.0.0"),
|
||||
.package(url: "https://github.com/tuist/xcodeproj.git", .exact("7.1.0")),
|
||||
.package(url: "https://github.com/jakeheis/SwiftCLI.git", .exact("5.2.2")),
|
||||
.package(url: "https://github.com/jakeheis/SwiftCLI.git", .upToNextMinor(from: "5.3.2")),
|
||||
],
|
||||
targets: [
|
||||
.target(name: "XcodeGen", dependencies: [
|
||||
|
@ -166,7 +166,7 @@ extension Project {
|
||||
public init(basePath: Path = "", jsonDictionary: JSONDictionary) throws {
|
||||
self.basePath = basePath
|
||||
|
||||
let jsonDictionary = try Project.resolveProject(jsonDictionary: jsonDictionary)
|
||||
let jsonDictionary = Project.resolveProject(jsonDictionary: jsonDictionary)
|
||||
|
||||
name = try jsonDictionary.json(atKeyPath: "name")
|
||||
settings = jsonDictionary.json(atKeyPath: "settings") ?? .empty
|
||||
@ -199,14 +199,15 @@ extension Project {
|
||||
externalProjectsMap = Dictionary(uniqueKeysWithValues: externalProjects.map { ($0.name, $0) })
|
||||
}
|
||||
|
||||
static func resolveProject(jsonDictionary: JSONDictionary) throws -> JSONDictionary {
|
||||
static func resolveProject(jsonDictionary: JSONDictionary) -> JSONDictionary {
|
||||
var jsonDictionary = jsonDictionary
|
||||
|
||||
// resolve multiple times so that we support both multi-platform templates,
|
||||
// as well as platform specific templates in multi-platform targets
|
||||
jsonDictionary = try Target.resolveMultiplatformTargets(jsonDictionary: jsonDictionary)
|
||||
jsonDictionary = try Target.resolveTargetTemplates(jsonDictionary: jsonDictionary)
|
||||
jsonDictionary = try Target.resolveMultiplatformTargets(jsonDictionary: jsonDictionary)
|
||||
jsonDictionary = Target.resolveMultiplatformTargets(jsonDictionary: jsonDictionary)
|
||||
jsonDictionary = Target.resolveTargetTemplates(jsonDictionary: jsonDictionary)
|
||||
jsonDictionary = Scheme.resolveSchemeTemplates(jsonDictionary: jsonDictionary)
|
||||
jsonDictionary = Target.resolveMultiplatformTargets(jsonDictionary: jsonDictionary)
|
||||
|
||||
return jsonDictionary
|
||||
}
|
||||
|
@ -243,7 +243,7 @@ public struct Scheme: Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
public struct BuildTarget: Equatable {
|
||||
public struct BuildTarget: Equatable, Hashable {
|
||||
public var target: TargetReference
|
||||
public var buildTypes: [BuildType]
|
||||
|
||||
|
@ -158,7 +158,11 @@ extension Dictionary where Key == String, Value: Any {
|
||||
func replaceString(_ template: String, with replacement: String) -> JSONDictionary {
|
||||
var replaced: JSONDictionary = self
|
||||
for (key, value) in self {
|
||||
replaced[key] = replace(value: value, template, with: replacement)
|
||||
let newKey = key.replacingOccurrences(of: template, with: replacement)
|
||||
if newKey != key {
|
||||
replaced.removeValue(forKey: key)
|
||||
}
|
||||
replaced[newKey] = replace(value: value, template, with: replacement)
|
||||
}
|
||||
return replaced
|
||||
}
|
||||
|
@ -134,59 +134,7 @@ extension Target: PathContainer {
|
||||
|
||||
extension Target {
|
||||
|
||||
static func resolveTargetTemplates(jsonDictionary: JSONDictionary) throws -> JSONDictionary {
|
||||
guard var targetsDictionary: [String: JSONDictionary] = jsonDictionary["targets"] as? [String: JSONDictionary] else {
|
||||
return jsonDictionary
|
||||
}
|
||||
|
||||
let targetTemplatesDictionary: [String: JSONDictionary] = jsonDictionary["targetTemplates"] as? [String: JSONDictionary] ?? [:]
|
||||
|
||||
// Recursively collects all nested template names of a given dictionary.
|
||||
func collectTemplates(of jsonDictionary: JSONDictionary,
|
||||
into allTemplates: inout [String],
|
||||
insertAt insertionIndex: inout Int) {
|
||||
guard let templates = jsonDictionary["templates"] as? [String] else {
|
||||
return
|
||||
}
|
||||
for template in templates where !allTemplates.contains(template) {
|
||||
guard let templateDictionary = targetTemplatesDictionary[template] else {
|
||||
continue
|
||||
}
|
||||
allTemplates.insert(template, at: insertionIndex)
|
||||
collectTemplates(of: templateDictionary, into: &allTemplates, insertAt: &insertionIndex)
|
||||
insertionIndex += 1
|
||||
}
|
||||
}
|
||||
|
||||
for (targetName, var target) in targetsDictionary {
|
||||
var templates: [String] = []
|
||||
var index: Int = 0
|
||||
collectTemplates(of: target, into: &templates, insertAt: &index)
|
||||
if !templates.isEmpty {
|
||||
var mergedDictionary: JSONDictionary = [:]
|
||||
for template in templates {
|
||||
if let templateDictionary = targetTemplatesDictionary[template] {
|
||||
mergedDictionary = templateDictionary.merged(onto: mergedDictionary)
|
||||
}
|
||||
}
|
||||
target = target.merged(onto: mergedDictionary)
|
||||
target = target.replaceString("$target_name", with: targetName) // Will be removed in upcoming version
|
||||
target = target.replaceString("${target_name}", with: targetName)
|
||||
if let templateAttributes = target["templateAttributes"] as? [String: String] {
|
||||
for (templateAttribute, value) in templateAttributes {
|
||||
target = target.replaceString("${\(templateAttribute)}", with: value)
|
||||
}
|
||||
}
|
||||
}
|
||||
targetsDictionary[targetName] = target
|
||||
}
|
||||
|
||||
var jsonDictionary = jsonDictionary
|
||||
jsonDictionary["targets"] = targetsDictionary
|
||||
return jsonDictionary
|
||||
}
|
||||
|
||||
static func resolveMultiplatformTargets(jsonDictionary: JSONDictionary) throws -> JSONDictionary {
|
||||
static func resolveMultiplatformTargets(jsonDictionary: JSONDictionary) -> JSONDictionary {
|
||||
guard let targetsDictionary: [String: JSONDictionary] = jsonDictionary["targets"] as? [String: JSONDictionary] else {
|
||||
return jsonDictionary
|
||||
}
|
||||
|
78
Sources/ProjectSpec/Template.swift
Normal file
78
Sources/ProjectSpec/Template.swift
Normal file
@ -0,0 +1,78 @@
|
||||
import Foundation
|
||||
import JSONUtilities
|
||||
|
||||
struct TemplateStructure {
|
||||
let baseKey: String
|
||||
let templatesKey: String
|
||||
let nameToReplace: String
|
||||
}
|
||||
|
||||
extension Target {
|
||||
static func resolveTargetTemplates(jsonDictionary: JSONDictionary) -> JSONDictionary {
|
||||
return resolveTemplates(jsonDictionary: jsonDictionary,
|
||||
templateStructure: TemplateStructure(baseKey: "targets",
|
||||
templatesKey: "targetTemplates",
|
||||
nameToReplace: "target_name"))
|
||||
}
|
||||
}
|
||||
|
||||
extension Scheme {
|
||||
static func resolveSchemeTemplates(jsonDictionary: JSONDictionary) -> JSONDictionary {
|
||||
return resolveTemplates(jsonDictionary: jsonDictionary,
|
||||
templateStructure: TemplateStructure(baseKey: "schemes",
|
||||
templatesKey: "schemeTemplates",
|
||||
nameToReplace: "scheme_name"))
|
||||
}
|
||||
}
|
||||
|
||||
private func resolveTemplates(jsonDictionary: JSONDictionary, templateStructure: TemplateStructure) -> JSONDictionary {
|
||||
guard var baseDictionary: [String: JSONDictionary] = jsonDictionary[templateStructure.baseKey] as? [String: JSONDictionary] else {
|
||||
return jsonDictionary
|
||||
}
|
||||
|
||||
let templatesDictionary: [String: JSONDictionary] = jsonDictionary[templateStructure.templatesKey] as? [String: JSONDictionary] ?? [:]
|
||||
|
||||
// Recursively collects all nested template names of a given dictionary.
|
||||
func collectTemplates(of jsonDictionary: JSONDictionary,
|
||||
into allTemplates: inout [String],
|
||||
insertAt insertionIndex: inout Int) {
|
||||
guard let templates = jsonDictionary["templates"] as? [String] else {
|
||||
return
|
||||
}
|
||||
for template in templates where !allTemplates.contains(template) {
|
||||
guard let templateDictionary = templatesDictionary[template] else {
|
||||
continue
|
||||
}
|
||||
allTemplates.insert(template, at: insertionIndex)
|
||||
collectTemplates(of: templateDictionary, into: &allTemplates, insertAt: &insertionIndex)
|
||||
insertionIndex += 1
|
||||
}
|
||||
}
|
||||
|
||||
for (referenceName, var reference) in baseDictionary {
|
||||
var templates: [String] = []
|
||||
var index: Int = 0
|
||||
collectTemplates(of: reference, into: &templates, insertAt: &index)
|
||||
if !templates.isEmpty {
|
||||
var mergedDictionary: JSONDictionary = [:]
|
||||
for template in templates {
|
||||
if let templateDictionary = templatesDictionary[template] {
|
||||
mergedDictionary = templateDictionary.merged(onto: mergedDictionary)
|
||||
}
|
||||
}
|
||||
reference = reference.merged(onto: mergedDictionary)
|
||||
reference = reference.replaceString("$\(templateStructure.nameToReplace)", with: referenceName) // Will be removed in upcoming version
|
||||
reference = reference.replaceString("${\(templateStructure.nameToReplace)}", with: referenceName)
|
||||
if let templateAttributes = reference["templateAttributes"] as? [String: String] {
|
||||
for (templateAttribute, value) in templateAttributes {
|
||||
reference = reference.replaceString("${\(templateAttribute)}", with: value)
|
||||
}
|
||||
}
|
||||
}
|
||||
baseDictionary[referenceName] = reference
|
||||
}
|
||||
|
||||
var jsonDictionary = jsonDictionary
|
||||
jsonDictionary[templateStructure.baseKey] = baseDictionary
|
||||
return jsonDictionary
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
import Foundation
|
||||
import SwiftCLI
|
||||
|
||||
class CommandRouter: Router {
|
||||
|
||||
let defaultCommand: Command
|
||||
|
||||
init(defaultCommand: Command) {
|
||||
self.defaultCommand = defaultCommand
|
||||
}
|
||||
|
||||
func parse(commandGroup: CommandGroup, arguments: ArgumentList) throws -> (CommandPath, OptionRegistry) {
|
||||
if !arguments.hasNext() || arguments.nextIsOption() {
|
||||
arguments.manipulate { existing in
|
||||
[defaultCommand.name] + existing
|
||||
}
|
||||
}
|
||||
return try DefaultRouter().parse(commandGroup: commandGroup, arguments: arguments)
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ import ProjectSpec
|
||||
import SwiftCLI
|
||||
|
||||
public class XcodeGenCLI {
|
||||
|
||||
let cli: CLI
|
||||
|
||||
public init(version: Version) {
|
||||
@ -15,7 +14,7 @@ public class XcodeGenCLI {
|
||||
description: "Generates Xcode projects",
|
||||
commands: [generateCommand]
|
||||
)
|
||||
cli.parser = Parser(router: CommandRouter(defaultCommand: generateCommand))
|
||||
cli.parser.routeBehavior = .searchWithFallback(generateCommand)
|
||||
}
|
||||
|
||||
public func execute(arguments: [String]? = nil) {
|
||||
|
@ -2,6 +2,14 @@ import Foundation
|
||||
import ProjectSpec
|
||||
import XcodeProj
|
||||
|
||||
private func suitableConfig(for type: ConfigType, in project: Project) -> Config {
|
||||
if let defaultConfig = Config.defaultConfigs.first(where: { $0.type == type }),
|
||||
project.configs.contains(defaultConfig) {
|
||||
return defaultConfig
|
||||
}
|
||||
return project.configs.first { $0.type == type }!
|
||||
}
|
||||
|
||||
public class SchemeGenerator {
|
||||
|
||||
let project: Project
|
||||
@ -34,8 +42,8 @@ public class SchemeGenerator {
|
||||
if targetScheme.configVariants.isEmpty {
|
||||
let schemeName = target.name
|
||||
|
||||
let debugConfig = project.configs.first { $0.type == .debug }!
|
||||
let releaseConfig = project.configs.first { $0.type == .release }!
|
||||
let debugConfig = suitableConfig(for: .debug, in: project)
|
||||
let releaseConfig = suitableConfig(for: .release, in: project)
|
||||
|
||||
let scheme = Scheme(
|
||||
name: schemeName,
|
||||
|
@ -221,7 +221,8 @@ class SourceGenerator {
|
||||
"xcdatamodeld",
|
||||
"intentdefinition",
|
||||
"metal",
|
||||
"mlmodel":
|
||||
"mlmodel",
|
||||
"rcproject":
|
||||
return .sources
|
||||
case "h",
|
||||
"hh",
|
||||
@ -267,7 +268,7 @@ class SourceGenerator {
|
||||
for child in children {
|
||||
// only add the children that aren't already in the cachedGroup
|
||||
// Check equality by path and sourceTree because XcodeProj.PBXObject.== is very slow.
|
||||
if !cachedGroupChildren.contains(where: { $0.path == child.path && $0.sourceTree == child.sourceTree }) {
|
||||
if !cachedGroupChildren.contains(where: { $0.name == child.name && $0.path == child.path && $0.sourceTree == child.sourceTree }) {
|
||||
cachedGroupChildren.append(child)
|
||||
}
|
||||
}
|
||||
|
@ -31,12 +31,12 @@
|
||||
09617AB755651FFEB2564CBC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1A2F579A6F79C62DDA0571 /* AppDelegate.swift */; settings = {COMPILER_FLAGS = "-Werror"; }; };
|
||||
0AB541AE3163B063E7012877 /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5A2B916A11DCC2565241359F /* StaticLibrary_ObjC.h */; };
|
||||
0BDA156BEBFCB9E65910F838 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A58A16491CDDF968B0D56DE /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
15D7AE7E8A1CD4556F711A7D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9390121B4ECBB1B796C7CBBD /* Assets.xcassets */; };
|
||||
1BC891D89980D82738D963F3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 74FBDFA5CB063F6001AD8ACD /* Main.storyboard */; };
|
||||
1E03FC7312293997599C6435 /* Empty.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 068EDF47F0B087F6A4052AC0 /* Empty.h */; };
|
||||
1E2A4D61E96521FF7123D7B0 /* XPC Service.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 22237B8EBD9E6BE8EBC8735F /* XPC Service.xpc */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
1E457F55331FD2C3E8E00BE2 /* Result.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0C5AC2545AE4D4F7F44E2E9B /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
210B49C23B9717C668B40C8C /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5F527F2590C14956518174 /* FrameworkFile.swift */; };
|
||||
212BCB51DAF3212993DDD49E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D51CC8BCCBD68A90E90A3207 /* Assets.xcassets */; };
|
||||
21425F6DE3D493B6F1E33D21 /* Framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41FC82ED1C4C3B7B3D7B2FB7 /* Framework.framework */; };
|
||||
216B220EC7961DF7CA9188B7 /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5A2B916A11DCC2565241359F /* StaticLibrary_ObjC.h */; };
|
||||
21CA04F29CD0DEB0DD27B808 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C5AC2545AE4D4F7F44E2E9B /* Result.framework */; };
|
||||
@ -55,7 +55,6 @@
|
||||
3788E1382B38DF4ACE3D2BB1 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A58A16491CDDF968B0D56DE /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
3C5134EE524310ACF7B7CD6E /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CAF6C55B555E3E1352645B6 /* ExtensionDelegate.swift */; };
|
||||
42BC5788871D1D838B253952 /* App_watchOS Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0D09D243DBCF9D32E239F1E8 /* App_watchOS Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
438B4302193F4EA3D1481643 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5ABEA2284F13483EFDF7C0E /* MessagesViewController.swift */; };
|
||||
447D59BE2E0993D7245EA247 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3797E591F302ECC0AA2FC607 /* Assets.xcassets */; };
|
||||
45E6702CD9C088FF1FC25F34 /* App_watchOS.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = A680BE9F68A255B0FB291AE6 /* App_watchOS.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
47D1F439B8E6D287B3F3E8D1 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A58A16491CDDF968B0D56DE /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
@ -71,11 +70,12 @@
|
||||
58C18019E71E372F635A3FB4 /* MoreUnder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA8718C7CD3BE86D9B1F5120 /* MoreUnder.swift */; };
|
||||
5CBE2B976F93D87990F5A973 /* StaticLibrary_ObjC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D0BF47DF71A6DBA33ED23FD /* StaticLibrary_ObjC.a */; };
|
||||
5D10822B0E7C33DD6979F656 /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F5BD97AF0F94A15A5B7DDB7 /* Standalone.swift */; };
|
||||
61B5CC9F873BEBC7ACC332A8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 42B95EB66A17FBA091F50601 /* Assets.xcassets */; };
|
||||
632774E7F21CCB386A76B2A8 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B198242976C3395E31FE000A /* MessagesViewController.swift */; };
|
||||
63D8E7F00276736EDA62D227 /* Framework2.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3EF21DF245F66BEF5446AAEF /* Framework2.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
666AA5F3F63C8FD7C68A6CC5 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A58A16491CDDF968B0D56DE /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
66C3C5E3C13325F351A3008F /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = F2950763C4C568CC85021D18 /* module.modulemap */; };
|
||||
6E8F8303759824631C8D9DA3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9E17D598D98065767A04740F /* Localizable.strings */; };
|
||||
7148A4172BFA1CC22E6ED5DB /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 753001CDCEAA4C4E1AFF8E87 /* MainInterface.storyboard */; };
|
||||
747CAE14D196F5652E93353C /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = 2E1E747C7BC434ADB80CC269 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
75F2774F183838AF34CA9B8A /* StaticLibrary_ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D0C79A8C750EC0DE748C463 /* StaticLibrary_ObjC.m */; };
|
||||
768648ED7E93B6D888574144 /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = F2950763C4C568CC85021D18 /* module.modulemap */; };
|
||||
@ -86,7 +86,6 @@
|
||||
900CFAD929CAEE3861127627 /* MyBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 7B5068D64404C61A67A18458 /* MyBundle.bundle */; };
|
||||
95DD9941E1529FD2AE1A191D /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5A2B916A11DCC2565241359F /* StaticLibrary_ObjC.h */; };
|
||||
96B55C0F660235FE6BDD8869 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A58A16491CDDF968B0D56DE /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
993BDD39817615604F1E1E0A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B419F22EB75EDD4AB9B92F32 /* Assets.xcassets */; };
|
||||
998CCB995347CBB8EDC95FB5 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5F527F2590C14956518174 /* FrameworkFile.swift */; };
|
||||
9AB50B81C29243936BB419E4 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5F527F2590C14956518174 /* FrameworkFile.swift */; };
|
||||
9D80BD5FAE6BE61CFD74CF1B /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5F527F2590C14956518174 /* FrameworkFile.swift */; };
|
||||
@ -108,16 +107,17 @@
|
||||
C400EBD25886ACB5CD9035EB /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = F2950763C4C568CC85021D18 /* module.modulemap */; };
|
||||
C836F09B677937EFF69B1FCE /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C934C1F7A68CCD0AB6B38478 /* NotificationController.swift */; };
|
||||
C88598A49087A212990F4E8B /* ResourceFolder in Resources */ = {isa = PBXBuildFile; fileRef = 6B1603BA83AA0C7B94E45168 /* ResourceFolder */; };
|
||||
CCA17097382757012B58C17C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1BC32A813B80A53962A1F365 /* Assets.xcassets */; };
|
||||
CE3D039C3014A07F32D2BEAA /* StaticLibrary_ObjC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 056A43A09CE7E88D578696D8 /* StaticLibrary_ObjC.a */; };
|
||||
D5458D67C3596943114C3205 /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F5BD97AF0F94A15A5B7DDB7 /* Standalone.swift */; };
|
||||
D61BEABD5B26B2DE67D0C2EC /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5F527F2590C14956518174 /* FrameworkFile.swift */; };
|
||||
D8ED40ED61AD912385CFF5F0 /* StaticLibrary_ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D0C79A8C750EC0DE748C463 /* StaticLibrary_ObjC.m */; };
|
||||
E1836941C13CC7F13650C317 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3ED831531AA349CCC19B258B /* Assets.xcassets */; };
|
||||
E34351AC0049221C167A60AC /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A58A16491CDDF968B0D56DE /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
E4B41CB5C796DD2C3C2E564C /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A58A16491CDDF968B0D56DE /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
E4D0F435405DABCB51C5B684 /* TestFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E43116070AFEF5D8C3A5A957 /* TestFramework.framework */; };
|
||||
E5DD0AD6F7AE1DD4AF98B83E /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 65C8D6D1DDC1512D396C07B7 /* Localizable.stringsdict */; };
|
||||
E8A135F768448632F8D77C8F /* StandaloneAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3571E41E19A5AB8AAAB04109 /* StandaloneAssets.xcassets */; };
|
||||
EB8FD464066560D258F63A50 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B47B80AF9EAE0ADB4FA469CF /* MainInterface.storyboard */; };
|
||||
F5D71267BB5A326BDD69D532 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E55F45EACB0F382722D61C8D /* Assets.xcassets */; };
|
||||
F6537CE373C94809E6653758 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = 2E1E747C7BC434ADB80CC269 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
F7423E8738EECF04795C7601 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F6BCB5FEFB16F1BA368059 /* InterfaceController.swift */; };
|
||||
@ -414,13 +414,11 @@
|
||||
056A43A09CE7E88D578696D8 /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
068EDF47F0B087F6A4052AC0 /* Empty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Empty.h; sourceTree = "<group>"; };
|
||||
0704B6CAFBB53E0EBB08F6B3 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
||||
089EC08C7E2D830C5916FDD9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = "<group>"; };
|
||||
09B82F603D981398F38D762E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
0B193CC6D2B3003418A550B6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/LocalizedStoryboard.strings; sourceTree = "<group>"; };
|
||||
0BB1B49A91B892152D68ED76 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
|
||||
0C5AC2545AE4D4F7F44E2E9B /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = "<group>"; };
|
||||
0D09D243DBCF9D32E239F1E8 /* App_watchOS Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "App_watchOS Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
0F32AD342EF6A4C7F6324B36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
0F5BD97AF0F94A15A5B7DDB7 /* Standalone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Standalone.swift; sourceTree = "<group>"; };
|
||||
102A08142A31E44F4ED52649 /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = "<group>"; };
|
||||
108BB29172D27BE3BD1E7F35 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
@ -429,6 +427,7 @@
|
||||
148B7C933698BCC4F1DBA979 /* XPC_Service.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPC_Service.m; sourceTree = "<group>"; };
|
||||
16D662EE577E4CD6AFF39D66 /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = "<group>"; };
|
||||
187E665975BB5611AF0F27E1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
1BC32A813B80A53962A1F365 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
1D0C79A8C750EC0DE748C463 /* StaticLibrary_ObjC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StaticLibrary_ObjC.m; sourceTree = "<group>"; };
|
||||
22237B8EBD9E6BE8EBC8735F /* XPC Service.xpc */ = {isa = PBXFileReference; explicitFileType = "wrapper.xpc-service"; includeInIndex = 0; path = "XPC Service.xpc"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
2233774B86539B1574D206B0 /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@ -440,14 +439,14 @@
|
||||
3797E591F302ECC0AA2FC607 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
38F1191E5B85DC882B8ABE85 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3D8A2D4363866877B9140156 /* XPC_ServiceProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPC_ServiceProtocol.h; sourceTree = "<group>"; };
|
||||
3ED831531AA349CCC19B258B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
3EF21DF245F66BEF5446AAEF /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
40863AE6202CFCD0529D8438 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
41FC82ED1C4C3B7B3D7B2FB7 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
42B95EB66A17FBA091F50601 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
4BF4D16042A80576D259160C /* Model 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 3.xcdatamodel"; sourceTree = "<group>"; };
|
||||
4D0BF47DF71A6DBA33ED23FD /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = archive.ar; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
5116B3B58070BCD09F1487BA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
553D289724905857912C7A1D /* outputList.xcfilelist */ = {isa = PBXFileReference; lastKnownFileType = text.xcfilelist; path = outputList.xcfilelist; sourceTree = "<group>"; };
|
||||
564E35E83C95F5591345B772 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
57FF8864B8EBAB5777DC12E6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
587B9E9A3533E965CA602B76 /* TestProjectUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectUITests.swift; sourceTree = "<group>"; };
|
||||
5A2B916A11DCC2565241359F /* StaticLibrary_ObjC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StaticLibrary_ObjC.h; sourceTree = "<group>"; };
|
||||
@ -459,7 +458,6 @@
|
||||
70A8E15C81E454DC950C59F0 /* SomeXPCService.xpc */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.xpc-service"; path = SomeXPCService.xpc; sourceTree = "<group>"; };
|
||||
72A14C887EF7E9C8CBE914AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
77C0C341F1865224E0596086 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
7ACBAD7D485AA4E2542B9E0F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
7B5068D64404C61A67A18458 /* MyBundle.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = MyBundle.bundle; sourceTree = "<group>"; };
|
||||
7C176A8297AC2F5207352BA8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
7D67F1C1BFBACE101DE7DB51 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@ -470,26 +468,25 @@
|
||||
814822136AF3C64428D69DD6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
8A9274BE42A03DC5DA1FAD04 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8CAF6C55B555E3E1352645B6 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = "<group>"; };
|
||||
9390121B4ECBB1B796C7CBBD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
93C033648A37D95027845BD3 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
|
||||
9A87A926D563773658FB87FE /* iMessageApp.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = iMessageApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
9F27382DD66E26C059E26EFE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
A0DC40025AB59B688E758829 /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A220DE4EB3CB2E598D034D9D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
A3F6BCB5FEFB16F1BA368059 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = "<group>"; };
|
||||
A4C3FE6B986506724DAB5D0F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
||||
A680BE9F68A255B0FB291AE6 /* App_watchOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App_watchOS.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
AAA49985DFFE797EE8416887 /* inputList.xcfilelist */ = {isa = PBXFileReference; lastKnownFileType = text.xcfilelist; path = inputList.xcfilelist; sourceTree = "<group>"; };
|
||||
AB055761199DF36DB0C629A6 /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
B17B8D9C9B391332CD176A35 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LocalizedStoryboard.storyboard; sourceTree = "<group>"; };
|
||||
B198242976C3395E31FE000A /* MessagesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesViewController.swift; sourceTree = "<group>"; };
|
||||
B1C33BB070583BE3B0EC0E68 /* App_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = App_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
B419F22EB75EDD4AB9B92F32 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
B76E17CE3574081D5BF45B44 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = "<group>"; };
|
||||
BA040F1F7D6CA08878323A55 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
BB178D03E75929F3F5B10C56 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = "<group>"; };
|
||||
BECEA4A483ADEB8158F640B3 /* Tool */ = {isa = PBXFileReference; includeInIndex = 0; path = Tool; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
C2F3574CCEF023755DDB1A06 /* Mintfile */ = {isa = PBXFileReference; path = Mintfile; sourceTree = "<group>"; };
|
||||
C53ACB2962FED621389C36A2 /* iMessageStickersExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = iMessageStickersExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
C5ABEA2284F13483EFDF7C0E /* MessagesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesViewController.swift; sourceTree = "<group>"; };
|
||||
C7809CE9FE9852C2AA87ACE5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.module; path = module.modulemap; sourceTree = "<group>"; };
|
||||
C934C1F7A68CCD0AB6B38478 /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = "<group>"; };
|
||||
C9DDE1B06BCC1CDE0ECF1589 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
@ -497,6 +494,7 @@
|
||||
CB77A637470A3CDA2BDDBE99 /* App_iOS_Tests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D132EA69984F32DA9DC727B6 /* TestProjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectTests.swift; sourceTree = "<group>"; };
|
||||
D296BB7355994040E197A1EE /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = "<group>"; };
|
||||
D51CC8BCCBD68A90E90A3207 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
D629E142AB87C681D4EC90F7 /* iMessageExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = iMessageExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D6C89D80B5458D8929F5C127 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
D70BE0C05E5779A077793BE6 /* Model 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 2.xcdatamodel"; sourceTree = "<group>"; };
|
||||
@ -509,6 +507,8 @@
|
||||
EF92E90B6F1D583382BD85BE /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
F0D48A913C087D049C8EDDD7 /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = "<group>"; };
|
||||
F2950763C4C568CC85021D18 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.module; path = module.modulemap; sourceTree = "<group>"; };
|
||||
F2FA55A558627ED576A4AFD6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
FA86D418796C1A6864414460 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = "<group>"; };
|
||||
FC60FF5527FEDF545816FFCF /* Folder */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Folder; sourceTree = SOURCE_ROOT; };
|
||||
FD05F36F95D6F098A76F220B /* XPC_Service.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPC_Service.h; sourceTree = "<group>"; };
|
||||
FD4A16C7B8FEB7F97F3CBE3F /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
|
||||
@ -585,15 +585,13 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
0A989C35EEBD58B9B98C41A7 /* iMessage MessagesExtension */ = {
|
||||
018CC36B301BFA9965780BD9 /* iMessageStickers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B419F22EB75EDD4AB9B92F32 /* Assets.xcassets */,
|
||||
0F32AD342EF6A4C7F6324B36 /* Info.plist */,
|
||||
B47B80AF9EAE0ADB4FA469CF /* MainInterface.storyboard */,
|
||||
C5ABEA2284F13483EFDF7C0E /* MessagesViewController.swift */,
|
||||
3ED831531AA349CCC19B258B /* Assets.xcassets */,
|
||||
F2FA55A558627ED576A4AFD6 /* Info.plist */,
|
||||
);
|
||||
path = "iMessage MessagesExtension";
|
||||
path = iMessageStickers;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
0D039F2E62354C7C8E283BE6 /* App_iOS_UITests */ = {
|
||||
@ -670,9 +668,9 @@
|
||||
3F2E22B7AB20FA42CD205C2A /* CopyFiles */,
|
||||
5CBCE0E2A145046265FE99E2 /* FileGroup */,
|
||||
1A57D1EE1FBC13598F6B5CB0 /* Framework */,
|
||||
B370CE9C04C41EBC52D4E4EA /* iMessage */,
|
||||
0A989C35EEBD58B9B98C41A7 /* iMessage MessagesExtension */,
|
||||
D1B8D50CE1D32597CD569AB5 /* iMessage Stickers */,
|
||||
A3DCF90D9B1EF4E27CF54B19 /* iMessageApp */,
|
||||
BF58996786F85CB77BEE72EF /* iMessageExtension */,
|
||||
018CC36B301BFA9965780BD9 /* iMessageStickers */,
|
||||
9EDF27BB8A57733E6639D36D /* Resources */,
|
||||
9DB22CB08CFAA455518700DB /* StandaloneFiles */,
|
||||
BDA839814AF73F01F7710518 /* StaticLibrary_ObjC */,
|
||||
@ -800,6 +798,15 @@
|
||||
path = Resources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A3DCF90D9B1EF4E27CF54B19 /* iMessageApp */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D51CC8BCCBD68A90E90A3207 /* Assets.xcassets */,
|
||||
A220DE4EB3CB2E598D034D9D /* Info.plist */,
|
||||
);
|
||||
path = iMessageApp;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
AC523591AC7BE9275003D2DB /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -833,15 +840,6 @@
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B370CE9C04C41EBC52D4E4EA /* iMessage */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
42B95EB66A17FBA091F50601 /* Assets.xcassets */,
|
||||
7ACBAD7D485AA4E2542B9E0F /* Info.plist */,
|
||||
);
|
||||
path = iMessage;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BAE6C12745737019DC9E98BF /* App_watchOS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -862,6 +860,17 @@
|
||||
path = StaticLibrary_ObjC;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BF58996786F85CB77BEE72EF /* iMessageExtension */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1BC32A813B80A53962A1F365 /* Assets.xcassets */,
|
||||
40863AE6202CFCD0529D8438 /* Info.plist */,
|
||||
753001CDCEAA4C4E1AFF8E87 /* MainInterface.storyboard */,
|
||||
B198242976C3395E31FE000A /* MessagesViewController.swift */,
|
||||
);
|
||||
path = iMessageExtension;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CBDAC144248EE9D3838C6AAA /* StaticLibrary_Swift */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -870,15 +879,6 @@
|
||||
path = StaticLibrary_Swift;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D1B8D50CE1D32597CD569AB5 /* iMessage Stickers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9390121B4ECBB1B796C7CBBD /* Assets.xcassets */,
|
||||
564E35E83C95F5591345B772 /* Info.plist */,
|
||||
);
|
||||
path = "iMessage Stickers";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D557819B1EE5B42A0A3DD4D1 /* tvOS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -1550,8 +1550,8 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
993BDD39817615604F1E1E0A /* Assets.xcassets in Resources */,
|
||||
EB8FD464066560D258F63A50 /* MainInterface.storyboard in Resources */,
|
||||
CCA17097382757012B58C17C /* Assets.xcassets in Resources */,
|
||||
7148A4172BFA1CC22E6ED5DB /* MainInterface.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -1567,7 +1567,7 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
61B5CC9F873BEBC7ACC332A8 /* Assets.xcassets in Resources */,
|
||||
212BCB51DAF3212993DDD49E /* Assets.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -1601,7 +1601,7 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
15D7AE7E8A1CD4556F711A7D /* Assets.xcassets in Resources */,
|
||||
E1836941C13CC7F13650C317 /* Assets.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -1857,7 +1857,7 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
438B4302193F4EA3D1481643 /* MessagesViewController.swift in Sources */,
|
||||
632774E7F21CCB386A76B2A8 /* MessagesViewController.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -2136,6 +2136,14 @@
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
753001CDCEAA4C4E1AFF8E87 /* MainInterface.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
FA86D418796C1A6864414460 /* Base */,
|
||||
);
|
||||
name = MainInterface.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
814D72C2B921F60B759C2D4B /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
@ -2153,14 +2161,6 @@
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B47B80AF9EAE0ADB4FA469CF /* MainInterface.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
089EC08C7E2D830C5916FDD9 /* Base */,
|
||||
);
|
||||
name = MainInterface.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
C872631362DDBAFCE71E5C66 /* Interface.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
@ -2553,7 +2553,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon";
|
||||
INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist";
|
||||
INFOPLIST_FILE = iMessageExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -2828,7 +2828,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon";
|
||||
INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist";
|
||||
INFOPLIST_FILE = iMessageExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3027,7 +3027,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon";
|
||||
INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist";
|
||||
INFOPLIST_FILE = iMessageExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3122,7 +3122,7 @@
|
||||
4D86BBA6893D41140152B8CC /* Staging Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = IMessage/Info.plist;
|
||||
INFOPLIST_FILE = iMessageApp/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3157,7 +3157,7 @@
|
||||
511E983641E821858100107B /* Production Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = IMessage/Info.plist;
|
||||
INFOPLIST_FILE = iMessageApp/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3364,7 +3364,7 @@
|
||||
5876AA17762F3248F4FD66E1 /* Staging Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = IMessage/Info.plist;
|
||||
INFOPLIST_FILE = iMessageApp/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3406,7 +3406,7 @@
|
||||
59416DBF97224D8A1B28D610 /* Production Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "IMessage Stickers/Info.plist";
|
||||
INFOPLIST_FILE = iMessageStickers/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3559,7 +3559,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon";
|
||||
INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist";
|
||||
INFOPLIST_FILE = iMessageExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3617,7 +3617,7 @@
|
||||
6C201A244077B7B453E15C1A /* Test Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = IMessage/Info.plist;
|
||||
INFOPLIST_FILE = iMessageApp/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3704,7 +3704,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon";
|
||||
INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist";
|
||||
INFOPLIST_FILE = iMessageExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -3885,7 +3885,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon";
|
||||
INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist";
|
||||
INFOPLIST_FILE = iMessageExtension/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -4151,7 +4151,7 @@
|
||||
9E0CC963DE7E2ED71A4C16C1 /* Staging Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "IMessage Stickers/Info.plist";
|
||||
INFOPLIST_FILE = iMessageStickers/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -4221,7 +4221,7 @@
|
||||
A0C50DBBF4AC5D30C92B19F7 /* Test Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "IMessage Stickers/Info.plist";
|
||||
INFOPLIST_FILE = iMessageStickers/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -4551,7 +4551,7 @@
|
||||
B4297CD61108CE066C299844 /* Staging Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "IMessage Stickers/Info.plist";
|
||||
INFOPLIST_FILE = iMessageStickers/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -4671,7 +4671,7 @@
|
||||
BF2F04729CC0602591655B25 /* Production Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "IMessage Stickers/Info.plist";
|
||||
INFOPLIST_FILE = iMessageStickers/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -5402,7 +5402,7 @@
|
||||
EA62022185E4BCDA6786EC0D /* Production Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = IMessage/Info.plist;
|
||||
INFOPLIST_FILE = iMessageApp/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -5531,7 +5531,7 @@
|
||||
F961247BCE59D147388CA721 /* Test Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = IMessage/Info.plist;
|
||||
INFOPLIST_FILE = iMessageApp/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -5628,7 +5628,7 @@
|
||||
FC4A8130B924FC04E9190AB6 /* Test Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = "IMessage Stickers/Info.plist";
|
||||
INFOPLIST_FILE = iMessageStickers/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
@ -151,7 +151,7 @@ targets:
|
||||
iMessageApp:
|
||||
type: application.messages
|
||||
platform: iOS
|
||||
sources: iMessage
|
||||
sources: iMessageApp
|
||||
scheme: {}
|
||||
dependencies:
|
||||
- target: iMessageExtension
|
||||
@ -159,7 +159,7 @@ targets:
|
||||
iMessageExtension:
|
||||
type: app-extension.messages
|
||||
platform: iOS
|
||||
sources: iMessage MessagesExtension
|
||||
sources: iMessageExtension
|
||||
settings:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.project.iMessageApp.extension
|
||||
|
||||
@ -167,7 +167,7 @@ targets:
|
||||
type: app-extension.messages-sticker-pack
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: iMessage Stickers
|
||||
- path: iMessageStickers
|
||||
|
||||
StaticLibrary_ObjC:
|
||||
type: library.static
|
||||
|
@ -19,6 +19,12 @@ private let framework = Target(
|
||||
platform: .iOS
|
||||
)
|
||||
|
||||
private let frameworkTest = Target(
|
||||
name: "MyFrameworkTests",
|
||||
type: .unitTestBundle,
|
||||
platform: .iOS
|
||||
)
|
||||
|
||||
private let optionalFramework = Target(
|
||||
name: "MyOptionalFramework",
|
||||
type: .framework,
|
||||
@ -92,6 +98,36 @@ class SchemeGeneratorTests: XCTestCase {
|
||||
try expect(xcscheme.testAction?.selectedDebuggerIdentifier) == XCScheme.defaultDebugger
|
||||
}
|
||||
|
||||
$0.it("generates scheme with multiple configs") {
|
||||
let configs: [Config] = [
|
||||
Config(name: "Beta", type: .debug),
|
||||
Config(name: "Debug", type: .debug),
|
||||
Config(name: "Production", type: .release),
|
||||
Config(name: "Release", type: .release),
|
||||
]
|
||||
let framework = Target(
|
||||
name: "MyFramework",
|
||||
type: .application,
|
||||
platform: .iOS,
|
||||
scheme: TargetScheme(testTargets: [.init(name: "MyFrameworkTests")])
|
||||
)
|
||||
let project = Project(
|
||||
name: "test",
|
||||
configs: configs,
|
||||
targets: [framework, frameworkTest]
|
||||
)
|
||||
let xcodeProject = try project.generateXcodeProject()
|
||||
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
|
||||
throw failure("Scheme not found")
|
||||
}
|
||||
|
||||
try expect(xcscheme.launchAction?.buildConfiguration) == "Debug"
|
||||
try expect(xcscheme.testAction?.buildConfiguration) == "Debug"
|
||||
try expect(xcscheme.profileAction?.buildConfiguration) == "Release"
|
||||
try expect(xcscheme.analyzeAction?.buildConfiguration) == "Debug"
|
||||
try expect(xcscheme.archiveAction?.buildConfiguration) == "Release"
|
||||
}
|
||||
|
||||
$0.it("sets environment variables for a scheme") {
|
||||
let runVariables: [XCScheme.EnvironmentVariable] = [
|
||||
XCScheme.EnvironmentVariable(variable: "RUN_ENV", value: "ENABLED", enabled: true),
|
||||
|
@ -167,6 +167,69 @@ class SourceGeneratorTests: XCTestCase {
|
||||
try expect(variableGroup.children.filter { $0 == refs.first }.count) == 1
|
||||
}
|
||||
}
|
||||
|
||||
$0.it("handles localized resources") {
|
||||
let directories = """
|
||||
App:
|
||||
Resources:
|
||||
en-CA.lproj:
|
||||
- empty.json
|
||||
- Localizable.strings
|
||||
en-US.lproj:
|
||||
- empty.json
|
||||
- Localizable.strings
|
||||
en.lproj:
|
||||
- empty.json
|
||||
- Localizable.strings
|
||||
fonts:
|
||||
SFUI:
|
||||
- SFUILight.ttf
|
||||
"""
|
||||
try createDirectories(directories)
|
||||
|
||||
let target = Target(name: "Test", type: .application, platform: .iOS, sources: [TargetSource(path: "App/Resources")])
|
||||
|
||||
let options = SpecOptions(createIntermediateGroups: true)
|
||||
let project = Project(basePath: directoryPath, name: "Test", targets: [target], options: options)
|
||||
|
||||
let outputXcodeProj = try project.generateXcodeProject()
|
||||
try outputXcodeProj.write(path: directoryPath)
|
||||
|
||||
let inputXcodeProj = try XcodeProj(path: directoryPath)
|
||||
let pbxProj = inputXcodeProj.pbxproj
|
||||
|
||||
func getFileReferences(_ path: String) -> [PBXFileReference] {
|
||||
return pbxProj.fileReferences.filter { $0.path == path }
|
||||
}
|
||||
|
||||
func getVariableGroups(_ name: String?) -> [PBXVariantGroup] {
|
||||
return pbxProj.variantGroups.filter { $0.name == name }
|
||||
}
|
||||
|
||||
let stringsResourceName = "Localizable.strings"
|
||||
let jsonResourceName = "empty.json"
|
||||
|
||||
guard let stringsVariableGroup = getVariableGroups(stringsResourceName).first else { throw failure("Couldn't find the variable group") }
|
||||
|
||||
guard let jsonVariableGroup = getVariableGroups(jsonResourceName).first else { throw failure("Couldn't find the variable group") }
|
||||
|
||||
let stringsResource = "en.lproj/Localizable.strings"
|
||||
let jsonResource = "en-CA.lproj/empty.json"
|
||||
|
||||
do {
|
||||
let refs = getFileReferences(stringsResource)
|
||||
try expect(refs.count) == 1
|
||||
try expect(refs.first!.uuid.hasPrefix("TEMP")) == false
|
||||
try expect(stringsVariableGroup.children.filter { $0 == refs.first }.count) == 1
|
||||
}
|
||||
|
||||
do {
|
||||
let refs = getFileReferences(jsonResource)
|
||||
try expect(refs.count) == 1
|
||||
try expect(refs.first!.uuid.hasPrefix("TEMP")) == false
|
||||
try expect(jsonVariableGroup.children.filter { $0 == refs.first }.count) == 1
|
||||
}
|
||||
}
|
||||
|
||||
$0.it("handles duplicate names") {
|
||||
let directories = """
|
||||
|
@ -855,6 +855,121 @@ class SpecLoadingTests: XCTestCase {
|
||||
try expect(scheme.profile?.environmentVariables.isEmpty) == true
|
||||
}
|
||||
|
||||
$0.it("parses scheme templates") {
|
||||
let targetDictionary: [String: Any] = [
|
||||
"deploymentTarget": "1.2.0",
|
||||
"sources": ["targetSource"],
|
||||
"templates": ["temp2", "temp"],
|
||||
"templateAttributes": [
|
||||
"source": "replacedSource",
|
||||
],
|
||||
]
|
||||
|
||||
let project = try getProjectSpec([
|
||||
"targets": ["Framework": targetDictionary],
|
||||
"targetTemplates": [
|
||||
"temp": [
|
||||
"platform": "iOS",
|
||||
"sources": [
|
||||
"templateSource",
|
||||
["path": "Sources/${target_name}"]
|
||||
],
|
||||
],
|
||||
"temp2": [
|
||||
"type": "framework",
|
||||
"platform": "tvOS",
|
||||
"deploymentTarget": "1.1.0",
|
||||
"configFiles": [
|
||||
"debug": "Configs/$target_name/debug.xcconfig",
|
||||
"release": "Configs/${target_name}/release.xcconfig",
|
||||
],
|
||||
"sources": ["${source}"],
|
||||
],
|
||||
],
|
||||
"schemeTemplates": [
|
||||
"base_scheme": [
|
||||
"build": [
|
||||
"parallelizeBuild": false,
|
||||
"buildImplicitDependencies": false,
|
||||
"targets": [
|
||||
"Target${name_1}": "all",
|
||||
"Target2": "testing",
|
||||
"Target${name_3}": "none",
|
||||
"Target4": ["testing": true],
|
||||
"Target5": ["testing": false],
|
||||
"Target6": ["test", "analyze"],
|
||||
],
|
||||
"preActions": [
|
||||
[
|
||||
"script": "${pre-action-name}",
|
||||
"name": "Before Build ${scheme_name}",
|
||||
"settingsTarget": "Target${name_1}",
|
||||
],
|
||||
],
|
||||
],
|
||||
"test": [
|
||||
"config": "debug",
|
||||
"targets": [
|
||||
"Target${name_1}",
|
||||
[
|
||||
"name": "Target2",
|
||||
"parallelizable": true,
|
||||
"randomExecutionOrder": true,
|
||||
"skippedTests": ["Test/testExample()"],
|
||||
],
|
||||
],
|
||||
"gatherCoverageData": true,
|
||||
"disableMainThreadChecker": true,
|
||||
],
|
||||
],
|
||||
],
|
||||
"schemes": [
|
||||
"temp2": [
|
||||
"templates": ["base_scheme"],
|
||||
"templateAttributes": [
|
||||
"pre-action-name": "modified-name",
|
||||
"name_1": "FirstTarget",
|
||||
"name_3": "ThirdTarget",
|
||||
],
|
||||
],
|
||||
],
|
||||
])
|
||||
|
||||
let scheme = project.schemes.first!
|
||||
let expectedTargets: [Scheme.BuildTarget] = [
|
||||
Scheme.BuildTarget(target: "TargetFirstTarget", buildTypes: BuildType.all),
|
||||
Scheme.BuildTarget(target: "Target2", buildTypes: [.testing, .analyzing]),
|
||||
Scheme.BuildTarget(target: "TargetThirdTarget", buildTypes: []),
|
||||
Scheme.BuildTarget(target: "Target4", buildTypes: [.testing]),
|
||||
Scheme.BuildTarget(target: "Target5", buildTypes: []),
|
||||
Scheme.BuildTarget(target: "Target6", buildTypes: [.testing, .analyzing]),
|
||||
]
|
||||
try expect(scheme.name) == "temp2"
|
||||
try expect(Set(scheme.build.targets)) == Set(expectedTargets)
|
||||
try expect(scheme.build.preActions.first?.script) == "modified-name"
|
||||
try expect(scheme.build.preActions.first?.name) == "Before Build temp2"
|
||||
try expect(scheme.build.preActions.first?.settingsTarget) == "TargetFirstTarget"
|
||||
|
||||
try expect(scheme.build.parallelizeBuild) == false
|
||||
try expect(scheme.build.buildImplicitDependencies) == false
|
||||
|
||||
let expectedTest = Scheme.Test(
|
||||
config: "debug",
|
||||
gatherCoverageData: true,
|
||||
disableMainThreadChecker: true,
|
||||
targets: [
|
||||
"TargetFirstTarget",
|
||||
Scheme.Test.TestTarget(
|
||||
name: "Target2",
|
||||
randomExecutionOrder: true,
|
||||
parallelizable: true,
|
||||
skippedTests: ["Test/testExample()"]
|
||||
),
|
||||
]
|
||||
)
|
||||
try expect(scheme.test) == expectedTest
|
||||
}
|
||||
|
||||
$0.it("parses settings") {
|
||||
let project = try Project(path: fixturePath + "settings_test.yml")
|
||||
let buildSettings: BuildSettings = ["SETTING": "value"]
|
||||
|
Loading…
Reference in New Issue
Block a user