Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6139af3394 | |||
| b034739065 | |||
| e410ed0cbc | |||
| dfee0e0e29 | |||
| 6129b57d39 | |||
| 0ac904cd51 | |||
| 9b675a8f92 | |||
| 399e1bfec2 | |||
| ec892ae746 | |||
| 3bd7b595fb | |||
| 3d8c83c720 | |||
| 466e70236c | |||
| 0fba2a6954 |
@@ -568,7 +568,7 @@
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
DEVELOPMENT_TEAM = HT94948NDD;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Example/Supporting Files/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.facebook.Facebook;
|
||||
@@ -586,7 +586,7 @@
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
DEVELOPMENT_TEAM = HT94948NDD;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Example/Supporting Files/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.facebook.Facebook;
|
||||
|
||||
+6
-6
@@ -549,7 +549,7 @@
|
||||
GCC_PREFIX_HEADER = "Target Support Files/Siren/Siren-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/Siren/Siren-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MODULEMAP_FILE = "Target Support Files/Siren/Siren.modulemap";
|
||||
PRODUCT_MODULE_NAME = Siren;
|
||||
@@ -581,7 +581,7 @@
|
||||
GCC_PREFIX_HEADER = "Target Support Files/Siren/Siren-prefix.pch";
|
||||
INFOPLIST_FILE = "Target Support Files/Siren/Siren-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MODULEMAP_FILE = "Target Support Files/Siren/Siren.modulemap";
|
||||
PRODUCT_MODULE_NAME = Siren;
|
||||
@@ -612,7 +612,7 @@
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Target Support Files/Pods-Example-Tests/Pods-Example-Tests-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MACH_O_TYPE = staticlib;
|
||||
MODULEMAP_FILE = "Target Support Files/Pods-Example-Tests/Pods-Example-Tests.modulemap";
|
||||
@@ -772,7 +772,7 @@
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MACH_O_TYPE = staticlib;
|
||||
MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap";
|
||||
@@ -805,7 +805,7 @@
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MACH_O_TYPE = staticlib;
|
||||
MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap";
|
||||
@@ -839,7 +839,7 @@
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Target Support Files/Pods-Example-Tests/Pods-Example-Tests-Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MACH_O_TYPE = staticlib;
|
||||
MODULEMAP_FILE = "Target Support Files/Pods-Example-Tests/Pods-Example-Tests.modulemap";
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.3)
|
||||
activesupport (5.2.4.4)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
minitest (~> 5.1)
|
||||
tzinfo (~> 1.1)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
algoliasearch (1.27.5)
|
||||
httpclient (~> 2.8, >= 2.8.3)
|
||||
json (>= 1.5.1)
|
||||
atomos (0.1.3)
|
||||
claide (1.0.3)
|
||||
cocoapods (1.10.0)
|
||||
addressable (~> 2.6)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
cocoapods-core (= 1.10.0)
|
||||
cocoapods-deintegrate (>= 1.0.3, < 2.0)
|
||||
cocoapods-downloader (>= 1.4.0, < 2.0)
|
||||
cocoapods-plugins (>= 1.0.0, < 2.0)
|
||||
cocoapods-search (>= 1.0.0, < 2.0)
|
||||
cocoapods-trunk (>= 1.4.0, < 2.0)
|
||||
cocoapods-try (>= 1.1.0, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
escape (~> 0.0.4)
|
||||
fourflusher (>= 2.3.0, < 3.0)
|
||||
gh_inspector (~> 1.0)
|
||||
molinillo (~> 0.6.6)
|
||||
nap (~> 1.0)
|
||||
ruby-macho (~> 1.4)
|
||||
xcodeproj (>= 1.19.0, < 2.0)
|
||||
cocoapods-core (1.10.0)
|
||||
activesupport (> 5.0, < 6)
|
||||
addressable (~> 2.6)
|
||||
algoliasearch (~> 1.0)
|
||||
concurrent-ruby (~> 1.1)
|
||||
fuzzy_match (~> 2.0.4)
|
||||
nap (~> 1.0)
|
||||
netrc (~> 0.11)
|
||||
public_suffix
|
||||
typhoeus (~> 1.0)
|
||||
cocoapods-deintegrate (1.0.4)
|
||||
cocoapods-downloader (1.6.3)
|
||||
cocoapods-plugins (1.0.0)
|
||||
nap
|
||||
cocoapods-search (1.0.0)
|
||||
cocoapods-trunk (1.5.0)
|
||||
nap (>= 0.8, < 2.0)
|
||||
netrc (~> 0.11)
|
||||
cocoapods-try (1.2.0)
|
||||
colored2 (3.1.2)
|
||||
concurrent-ruby (1.1.7)
|
||||
escape (0.0.4)
|
||||
ethon (0.12.0)
|
||||
ffi (>= 1.3.0)
|
||||
ffi (1.14.2)
|
||||
fourflusher (2.3.1)
|
||||
fuzzy_match (2.0.4)
|
||||
gh_inspector (1.1.3)
|
||||
httpclient (2.8.3)
|
||||
i18n (1.8.5)
|
||||
concurrent-ruby (~> 1.0)
|
||||
json (2.5.1)
|
||||
minitest (5.14.2)
|
||||
molinillo (0.6.6)
|
||||
nanaimo (0.3.0)
|
||||
nap (1.1.0)
|
||||
netrc (0.11.0)
|
||||
public_suffix (4.0.6)
|
||||
ruby-macho (1.4.0)
|
||||
thread_safe (0.3.6)
|
||||
typhoeus (1.4.0)
|
||||
ethon (>= 0.9.0)
|
||||
tzinfo (1.2.9)
|
||||
thread_safe (~> 0.1)
|
||||
xcodeproj (1.19.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.3.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
cocoapods
|
||||
|
||||
BUNDLED WITH
|
||||
2.1.4
|
||||
+2
-2
@@ -3,8 +3,8 @@ import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "Siren",
|
||||
platforms: [.iOS(.v15), .tvOS(.v15)],
|
||||
platforms: [.iOS(.v13), .tvOS(.v13)],
|
||||
products: [.library(name: "Siren", targets: ["Siren"])],
|
||||
targets: [.target(name: "Siren", path: "Sources", resources: [.copy("Siren.bundle")])],
|
||||
targets: [.target(name: "Siren", path: "Sources", resources: [.copy("Siren.bundle"), .copy("PrivacyInfo.xcprivacy")])],
|
||||
swiftLanguageVersions: [.v5]
|
||||
)
|
||||
|
||||
@@ -2,7 +2,13 @@
|
||||
|
||||
### Notify users when a new version of your app is available and prompt them to upgrade.
|
||||
|
||||
[](https://travis-ci.org/ArtSabintsev/Siren)  [](https://cocoapods.org/pods/Siren) [](https://swift.org/package-manager/) [](https://github.com/JamitLabs/Accio)
|
||||
 [](https://cocoapods.org/pods/Siren) [](https://swift.org/package-manager/) [](https://github.com/JamitLabs/Accio)
|
||||
|
||||
---
|
||||
|
||||
# Important Information
|
||||
|
||||
I stopped being a proactive iOS engineer in 2021. For the time being, I will keep this library maintained for the community, but I will not be proactively adding features.
|
||||
|
||||
---
|
||||
|
||||
@@ -44,7 +50,7 @@ Siren is built to work with the [**Semantic Versioning**](https://semver.org/) s
|
||||
## Features
|
||||
|
||||
### Current Features
|
||||
- [x] Compatible with iOS 15+ and tvOS 15+
|
||||
- [x] Compatible with iOS 13+ and tvOS 13+
|
||||
- [x] CocoaPods and Swift Package Manager Support (see [Installation Instructions](https://github.com/ArtSabintsev/Siren#installation-instructions))
|
||||
- [x] Three Types of Alerts (see [Screenshots](https://github.com/ArtSabintsev/Siren#screenshots))
|
||||
- [x] Highly Customizable Presentation Rules (see [Implementation Examples](https://github.com/ArtSabintsev/Siren#implementation-examples))
|
||||
@@ -104,7 +110,7 @@ pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'sw
|
||||
|
||||
### Swift Package Manager
|
||||
```swift
|
||||
.Package(url: "https://github.com/ArtSabintsev/Siren.git", majorVersion: 5)
|
||||
.Package(url: "https://github.com/ArtSabintsev/Siren.git", majorVersion: 6)
|
||||
```
|
||||
|
||||
## Implementation Examples
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
# Version
|
||||
s.version = "6.0.3"
|
||||
s.version = "6.1.3"
|
||||
s.swift_version = "5.5"
|
||||
|
||||
# Meta
|
||||
@@ -14,8 +14,8 @@ Pod::Spec.new do |s|
|
||||
DESC
|
||||
|
||||
# Compatibility & Sources
|
||||
s.ios.deployment_target = '15.0'
|
||||
s.tvos.deployment_target = '15.0'
|
||||
s.ios.deployment_target = '13.0'
|
||||
s.tvos.deployment_target = '13.0'
|
||||
s.source = { :git => "https://github.com/ArtSabintsev/Siren.git", :tag => s.version.to_s }
|
||||
s.source_files = 'Sources/**/*.swift'
|
||||
s.resources = 'Sources/Siren.bundle'
|
||||
|
||||
@@ -27,6 +27,9 @@ public struct APIManager {
|
||||
/// Return results or errors obtained from performing a version check with Siren.
|
||||
typealias CompletionHandler = (Result<APIModel, KnownError>) -> Void
|
||||
|
||||
/// The Bundle ID for the your application. Defaults to "Bundle.main.bundleIdentifier".
|
||||
let bundleID: String?
|
||||
|
||||
/// The region or country of an App Store in which the app is available.
|
||||
let country: AppStoreCountry
|
||||
|
||||
@@ -38,9 +41,11 @@ public struct APIManager {
|
||||
/// - Parameters:
|
||||
/// - country: The country for the App Store in which the app is available.
|
||||
/// - language: The locale to use for the App Store notes. The default result the API returns is equivalent to passing "en_us", so passing `nil` is equivalent to passing "en_us".
|
||||
public init(country: AppStoreCountry = .unitedStates, language: String? = nil) {
|
||||
/// - bundleID: The bundleID for your app. Defaults to `Bundle.main.bundleIdentifier`. Passing `nil` will throw a `missingBundleID` error.
|
||||
public init(country: AppStoreCountry = .unitedStates, language: String? = nil, bundleID: String? = Bundle.main.bundleIdentifier) {
|
||||
self.country = country
|
||||
self.language = language
|
||||
self.bundleID = bundleID
|
||||
}
|
||||
|
||||
/// The default `APIManager`.
|
||||
@@ -62,7 +67,7 @@ extension APIManager {
|
||||
///
|
||||
/// - returns APIModel: The decoded JSON as an instance of APIModel.
|
||||
func performVersionCheckRequest() async throws -> APIModel {
|
||||
guard Bundle.main.bundleIdentifier != nil else {
|
||||
guard bundleID != nil else {
|
||||
throw KnownError.missingBundleID
|
||||
}
|
||||
|
||||
@@ -108,7 +113,7 @@ extension APIManager {
|
||||
components.host = "itunes.apple.com"
|
||||
components.path = "/lookup"
|
||||
|
||||
var items: [URLQueryItem] = [URLQueryItem(name: Constants.bundleID, value: Bundle.main.bundleIdentifier)]
|
||||
var items: [URLQueryItem] = [URLQueryItem(name: Constants.bundleID, value: bundleID)]
|
||||
|
||||
#if os(tvOS)
|
||||
let tvOSQueryItem = URLQueryItem(name: Constants.entity, value: Constants.tvSoftware)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSPrivacyTracking</key>
|
||||
<false/>
|
||||
<key>NSPrivacyTrackingDomains</key>
|
||||
<array/>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPIType</key>
|
||||
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||
<array>
|
||||
<string>CA92.1</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>NSPrivacyCollectedDataTypes</key>
|
||||
<array/>
|
||||
</dict>
|
||||
</plist>
|
||||
+15
-13
@@ -131,7 +131,7 @@ private extension Siren {
|
||||
/// Initiatives the version check request.
|
||||
func performVersionCheck() async {
|
||||
do {
|
||||
let apiModel = await try apiManager.performVersionCheckRequest()
|
||||
let apiModel = try await apiManager.performVersionCheckRequest()
|
||||
DispatchQueue.main.async {
|
||||
self.validate(apiModel: apiModel)
|
||||
}
|
||||
@@ -205,23 +205,25 @@ private extension Siren {
|
||||
/// - currentAppStoreVersion: The curren version of the app in the App Store.
|
||||
/// - model: The iTunes Lookup Model.
|
||||
func determineIfAlertPresentationRulesAreSatisfied(forCurrentAppStoreVersion currentAppStoreVersion: String, andModel model: Model) {
|
||||
// Did the user:
|
||||
// - request to skip being prompted with version update alerts for a specific version
|
||||
// - and is the latest App Store update the same version that was requested?
|
||||
if let previouslySkippedVersion = UserDefaults.storedSkippedVersion,
|
||||
let currentInstalledVersion = currentInstalledVersion,
|
||||
!currentAppStoreVersion.isEmpty,
|
||||
currentAppStoreVersion == previouslySkippedVersion {
|
||||
resultsHandler?(.failure(.skipVersionUpdate(installedVersion: currentInstalledVersion,
|
||||
appStoreVersion: currentAppStoreVersion)))
|
||||
return
|
||||
}
|
||||
|
||||
let updateType = DataParser.parseForUpdate(forInstalledVersion: currentInstalledVersion,
|
||||
andAppStoreVersion: currentAppStoreVersion)
|
||||
do {
|
||||
let rules = try rulesManager.loadRulesForUpdateType(updateType)
|
||||
|
||||
// Did the user:
|
||||
// - request to skip being prompted with version update alerts for a specific version
|
||||
// - and is the latest App Store update the same version that was requested
|
||||
// - and app is not forcing updates?
|
||||
if let previouslySkippedVersion = UserDefaults.storedSkippedVersion,
|
||||
let currentInstalledVersion = currentInstalledVersion,
|
||||
!currentAppStoreVersion.isEmpty,
|
||||
currentAppStoreVersion == previouslySkippedVersion,
|
||||
rules.alertType != .force {
|
||||
resultsHandler?(.failure(.skipVersionUpdate(installedVersion: currentInstalledVersion,
|
||||
appStoreVersion: currentAppStoreVersion)))
|
||||
return
|
||||
}
|
||||
|
||||
if rules.frequency == .immediately {
|
||||
presentAlert(withRules: rules, forCurrentAppStoreVersion: currentAppStoreVersion, model: model, andUpdateType: updateType)
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user