mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-09 06:43:25 +01:00
Fixes “Device Already Registered” error
This commit is contained in:
@@ -144,6 +144,7 @@
|
|||||||
BF9ABA4F22DD41A9008935CF /* UIColor+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4E22DD41A9008935CF /* UIColor+Hex.swift */; };
|
BF9ABA4F22DD41A9008935CF /* UIColor+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4E22DD41A9008935CF /* UIColor+Hex.swift */; };
|
||||||
BFA8172923C56042001B5953 /* ServerConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172823C56042001B5953 /* ServerConnection.swift */; };
|
BFA8172923C56042001B5953 /* ServerConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172823C56042001B5953 /* ServerConnection.swift */; };
|
||||||
BFA8172B23C5633D001B5953 /* FetchAnisetteDataOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */; };
|
BFA8172B23C5633D001B5953 /* FetchAnisetteDataOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */; };
|
||||||
|
BFA8172F23C5831A001B5953 /* PrepareDeveloperAccountOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172E23C5831A001B5953 /* PrepareDeveloperAccountOperation.swift */; };
|
||||||
BFB11692229322E400BB457C /* DatabaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB11691229322E400BB457C /* DatabaseManager.swift */; };
|
BFB11692229322E400BB457C /* DatabaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB11691229322E400BB457C /* DatabaseManager.swift */; };
|
||||||
BFB1169B2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB1169A2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift */; };
|
BFB1169B2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB1169A2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift */; };
|
||||||
BFB3645A2325985F00CD0EB1 /* FindServerOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB364592325985F00CD0EB1 /* FindServerOperation.swift */; };
|
BFB3645A2325985F00CD0EB1 /* FindServerOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB364592325985F00CD0EB1 /* FindServerOperation.swift */; };
|
||||||
@@ -468,6 +469,7 @@
|
|||||||
BF9B63C5229DD44D002F0A62 /* AltSign.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AltSign.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
BF9B63C5229DD44D002F0A62 /* AltSign.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AltSign.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
BFA8172823C56042001B5953 /* ServerConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerConnection.swift; sourceTree = "<group>"; };
|
BFA8172823C56042001B5953 /* ServerConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerConnection.swift; sourceTree = "<group>"; };
|
||||||
BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAnisetteDataOperation.swift; sourceTree = "<group>"; };
|
BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAnisetteDataOperation.swift; sourceTree = "<group>"; };
|
||||||
|
BFA8172E23C5831A001B5953 /* PrepareDeveloperAccountOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepareDeveloperAccountOperation.swift; sourceTree = "<group>"; };
|
||||||
BFB11691229322E400BB457C /* DatabaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseManager.swift; sourceTree = "<group>"; };
|
BFB11691229322E400BB457C /* DatabaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseManager.swift; sourceTree = "<group>"; };
|
||||||
BFB1169A2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+ManagedObjectContext.swift"; sourceTree = "<group>"; };
|
BFB1169A2293274D00BB457C /* JSONDecoder+ManagedObjectContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+ManagedObjectContext.swift"; sourceTree = "<group>"; };
|
||||||
BFB1169C22932DB100BB457C /* apps.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = apps.json; sourceTree = "<group>"; };
|
BFB1169C22932DB100BB457C /* apps.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = apps.json; sourceTree = "<group>"; };
|
||||||
@@ -1155,6 +1157,7 @@
|
|||||||
BF770E5322BC044E002A40FE /* AppOperationContext.swift */,
|
BF770E5322BC044E002A40FE /* AppOperationContext.swift */,
|
||||||
BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */,
|
BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */,
|
||||||
BFB364592325985F00CD0EB1 /* FindServerOperation.swift */,
|
BFB364592325985F00CD0EB1 /* FindServerOperation.swift */,
|
||||||
|
BFA8172E23C5831A001B5953 /* PrepareDeveloperAccountOperation.swift */,
|
||||||
BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */,
|
BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */,
|
||||||
BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */,
|
BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */,
|
||||||
BFDB6A0E22AB2776007EA6D6 /* SendAppOperation.swift */,
|
BFDB6A0E22AB2776007EA6D6 /* SendAppOperation.swift */,
|
||||||
@@ -1722,6 +1725,7 @@
|
|||||||
BFF0B69A2322D7D0007A79E1 /* UIScreen+CompactHeight.swift in Sources */,
|
BFF0B69A2322D7D0007A79E1 /* UIScreen+CompactHeight.swift in Sources */,
|
||||||
BFD5D6EE230D8A86007955AB /* Patron.swift in Sources */,
|
BFD5D6EE230D8A86007955AB /* Patron.swift in Sources */,
|
||||||
BF8F69C222E659F700049BA1 /* AppContentViewController.swift in Sources */,
|
BF8F69C222E659F700049BA1 /* AppContentViewController.swift in Sources */,
|
||||||
|
BFA8172F23C5831A001B5953 /* PrepareDeveloperAccountOperation.swift in Sources */,
|
||||||
BF08858522DE7EC800DE9F1E /* UpdateCollectionViewCell.swift in Sources */,
|
BF08858522DE7EC800DE9F1E /* UpdateCollectionViewCell.swift in Sources */,
|
||||||
BF258CE322EBAE2800023032 /* AppProtocol.swift in Sources */,
|
BF258CE322EBAE2800023032 /* AppProtocol.swift in Sources */,
|
||||||
BF770E5822BC3D0F002A40FE /* OperationGroup.swift in Sources */,
|
BF770E5822BC3D0F002A40FE /* OperationGroup.swift in Sources */,
|
||||||
|
|||||||
@@ -260,6 +260,18 @@ private extension AppManager
|
|||||||
refreshAnisetteDataOperation.addDependency(authenticationOperation ?? findServerOperation)
|
refreshAnisetteDataOperation.addDependency(authenticationOperation ?? findServerOperation)
|
||||||
operations.append(refreshAnisetteDataOperation)
|
operations.append(refreshAnisetteDataOperation)
|
||||||
|
|
||||||
|
/* Prepare Developer Account */
|
||||||
|
let prepareDeveloperAccountOperation = PrepareDeveloperAccountOperation(group: group)
|
||||||
|
prepareDeveloperAccountOperation.resultHandler = { (result) in
|
||||||
|
switch result
|
||||||
|
{
|
||||||
|
case .failure(let error): group.error = error
|
||||||
|
case .success: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prepareDeveloperAccountOperation.addDependency(refreshAnisetteDataOperation)
|
||||||
|
operations.append(prepareDeveloperAccountOperation)
|
||||||
|
|
||||||
for app in apps
|
for app in apps
|
||||||
{
|
{
|
||||||
let context = AppOperationContext(bundleIdentifier: app.bundleIdentifier, group: group)
|
let context = AppOperationContext(bundleIdentifier: app.bundleIdentifier, group: group)
|
||||||
@@ -272,7 +284,7 @@ private extension AppManager
|
|||||||
guard let resignedApp = self.process(result, context: context) else { return }
|
guard let resignedApp = self.process(result, context: context) else { return }
|
||||||
context.resignedApp = resignedApp
|
context.resignedApp = resignedApp
|
||||||
}
|
}
|
||||||
resignAppOperation.addDependency(refreshAnisetteDataOperation)
|
resignAppOperation.addDependency(prepareDeveloperAccountOperation)
|
||||||
progress.addChild(resignAppOperation.progress, withPendingUnitCount: 20)
|
progress.addChild(resignAppOperation.progress, withPendingUnitCount: 20)
|
||||||
operations.append(resignAppOperation)
|
operations.append(resignAppOperation)
|
||||||
|
|
||||||
|
|||||||
81
AltStore/Operations/PrepareDeveloperAccountOperation.swift
Normal file
81
AltStore/Operations/PrepareDeveloperAccountOperation.swift
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
//
|
||||||
|
// PrepareDeveloperAccountOperation.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Riley Testut on 1/7/20.
|
||||||
|
// Copyright © 2020 Riley Testut. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import Roxas
|
||||||
|
|
||||||
|
import AltSign
|
||||||
|
|
||||||
|
@objc(PrepareDeveloperAccountOperation)
|
||||||
|
class PrepareDeveloperAccountOperation: ResultOperation<Void>
|
||||||
|
{
|
||||||
|
let group: OperationGroup
|
||||||
|
|
||||||
|
init(group: OperationGroup)
|
||||||
|
{
|
||||||
|
self.group = group
|
||||||
|
|
||||||
|
super.init()
|
||||||
|
|
||||||
|
self.progress.totalUnitCount = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
override func main()
|
||||||
|
{
|
||||||
|
super.main()
|
||||||
|
|
||||||
|
if let error = self.group.error
|
||||||
|
{
|
||||||
|
self.finish(.failure(error))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard
|
||||||
|
let signer = self.group.signer,
|
||||||
|
let session = self.group.session
|
||||||
|
else { return self.finish(.failure(OperationError.invalidParameters)) }
|
||||||
|
|
||||||
|
// Register Device
|
||||||
|
self.registerCurrentDevice(for: signer.team, session: session) { (result) in
|
||||||
|
let result = result.map { _ in () }
|
||||||
|
self.finish(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private extension PrepareDeveloperAccountOperation
|
||||||
|
{
|
||||||
|
func registerCurrentDevice(for team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result<ALTDevice, Error>) -> Void)
|
||||||
|
{
|
||||||
|
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else {
|
||||||
|
return completionHandler(.failure(OperationError.unknownUDID))
|
||||||
|
}
|
||||||
|
|
||||||
|
ALTAppleAPI.shared.fetchDevices(for: team, session: session) { (devices, error) in
|
||||||
|
do
|
||||||
|
{
|
||||||
|
let devices = try Result(devices, error).get()
|
||||||
|
|
||||||
|
if let device = devices.first(where: { $0.identifier == udid })
|
||||||
|
{
|
||||||
|
completionHandler(.success(device))
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ALTAppleAPI.shared.registerDevice(name: UIDevice.current.name, identifier: udid, team: team, session: session) { (device, error) in
|
||||||
|
completionHandler(Result(device, error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
completionHandler(.failure(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -41,46 +41,41 @@ class ResignAppOperation: ResultOperation<ALTApplication>
|
|||||||
let session = self.context.group.session
|
let session = self.context.group.session
|
||||||
else { return self.finish(.failure(OperationError.invalidParameters)) }
|
else { return self.finish(.failure(OperationError.invalidParameters)) }
|
||||||
|
|
||||||
// Register Device
|
// Prepare Provisioning Profiles
|
||||||
self.registerCurrentDevice(for: signer.team, session: session) { (result) in
|
self.prepareProvisioningProfiles(app.fileURL, team: signer.team, session: session) { (result) in
|
||||||
guard let _ = self.process(result) else { return }
|
guard let profiles = self.process(result) else { return }
|
||||||
|
|
||||||
// Prepare Provisioning Profiles
|
// Prepare app bundle
|
||||||
self.prepareProvisioningProfiles(app.fileURL, team: signer.team, session: session) { (result) in
|
let prepareAppProgress = Progress.discreteProgress(totalUnitCount: 2)
|
||||||
guard let profiles = self.process(result) else { return }
|
self.progress.addChild(prepareAppProgress, withPendingUnitCount: 3)
|
||||||
|
|
||||||
|
let prepareAppBundleProgress = self.prepareAppBundle(for: app, profiles: profiles) { (result) in
|
||||||
|
guard let appBundleURL = self.process(result) else { return }
|
||||||
|
|
||||||
// Prepare app bundle
|
print("Resigning App:", self.context.bundleIdentifier)
|
||||||
let prepareAppProgress = Progress.discreteProgress(totalUnitCount: 2)
|
|
||||||
self.progress.addChild(prepareAppProgress, withPendingUnitCount: 3)
|
|
||||||
|
|
||||||
let prepareAppBundleProgress = self.prepareAppBundle(for: app, profiles: profiles) { (result) in
|
// Resign app bundle
|
||||||
guard let appBundleURL = self.process(result) else { return }
|
let resignProgress = self.resignAppBundle(at: appBundleURL, signer: signer, profiles: Array(profiles.values)) { (result) in
|
||||||
|
guard let resignedURL = self.process(result) else { return }
|
||||||
|
|
||||||
print("Resigning App:", self.context.bundleIdentifier)
|
// Finish
|
||||||
|
do
|
||||||
// Resign app bundle
|
{
|
||||||
let resignProgress = self.resignAppBundle(at: appBundleURL, signer: signer, profiles: Array(profiles.values)) { (result) in
|
let destinationURL = InstalledApp.refreshedIPAURL(for: app)
|
||||||
guard let resignedURL = self.process(result) else { return }
|
try FileManager.default.copyItem(at: resignedURL, to: destinationURL, shouldReplace: true)
|
||||||
|
|
||||||
// Finish
|
// Use appBundleURL since we need an app bundle, not .ipa.
|
||||||
do
|
guard let resignedApplication = ALTApplication(fileURL: appBundleURL) else { throw OperationError.invalidApp }
|
||||||
{
|
self.finish(.success(resignedApplication))
|
||||||
let destinationURL = InstalledApp.refreshedIPAURL(for: app)
|
}
|
||||||
try FileManager.default.copyItem(at: resignedURL, to: destinationURL, shouldReplace: true)
|
catch
|
||||||
|
{
|
||||||
// Use appBundleURL since we need an app bundle, not .ipa.
|
self.finish(.failure(error))
|
||||||
guard let resignedApplication = ALTApplication(fileURL: appBundleURL) else { throw OperationError.invalidApp }
|
|
||||||
self.finish(.success(resignedApplication))
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
self.finish(.failure(error))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
prepareAppProgress.addChild(resignProgress, withPendingUnitCount: 1)
|
|
||||||
}
|
}
|
||||||
prepareAppProgress.addChild(prepareAppBundleProgress, withPendingUnitCount: 1)
|
prepareAppProgress.addChild(resignProgress, withPendingUnitCount: 1)
|
||||||
}
|
}
|
||||||
|
prepareAppProgress.addChild(prepareAppBundleProgress, withPendingUnitCount: 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,35 +100,6 @@ class ResignAppOperation: ResultOperation<ALTApplication>
|
|||||||
|
|
||||||
private extension ResignAppOperation
|
private extension ResignAppOperation
|
||||||
{
|
{
|
||||||
func registerCurrentDevice(for team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result<ALTDevice, Error>) -> Void)
|
|
||||||
{
|
|
||||||
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else {
|
|
||||||
return completionHandler(.failure(OperationError.unknownUDID))
|
|
||||||
}
|
|
||||||
|
|
||||||
ALTAppleAPI.shared.fetchDevices(for: team, session: session) { (devices, error) in
|
|
||||||
do
|
|
||||||
{
|
|
||||||
let devices = try Result(devices, error).get()
|
|
||||||
|
|
||||||
if let device = devices.first(where: { $0.identifier == udid })
|
|
||||||
{
|
|
||||||
completionHandler(.success(device))
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ALTAppleAPI.shared.registerDevice(name: UIDevice.current.name, identifier: udid, team: team, session: session) { (device, error) in
|
|
||||||
completionHandler(Result(device, error))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
completionHandler(.failure(error))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func prepareProvisioningProfiles(_ fileURL: URL, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result<[String: ALTProvisioningProfile], Error>) -> Void)
|
func prepareProvisioningProfiles(_ fileURL: URL, team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result<[String: ALTProvisioningProfile], Error>) -> Void)
|
||||||
{
|
{
|
||||||
guard let bundle = Bundle(url: fileURL), let app = ALTApplication(fileURL: fileURL) else { return completionHandler(.failure(OperationError.invalidApp)) }
|
guard let bundle = Bundle(url: fileURL), let app = ALTApplication(fileURL: fileURL) else { return completionHandler(.failure(OperationError.invalidApp)) }
|
||||||
|
|||||||
Reference in New Issue
Block a user