[AltStore] Checks for updates in background

This commit is contained in:
Riley Testut
2019-07-24 13:52:58 -07:00
parent c7be693726
commit cd9562c300
4 changed files with 38 additions and 3 deletions

View File

@@ -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
{ {

View File

@@ -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) }
} }

View File

@@ -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)

View File

@@ -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
} }
} }