mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-19 19:53:25 +01:00
Prioritizes AltServer that originally installed AltStore over others
This commit is contained in:
@@ -11,6 +11,7 @@ import UserNotifications
|
|||||||
import AVFoundation
|
import AVFoundation
|
||||||
|
|
||||||
import AltSign
|
import AltSign
|
||||||
|
import AltKit
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
private enum RefreshError: LocalizedError
|
private enum RefreshError: LocalizedError
|
||||||
@@ -68,6 +69,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||||||
UserDefaults.standard.firstLaunch = Date()
|
UserDefaults.standard.firstLaunch = Date()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UserDefaults.standard.preferredServerID = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.serverID) as? String
|
||||||
|
|
||||||
self.prepareForBackgroundFetch()
|
self.prepareForBackgroundFetch()
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -8,7 +8,11 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
import Roxas
|
||||||
|
|
||||||
extension UserDefaults
|
extension UserDefaults
|
||||||
{
|
{
|
||||||
@NSManaged var firstLaunch: Date?
|
@NSManaged var firstLaunch: Date?
|
||||||
|
|
||||||
|
@NSManaged var preferredServerID: String?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>ALTDeviceID</key>
|
<key>ALTDeviceID</key>
|
||||||
<string>1c3416b7b0ab68773e6e7eb7f0d110f7c9353acc</string>
|
<string>1c3416b7b0ab68773e6e7eb7f0d110f7c9353acc</string>
|
||||||
|
<key>ALTServerID</key>
|
||||||
|
<string>1AAAB6FD-E8CE-4B70-8F26-4073215C03B0</string>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
|
|||||||
@@ -175,8 +175,8 @@ private extension AppManager
|
|||||||
{
|
{
|
||||||
// Authenticate -> Download (if necessary) -> Resign -> Send -> Install.
|
// Authenticate -> Download (if necessary) -> Resign -> Send -> Install.
|
||||||
let group = group ?? OperationGroup()
|
let group = group ?? OperationGroup()
|
||||||
|
|
||||||
guard let server = ServerManager.shared.discoveredServers.first else {
|
guard let server = ServerManager.shared.discoveredServers.first(where: { $0.isPreferred }) ?? ServerManager.shared.discoveredServers.first else {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
group.completionHandler?(.failure(ConnectionError.serverNotFound))
|
group.completionHandler?(.failure(ConnectionError.serverNotFound))
|
||||||
}
|
}
|
||||||
@@ -330,7 +330,24 @@ private extension AppManager
|
|||||||
|
|
||||||
if let error = context.error
|
if let error = context.error
|
||||||
{
|
{
|
||||||
context.group.results[context.bundleIdentifier] = .failure(error)
|
switch error
|
||||||
|
{
|
||||||
|
case let error as ALTServerError where error.code == .deviceNotFound || error.code == .lostConnection:
|
||||||
|
if let server = context.group.server, server.isPreferred
|
||||||
|
{
|
||||||
|
// Preferred server, so report errors normally.
|
||||||
|
context.group.results[context.bundleIdentifier] = .failure(error)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Not preferred server, so ignore these specific errors and throw serverNotFound instead.
|
||||||
|
context.group.results[context.bundleIdentifier] = .failure(ConnectionError.serverNotFound)
|
||||||
|
}
|
||||||
|
|
||||||
|
case let error:
|
||||||
|
context.group.results[context.bundleIdentifier] = .failure(error)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if let installedApp = context.installedApp
|
else if let installedApp = context.installedApp
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -44,8 +44,20 @@ enum ConnectionError: LocalizedError
|
|||||||
|
|
||||||
struct Server: Equatable
|
struct Server: Equatable
|
||||||
{
|
{
|
||||||
|
var identifier: String
|
||||||
var service: NetService
|
var service: NetService
|
||||||
|
|
||||||
|
var isPreferred = false
|
||||||
|
|
||||||
|
init?(service: NetService, txtData: Data)
|
||||||
|
{
|
||||||
|
let txtDictionary = NetService.dictionary(fromTXTRecord: txtData)
|
||||||
|
guard let identifierData = txtDictionary["serverID"], let identifier = String(data: identifierData, encoding: .utf8) else { return nil }
|
||||||
|
|
||||||
|
self.identifier = identifier
|
||||||
|
self.service = service
|
||||||
|
}
|
||||||
|
|
||||||
func send<T: Encodable>(_ payload: T, via connection: NWConnection, prependSize: Bool = true, completionHandler: @escaping (Result<Void, Error>) -> Void)
|
func send<T: Encodable>(_ payload: T, via connection: NWConnection, prependSize: Bool = true, completionHandler: @escaping (Result<Void, Error>) -> Void)
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ class ServerManager: NSObject
|
|||||||
|
|
||||||
private let serviceBrowser = NetServiceBrowser()
|
private let serviceBrowser = NetServiceBrowser()
|
||||||
|
|
||||||
|
private var services = Set<NetService>()
|
||||||
|
|
||||||
private override init()
|
private override init()
|
||||||
{
|
{
|
||||||
super.init()
|
super.init()
|
||||||
@@ -45,10 +47,24 @@ extension ServerManager
|
|||||||
self.isDiscovering = false
|
self.isDiscovering = false
|
||||||
|
|
||||||
self.discoveredServers.removeAll()
|
self.discoveredServers.removeAll()
|
||||||
|
self.services.removeAll()
|
||||||
self.serviceBrowser.stop()
|
self.serviceBrowser.stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private extension ServerManager
|
||||||
|
{
|
||||||
|
func addDiscoveredServer(_ server: Server)
|
||||||
|
{
|
||||||
|
var server = server
|
||||||
|
server.isPreferred = (server.identifier == UserDefaults.standard.preferredServerID)
|
||||||
|
|
||||||
|
guard !self.discoveredServers.contains(server) else { return }
|
||||||
|
|
||||||
|
self.discoveredServers.append(server)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
extension ServerManager: NetServiceBrowserDelegate
|
extension ServerManager: NetServiceBrowserDelegate
|
||||||
{
|
{
|
||||||
func netServiceBrowserWillSearch(_ browser: NetServiceBrowser)
|
func netServiceBrowserWillSearch(_ browser: NetServiceBrowser)
|
||||||
@@ -68,19 +84,46 @@ extension ServerManager: NetServiceBrowserDelegate
|
|||||||
|
|
||||||
func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool)
|
func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool)
|
||||||
{
|
{
|
||||||
let server = Server(service: service)
|
service.delegate = self
|
||||||
guard !self.discoveredServers.contains(server) else { return }
|
|
||||||
|
|
||||||
self.discoveredServers.append(server)
|
if let txtData = service.txtRecordData(), let server = Server(service: service, txtData: txtData)
|
||||||
|
{
|
||||||
|
self.addDiscoveredServer(server)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
service.resolve(withTimeout: 3)
|
||||||
|
self.services.insert(service)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool)
|
func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool)
|
||||||
{
|
{
|
||||||
let server = Server(service: service)
|
if let index = self.discoveredServers.firstIndex(where: { $0.service == service })
|
||||||
|
|
||||||
if let index = self.discoveredServers.firstIndex(of: server)
|
|
||||||
{
|
{
|
||||||
self.discoveredServers.remove(at: index)
|
self.discoveredServers.remove(at: index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.services.remove(service)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ServerManager: NetServiceDelegate
|
||||||
|
{
|
||||||
|
func netServiceDidResolveAddress(_ service: NetService)
|
||||||
|
{
|
||||||
|
guard let data = service.txtRecordData(), let server = Server(service: service, txtData: data) else { return }
|
||||||
|
self.addDiscoveredServer(server)
|
||||||
|
}
|
||||||
|
|
||||||
|
func netService(_ sender: NetService, didNotResolve errorDict: [String : NSNumber])
|
||||||
|
{
|
||||||
|
print("Error resolving net service \(sender).", errorDict)
|
||||||
|
}
|
||||||
|
|
||||||
|
func netService(_ sender: NetService, didUpdateTXTRecord data: Data)
|
||||||
|
{
|
||||||
|
let txtDict = NetService.dictionary(fromTXTRecord: data)
|
||||||
|
print("Service \(sender) updated TXT Record:", txtDict)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user