mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-09 06:43:25 +01:00
[AltStore] Refreshes installed apps in background
This commit is contained in:
@@ -15,6 +15,8 @@
|
||||
BF1E315A22A0620000370A3C /* NSError+ALTServerError.m in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314922A060F400370A3C /* NSError+ALTServerError.m */; };
|
||||
BF1E315F22A0635900370A3C /* libAltKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF1E315022A0616100370A3C /* libAltKit.a */; };
|
||||
BF1E316022A0636400370A3C /* libAltKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF1E315022A0616100370A3C /* libAltKit.a */; };
|
||||
BF43002E22A714AF0051E2BC /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF43002D22A714AF0051E2BC /* Keychain.swift */; };
|
||||
BF43003022A71C960051E2BC /* UserDefaults+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF43002F22A71C960051E2BC /* UserDefaults+AltStore.swift */; };
|
||||
BF458690229872EA00BD7491 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF45868F229872EA00BD7491 /* AppDelegate.swift */; };
|
||||
BF458692229872EA00BD7491 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF458691229872EA00BD7491 /* ViewController.swift */; };
|
||||
BF458694229872EA00BD7491 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BF458693229872EA00BD7491 /* Assets.xcassets */; };
|
||||
@@ -143,6 +145,7 @@
|
||||
BFD52C2122A1A9EC000B7ED1 /* node_list.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C1E22A1A9EC000B7ED1 /* node_list.c */; };
|
||||
BFD52C2222A1A9EC000B7ED1 /* cnary.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C1F22A1A9EC000B7ED1 /* cnary.c */; };
|
||||
BFFC044E22A204F40066B31F /* App.ipa in Resources */ = {isa = PBXBuildFile; fileRef = BFFC044D22A204F30066B31F /* App.ipa */; };
|
||||
DBAC68F8EC03F4A41D62EDE1 /* Pods_AltStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1039C07E517311FC499A0B64 /* Pods_AltStore.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -205,6 +208,8 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1039C07E517311FC499A0B64 /* Pods_AltStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltStore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A136EE677716B80768E9F0A2 /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStore.release.xcconfig"; path = "Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig"; sourceTree = "<group>"; };
|
||||
BF0C4EBC22A1BD8B009A2DD7 /* AppManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = "<group>"; };
|
||||
BF1E3128229F474900370A3C /* ServerProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerProtocol.swift; sourceTree = "<group>"; };
|
||||
BF1E3129229F474900370A3C /* ConnectionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionManager.swift; sourceTree = "<group>"; };
|
||||
@@ -213,6 +218,8 @@
|
||||
BF1E314822A060F400370A3C /* NSError+ALTServerError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSError+ALTServerError.h"; sourceTree = "<group>"; };
|
||||
BF1E314922A060F400370A3C /* NSError+ALTServerError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSError+ALTServerError.m"; sourceTree = "<group>"; };
|
||||
BF1E315022A0616100370A3C /* libAltKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAltKit.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
BF43002D22A714AF0051E2BC /* Keychain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = "<group>"; };
|
||||
BF43002F22A71C960051E2BC /* UserDefaults+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+AltStore.swift"; sourceTree = "<group>"; };
|
||||
BF45868D229872EA00BD7491 /* AltServer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AltServer.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
BF45868F229872EA00BD7491 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
BF458691229872EA00BD7491 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
||||
@@ -348,9 +355,17 @@
|
||||
BFD52C1E22A1A9EC000B7ED1 /* node_list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = node_list.c; path = Dependencies/libplist/libcnary/node_list.c; sourceTree = SOURCE_ROOT; };
|
||||
BFD52C1F22A1A9EC000B7ED1 /* cnary.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cnary.c; path = Dependencies/libplist/libcnary/cnary.c; sourceTree = SOURCE_ROOT; };
|
||||
BFFC044D22A204F30066B31F /* App.ipa */ = {isa = PBXFileReference; lastKnownFileType = file; path = App.ipa; sourceTree = "<group>"; };
|
||||
EA79A60285C6AF5848AA16E9 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStore.debug.xcconfig"; path = "Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
678E094C3184B66357EAA4AF /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
BF1E314D22A0616100370A3C /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -378,12 +393,22 @@
|
||||
BF4713A522976D1E00784A2F /* openssl.framework in Frameworks */,
|
||||
BFD247872284BB4200981D42 /* Roxas.framework in Frameworks */,
|
||||
BF5AB3A82285FE7500DC914B /* AltSign.framework in Frameworks */,
|
||||
DBAC68F8EC03F4A41D62EDE1 /* Pods_AltStore.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
4460E048E3AC1C9708C4FA33 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
EA79A60285C6AF5848AA16E9 /* Pods-AltStore.debug.xcconfig */,
|
||||
A136EE677716B80768E9F0A2 /* Pods-AltStore.release.xcconfig */,
|
||||
);
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BF1E315122A0616100370A3C /* AltKit */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -612,6 +637,7 @@
|
||||
BF45872C2298D31600BD7491 /* libimobiledevice */,
|
||||
BFD247852284BB3300981D42 /* Frameworks */,
|
||||
BFD2476B2284B9A500981D42 /* Products */,
|
||||
4460E048E3AC1C9708C4FA33 /* Pods */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -654,6 +680,7 @@
|
||||
BFD247862284BB3B00981D42 /* Roxas.framework */,
|
||||
BF5AB3A72285FE6C00DC914B /* AltSign.framework */,
|
||||
BF4713A422976CFC00784A2F /* openssl.framework */,
|
||||
1039C07E517311FC499A0B64 /* Pods_AltStore.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@@ -674,6 +701,7 @@
|
||||
children = (
|
||||
BFD2478B2284C4C300981D42 /* AppIconImageView.swift */,
|
||||
BFD2478E2284C8F900981D42 /* Button.swift */,
|
||||
BF43002D22A714AF0051E2BC /* Keychain.swift */,
|
||||
);
|
||||
path = Components;
|
||||
sourceTree = "<group>";
|
||||
@@ -713,6 +741,7 @@
|
||||
children = (
|
||||
BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */,
|
||||
BFB1169A2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift */,
|
||||
BF43002F22A71C960051E2BC /* UserDefaults+AltStore.swift */,
|
||||
);
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
@@ -819,6 +848,7 @@
|
||||
buildPhases = (
|
||||
BF4587272298D31600BD7491 /* Headers */,
|
||||
BF4587282298D31600BD7491 /* Sources */,
|
||||
678E094C3184B66357EAA4AF /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -833,10 +863,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = BFD2477E2284B9A700981D42 /* Build configuration list for PBXNativeTarget "AltStore" */;
|
||||
buildPhases = (
|
||||
FFB93342C7EB2021A1FFFB6A /* [CP] Check Pods Manifest.lock */,
|
||||
BFD247662284B9A500981D42 /* Sources */,
|
||||
BFD247672284B9A500981D42 /* Frameworks */,
|
||||
BFD247682284B9A500981D42 /* Resources */,
|
||||
BFD247842284BB2C00981D42 /* Embed Frameworks */,
|
||||
B8F37E08B55D2C9C4E2B1B4E /* [CP] Embed Pods Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -876,6 +908,11 @@
|
||||
BFD247692284B9A500981D42 = {
|
||||
CreatedOnToolsVersion = 10.2.1;
|
||||
LastSwiftMigration = 1020;
|
||||
SystemCapabilities = {
|
||||
com.apple.BackgroundModes = {
|
||||
enabled = 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -924,6 +961,53 @@
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
B8F37E08B55D2C9C4E2B1B4E /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh",
|
||||
"${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework",
|
||||
);
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KeychainAccess.framework",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
FFB93342C7EB2021A1FFFB6A /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-AltStore-checkManifestLockResult.txt",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
BF1E314C22A0616100370A3C /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
@@ -1017,6 +1101,7 @@
|
||||
BFB11692229322E400BB457C /* DatabaseManager.swift in Sources */,
|
||||
BFBBE2E122931F81002097FA /* InstalledApp.swift in Sources */,
|
||||
BFBBE2DF22931F73002097FA /* App.swift in Sources */,
|
||||
BF43002E22A714AF0051E2BC /* Keychain.swift in Sources */,
|
||||
BFD2478C2284C4C300981D42 /* AppIconImageView.swift in Sources */,
|
||||
BFD2479C2284E19A00981D42 /* AppDetailViewController.swift in Sources */,
|
||||
BFD2476E2284B9A500981D42 /* AppDelegate.swift in Sources */,
|
||||
@@ -1029,6 +1114,7 @@
|
||||
BF0C4EBD22A1BD8B009A2DD7 /* AppManager.swift in Sources */,
|
||||
BFD52BD622A08A85000B7ED1 /* Server.swift in Sources */,
|
||||
BFD2479F2284FBD000981D42 /* UIColor+AltStore.swift in Sources */,
|
||||
BF43003022A71C960051E2BC /* UserDefaults+AltStore.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -1393,6 +1479,7 @@
|
||||
};
|
||||
BFD2477F2284B9A700981D42 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = EA79A60285C6AF5848AA16E9 /* Pods-AltStore.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
@@ -1414,6 +1501,7 @@
|
||||
};
|
||||
BFD247802284B9A700981D42 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = A136EE677716B80768E9F0A2 /* Pods-AltStore.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
|
||||
3
AltStore.xcworkspace/contents.xcworkspacedata
generated
3
AltStore.xcworkspace/contents.xcworkspacedata
generated
@@ -10,4 +10,7 @@
|
||||
<FileRef
|
||||
location = "group:Dependencies/Roxas/Roxas.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:Pods/Pods.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import UserNotifications
|
||||
|
||||
import AltSign
|
||||
import Roxas
|
||||
@@ -29,16 +30,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
{
|
||||
print("Started DatabaseManager")
|
||||
|
||||
AppManager.shared.refresh()
|
||||
AppManager.shared.update()
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
if UserDefaults.standard.firstLaunch == nil
|
||||
{
|
||||
Keychain.shared.appleIDEmailAddress = nil
|
||||
Keychain.shared.appleIDPassword = nil
|
||||
Keychain.shared.signingCertificatePrivateKey = nil
|
||||
|
||||
func applicationWillResignActive(_ application: UIApplication) {
|
||||
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
||||
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
|
||||
UserDefaults.standard.firstLaunch = Date()
|
||||
}
|
||||
|
||||
self.prepareForBackgroundFetch()
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func applicationDidEnterBackground(_ application: UIApplication)
|
||||
@@ -48,15 +55,68 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
|
||||
func applicationWillEnterForeground(_ application: UIApplication)
|
||||
{
|
||||
AppManager.shared.refresh()
|
||||
AppManager.shared.update()
|
||||
ServerManager.shared.startDiscovering()
|
||||
}
|
||||
}
|
||||
|
||||
func applicationDidBecomeActive(_ application: UIApplication) {
|
||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||
extension AppDelegate
|
||||
{
|
||||
private func prepareForBackgroundFetch()
|
||||
{
|
||||
// Fetch every 6 hours.
|
||||
UIApplication.shared.setMinimumBackgroundFetchInterval(60 * 60 * 6)
|
||||
|
||||
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (success, error) in
|
||||
}
|
||||
}
|
||||
|
||||
func applicationWillTerminate(_ application: UIApplication) {
|
||||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
||||
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
|
||||
{
|
||||
ServerManager.shared.startDiscovering()
|
||||
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||
AppManager.shared.refreshAllApps() { (result) in
|
||||
ServerManager.shared.stopDiscovering()
|
||||
|
||||
let content = UNMutableNotificationContent()
|
||||
|
||||
do
|
||||
{
|
||||
let results = try result.get()
|
||||
|
||||
for (_, result) in results
|
||||
{
|
||||
guard case let .failure(error) = result else { continue }
|
||||
throw error
|
||||
}
|
||||
|
||||
print(results)
|
||||
|
||||
content.title = "Refreshed Apps!"
|
||||
content.body = "Successfully refreshed all apps."
|
||||
|
||||
completionHandler(.newData)
|
||||
}
|
||||
catch
|
||||
{
|
||||
print("Failed to refresh apps in background.", error)
|
||||
|
||||
content.title = "Failed to Refresh Apps"
|
||||
content.body = error.localizedDescription
|
||||
|
||||
completionHandler(.failed)
|
||||
}
|
||||
|
||||
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false)
|
||||
|
||||
let request = UNNotificationRequest(identifier: "RefreshedApps", content: content, trigger: trigger)
|
||||
UNUserNotificationCenter.current().add(request) { (error) in
|
||||
if let error = error {
|
||||
print(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,10 @@ extension AppManager
|
||||
case noServersFound
|
||||
case missingPrivateKey
|
||||
case missingCertificate
|
||||
case notAuthenticated
|
||||
|
||||
case multipleCertificates
|
||||
case multipleTeams
|
||||
|
||||
case download(URLError)
|
||||
case authentication(Error)
|
||||
@@ -38,6 +42,9 @@ extension AppManager
|
||||
case .noServersFound: return "An active AltServer could not be found."
|
||||
case .missingPrivateKey: return "A valid private key must be provided."
|
||||
case .missingCertificate: return "A valid certificate must be provided."
|
||||
case .notAuthenticated: return "You must be logged in with your Apple ID to install apps."
|
||||
case .multipleCertificates: return "You must select a certificate to use to install apps."
|
||||
case .multipleTeams: return "You must select a team to use to install apps."
|
||||
case .download(let error): return error.localizedDescription
|
||||
case .authentication(let error): return error.localizedDescription
|
||||
case .fetchingSigningResources(let error): return error.localizedDescription
|
||||
@@ -61,7 +68,7 @@ class AppManager
|
||||
|
||||
extension AppManager
|
||||
{
|
||||
func refresh()
|
||||
func update()
|
||||
{
|
||||
let context = DatabaseManager.shared.persistentContainer.newBackgroundSavingViewContext()
|
||||
|
||||
@@ -143,7 +150,8 @@ extension AppManager
|
||||
expirationDate: Date().addingTimeInterval(60 * 60 * 24 * 7),
|
||||
context: context)
|
||||
|
||||
self.prepare(installedApp, team: team, certificate: certificate, provisioningProfile: profile) { (result) in
|
||||
let signer = ALTSigner(team: team, certificate: certificate)
|
||||
self.prepare(installedApp, provisioningProfile: profile, signer: signer) { (result) in
|
||||
switch result
|
||||
{
|
||||
case .failure(let error): finish(.failure(.prepare(error)))
|
||||
@@ -172,6 +180,74 @@ extension AppManager
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func refreshAllApps(completionHandler: @escaping (Result<[String: Result<Void, Error>], AppError>) -> Void)
|
||||
{
|
||||
let backgroundTaskID = RSTBeginBackgroundTask("com.rileytestut.AltStore.RefreshApps")
|
||||
|
||||
func finish(_ result: Result<[String: Result<Void, Error>], AppError>)
|
||||
{
|
||||
completionHandler(result)
|
||||
|
||||
RSTEndBackgroundTask(backgroundTaskID)
|
||||
}
|
||||
|
||||
// Authenticate
|
||||
self.authenticate(presentingViewController: nil) { (result) in
|
||||
switch result
|
||||
{
|
||||
case .failure(let error): finish(.failure(.authentication(error)))
|
||||
case .success(let team):
|
||||
|
||||
// Fetch Certificate
|
||||
self.fetchCertificate(for: team, presentingViewController: nil) { (result) in
|
||||
switch result
|
||||
{
|
||||
case .failure(let error): finish(.failure(.fetchingSigningResources(error)))
|
||||
case .success(let certificate):
|
||||
let signer = ALTSigner(team: team, certificate: certificate)
|
||||
|
||||
DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
|
||||
do
|
||||
{
|
||||
let fetchRequest = InstalledApp.fetchRequest() as NSFetchRequest<InstalledApp>
|
||||
fetchRequest.relationshipKeyPathsForPrefetching = [#keyPath(InstalledApp.app)]
|
||||
|
||||
let installedApps = try context.fetch(fetchRequest)
|
||||
|
||||
let dispatchGroup = DispatchGroup()
|
||||
var results = [String: Result<Void, Error>]()
|
||||
|
||||
for app in installedApps
|
||||
{
|
||||
dispatchGroup.enter()
|
||||
|
||||
let bundleIdentifier = app.bundleIdentifier
|
||||
print("Refreshing App:", bundleIdentifier)
|
||||
|
||||
self.refresh(app, signer: signer) { (result) in
|
||||
print("Refreshed App: \(bundleIdentifier).", result)
|
||||
results[bundleIdentifier] = result
|
||||
dispatchGroup.leave()
|
||||
}
|
||||
}
|
||||
|
||||
dispatchGroup.notify(queue: .global()) {
|
||||
context.perform { // Keep context alive
|
||||
finish(.success(results))
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
finish(.failure(.prepare(error)))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension AppManager
|
||||
@@ -197,44 +273,64 @@ private extension AppManager
|
||||
downloadTask.resume()
|
||||
}
|
||||
|
||||
func authenticate(presentingViewController: UIViewController, completionHandler: @escaping (Result<ALTTeam, Error>) -> Void)
|
||||
func authenticate(presentingViewController: UIViewController?, completionHandler: @escaping (Result<ALTTeam, Error>) -> Void)
|
||||
{
|
||||
DispatchQueue.main.async {
|
||||
let alertController = UIAlertController(title: "Enter Apple ID + Password", message: "", preferredStyle: .alert)
|
||||
alertController.addTextField { (textField) in
|
||||
textField.placeholder = "Apple ID"
|
||||
textField.textContentType = .emailAddress
|
||||
func authenticate(emailAddress: String, password: String)
|
||||
{
|
||||
ALTAppleAPI.shared.authenticate(appleID: emailAddress, password: password) { (account, error) in
|
||||
do
|
||||
{
|
||||
let account = try Result(account, error).get()
|
||||
|
||||
Keychain.shared.appleIDEmailAddress = emailAddress
|
||||
Keychain.shared.appleIDPassword = password
|
||||
|
||||
self.fetchTeam(for: account, presentingViewController: presentingViewController, completionHandler: completionHandler)
|
||||
}
|
||||
catch
|
||||
{
|
||||
completionHandler(.failure(error))
|
||||
}
|
||||
}
|
||||
alertController.addTextField { (textField) in
|
||||
textField.placeholder = "Password"
|
||||
textField.textContentType = .password
|
||||
}
|
||||
alertController.addAction(.cancel)
|
||||
alertController.addAction(UIAlertAction(title: "Sign In", style: .default) { [unowned alertController] (action) in
|
||||
guard
|
||||
let emailAddress = alertController.textFields![0].text,
|
||||
let password = alertController.textFields![1].text,
|
||||
!emailAddress.isEmpty, !password.isEmpty
|
||||
}
|
||||
|
||||
if let emailAddress = Keychain.shared.appleIDEmailAddress, let password = Keychain.shared.appleIDPassword
|
||||
{
|
||||
authenticate(emailAddress: emailAddress, password: password)
|
||||
}
|
||||
else if let presentingViewController = presentingViewController
|
||||
{
|
||||
DispatchQueue.main.async {
|
||||
let alertController = UIAlertController(title: "Enter Apple ID + Password", message: "", preferredStyle: .alert)
|
||||
alertController.addTextField { (textField) in
|
||||
textField.placeholder = "Apple ID"
|
||||
textField.textContentType = .emailAddress
|
||||
}
|
||||
alertController.addTextField { (textField) in
|
||||
textField.placeholder = "Password"
|
||||
textField.textContentType = .password
|
||||
}
|
||||
alertController.addAction(.cancel)
|
||||
alertController.addAction(UIAlertAction(title: "Sign In", style: .default) { [unowned alertController] (action) in
|
||||
guard
|
||||
let emailAddress = alertController.textFields![0].text,
|
||||
let password = alertController.textFields![1].text,
|
||||
!emailAddress.isEmpty, !password.isEmpty
|
||||
else { return completionHandler(.failure(ALTAppleAPIError(.incorrectCredentials))) }
|
||||
|
||||
ALTAppleAPI.shared.authenticate(appleID: emailAddress, password: password) { (account, error) in
|
||||
do
|
||||
{
|
||||
let account = try Result(account, error).get()
|
||||
self.fetchTeam(for: account, presentingViewController: presentingViewController, completionHandler: completionHandler)
|
||||
}
|
||||
catch
|
||||
{
|
||||
completionHandler(.failure(error))
|
||||
}
|
||||
}
|
||||
})
|
||||
authenticate(emailAddress: emailAddress, password: password)
|
||||
})
|
||||
|
||||
presentingViewController.present(alertController, animated: true, completion: nil)
|
||||
presentingViewController.present(alertController, animated: true, completion: nil)
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
completionHandler(.failure(AppError.notAuthenticated))
|
||||
}
|
||||
}
|
||||
|
||||
func fetchSigningResources(for app: App, team: ALTTeam, presentingViewController: UIViewController, completionHandler: @escaping (Result<(ALTCertificate, ALTProvisioningProfile), Error>) -> Void)
|
||||
func prepareProvisioningProfile(for app: App, team: ALTTeam, completionHandler: @escaping (Result<ALTProvisioningProfile, Error>) -> Void)
|
||||
{
|
||||
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { return completionHandler(.failure(AppError.missingUDID)) }
|
||||
|
||||
@@ -244,27 +340,16 @@ private extension AppManager
|
||||
{
|
||||
_ = try result.get()
|
||||
|
||||
self.fetchCertificate(for: team, presentingViewController: presentingViewController) { (result) in
|
||||
do
|
||||
{
|
||||
let certificate = try result.get()
|
||||
|
||||
app.managedObjectContext?.perform {
|
||||
self.register(app, with: team) { (result) in
|
||||
app.managedObjectContext?.perform {
|
||||
self.register(app, with: team) { (result) in
|
||||
do
|
||||
{
|
||||
let appID = try result.get()
|
||||
self.fetchProvisioningProfile(for: appID, team: team) { (result) in
|
||||
do
|
||||
{
|
||||
let appID = try result.get()
|
||||
self.fetchProvisioningProfile(for: appID, team: team) { (result) in
|
||||
do
|
||||
{
|
||||
let provisioningProfile = try result.get()
|
||||
completionHandler(.success((certificate, provisioningProfile)))
|
||||
}
|
||||
catch
|
||||
{
|
||||
completionHandler(.failure(error))
|
||||
}
|
||||
}
|
||||
let provisioningProfile = try result.get()
|
||||
completionHandler(.success(provisioningProfile))
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -272,6 +357,32 @@ private extension AppManager
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
completionHandler(.failure(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
completionHandler(.failure(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func fetchSigningResources(for app: App, team: ALTTeam, presentingViewController: UIViewController?, completionHandler: @escaping (Result<(ALTCertificate, ALTProvisioningProfile), Error>) -> Void)
|
||||
{
|
||||
self.fetchCertificate(for: team, presentingViewController: presentingViewController) { (result) in
|
||||
do
|
||||
{
|
||||
let certificate = try result.get()
|
||||
|
||||
self.prepareProvisioningProfile(for: app, team: team) { (result) in
|
||||
do
|
||||
{
|
||||
let provisioningProfile = try result.get()
|
||||
completionHandler(.success((certificate, provisioningProfile)))
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -286,7 +397,7 @@ private extension AppManager
|
||||
}
|
||||
}
|
||||
|
||||
func prepare(_ installedApp: InstalledApp, team altTeam: ALTTeam, certificate: ALTCertificate, provisioningProfile: ALTProvisioningProfile, completionHandler: @escaping (Result<URL, Error>) -> Void)
|
||||
func prepare(_ installedApp: InstalledApp, provisioningProfile: ALTProvisioningProfile, signer: ALTSigner, completionHandler: @escaping (Result<URL, Error>) -> Void)
|
||||
{
|
||||
do
|
||||
{
|
||||
@@ -314,7 +425,6 @@ private extension AppManager
|
||||
|
||||
try (infoDictionary as NSDictionary).write(to: bundle.infoPlistURL)
|
||||
|
||||
let signer = ALTSigner(team: altTeam, certificate: certificate)
|
||||
signer.signApp(at: appBundleURL, provisioningProfile: provisioningProfile) { (success, error) in
|
||||
do
|
||||
{
|
||||
@@ -348,7 +458,7 @@ private extension AppManager
|
||||
|
||||
private extension AppManager
|
||||
{
|
||||
func fetchTeam(for account: ALTAccount, presentingViewController: UIViewController, completionHandler: @escaping (Result<ALTTeam, Error>) -> Void)
|
||||
func fetchTeam(for account: ALTAccount, presentingViewController: UIViewController?, completionHandler: @escaping (Result<ALTTeam, Error>) -> Void)
|
||||
{
|
||||
ALTAppleAPI.shared.fetchTeams(for: account) { (teams, error) in
|
||||
do
|
||||
@@ -373,7 +483,7 @@ private extension AppManager
|
||||
})
|
||||
}
|
||||
|
||||
presentingViewController.present(alertController, animated: true, completion: nil)
|
||||
presentingViewController?.present(alertController, animated: true, completion: nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -384,14 +494,22 @@ private extension AppManager
|
||||
}
|
||||
}
|
||||
|
||||
func fetchCertificate(for team: ALTTeam, presentingViewController: UIViewController, completionHandler: @escaping (Result<ALTCertificate, Error>) -> Void)
|
||||
func fetchCertificate(for team: ALTTeam, presentingViewController: UIViewController?, completionHandler: @escaping (Result<ALTCertificate, Error>) -> Void)
|
||||
{
|
||||
ALTAppleAPI.shared.fetchCertificates(for: team) { (certificates, error) in
|
||||
do
|
||||
{
|
||||
let certificates = try Result(certificates, error).get()
|
||||
|
||||
if certificates.count < 1
|
||||
if
|
||||
let identifier = UserDefaults.standard.signingCertificateIdentifier,
|
||||
let privateKey = Keychain.shared.signingCertificatePrivateKey,
|
||||
let certificate = certificates.first(where: { $0.identifier == identifier })
|
||||
{
|
||||
certificate.privateKey = privateKey
|
||||
completionHandler(.success(certificate))
|
||||
}
|
||||
else if certificates.count < 1
|
||||
{
|
||||
let machineName = "AltStore - " + UIDevice.current.name
|
||||
ALTAppleAPI.shared.addCertificate(machineName: machineName, to: team) { (certificate, error) in
|
||||
@@ -411,6 +529,9 @@ private extension AppManager
|
||||
|
||||
certificate.privateKey = privateKey
|
||||
|
||||
UserDefaults.standard.signingCertificateIdentifier = certificate.identifier
|
||||
Keychain.shared.signingCertificatePrivateKey = privateKey
|
||||
|
||||
completionHandler(.success(certificate))
|
||||
}
|
||||
catch
|
||||
@@ -425,7 +546,7 @@ private extension AppManager
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else if let presentingViewController = presentingViewController
|
||||
{
|
||||
DispatchQueue.main.async {
|
||||
let alertController = UIAlertController(title: "Too Many Certificates", message: "Please select the certificate you would like to revoke.", preferredStyle: .actionSheet)
|
||||
@@ -451,6 +572,10 @@ private extension AppManager
|
||||
presentingViewController.present(alertController, animated: true, completion: nil)
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
completionHandler(.failure(AppError.multipleCertificates))
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -518,4 +643,30 @@ private extension AppManager
|
||||
completionHandler(Result(profile, error))
|
||||
}
|
||||
}
|
||||
|
||||
func refresh(_ installedApp: InstalledApp, signer: ALTSigner, completionHandler: @escaping (Result<Void, Error>) -> Void)
|
||||
{
|
||||
self.prepareProvisioningProfile(for: installedApp.app, team: signer.team) { (result) in
|
||||
switch result
|
||||
{
|
||||
case .failure(let error): completionHandler(.failure(error))
|
||||
case .success(let profile):
|
||||
|
||||
installedApp.managedObjectContext?.perform {
|
||||
self.prepare(installedApp, provisioningProfile: profile, signer: signer) { (result) in
|
||||
switch result
|
||||
{
|
||||
case .failure(let error): completionHandler(.failure(error))
|
||||
case .success(let resignedURL):
|
||||
|
||||
// Send app to server
|
||||
installedApp.managedObjectContext?.perform {
|
||||
self.sendAppToServer(fileURL: resignedURL, identifier: installedApp.bundleIdentifier, completionHandler: completionHandler)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
56
AltStore/Components/Keychain.swift
Normal file
56
AltStore/Components/Keychain.swift
Normal file
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// Keychain.swift
|
||||
// AltStore
|
||||
//
|
||||
// Created by Riley Testut on 6/4/19.
|
||||
// Copyright © 2019 Riley Testut. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import KeychainAccess
|
||||
|
||||
import AltSign
|
||||
|
||||
class Keychain
|
||||
{
|
||||
static let shared = Keychain()
|
||||
|
||||
private let keychain = KeychainAccess.Keychain(service: "com.rileytestut.AltStore").accessibility(.afterFirstUnlock).synchronizable(true)
|
||||
|
||||
private init()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
extension Keychain
|
||||
{
|
||||
var appleIDEmailAddress: String? {
|
||||
get {
|
||||
let emailAddress = try? self.keychain.get("appleIDEmailAddress")
|
||||
return emailAddress
|
||||
}
|
||||
set {
|
||||
self.keychain["appleIDEmailAddress"] = newValue
|
||||
}
|
||||
}
|
||||
|
||||
var appleIDPassword: String? {
|
||||
get {
|
||||
let password = try? self.keychain.get("appleIDPassword")
|
||||
return password
|
||||
}
|
||||
set {
|
||||
self.keychain["appleIDPassword"] = newValue
|
||||
}
|
||||
}
|
||||
|
||||
var signingCertificatePrivateKey: Data? {
|
||||
get {
|
||||
let privateKey = try? self.keychain.getData("signingCertificatePrivateKey")
|
||||
return privateKey
|
||||
}
|
||||
set {
|
||||
self.keychain[data: "signingCertificatePrivateKey"] = newValue
|
||||
}
|
||||
}
|
||||
}
|
||||
15
AltStore/Extensions/UserDefaults+AltStore.swift
Normal file
15
AltStore/Extensions/UserDefaults+AltStore.swift
Normal file
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// UserDefaults+AltStore.swift
|
||||
// AltStore
|
||||
//
|
||||
// Created by Riley Testut on 6/4/19.
|
||||
// Copyright © 2019 Riley Testut. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
extension UserDefaults
|
||||
{
|
||||
@NSManaged var firstLaunch: Date?
|
||||
@NSManaged var signingCertificateIdentifier: String?
|
||||
}
|
||||
@@ -26,6 +26,10 @@
|
||||
</array>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>fetch</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
|
||||
2
Dependencies/AltSign
vendored
2
Dependencies/AltSign
vendored
Submodule Dependencies/AltSign updated: e3cee11a3a...0065e75201
11
Podfile
Normal file
11
Podfile
Normal file
@@ -0,0 +1,11 @@
|
||||
inhibit_all_warnings!
|
||||
|
||||
target 'AltStore' do
|
||||
platform :ios, '12.0'
|
||||
|
||||
use_frameworks!
|
||||
|
||||
# Pods for AltStore
|
||||
pod 'KeychainAccess', '~> 3.2.0'
|
||||
|
||||
end
|
||||
16
Podfile.lock
Normal file
16
Podfile.lock
Normal file
@@ -0,0 +1,16 @@
|
||||
PODS:
|
||||
- KeychainAccess (3.2.0)
|
||||
|
||||
DEPENDENCIES:
|
||||
- KeychainAccess (~> 3.2.0)
|
||||
|
||||
SPEC REPOS:
|
||||
https://github.com/cocoapods/specs.git:
|
||||
- KeychainAccess
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
KeychainAccess: 3b1bf8a77eb4c6ea1ce9404c292e48f948954c6b
|
||||
|
||||
PODFILE CHECKSUM: 6a1695fc6ba95ee2a4044665937e8ac08a4c4572
|
||||
|
||||
COCOAPODS: 1.6.1
|
||||
22
Pods/KeychainAccess/LICENSE
generated
Normal file
22
Pods/KeychainAccess/LICENSE
generated
Normal file
@@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 kishikawa katsumi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
2933
Pods/KeychainAccess/Lib/KeychainAccess/Keychain.swift
generated
Normal file
2933
Pods/KeychainAccess/Lib/KeychainAccess/Keychain.swift
generated
Normal file
File diff suppressed because it is too large
Load Diff
602
Pods/KeychainAccess/README.md
generated
Normal file
602
Pods/KeychainAccess/README.md
generated
Normal file
@@ -0,0 +1,602 @@
|
||||
# KeychainAccess
|
||||
[](https://travis-ci.org/kishikawakatsumi/KeychainAccess)
|
||||
[](https://codecov.io/gh/kishikawakatsumi/KeychainAccess)
|
||||
[](https://github.com/Carthage/Carthage)
|
||||
[](http://cocoadocs.org/docsets/KeychainAccess)
|
||||
[](http://cocoadocs.org/docsets/KeychainAccess)
|
||||
[](https://swift.org/)
|
||||
[](https://swift.org/)
|
||||
[](https://swift.org/)
|
||||
[](https://swift.org/)
|
||||
|
||||
KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X. Makes using Keychain APIs extremely easy and much more palatable to use in Swift.
|
||||
|
||||
<img src="https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/01.png" width="320px" />
|
||||
<img src="https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/02.png" width="320px" />
|
||||
<img src="https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/03.png" width="320px" />
|
||||
|
||||
## :bulb: Features
|
||||
|
||||
- Simple interface
|
||||
- Support access group
|
||||
- [Support accessibility](#accessibility)
|
||||
- [Support iCloud sharing](#icloud_sharing)
|
||||
- **[Support TouchID and Keychain integration (iOS 8+)](#touch_id_integration)**
|
||||
- **[Support Shared Web Credentials (iOS 8+)](#shared_web_credentials)**
|
||||
- [Works on both iOS & OS X](#requirements)
|
||||
- [watchOS and tvOS are supported](#requirements)
|
||||
- **[Swift 4 & Swift 3 compatible](#requirements)**
|
||||
|
||||
## :book: Usage
|
||||
|
||||
##### :eyes: See also:
|
||||
- [:link: iOS Example Project](https://github.com/kishikawakatsumi/KeychainAccess/tree/master/Examples/Example-iOS)
|
||||
|
||||
### :key: Basics
|
||||
|
||||
#### Saving Application Password
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
|
||||
```
|
||||
|
||||
#### Saving Internet Password
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://github.com", protocolType: .https)
|
||||
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
|
||||
```
|
||||
|
||||
### :key: Instantiation
|
||||
|
||||
#### Create Keychain for Application Password
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
```
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token", accessGroup: "12ABCD3E4F.shared")
|
||||
```
|
||||
|
||||
#### Create Keychain for Internet Password
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://github.com", protocolType: .https)
|
||||
```
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://github.com", protocolType: .https, authenticationType: .htmlForm)
|
||||
```
|
||||
|
||||
### :key: Adding an item
|
||||
|
||||
#### subscripting
|
||||
|
||||
##### for String
|
||||
|
||||
```swift
|
||||
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
|
||||
```
|
||||
|
||||
```swift
|
||||
keychain[string: "kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
|
||||
```
|
||||
|
||||
##### for NSData
|
||||
|
||||
```swift
|
||||
keychain[data: "secret"] = NSData(contentsOfFile: "secret.bin")
|
||||
```
|
||||
|
||||
#### set method
|
||||
|
||||
```swift
|
||||
keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
```
|
||||
|
||||
#### error handling
|
||||
|
||||
```swift
|
||||
do {
|
||||
try keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
}
|
||||
catch let error {
|
||||
print(error)
|
||||
}
|
||||
```
|
||||
|
||||
### :key: Obtaining an item
|
||||
|
||||
#### subscripting
|
||||
|
||||
##### for String (If the value is NSData, attempt to convert to String)
|
||||
|
||||
```swift
|
||||
let token = keychain["kishikawakatsumi"]
|
||||
```
|
||||
|
||||
```swift
|
||||
let token = keychain[string: "kishikawakatsumi"]
|
||||
```
|
||||
|
||||
##### for NSData
|
||||
|
||||
```swift
|
||||
let secretData = keychain[data: "secret"]
|
||||
```
|
||||
|
||||
#### get methods
|
||||
|
||||
##### as String
|
||||
|
||||
```swift
|
||||
let token = try? keychain.get("kishikawakatsumi")
|
||||
```
|
||||
|
||||
```swift
|
||||
let token = try? keychain.getString("kishikawakatsumi")
|
||||
```
|
||||
|
||||
##### as NSData
|
||||
|
||||
```swift
|
||||
let data = try? keychain.getData("kishikawakatsumi")
|
||||
```
|
||||
|
||||
### :key: Removing an item
|
||||
|
||||
#### subscripting
|
||||
|
||||
```swift
|
||||
keychain["kishikawakatsumi"] = nil
|
||||
```
|
||||
|
||||
#### remove method
|
||||
|
||||
```swift
|
||||
do {
|
||||
try keychain.remove("kishikawakatsumi")
|
||||
} catch let error {
|
||||
print("error: \(error)")
|
||||
}
|
||||
```
|
||||
|
||||
### :key: Set Label and Comment
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://github.com", protocolType: .https)
|
||||
do {
|
||||
try keychain
|
||||
.label("github.com (kishikawakatsumi)")
|
||||
.comment("github access token")
|
||||
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
} catch let error {
|
||||
print("error: \(error)")
|
||||
}
|
||||
```
|
||||
|
||||
### :key: Obtaining Other Attributes
|
||||
|
||||
#### PersistentRef
|
||||
|
||||
```swift
|
||||
let keychain = Keychain()
|
||||
let persistentRef = keychain[attributes: "kishikawakatsumi"].persistentRef
|
||||
...
|
||||
```
|
||||
|
||||
#### Creation Date
|
||||
|
||||
```swift
|
||||
let keychain = Keychain()
|
||||
let creationDate = keychain[attributes: "kishikawakatsumi"].creationDate
|
||||
...
|
||||
```
|
||||
|
||||
#### All Attributes
|
||||
|
||||
```swift
|
||||
let keychain = Keychain()
|
||||
do {
|
||||
let attributes = try keychain.get("kishikawakatsumi") { $0 }
|
||||
print(attributes.comment)
|
||||
print(attributes.label)
|
||||
print(attributes.creator)
|
||||
...
|
||||
} catch let error {
|
||||
print("error: \(error)")
|
||||
}
|
||||
```
|
||||
|
||||
##### subscripting
|
||||
|
||||
```swift
|
||||
let keychain = Keychain()
|
||||
let attributes = keychain[attributes: "kishikawakatsumi"]
|
||||
print(attributes.comment)
|
||||
print(attributes.label)
|
||||
print(attributes.creator)
|
||||
```
|
||||
|
||||
### :key: Configuration (Accessibility, Sharing, iCloud Sync)
|
||||
|
||||
**Provides fluent interfaces**
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
.label("github.com (kishikawakatsumi)")
|
||||
.synchronizable(true)
|
||||
.accessibility(.afterFirstUnlock)
|
||||
```
|
||||
|
||||
#### <a name="accessibility"> Accessibility
|
||||
|
||||
##### Default accessibility matches background application (=kSecAttrAccessibleAfterFirstUnlock)
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
```
|
||||
|
||||
##### For background application
|
||||
|
||||
###### Creating instance
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
.accessibility(.afterFirstUnlock)
|
||||
|
||||
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
|
||||
```
|
||||
|
||||
###### One-shot
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
|
||||
do {
|
||||
try keychain
|
||||
.accessibility(.afterFirstUnlock)
|
||||
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
} catch let error {
|
||||
print("error: \(error)")
|
||||
}
|
||||
```
|
||||
|
||||
##### For foreground application
|
||||
|
||||
###### Creating instance
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
.accessibility(.whenUnlocked)
|
||||
|
||||
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
|
||||
```
|
||||
|
||||
###### One-shot
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
|
||||
do {
|
||||
try keychain
|
||||
.accessibility(.whenUnlocked)
|
||||
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
} catch let error {
|
||||
print("error: \(error)")
|
||||
}
|
||||
```
|
||||
|
||||
#### :couple: Sharing Keychain items
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token", accessGroup: "12ABCD3E4F.shared")
|
||||
```
|
||||
|
||||
#### <a name="icloud_sharing"> :arrows_counterclockwise: Synchronizing Keychain items with iCloud
|
||||
|
||||
###### Creating instance
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
.synchronizable(true)
|
||||
|
||||
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
|
||||
```
|
||||
|
||||
###### One-shot
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
|
||||
do {
|
||||
try keychain
|
||||
.synchronizable(true)
|
||||
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
} catch let error {
|
||||
print("error: \(error)")
|
||||
}
|
||||
```
|
||||
|
||||
### <a name="touch_id_integration"> :fu: Touch ID integration
|
||||
|
||||
**Any Operation that require authentication must be run in the background thread.**
|
||||
**If you run in the main thread, UI thread will lock for the system to try to display the authentication dialog.**
|
||||
|
||||
#### :closed_lock_with_key: Adding a Touch ID protected item
|
||||
|
||||
If you want to store the Touch ID protected Keychain item, specify `accessibility` and `authenticationPolicy` attributes.
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
|
||||
DispatchQueue.global().async {
|
||||
do {
|
||||
// Should be the secret invalidated when passcode is removed? If not then use `.WhenUnlocked`
|
||||
try keychain
|
||||
.accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence)
|
||||
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
} catch let error {
|
||||
// Error handling if needed...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### :closed_lock_with_key: Updating a Touch ID protected item
|
||||
|
||||
The same way as when adding.
|
||||
|
||||
**Do not run in the main thread if there is a possibility that the item you are trying to add already exists, and protected.**
|
||||
**Because updating protected items requires authentication.**
|
||||
|
||||
Additionally, you want to show custom authentication prompt message when updating, specify an `authenticationPrompt` attribute.
|
||||
If the item not protected, the `authenticationPrompt` parameter just be ignored.
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
|
||||
DispatchQueue.global().async {
|
||||
do {
|
||||
// Should be the secret invalidated when passcode is removed? If not then use `.WhenUnlocked`
|
||||
try keychain
|
||||
.accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence)
|
||||
.authenticationPrompt("Authenticate to update your access token")
|
||||
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
|
||||
} catch let error {
|
||||
// Error handling if needed...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### :closed_lock_with_key: Obtaining a Touch ID protected item
|
||||
|
||||
The same way as when you get a normal item. It will be displayed automatically Touch ID or passcode authentication If the item you try to get is protected.
|
||||
If you want to show custom authentication prompt message, specify an `authenticationPrompt` attribute.
|
||||
If the item not protected, the `authenticationPrompt` parameter just be ignored.
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
|
||||
DispatchQueue.global().async {
|
||||
do {
|
||||
let password = try keychain
|
||||
.authenticationPrompt("Authenticate to login to server")
|
||||
.get("kishikawakatsumi")
|
||||
|
||||
print("password: \(password)")
|
||||
} catch let error {
|
||||
// Error handling if needed...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### :closed_lock_with_key: Removing a Touch ID protected item
|
||||
|
||||
The same way as when you remove a normal item.
|
||||
There is no way to show Touch ID or passcode authentication when removing Keychain items.
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(service: "com.example.github-token")
|
||||
|
||||
do {
|
||||
try keychain.remove("kishikawakatsumi")
|
||||
} catch let error {
|
||||
// Error handling if needed...
|
||||
}
|
||||
```
|
||||
|
||||
### <a name="shared_web_credentials"> :key: Shared Web Credentials
|
||||
|
||||
> Shared web credentials is a programming interface that enables native iOS apps to share credentials with their website counterparts. For example, a user may log in to a website in Safari, entering a user name and password, and save those credentials using the iCloud Keychain. Later, the user may run a native app from the same developer, and instead of the app requiring the user to reenter a user name and password, shared web credentials gives it access to the credentials that were entered earlier in Safari. The user can also create new accounts, update passwords, or delete her account from within the app. These changes are then saved and used by Safari.
|
||||
<https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/>
|
||||
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://www.kishikawakatsumi.com", protocolType: .HTTPS)
|
||||
|
||||
let username = "kishikawakatsumi@mac.com"
|
||||
|
||||
// First, check the credential in the app's Keychain
|
||||
if let password = try? keychain.get(username) {
|
||||
// If found password in the Keychain,
|
||||
// then log into the server
|
||||
} else {
|
||||
// If not found password in the Keychain,
|
||||
// try to read from Shared Web Credentials
|
||||
keychain.getSharedPassword(username) { (password, error) -> () in
|
||||
if password != nil {
|
||||
// If found password in the Shared Web Credentials,
|
||||
// then log into the server
|
||||
// and save the password to the Keychain
|
||||
|
||||
keychain[username] = password
|
||||
} else {
|
||||
// If not found password either in the Keychain also Shared Web Credentials,
|
||||
// prompt for username and password
|
||||
|
||||
// Log into server
|
||||
|
||||
// If the login is successful,
|
||||
// save the credentials to both the Keychain and the Shared Web Credentials.
|
||||
|
||||
keychain[username] = inputPassword
|
||||
keychain.setSharedPassword(inputPassword, account: username)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Request all associated domain's credentials
|
||||
|
||||
```swift
|
||||
Keychain.requestSharedWebCredential { (credentials, error) -> () in
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
#### Generate strong random password
|
||||
|
||||
Generate strong random password that is in the same format used by Safari autofill (xxx-xxx-xxx-xxx).
|
||||
|
||||
```swift
|
||||
let password = Keychain.generatePassword() // => Nhu-GKm-s3n-pMx
|
||||
```
|
||||
|
||||
#### How to set up Shared Web Credentials
|
||||
|
||||
> 1. Add a com.apple.developer.associated-domains entitlement to your app. This entitlement must include all the domains with which you want to share credentials.
|
||||
|
||||
> 2. Add an apple-app-site-association file to your website. This file must include application identifiers for all the apps with which the site wants to share credentials, and it must be properly signed.
|
||||
|
||||
> 3. When the app is installed, the system downloads and verifies the site association file for each of its associated domains. If the verification is successful, the app is associated with the domain.
|
||||
|
||||
**More details:**
|
||||
<https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/>
|
||||
|
||||
### :key: Debugging
|
||||
|
||||
#### Display all stored items if print keychain object
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://github.com", protocolType: .https)
|
||||
print("\(keychain)")
|
||||
```
|
||||
|
||||
```
|
||||
=>
|
||||
[
|
||||
[authenticationType: default, key: kishikawakatsumi, server: github.com, class: internetPassword, protocol: https]
|
||||
[authenticationType: default, key: hirohamada, server: github.com, class: internetPassword, protocol: https]
|
||||
[authenticationType: default, key: honeylemon, server: github.com, class: internetPassword, protocol: https]
|
||||
]
|
||||
```
|
||||
|
||||
#### Obtaining all stored keys
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://github.com", protocolType: .https)
|
||||
|
||||
let keys = keychain.allKeys()
|
||||
for key in keys {
|
||||
print("key: \(key)")
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
=>
|
||||
key: kishikawakatsumi
|
||||
key: hirohamada
|
||||
key: honeylemon
|
||||
```
|
||||
|
||||
#### Obtaining all stored items
|
||||
|
||||
```swift
|
||||
let keychain = Keychain(server: "https://github.com", protocolType: .https)
|
||||
|
||||
let items = keychain.allItems()
|
||||
for item in items {
|
||||
print("item: \(item)")
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
=>
|
||||
item: [authenticationType: Default, key: kishikawakatsumi, server: github.com, class: InternetPassword, protocol: https]
|
||||
item: [authenticationType: Default, key: hirohamada, server: github.com, class: InternetPassword, protocol: https]
|
||||
item: [authenticationType: Default, key: honeylemon, server: github.com, class: InternetPassword, protocol: https]
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
| | OS | Swift |
|
||||
|------------|----------------------------------------|---------------|
|
||||
| **v1.1.x** | iOS 7+, OSX 10.9+ | 1.1 |
|
||||
| **v1.2.x** | iOS 7+, OSX 10.9+ | 1.2 |
|
||||
| **v2.0.x** | iOS 7+, OSX 10.9+, watchOS 2+ | 2.0 |
|
||||
| **v2.1.x** | iOS 7+, OSX 10.9+, watchOS 2+ | 2.0 |
|
||||
| **v2.2.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 2.0, 2.1 |
|
||||
| **v2.3.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 2.0, 2.1, 2.2 |
|
||||
| **v2.4.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 2.2, 2.3 |
|
||||
| **v3.0.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 3.x |
|
||||
| **v3.1.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 4.0, 4.1, 4.2 |
|
||||
|
||||
## Installation
|
||||
|
||||
### CocoaPods
|
||||
|
||||
KeychainAccess is available through [CocoaPods](http://cocoapods.org). To install
|
||||
it, simply add the following lines to your Podfile:
|
||||
|
||||
```ruby
|
||||
use_frameworks!
|
||||
pod 'KeychainAccess'
|
||||
```
|
||||
|
||||
### Carthage
|
||||
|
||||
KeychainAccess is available through [Carthage](https://github.com/Carthage/Carthage). To install
|
||||
it, simply add the following line to your Cartfile:
|
||||
|
||||
`github "kishikawakatsumi/KeychainAccess"`
|
||||
|
||||
### Swift Package Manager
|
||||
|
||||
KeychainAccess is also available through [Swift Package Manager](https://github.com/apple/swift-package-manager/).
|
||||
First, create `Package.swift` that its package declaration includes:
|
||||
|
||||
```swift
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
dependencies: [
|
||||
.Package(url: "https://github.com/kishikawakatsumi/KeychainAccess.git", majorVersion: 2)
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
Then, type
|
||||
|
||||
```shell
|
||||
$ swift build
|
||||
```
|
||||
|
||||
### To manually add to your project
|
||||
|
||||
1. Add `Lib/KeychainAccess.xcodeproj` to your project
|
||||
2. Link `KeychainAccess.framework` with your target
|
||||
3. Add `Copy Files Build Phase` to include the framework to your application bundle
|
||||
|
||||
_See [iOS Example Project](https://github.com/kishikawakatsumi/KeychainAccess/tree/master/Examples/Example-iOS) as reference._
|
||||
|
||||
<img src="https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/Installation.png" width="800px" />
|
||||
|
||||
## Author
|
||||
|
||||
kishikawa katsumi, kishikawakatsumi@mac.com
|
||||
|
||||
## License
|
||||
|
||||
KeychainAccess is available under the MIT license. See the LICENSE file for more info.
|
||||
16
Pods/Manifest.lock
generated
Normal file
16
Pods/Manifest.lock
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
PODS:
|
||||
- KeychainAccess (3.2.0)
|
||||
|
||||
DEPENDENCIES:
|
||||
- KeychainAccess (~> 3.2.0)
|
||||
|
||||
SPEC REPOS:
|
||||
https://github.com/cocoapods/specs.git:
|
||||
- KeychainAccess
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
KeychainAccess: 3b1bf8a77eb4c6ea1ce9404c292e48f948954c6b
|
||||
|
||||
PODFILE CHECKSUM: 6a1695fc6ba95ee2a4044665937e8ac08a4c4572
|
||||
|
||||
COCOAPODS: 1.6.1
|
||||
603
Pods/Pods.xcodeproj/project.pbxproj
generated
Normal file
603
Pods/Pods.xcodeproj/project.pbxproj
generated
Normal file
@@ -0,0 +1,603 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 50;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
5A8E10AA29B392DAE441976836D393A5 /* KeychainAccess-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DC95F84ADCC7EA0D937C9F7E1A13FD3F /* KeychainAccess-dummy.m */; };
|
||||
84799F206FB756858DA1341F7AEC702F /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A8D4AA4DF9DABA6B3E0870FA4FF211 /* Keychain.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
|
||||
853F25B704B9C1E0728C8355490C3E8B /* Pods-AltStore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B40162929DC081B191D728E6A63F10 /* Pods-AltStore-dummy.m */; };
|
||||
8C461642DA35C9D0EE56FAC4A9B7EB98 /* Pods-AltStore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A6C251E1905FCD10CB7FAFE104093724 /* Pods-AltStore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
92B9A2B19BE39566C6CACFD26BF134C4 /* KeychainAccess-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C9FE5B73BA33889545E29DB12D4DF6CF /* KeychainAccess-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
E508379E4792F37F65760D68B758E547 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; };
|
||||
E8395200A45B1D891CABD0675CDFEB7B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
9FFDB3D153C5FA18B6FD59B50C54CAAD /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 3F895CBA524B654D3F837F25BFBE2262;
|
||||
remoteInfo = KeychainAccess;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
12FBD321A774CE97AC1213C6B240DC9F /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.release.xcconfig"; sourceTree = "<group>"; };
|
||||
26B0AFC87F31102D2BE23BCC938B1223 /* Pods-AltStore-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-acknowledgements.plist"; sourceTree = "<group>"; };
|
||||
381EB86F7712B890E418E54C20FB51E3 /* Pods-AltStore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-Info.plist"; sourceTree = "<group>"; };
|
||||
4DBA4D739ECCF9E52DA7C1AFF75568B0 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
5EA1AF6D01DBBAE8075A59F88B649449 /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = KeychainAccess.framework; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
70C1D1D165319C9CE56A3D43DDFBF1DC /* KeychainAccess-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "KeychainAccess-Info.plist"; sourceTree = "<group>"; };
|
||||
87BB091C7209D9D07DFA5FFB06428B65 /* KeychainAccess.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.xcconfig; sourceTree = "<group>"; };
|
||||
96AD8FCF302BCD7BCBBEE0FEB1F64ACE /* Pods-AltStore-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltStore-acknowledgements.markdown"; sourceTree = "<group>"; };
|
||||
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
|
||||
A6C251E1905FCD10CB7FAFE104093724 /* Pods-AltStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltStore-umbrella.h"; sourceTree = "<group>"; };
|
||||
B329E578A66D5B034937A60730C4AEA7 /* KeychainAccess.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KeychainAccess.modulemap; sourceTree = "<group>"; };
|
||||
B38C6112DA4290AC0E677628F897988F /* Pods-AltStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltStore.modulemap"; sourceTree = "<group>"; };
|
||||
BD6733F0EF9D699F0FFB110363BB951D /* Pods-AltStore-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltStore-frameworks.sh"; sourceTree = "<group>"; };
|
||||
C1A8D4AA4DF9DABA6B3E0870FA4FF211 /* Keychain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Keychain.swift; path = Lib/KeychainAccess/Keychain.swift; sourceTree = "<group>"; };
|
||||
C6FE0CABF5936907F3B06C5EC42CC92A /* KeychainAccess-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-prefix.pch"; sourceTree = "<group>"; };
|
||||
C9FE5B73BA33889545E29DB12D4DF6CF /* KeychainAccess-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-umbrella.h"; sourceTree = "<group>"; };
|
||||
CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
|
||||
DC95F84ADCC7EA0D937C9F7E1A13FD3F /* KeychainAccess-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KeychainAccess-dummy.m"; sourceTree = "<group>"; };
|
||||
F1AAD8D354A54F78205D3DC08E311FA3 /* Pods_AltStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AltStore.framework; path = "Pods-AltStore.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
F5B40162929DC081B191D728E6A63F10 /* Pods-AltStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltStore-dummy.m"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
97AFD54D8F68D9249D86AB9692333E16 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
E508379E4792F37F65760D68B758E547 /* Foundation.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
FDED646FFE773E48D6F071CBE9862359 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
E8395200A45B1D891CABD0675CDFEB7B /* Foundation.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
1822CF174BA8C3BC1C6A1BCD70C74D9E /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
21FB2FA785D073B5E18E48DDEE0CE582 /* KeychainAccess */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
21FB2FA785D073B5E18E48DDEE0CE582 /* KeychainAccess */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
C1A8D4AA4DF9DABA6B3E0870FA4FF211 /* Keychain.swift */,
|
||||
B15474ABEC92ADDC00515B28B5193997 /* Support Files */,
|
||||
);
|
||||
name = KeychainAccess;
|
||||
path = KeychainAccess;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
2D98B260CC94787B2358F221289A3927 /* Pods-AltStore */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B38C6112DA4290AC0E677628F897988F /* Pods-AltStore.modulemap */,
|
||||
96AD8FCF302BCD7BCBBEE0FEB1F64ACE /* Pods-AltStore-acknowledgements.markdown */,
|
||||
26B0AFC87F31102D2BE23BCC938B1223 /* Pods-AltStore-acknowledgements.plist */,
|
||||
F5B40162929DC081B191D728E6A63F10 /* Pods-AltStore-dummy.m */,
|
||||
BD6733F0EF9D699F0FFB110363BB951D /* Pods-AltStore-frameworks.sh */,
|
||||
381EB86F7712B890E418E54C20FB51E3 /* Pods-AltStore-Info.plist */,
|
||||
A6C251E1905FCD10CB7FAFE104093724 /* Pods-AltStore-umbrella.h */,
|
||||
4DBA4D739ECCF9E52DA7C1AFF75568B0 /* Pods-AltStore.debug.xcconfig */,
|
||||
12FBD321A774CE97AC1213C6B240DC9F /* Pods-AltStore.release.xcconfig */,
|
||||
);
|
||||
name = "Pods-AltStore";
|
||||
path = "Target Support Files/Pods-AltStore";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9B055D0CFEA43187E72B03DED11F5662 /* iOS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */,
|
||||
);
|
||||
name = iOS;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B15474ABEC92ADDC00515B28B5193997 /* Support Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B329E578A66D5B034937A60730C4AEA7 /* KeychainAccess.modulemap */,
|
||||
87BB091C7209D9D07DFA5FFB06428B65 /* KeychainAccess.xcconfig */,
|
||||
DC95F84ADCC7EA0D937C9F7E1A13FD3F /* KeychainAccess-dummy.m */,
|
||||
70C1D1D165319C9CE56A3D43DDFBF1DC /* KeychainAccess-Info.plist */,
|
||||
C6FE0CABF5936907F3B06C5EC42CC92A /* KeychainAccess-prefix.pch */,
|
||||
C9FE5B73BA33889545E29DB12D4DF6CF /* KeychainAccess-umbrella.h */,
|
||||
);
|
||||
name = "Support Files";
|
||||
path = "../Target Support Files/KeychainAccess";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
C503C40C4D61FFD0A7542EA7A5BA8470 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5EA1AF6D01DBBAE8075A59F88B649449 /* KeychainAccess.framework */,
|
||||
F1AAD8D354A54F78205D3DC08E311FA3 /* Pods_AltStore.framework */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CF1408CF629C7361332E53B88F7BD30C = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
|
||||
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
|
||||
1822CF174BA8C3BC1C6A1BCD70C74D9E /* Pods */,
|
||||
C503C40C4D61FFD0A7542EA7A5BA8470 /* Products */,
|
||||
EF5F913657CC5FD110C6B562EDEABE4B /* Targets Support Files */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9B055D0CFEA43187E72B03DED11F5662 /* iOS */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
EF5F913657CC5FD110C6B562EDEABE4B /* Targets Support Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
2D98B260CC94787B2358F221289A3927 /* Pods-AltStore */,
|
||||
);
|
||||
name = "Targets Support Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
35EA24761FC20AE2B8CC8E9670E57DC5 /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
92B9A2B19BE39566C6CACFD26BF134C4 /* KeychainAccess-umbrella.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
511D4143282C493D1B0E8F20439A604C /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8C461642DA35C9D0EE56FAC4A9B7EB98 /* Pods-AltStore-umbrella.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
3F895CBA524B654D3F837F25BFBE2262 /* KeychainAccess */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = DE15D3D37E993FBD358414CD9F51D3B6 /* Build configuration list for PBXNativeTarget "KeychainAccess" */;
|
||||
buildPhases = (
|
||||
35EA24761FC20AE2B8CC8E9670E57DC5 /* Headers */,
|
||||
BED7319EC5283C148574010E5AB999C0 /* Sources */,
|
||||
FDED646FFE773E48D6F071CBE9862359 /* Frameworks */,
|
||||
153594991ADE9BDDE5FB6C2FDB474216 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = KeychainAccess;
|
||||
productName = KeychainAccess;
|
||||
productReference = 5EA1AF6D01DBBAE8075A59F88B649449 /* KeychainAccess.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
A24BCCF0615F19EF15C5175F5155059B /* Pods-AltStore */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 9DCE5F54F9F65C3281FF75A7483961D6 /* Build configuration list for PBXNativeTarget "Pods-AltStore" */;
|
||||
buildPhases = (
|
||||
511D4143282C493D1B0E8F20439A604C /* Headers */,
|
||||
B416FEBA18E397F57E54B00750E42DD5 /* Sources */,
|
||||
97AFD54D8F68D9249D86AB9692333E16 /* Frameworks */,
|
||||
E76406DC9B6AA5D67A3AC649D0F24293 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
E524462E97292EC1913EB28B4E5A395E /* PBXTargetDependency */,
|
||||
);
|
||||
name = "Pods-AltStore";
|
||||
productName = "Pods-AltStore";
|
||||
productReference = F1AAD8D354A54F78205D3DC08E311FA3 /* Pods_AltStore.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 0930;
|
||||
LastUpgradeCheck = 0930;
|
||||
};
|
||||
buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = CF1408CF629C7361332E53B88F7BD30C;
|
||||
productRefGroup = C503C40C4D61FFD0A7542EA7A5BA8470 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
3F895CBA524B654D3F837F25BFBE2262 /* KeychainAccess */,
|
||||
A24BCCF0615F19EF15C5175F5155059B /* Pods-AltStore */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
153594991ADE9BDDE5FB6C2FDB474216 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
E76406DC9B6AA5D67A3AC649D0F24293 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
B416FEBA18E397F57E54B00750E42DD5 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
853F25B704B9C1E0728C8355490C3E8B /* Pods-AltStore-dummy.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
BED7319EC5283C148574010E5AB999C0 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
84799F206FB756858DA1341F7AEC702F /* Keychain.swift in Sources */,
|
||||
5A8E10AA29B392DAE441976836D393A5 /* KeychainAccess-dummy.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
E524462E97292EC1913EB28B4E5A395E /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = KeychainAccess;
|
||||
target = 3F895CBA524B654D3F837F25BFBE2262 /* KeychainAccess */;
|
||||
targetProxy = 9FFDB3D153C5FA18B6FD59B50C54CAAD /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
0DFF4363645F04A33C4CA0552E2894B6 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 12FBD321A774CE97AC1213C6B240DC9F /* Pods-AltStore.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
|
||||
CLANG_ENABLE_OBJC_WEAK = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
MACH_O_TYPE = staticlib;
|
||||
MODULEMAP_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore.modulemap";
|
||||
OTHER_LDFLAGS = "";
|
||||
OTHER_LIBTOOLFLAGS = "";
|
||||
PODS_ROOT = "$(SRCROOT)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
4093433A309EFE160336AC736594AB22 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"POD_CONFIGURATION_DEBUG=1",
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
STRIP_INSTALLED_PRODUCT = NO;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SYMROOT = "${SRCROOT}/../build";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
55F18E06825E1BFC1A262F9FC0752F52 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 87BB091C7209D9D07DFA5FFB06428B65 /* KeychainAccess.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
GCC_PREFIX_HEADER = "Target Support Files/KeychainAccess/KeychainAccess-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/KeychainAccess/KeychainAccess-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
MODULEMAP_FILE = "Target Support Files/KeychainAccess/KeychainAccess.modulemap";
|
||||
PRODUCT_MODULE_NAME = KeychainAccess;
|
||||
PRODUCT_NAME = KeychainAccess;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
924D56B1D59CD3049300EAEEA256114E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"POD_CONFIGURATION_RELEASE=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
STRIP_INSTALLED_PRODUCT = NO;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SYMROOT = "${SRCROOT}/../build";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
BC334190485B1F4408F03EDF94A692EF /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 87BB091C7209D9D07DFA5FFB06428B65 /* KeychainAccess.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
GCC_PREFIX_HEADER = "Target Support Files/KeychainAccess/KeychainAccess-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/KeychainAccess/KeychainAccess-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
MODULEMAP_FILE = "Target Support Files/KeychainAccess/KeychainAccess.modulemap";
|
||||
PRODUCT_MODULE_NAME = KeychainAccess;
|
||||
PRODUCT_NAME = KeychainAccess;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
F1AB5B87B0E318FCDC88C0E5FF60B9A4 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 4DBA4D739ECCF9E52DA7C1AFF75568B0 /* Pods-AltStore.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
|
||||
CLANG_ENABLE_OBJC_WEAK = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
MACH_O_TYPE = staticlib;
|
||||
MODULEMAP_FILE = "Target Support Files/Pods-AltStore/Pods-AltStore.modulemap";
|
||||
OTHER_LDFLAGS = "";
|
||||
OTHER_LIBTOOLFLAGS = "";
|
||||
PODS_ROOT = "$(SRCROOT)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
4093433A309EFE160336AC736594AB22 /* Debug */,
|
||||
924D56B1D59CD3049300EAEEA256114E /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
9DCE5F54F9F65C3281FF75A7483961D6 /* Build configuration list for PBXNativeTarget "Pods-AltStore" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
F1AB5B87B0E318FCDC88C0E5FF60B9A4 /* Debug */,
|
||||
0DFF4363645F04A33C4CA0552E2894B6 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
DE15D3D37E993FBD358414CD9F51D3B6 /* Build configuration list for PBXNativeTarget "KeychainAccess" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
55F18E06825E1BFC1A262F9FC0752F52 /* Debug */,
|
||||
BC334190485B1F4408F03EDF94A692EF /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
|
||||
}
|
||||
26
Pods/Target Support Files/KeychainAccess/KeychainAccess-Info.plist
generated
Normal file
26
Pods/Target Support Files/KeychainAccess/KeychainAccess-Info.plist
generated
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.2.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${CURRENT_PROJECT_VERSION}</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
||||
5
Pods/Target Support Files/KeychainAccess/KeychainAccess-dummy.m
generated
Normal file
5
Pods/Target Support Files/KeychainAccess/KeychainAccess-dummy.m
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
@interface PodsDummy_KeychainAccess : NSObject
|
||||
@end
|
||||
@implementation PodsDummy_KeychainAccess
|
||||
@end
|
||||
12
Pods/Target Support Files/KeychainAccess/KeychainAccess-prefix.pch
generated
Normal file
12
Pods/Target Support Files/KeychainAccess/KeychainAccess-prefix.pch
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifdef __OBJC__
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#ifndef FOUNDATION_EXPORT
|
||||
#if defined(__cplusplus)
|
||||
#define FOUNDATION_EXPORT extern "C"
|
||||
#else
|
||||
#define FOUNDATION_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
16
Pods/Target Support Files/KeychainAccess/KeychainAccess-umbrella.h
generated
Normal file
16
Pods/Target Support Files/KeychainAccess/KeychainAccess-umbrella.h
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifdef __OBJC__
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#ifndef FOUNDATION_EXPORT
|
||||
#if defined(__cplusplus)
|
||||
#define FOUNDATION_EXPORT extern "C"
|
||||
#else
|
||||
#define FOUNDATION_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
FOUNDATION_EXPORT double KeychainAccessVersionNumber;
|
||||
FOUNDATION_EXPORT const unsigned char KeychainAccessVersionString[];
|
||||
|
||||
6
Pods/Target Support Files/KeychainAccess/KeychainAccess.modulemap
generated
Normal file
6
Pods/Target Support Files/KeychainAccess/KeychainAccess.modulemap
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
framework module KeychainAccess {
|
||||
umbrella header "KeychainAccess-umbrella.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
9
Pods/Target Support Files/KeychainAccess/KeychainAccess.xcconfig
generated
Normal file
9
Pods/Target Support Files/KeychainAccess/KeychainAccess.xcconfig
generated
Normal file
@@ -0,0 +1,9 @@
|
||||
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings
|
||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||
PODS_ROOT = ${SRCROOT}
|
||||
PODS_TARGET_SRCROOT = ${PODS_ROOT}/KeychainAccess
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
|
||||
SKIP_INSTALL = YES
|
||||
26
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-Info.plist
generated
Normal file
26
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-Info.plist
generated
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${CURRENT_PROJECT_VERSION}</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
||||
29
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-acknowledgements.markdown
generated
Normal file
29
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-acknowledgements.markdown
generated
Normal file
@@ -0,0 +1,29 @@
|
||||
# Acknowledgements
|
||||
This application makes use of the following third party libraries:
|
||||
|
||||
## KeychainAccess
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 kishikawa katsumi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
Generated by CocoaPods - https://cocoapods.org
|
||||
61
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-acknowledgements.plist
generated
Normal file
61
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-acknowledgements.plist
generated
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>This application makes use of the following third party libraries:</string>
|
||||
<key>Title</key>
|
||||
<string>Acknowledgements</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 kishikawa katsumi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
</string>
|
||||
<key>License</key>
|
||||
<string>MIT</string>
|
||||
<key>Title</key>
|
||||
<string>KeychainAccess</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Generated by CocoaPods - https://cocoapods.org</string>
|
||||
<key>Title</key>
|
||||
<string></string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>StringsTable</key>
|
||||
<string>Acknowledgements</string>
|
||||
<key>Title</key>
|
||||
<string>Acknowledgements</string>
|
||||
</dict>
|
||||
</plist>
|
||||
5
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-dummy.m
generated
Normal file
5
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-dummy.m
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
@interface PodsDummy_Pods_AltStore : NSObject
|
||||
@end
|
||||
@implementation PodsDummy_Pods_AltStore
|
||||
@end
|
||||
163
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh
generated
Executable file
163
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-frameworks.sh
generated
Executable file
@@ -0,0 +1,163 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
set -u
|
||||
set -o pipefail
|
||||
|
||||
function on_error {
|
||||
echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
|
||||
}
|
||||
trap 'on_error $LINENO' ERR
|
||||
|
||||
if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
|
||||
# If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
|
||||
# frameworks to, so exit 0 (signalling the script phase was successful).
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
|
||||
mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
|
||||
|
||||
COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
|
||||
SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
|
||||
|
||||
# Used as a return value for each invocation of `strip_invalid_archs` function.
|
||||
STRIP_BINARY_RETVAL=0
|
||||
|
||||
# This protects against multiple targets copying the same framework dependency at the same time. The solution
|
||||
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
|
||||
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
|
||||
|
||||
# Copies and strips a vendored framework
|
||||
install_framework()
|
||||
{
|
||||
if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
|
||||
local source="${BUILT_PRODUCTS_DIR}/$1"
|
||||
elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
|
||||
local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
|
||||
elif [ -r "$1" ]; then
|
||||
local source="$1"
|
||||
fi
|
||||
|
||||
local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
|
||||
|
||||
if [ -L "${source}" ]; then
|
||||
echo "Symlinked..."
|
||||
source="$(readlink "${source}")"
|
||||
fi
|
||||
|
||||
# Use filter instead of exclude so missing patterns don't throw errors.
|
||||
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
|
||||
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
|
||||
|
||||
local basename
|
||||
basename="$(basename -s .framework "$1")"
|
||||
binary="${destination}/${basename}.framework/${basename}"
|
||||
|
||||
if ! [ -r "$binary" ]; then
|
||||
binary="${destination}/${basename}"
|
||||
elif [ -L "${binary}" ]; then
|
||||
echo "Destination binary is symlinked..."
|
||||
dirname="$(dirname "${binary}")"
|
||||
binary="${dirname}/$(readlink "${binary}")"
|
||||
fi
|
||||
|
||||
# Strip invalid architectures so "fat" simulator / device frameworks work on device
|
||||
if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
|
||||
strip_invalid_archs "$binary"
|
||||
fi
|
||||
|
||||
# Resign the code if required by the build settings to avoid unstable apps
|
||||
code_sign_if_enabled "${destination}/$(basename "$1")"
|
||||
|
||||
# Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
|
||||
if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
|
||||
local swift_runtime_libs
|
||||
swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
|
||||
for lib in $swift_runtime_libs; do
|
||||
echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
|
||||
rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
|
||||
code_sign_if_enabled "${destination}/${lib}"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# Copies and strips a vendored dSYM
|
||||
install_dsym() {
|
||||
local source="$1"
|
||||
if [ -r "$source" ]; then
|
||||
# Copy the dSYM into a the targets temp dir.
|
||||
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
|
||||
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
|
||||
|
||||
local basename
|
||||
basename="$(basename -s .framework.dSYM "$source")"
|
||||
binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}"
|
||||
|
||||
# Strip invalid architectures so "fat" simulator / device frameworks work on device
|
||||
if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then
|
||||
strip_invalid_archs "$binary"
|
||||
fi
|
||||
|
||||
if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
|
||||
# Move the stripped file into its final destination.
|
||||
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
|
||||
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
|
||||
else
|
||||
# The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
|
||||
touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Signs a framework with the provided identity
|
||||
code_sign_if_enabled() {
|
||||
if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
|
||||
# Use the current code_sign_identity
|
||||
echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
|
||||
local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
|
||||
|
||||
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
|
||||
code_sign_cmd="$code_sign_cmd &"
|
||||
fi
|
||||
echo "$code_sign_cmd"
|
||||
eval "$code_sign_cmd"
|
||||
fi
|
||||
}
|
||||
|
||||
# Strip invalid architectures
|
||||
strip_invalid_archs() {
|
||||
binary="$1"
|
||||
# Get architectures for current target binary
|
||||
binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
|
||||
# Intersect them with the architectures we are building for
|
||||
intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
|
||||
# If there are no archs supported by this binary then warn the user
|
||||
if [[ -z "$intersected_archs" ]]; then
|
||||
echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
|
||||
STRIP_BINARY_RETVAL=0
|
||||
return
|
||||
fi
|
||||
stripped=""
|
||||
for arch in $binary_archs; do
|
||||
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
|
||||
# Strip non-valid architectures in-place
|
||||
lipo -remove "$arch" -output "$binary" "$binary"
|
||||
stripped="$stripped $arch"
|
||||
fi
|
||||
done
|
||||
if [[ "$stripped" ]]; then
|
||||
echo "Stripped $binary of architectures:$stripped"
|
||||
fi
|
||||
STRIP_BINARY_RETVAL=1
|
||||
}
|
||||
|
||||
|
||||
if [[ "$CONFIGURATION" == "Debug" ]]; then
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework"
|
||||
fi
|
||||
if [[ "$CONFIGURATION" == "Release" ]]; then
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework"
|
||||
fi
|
||||
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
|
||||
wait
|
||||
fi
|
||||
16
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-umbrella.h
generated
Normal file
16
Pods/Target Support Files/Pods-AltStore/Pods-AltStore-umbrella.h
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifdef __OBJC__
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#ifndef FOUNDATION_EXPORT
|
||||
#if defined(__cplusplus)
|
||||
#define FOUNDATION_EXPORT extern "C"
|
||||
#else
|
||||
#define FOUNDATION_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
FOUNDATION_EXPORT double Pods_AltStoreVersionNumber;
|
||||
FOUNDATION_EXPORT const unsigned char Pods_AltStoreVersionString[];
|
||||
|
||||
12
Pods/Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig
generated
Normal file
12
Pods/Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
|
||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess"
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers"
|
||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
|
||||
OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess"
|
||||
OTHER_LDFLAGS = $(inherited) -framework "KeychainAccess"
|
||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
|
||||
PODS_ROOT = ${SRCROOT}/Pods
|
||||
6
Pods/Target Support Files/Pods-AltStore/Pods-AltStore.modulemap
generated
Normal file
6
Pods/Target Support Files/Pods-AltStore/Pods-AltStore.modulemap
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
framework module Pods_AltStore {
|
||||
umbrella header "Pods-AltStore-umbrella.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
12
Pods/Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig
generated
Normal file
12
Pods/Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
|
||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess"
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers"
|
||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
|
||||
OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess"
|
||||
OTHER_LDFLAGS = $(inherited) -framework "KeychainAccess"
|
||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
|
||||
PODS_ROOT = ${SRCROOT}/Pods
|
||||
Reference in New Issue
Block a user