mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-09 06:43:25 +01:00
[AltStore] Checks for updates in background
This commit is contained in:
@@ -207,7 +207,34 @@ extension AppDelegate
|
|||||||
let apps = try result.get()
|
let apps = try result.get()
|
||||||
|
|
||||||
guard let context = apps.first?.managedObjectContext else { return }
|
guard let context = apps.first?.managedObjectContext else { return }
|
||||||
|
|
||||||
|
let updatesFetchRequest = InstalledApp.updatesFetchRequest()
|
||||||
|
updatesFetchRequest.includesPendingChanges = true
|
||||||
|
|
||||||
|
let previousUpdatesFetchRequest = InstalledApp.updatesFetchRequest()
|
||||||
|
previousUpdatesFetchRequest.includesPendingChanges = false
|
||||||
|
|
||||||
|
let previousUpdates = try context.fetch(previousUpdatesFetchRequest)
|
||||||
|
|
||||||
try context.save()
|
try context.save()
|
||||||
|
|
||||||
|
let updates = try context.fetch(updatesFetchRequest)
|
||||||
|
|
||||||
|
for update in updates
|
||||||
|
{
|
||||||
|
guard !previousUpdates.contains(where: { $0.app.identifier == update.app.identifier }) else { continue }
|
||||||
|
|
||||||
|
let content = UNMutableNotificationContent()
|
||||||
|
content.title = NSLocalizedString("New Update Available", comment: "")
|
||||||
|
content.body = String(format: NSLocalizedString("%@ %@ is now available for download.", comment: ""), update.app.name, update.app.version)
|
||||||
|
|
||||||
|
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil)
|
||||||
|
UNUserNotificationCenter.current().add(request)
|
||||||
|
}
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
UIApplication.shared.applicationIconBadgeNumber = updates.count
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ private extension AppManager
|
|||||||
context.group.results[context.appIdentifier] = .success(installedApp)
|
context.group.results[context.appIdentifier] = .success(installedApp)
|
||||||
|
|
||||||
// Save after each installation.
|
// Save after each installation.
|
||||||
installedApp.managedObjectContext?.perform {
|
installedApp.managedObjectContext?.performAndWait {
|
||||||
do { try installedApp.managedObjectContext?.save() }
|
do { try installedApp.managedObjectContext?.save() }
|
||||||
catch { print("Error saving installed app.", error) }
|
catch { print("Error saving installed app.", error) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,13 @@ extension InstalledApp
|
|||||||
return NSFetchRequest<InstalledApp>(entityName: "InstalledApp")
|
return NSFetchRequest<InstalledApp>(entityName: "InstalledApp")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class func updatesFetchRequest() -> NSFetchRequest<InstalledApp>
|
||||||
|
{
|
||||||
|
let fetchRequest = InstalledApp.fetchRequest() as NSFetchRequest<InstalledApp>
|
||||||
|
fetchRequest.predicate = NSPredicate(format: "%K != %K", #keyPath(InstalledApp.version), #keyPath(InstalledApp.app.version))
|
||||||
|
return fetchRequest
|
||||||
|
}
|
||||||
|
|
||||||
class func fetchAltStore(in context: NSManagedObjectContext) -> InstalledApp?
|
class func fetchAltStore(in context: NSManagedObjectContext) -> InstalledApp?
|
||||||
{
|
{
|
||||||
let predicate = NSPredicate(format: "%K == %@", #keyPath(InstalledApp.app.identifier), App.altstoreAppID)
|
let predicate = NSPredicate(format: "%K == %@", #keyPath(InstalledApp.app.identifier), App.altstoreAppID)
|
||||||
|
|||||||
@@ -104,8 +104,7 @@ private extension MyAppsViewController
|
|||||||
|
|
||||||
func makeUpdatesDataSource() -> RSTFetchedResultsCollectionViewPrefetchingDataSource<InstalledApp, UIImage>
|
func makeUpdatesDataSource() -> RSTFetchedResultsCollectionViewPrefetchingDataSource<InstalledApp, UIImage>
|
||||||
{
|
{
|
||||||
let fetchRequest = InstalledApp.fetchRequest() as NSFetchRequest<InstalledApp>
|
let fetchRequest = InstalledApp.updatesFetchRequest()
|
||||||
fetchRequest.predicate = NSPredicate(format: "%K != %K", #keyPath(InstalledApp.version), #keyPath(InstalledApp.app.version))
|
|
||||||
fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \InstalledApp.app?.versionDate, ascending: true),
|
fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \InstalledApp.app?.versionDate, ascending: true),
|
||||||
NSSortDescriptor(keyPath: \InstalledApp.app?.name, ascending: true)]
|
NSSortDescriptor(keyPath: \InstalledApp.app?.name, ascending: true)]
|
||||||
fetchRequest.returnsObjectsAsFaults = false
|
fetchRequest.returnsObjectsAsFaults = false
|
||||||
@@ -226,10 +225,12 @@ private extension MyAppsViewController
|
|||||||
if self.updatesDataSource.itemCount > 0
|
if self.updatesDataSource.itemCount > 0
|
||||||
{
|
{
|
||||||
self.navigationController?.tabBarItem.badgeValue = String(describing: self.updatesDataSource.itemCount)
|
self.navigationController?.tabBarItem.badgeValue = String(describing: self.updatesDataSource.itemCount)
|
||||||
|
UIApplication.shared.applicationIconBadgeNumber = Int(self.updatesDataSource.itemCount)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
self.navigationController?.tabBarItem.badgeValue = nil
|
self.navigationController?.tabBarItem.badgeValue = nil
|
||||||
|
UIApplication.shared.applicationIconBadgeNumber = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user