mirror of
https://github.com/SideStore/SideStore.git
synced 2026-04-05 10:15:38 +02:00
Compare commits
9 Commits
naturecode
...
connect-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94ee08c718 | ||
|
|
fd7dc94975 | ||
|
|
b78707808d | ||
|
|
d41518581a | ||
|
|
4abbfe6142 | ||
|
|
dae813d80c | ||
|
|
af89b178ad | ||
|
|
8c269207fd | ||
|
|
42ecd38517 |
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -2,8 +2,7 @@ name: Bug Report
|
|||||||
description: Report a bug
|
description: Report a bug
|
||||||
title: "[BUG] "
|
title: "[BUG] "
|
||||||
labels: ["bug"]
|
labels: ["bug"]
|
||||||
assignees:
|
assignees: []
|
||||||
- naturecodevoid
|
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
3
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
3
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -2,8 +2,7 @@ name: Feature Request
|
|||||||
description: Suggest a feature
|
description: Suggest a feature
|
||||||
title: "[FEATURE REQUEST] "
|
title: "[FEATURE REQUEST] "
|
||||||
labels: ["enhancement"]
|
labels: ["enhancement"]
|
||||||
assignees:
|
assignees: []
|
||||||
- naturecodevoid
|
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
2
.github/workflows/nightly.yml
vendored
2
.github/workflows/nightly.yml
vendored
@@ -2,7 +2,7 @@ name: Nightly SideStore build
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- connect-develop
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|||||||
1
.github/workflows/stable.yml
vendored
1
.github/workflows/stable.yml
vendored
@@ -3,7 +3,6 @@ on:
|
|||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- '[0-9]+.[0-9]+.[0-9]+' # example: 1.0.0
|
- '[0-9]+.[0-9]+.[0-9]+' # example: 1.0.0
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ private extension BrowseViewController
|
|||||||
NSSortDescriptor(keyPath: \StoreApp.name, ascending: true),
|
NSSortDescriptor(keyPath: \StoreApp.name, ascending: true),
|
||||||
NSSortDescriptor(keyPath: \StoreApp.bundleIdentifier, ascending: true)]
|
NSSortDescriptor(keyPath: \StoreApp.bundleIdentifier, ascending: true)]
|
||||||
fetchRequest.returnsObjectsAsFaults = false
|
fetchRequest.returnsObjectsAsFaults = false
|
||||||
fetchRequest.predicate = NSPredicate(format: "%K != %@", #keyPath(StoreApp.sourceIdentifier), Source.altStoreIdentifier)
|
fetchRequest.predicate = NSPredicate(format: "%K != %@", #keyPath(StoreApp.bundleIdentifier), StoreApp.altstoreAppID)
|
||||||
|
|
||||||
let dataSource = RSTFetchedResultsCollectionViewPrefetchingDataSource<StoreApp, UIImage>(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext)
|
let dataSource = RSTFetchedResultsCollectionViewPrefetchingDataSource<StoreApp, UIImage>(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext)
|
||||||
dataSource.cellConfigurationHandler = { (cell, app, indexPath) in
|
dataSource.cellConfigurationHandler = { (cell, app, indexPath) in
|
||||||
|
|||||||
@@ -279,7 +279,7 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Add to Siri…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c6K-fI-CVr">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Allow Siri To Refresh Apps…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c6K-fI-CVr">
|
||||||
<rect key="frame" x="30" y="15.5" width="100.5" height="20.5"/>
|
<rect key="frame" x="30" y="15.5" width="100.5" height="20.5"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ private extension SettingsViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.backgroundRefreshSwitch.isOn = UserDefaults.standard.isBackgroundRefreshEnabled
|
self.backgroundRefreshSwitch.isOn = UserDefaults.standard.isBackgroundRefreshEnabled
|
||||||
|
self.noIdleTimeoutSwitch.isOn = UserDefaults.standard.isIdleTimeoutDisableEnabled
|
||||||
|
|
||||||
if self.isViewLoaded
|
if self.isViewLoaded
|
||||||
{
|
{
|
||||||
@@ -203,7 +204,7 @@ private extension SettingsViewController
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
settingsHeaderFooterView.secondaryLabel.text = NSLocalizedString("Enable Background Refresh to automatically refresh apps in the background when connected to Wi-Fi.", comment: "")
|
settingsHeaderFooterView.secondaryLabel.text = NSLocalizedString("Enable Background Refresh to automatically refresh apps in the background when connected to Wi-Fi. \n\nDisable the Idle Timeout toggle to allow SideStore to not let your device go to sleep during a refresh or install of any apps.", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
case .instructions:
|
case .instructions:
|
||||||
|
|||||||
@@ -103,7 +103,6 @@
|
|||||||
<attribute name="externalURL" optional="YES" attributeType="URI"/>
|
<attribute name="externalURL" optional="YES" attributeType="URI"/>
|
||||||
<attribute name="identifier" attributeType="String"/>
|
<attribute name="identifier" attributeType="String"/>
|
||||||
<attribute name="imageURL" optional="YES" attributeType="URI"/>
|
<attribute name="imageURL" optional="YES" attributeType="URI"/>
|
||||||
<attribute name="isDuplicate" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/>
|
|
||||||
<attribute name="isSilent" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
|
<attribute name="isSilent" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
|
||||||
<attribute name="sortIndex" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
|
<attribute name="sortIndex" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
<attribute name="sourceIdentifier" optional="YES" attributeType="String"/>
|
<attribute name="sourceIdentifier" optional="YES" attributeType="String"/>
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ private extension DatabaseManager
|
|||||||
|
|
||||||
let storeApp: StoreApp
|
let storeApp: StoreApp
|
||||||
|
|
||||||
if let app = StoreApp.first(satisfying: NSPredicate(format: "%K == %@ AND %K == %@", #keyPath(StoreApp.bundleIdentifier), StoreApp.altstoreAppID, #keyPath(StoreApp.sourceIdentifier), Source.altStoreIdentifier), in: context)
|
if let app = StoreApp.first(satisfying: NSPredicate(format: "%K == %@", #keyPath(StoreApp.bundleIdentifier), StoreApp.altstoreAppID), in: context)
|
||||||
{
|
{
|
||||||
storeApp = app
|
storeApp = app
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,10 +108,6 @@ public class InstalledApp: NSManagedObject, InstalledAppProtocol
|
|||||||
public func update(resignedApp: ALTApplication, certificateSerialNumber: String?)
|
public func update(resignedApp: ALTApplication, certificateSerialNumber: String?)
|
||||||
{
|
{
|
||||||
self.name = resignedApp.name
|
self.name = resignedApp.name
|
||||||
if storeApp != nil {
|
|
||||||
// This might break things; maybe only do this if the bundle ID is SideStore's?
|
|
||||||
self.name = storeApp!.name // If we don't do this, the name will always be SideStore in My Apps, even when using beta/nightly
|
|
||||||
}
|
|
||||||
|
|
||||||
self.resignedBundleIdentifier = resignedApp.bundleIdentifier
|
self.resignedBundleIdentifier = resignedApp.bundleIdentifier
|
||||||
self.version = resignedApp.version
|
self.version = resignedApp.version
|
||||||
@@ -182,7 +178,7 @@ public extension InstalledApp
|
|||||||
|
|
||||||
class func fetchAltStore(in context: NSManagedObjectContext) -> InstalledApp?
|
class func fetchAltStore(in context: NSManagedObjectContext) -> InstalledApp?
|
||||||
{
|
{
|
||||||
let predicate = NSPredicate(format: "%K == %@ AND %K != nil AND %K == %@", #keyPath(InstalledApp.bundleIdentifier), StoreApp.altstoreAppID, #keyPath(InstalledApp.storeApp), #keyPath(InstalledApp.storeApp.sourceIdentifier), Source.altStoreIdentifier)
|
let predicate = NSPredicate(format: "%K == %@", #keyPath(InstalledApp.bundleIdentifier), StoreApp.altstoreAppID)
|
||||||
print("Fetch 'AltStore' Predicate: \(String(describing: predicate))")
|
print("Fetch 'AltStore' Predicate: \(String(describing: predicate))")
|
||||||
let altStore = InstalledApp.first(satisfying: predicate, in: context)
|
let altStore = InstalledApp.first(satisfying: predicate, in: context)
|
||||||
return altStore
|
return altStore
|
||||||
|
|||||||
@@ -32,15 +32,6 @@ public class NewsItem: NSManagedObject, Decodable, Fetchable
|
|||||||
@NSManaged public var storeApp: StoreApp?
|
@NSManaged public var storeApp: StoreApp?
|
||||||
@NSManaged public var source: Source?
|
@NSManaged public var source: Source?
|
||||||
|
|
||||||
@objc public var isDuplicate: Bool {
|
|
||||||
if self.source == nil { return false }
|
|
||||||
|
|
||||||
// Hide news from sources that begin with the SideStore identifier, and aren't from the same source as the current SideStore source
|
|
||||||
if self.source!.identifier.starts(with: Bundle.Info.appbundleIdentifier) && self.source!.identifier != Source.altStoreIdentifier { return true }
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey
|
private enum CodingKeys: String, CodingKey
|
||||||
{
|
{
|
||||||
case identifier
|
case identifier
|
||||||
@@ -95,9 +86,6 @@ public extension NewsItem
|
|||||||
{
|
{
|
||||||
@nonobjc class func fetchRequest() -> NSFetchRequest<NewsItem>
|
@nonobjc class func fetchRequest() -> NSFetchRequest<NewsItem>
|
||||||
{
|
{
|
||||||
let fetchRequest = NSFetchRequest<NewsItem>(entityName: "NewsItem")
|
return NSFetchRequest<NewsItem>(entityName: "NewsItem")
|
||||||
fetchRequest.predicate = NSPredicate(format: "%K == NO",
|
|
||||||
#keyPath(NewsItem.isDuplicate))
|
|
||||||
return fetchRequest
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,37 +11,29 @@ import UIKit
|
|||||||
|
|
||||||
public extension Source
|
public extension Source
|
||||||
{
|
{
|
||||||
static var altStoreIdentifier: String {
|
#if ALPHA
|
||||||
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
|
static let altStoreIdentifier = Bundle.Info.appbundleIdentifier
|
||||||
|
#else
|
||||||
if appVersion != nil {
|
static let altStoreIdentifier = Bundle.Info.appbundleIdentifier
|
||||||
if appVersion!.contains("beta") {
|
#endif
|
||||||
return Bundle.Info.appbundleIdentifier + ".Beta"
|
|
||||||
}
|
|
||||||
if appVersion!.contains("nightly") {
|
|
||||||
return Bundle.Info.appbundleIdentifier + ".Nightly"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Bundle.Info.appbundleIdentifier
|
|
||||||
}
|
|
||||||
|
|
||||||
static let altStoreSourceBaseURL = "https://apps.sidestore.io/"
|
#if STAGING
|
||||||
|
|
||||||
static var altStoreSourceURL: URL {
|
#if ALPHA
|
||||||
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
|
static let altStoreSourceURL = URL(string: "https://connect.sidestore.io/")!
|
||||||
|
#else
|
||||||
if appVersion != nil {
|
static let altStoreSourceURL = URL(string: "https://connect.sidestore.io/")!
|
||||||
if appVersion!.contains("beta") {
|
#endif
|
||||||
return URL(string: altStoreSourceBaseURL + "beta")!
|
|
||||||
}
|
#else
|
||||||
if appVersion!.contains("nightly") {
|
|
||||||
return URL(string: altStoreSourceBaseURL + "nightly")!
|
#if ALPHA
|
||||||
}
|
static let altStoreSourceURL = URL(string: "https://connect.sidestore.io/")!
|
||||||
}
|
#else
|
||||||
|
static let altStoreSourceURL = URL(string: "https://connect.sidestore.io/")!
|
||||||
return URL(string: altStoreSourceBaseURL)!
|
#endif
|
||||||
}
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct AppPermissionFeed: Codable {
|
public struct AppPermissionFeed: Codable {
|
||||||
|
|||||||
@@ -343,28 +343,16 @@ public extension StoreApp
|
|||||||
{
|
{
|
||||||
let app = StoreApp(context: context)
|
let app = StoreApp(context: context)
|
||||||
app.name = "SideStore"
|
app.name = "SideStore"
|
||||||
|
|
||||||
let currentAppVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
|
|
||||||
|
|
||||||
if currentAppVersion != nil {
|
|
||||||
if currentAppVersion!.contains("beta") {
|
|
||||||
app.name += " (Beta)"
|
|
||||||
}
|
|
||||||
if currentAppVersion!.contains("nightly") {
|
|
||||||
app.name += " (Nightly)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
app.bundleIdentifier = StoreApp.altstoreAppID
|
app.bundleIdentifier = StoreApp.altstoreAppID
|
||||||
app.developerName = "SideStore Team"
|
app.developerName = "Side Team"
|
||||||
app.localizedDescription = "SideStore is an alternative app store for non-jailbroken devices.\n\nSideStore allows you to sideload other .ipa files and apps from the Files app or via the SideStore Library."
|
app.localizedDescription = "SideStore is an alternative App Store."
|
||||||
app.iconURL = URL(string: "https://sidestore.io/assets/icon.png")!
|
app.iconURL = URL(string: "https://user-images.githubusercontent.com/705880/63392210-540c5980-c37b-11e9-968c-8742fc68ab2e.png")!
|
||||||
app.screenshotURLs = []
|
app.screenshotURLs = []
|
||||||
app.sourceIdentifier = Source.altStoreIdentifier
|
app.sourceIdentifier = Source.altStoreIdentifier
|
||||||
|
|
||||||
let appVersion = AppVersion.makeAppVersion(version: "0.0.0", // this is set to the current app version later
|
let appVersion = AppVersion.makeAppVersion(version: "0.3.0",
|
||||||
date: Date(),
|
date: Date(),
|
||||||
downloadURL: URL(string: "https://sidestore.io")!,
|
downloadURL: URL(string: "http://rileytestut.com")!,
|
||||||
size: 0,
|
size: 0,
|
||||||
appBundleID: app.bundleIdentifier,
|
appBundleID: app.bundleIdentifier,
|
||||||
sourceID: Source.altStoreIdentifier,
|
sourceID: Source.altStoreIdentifier,
|
||||||
@@ -373,6 +361,10 @@ public extension StoreApp
|
|||||||
|
|
||||||
print("makeAltStoreApp StoreApp: \(String(describing: app))")
|
print("makeAltStoreApp StoreApp: \(String(describing: app))")
|
||||||
|
|
||||||
|
#if BETA
|
||||||
|
app.isBeta = true
|
||||||
|
#endif
|
||||||
|
|
||||||
return app
|
return app
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,6 @@
|
|||||||
{
|
{
|
||||||
"identifier": "io.sidestore.example"
|
"identifier": "io.sidestore.example"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"identifier": "com.SideStore.SideStore",
|
|
||||||
"sourceURL": "https://apps.sidestore.io/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identifier": "com.SideStore.SideStore.Beta",
|
|
||||||
"sourceURL": "https://apps.sidestore.io/beta"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"identifier": "com.sidestoreapps.community",
|
"identifier": "com.sidestoreapps.community",
|
||||||
"sourceURL": "https://community-apps.sidestore.io/sidecommunity.json"
|
"sourceURL": "https://community-apps.sidestore.io/sidecommunity.json"
|
||||||
|
|||||||
Reference in New Issue
Block a user