Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 42c5ab103d | |||
| a82d13d1a2 | |||
| 77cda5f933 | |||
| a5bd175373 | |||
| a95766201b | |||
| 6a7901f443 | |||
| 97b23f2804 | |||
| e475b18892 | |||
| c41f146a2d | |||
| 12ec30958c | |||
| cdb05f36a1 | |||
| 8a85468354 | |||
| 54e91577a7 | |||
| 171250c580 | |||
| 1b07f76f59 | |||
| b7819acbd5 |
+10
-7
@@ -31,21 +31,24 @@
|
||||
- [Vladislav Jevremović](https://github.com/VladislavJevremovic) for [Pull Request #98](https://github.com/ArtSabintsev/Siren/pull/98)
|
||||
- [Stefan Kieleithner](https://github.com/steviki) for [Pull Request #99](https://github.com/ArtSabintsev/Siren/pull/99)
|
||||
- [Konstantinos N.](https://github.com/kwstasna) for [Pull Request #101](https://github.com/ArtSabintsev/Siren/pull/101)
|
||||
- [Christoph Mantler](https://github.com/ChrisixFlash) for [Pull Request #103](https://github.com/ArtSabintsev/Siren/pull/103)
|
||||
- [Christoph Mantler](https://github.com/ChrisixFlash) for [Pull Request #106](https://github.com/ArtSabintsev/Siren/pull/106)
|
||||
- [Christoph Mantler](https://github.com/ChrisixFlash) for [Pull Request #103](https://github.com/ArtSabintsev/Siren/pull/103) and [Pull Request #106](https://github.com/ArtSabintsev/Siren/pull/106)
|
||||
- [xedla](https://github.com/xedla) for [Pull Request #107](https://github.com/ArtSabintsev/Siren/pull/107)
|
||||
- [Daniel Hu](https://github.com/zongmumask) for [Pull Request #116](https://github.com/ArtSabintsev/Siren/pull/116)
|
||||
- [Jakob Krigovsky](https://github.com/sonicdoe) for [Pull Request #118](https://github.com/ArtSabintsev/Siren/pull/118)
|
||||
- [germ4n](https://github.com/glm4) for [Pull Request #122](https://github.com/ArtSabintsev/Siren/pull/122)
|
||||
- [Txai Wieser](https://github.com/txaiwieser) for [Pull Request #139](https://github.com/ArtSabintsev/Siren/pull/107)
|
||||
- [Txai Wieser](https://github.com/txaiwieser) for [Pull Request #140](https://github.com/ArtSabintsev/Siren/pull/107)
|
||||
- [Txai Wieser](https://github.com/txaiwieser) for [Pull Request #139](https://github.com/ArtSabintsev/Siren/pull/139) and [Pull Request #140](https://github.com/ArtSabintsev/Siren/pull/140)
|
||||
- [premyslvlcek](https://github.com/premyslvlcek) for [Pull Request #143](https://github.com/ArtSabintsev/Siren/pull/143)
|
||||
- [Seyed Mojtaba Hosseini Zeidabadi](https://github.com/MojtabaHs) for [Pull Request #144](https://github.com/ArtSabintsev/Siren/pull/143)
|
||||
- [Chanchal Raj](https://github.com/RajChanchal) for [Pull Request #171 *Harpy)](https://github.com/ArtSabintsev/harpy/pull/171)
|
||||
- [Ryoh Tsukahara](https://github.com/nixnoughtnothing) for [Pull Request #150](https://github.com/ArtSabintsev/Siren/pull/150)
|
||||
- [Ryoh Tsukahara](https://github.com/nixnoughtnothing) for [Pull Request #159](https://github.com/ArtSabintsev/Siren/pull/159)
|
||||
- [Chanchal Raj](https://github.com/RajChanchal) for [Pull Request #171 (Harpy)](https://github.com/ArtSabintsev/harpy/pull/171)
|
||||
- [Ryoh Tsukahara](https://github.com/nixnoughtnothing) for [Pull Request #150](https://github.com/ArtSabintsev/Siren/pull/150) and [Pull Request #159](https://github.com/ArtSabintsev/Siren/pull/159)
|
||||
- [Jason Wade](https://github.com/iJasonWade) for [Pull Request #162](https://github.com/ArtSabintsev/Siren/pull/162)
|
||||
- [JussiSuojanen](https://github.com/JussiSuojanen) for [Pull Request #171](https://github.com/ArtSabintsev/Siren/pull/171)
|
||||
- [Dmytro Cheverda](https://github.com/dimacheverda) for [Pull Request #175](https://github.com/ArtSabintsev/Siren/pull/175)
|
||||
- [Vladislav Jevremovic](https://github.com/VladislavJevremovic) for [Pull Request #176](https://github.com/ArtSabintsev/Siren/pull/176)
|
||||
- [NSemakov](https://github.com/NSemakov) for [Pull Request #179](https://github.com/ArtSabintsev/Siren/pull/179)
|
||||
- [Attia Mo](https://github.com/attiamo) for [Pull Request #182](https://github.com/ArtSabintsev/Siren/pull/182)
|
||||
- [wbison](https://github.com/wbison) for [Pull Request #185 (Harpy)](https://github.com/ArtSabintsev/Harpy/pull/185)
|
||||
|
||||
|
||||
### Harpy Project Contributors
|
||||
This repo is a Swift language port of [Harpy](http://github.com/ArtSabintsev/Harpy). We couldn't have built this port without acknowledging the following developers who were instrumental in getting Harpy to v3.2.1, the version of Harpy that Siren was based on.
|
||||
|
||||
@@ -133,6 +133,13 @@ func application(application: UIApplication, didFinishLaunchingWithOptions launc
|
||||
// Optional: Defaults to .option
|
||||
siren.alertType = <#Siren.AlertType_Enum_Value#>
|
||||
|
||||
// Optional: Change the various UIAlertController and UIAlertAction messaging. One or more values can be changes. If only a subset of values are changed, the defaults with which Siren comes with will be used.
|
||||
siren.alertMessaging = SirenAlertMessaging(updateTitle: "New Fancy Title",
|
||||
updateMessage: "New message goes here!",
|
||||
updateButtonMessage: "Update Now, Plz!?",
|
||||
nextTimeButtonMessage: "OK, next time it is!",
|
||||
skipVersionButtonMessage: "Please don't push skip, please don't!")
|
||||
|
||||
// Optional: Set this variable if you would only like to show an alert if your app has been available on the store for a few days.
|
||||
// This default value is set to 1 to avoid this issue: https://github.com/ArtSabintsev/Siren#words-of-caution
|
||||
// To show the update immediately after Apple has updated their JSON, set this value to 0. Not recommended due to aforementioned reason in https://github.com/ArtSabintsev/Siren#words-of-caution.
|
||||
@@ -251,6 +258,7 @@ Siren is localized for
|
||||
- Swedish
|
||||
- Thai
|
||||
- Turkish
|
||||
- Ukrainian
|
||||
- Urdu
|
||||
- Vietnamese
|
||||
|
||||
@@ -275,10 +283,14 @@ For your convenience, you may turn on debugging statements by setting `self.debu
|
||||
The App Store reviewer will **not** see the alert. The version in the App Store will always be older than the version being reviewed.
|
||||
|
||||
## Phased Releases
|
||||
In 2017, Apple announced the [ability to rollout app updates gradually (a.k.a. Phased Releases)](https://itunespartner.apple.com/en/apps/faq/Managing%20Your%20Apps_Submission%20Process). Siren will continue to work as it has in the past, presenting an update modal to _all_ users. If you opt-in to a phased rollout for a specific version, you will need to remotely disable Siren until the rollout is done.
|
||||
In 2017, Apple announced the [ability to rollout app updates gradually (a.k.a. Phased Releases)](https://itunespartner.apple.com/en/apps/faq/Managing%20Your%20Apps_Submission%20Process). Siren will continue to work as it has in the past, presenting an update modal to _all_ users. If you opt-in to a phased rollout for a specific version, you have a few choices:
|
||||
|
||||
- You can leave Siren configured as normal. Phased rollout will continue to auto-update apps. Since all users can still manually update your app directly, Siren will ignore the phase rollout and will prompt users to update.
|
||||
- You can set `showAlertAfterCurrentVersionHasBeenReleasedForDays` to `7`, and Siren will not prompt any users until the latest version is 7 days old, after phased rollout is complete.
|
||||
- You can remotely disable Siren until the rollout is done using your own API / backend logic.
|
||||
|
||||
## Words of Caution
|
||||
Occasionally, the iTunes JSON will update faster than the App Store CDN, meaning the JSON may state that the new version of the app has been release, while no new binary is made available for download via the App Store. It is for this reason that Siren will, by default, wait 24 hours after the JSON has been updated to prompt the user to update. To change the default setting, please modify the value of `showAlertAfterCurrentVersionHasBeenReleasedForDays`.
|
||||
Occasionally, the iTunes JSON will update faster than the App Store CDN, meaning the JSON may state that the new version of the app has been released, while no new binary is made available for download via the App Store. It is for this reason that Siren will, by default, wait 24 hours after the JSON has been updated to prompt the user to update. To change the default setting, please modify the value of `showAlertAfterCurrentVersionHasBeenReleasedForDays`.
|
||||
|
||||
## Ports
|
||||
- **Objective-C (iOS)**
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "Siren"
|
||||
s.version = "3.1.2"
|
||||
s.version = "3.2.0"
|
||||
s.summary = "Notify users that a new version of your iOS app is available, and prompt them with the App Store link."
|
||||
|
||||
s.description = <<-DESC
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
55EC36601E6BB99B00726F13 /* Siren.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 55EC365E1E6BB99B00726F13 /* Siren.bundle */; };
|
||||
55EC36611E6BB99B00726F13 /* Siren.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55EC365F1E6BB99B00726F13 /* Siren.swift */; };
|
||||
8E1635A91E6A0B9C0060CE27 /* SirenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EE6C74C1E6A0AE100DBE454 /* SirenTests.swift */; };
|
||||
8E2499BF1FD83DDF00F384BA /* SirenAlertMessaging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E2499BE1FD83DDF00F384BA /* SirenAlertMessaging.swift */; };
|
||||
8E43D6231E8223EE00ECFFC8 /* SirenDateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E43D6221E8223EE00ECFFC8 /* SirenDateExtension.swift */; };
|
||||
8E528A301E989A7A00B643C4 /* SirenDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E528A2F1E989A7A00B643C4 /* SirenDelegate.swift */; };
|
||||
8E528A321E989E0A00B643C4 /* SirenTestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E528A311E989E0A00B643C4 /* SirenTestHelper.swift */; };
|
||||
@@ -66,6 +67,7 @@
|
||||
55EC364A1E6BB98A00726F13 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
55EC365E1E6BB99B00726F13 /* Siren.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Siren.bundle; path = ../../Sources/Siren.bundle; sourceTree = "<group>"; };
|
||||
55EC365F1E6BB99B00726F13 /* Siren.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Siren.swift; path = ../../Sources/Siren.swift; sourceTree = "<group>"; };
|
||||
8E2499BE1FD83DDF00F384BA /* SirenAlertMessaging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SirenAlertMessaging.swift; path = ../../Sources/SirenAlertMessaging.swift; sourceTree = "<group>"; };
|
||||
8E3A6C041D07CB6F00A8B7CF /* SirenExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SirenExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8E43D6221E8223EE00ECFFC8 /* SirenDateExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SirenDateExtension.swift; path = ../../Sources/SirenDateExtension.swift; sourceTree = "<group>"; };
|
||||
8E528A2F1E989A7A00B643C4 /* SirenDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SirenDelegate.swift; path = ../../Sources/SirenDelegate.swift; sourceTree = "<group>"; };
|
||||
@@ -118,9 +120,10 @@
|
||||
children = (
|
||||
55EC365E1E6BB99B00726F13 /* Siren.bundle */,
|
||||
55EC365F1E6BB99B00726F13 /* Siren.swift */,
|
||||
8E528A2F1E989A7A00B643C4 /* SirenDelegate.swift */,
|
||||
8E2499BE1FD83DDF00F384BA /* SirenAlertMessaging.swift */,
|
||||
8E9C238A1E7CDB42000ED3DA /* SirenBundleExtension.swift */,
|
||||
8E43D6221E8223EE00ECFFC8 /* SirenDateExtension.swift */,
|
||||
8E528A2F1E989A7A00B643C4 /* SirenDelegate.swift */,
|
||||
8EACA9761F38113D003134CA /* SirenError.swift */,
|
||||
8E5D15B01F3632D7001C0960 /* SirenLog.swift */,
|
||||
8EACA96F1F37F327003134CA /* SirenLookupModel.swift */,
|
||||
@@ -360,6 +363,7 @@
|
||||
8E5D15B11F3632D7001C0960 /* SirenLog.swift in Sources */,
|
||||
8E9C238B1E7CDB42000ED3DA /* SirenBundleExtension.swift in Sources */,
|
||||
8E528A301E989A7A00B643C4 /* SirenDelegate.swift in Sources */,
|
||||
8E2499BF1FD83DDF00F384BA /* SirenAlertMessaging.swift in Sources */,
|
||||
8EACA9701F37F327003134CA /* SirenLookupModel.swift in Sources */,
|
||||
8E9C238D1E7CDD31000ED3DA /* SirenUIAlertControllerExtension.swift in Sources */,
|
||||
);
|
||||
@@ -434,7 +438,7 @@
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.sabintsev.Siren;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.apple.itunesconnect.mobile.tests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
@@ -465,7 +469,7 @@
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.sabintsev.Siren;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.apple.itunesconnect.mobile.tests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
|
||||
@@ -34,6 +34,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
// Optional - Change the name of your app. Useful if you have a long app name and want to display a shortened version in the update dialog (e.g., the UIAlertController).
|
||||
// siren.appName = "Test App Name"
|
||||
|
||||
// Optional - Change the various UIAlertController and UIAlertAction messaging. One or more values can be changes. If only a subset of values are changed, the defaults with which Siren comes with will be used.
|
||||
// siren.alertMessaging = SirenAlertMessaging(updateTitle: "New Fancy Title",
|
||||
// updateMessage: "New message goes here!",
|
||||
// updateButtonMessage: "Update Now, Plz!?",
|
||||
// nextTimeButtonMessage: "OK, next time it is!",
|
||||
// skipVersionButtonMessage: "Please don't push skip, please don't!")
|
||||
|
||||
// Optional - Defaults to .Option
|
||||
// siren.alertType = .option // or .force, .skip, .none
|
||||
|
||||
@@ -46,7 +53,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
// Optional - Sets all messages to appear in Russian. Siren supports many other languages, not just English and Russian.
|
||||
// siren.forceLanguageLocalization = .russian
|
||||
|
||||
// Optional - Set this variable if your app is not available in the U.S. App Store. List of codes: https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Appendices/AppStoreTerritories.html
|
||||
// Optional - Set this variable if your app is not available in the U.S. App Store. List of codes: https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/AppStoreTerritories.html
|
||||
// siren.countryCode = ""
|
||||
|
||||
// Optional - Set this variable if you would only like to show an alert if your app has been available on the store for a few days.
|
||||
|
||||
@@ -15,11 +15,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4</string>
|
||||
<string>1.0.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>18</string>
|
||||
<string>1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
|
||||
@@ -143,7 +143,7 @@ extension SirenTests {
|
||||
siren.forceLanguageLocalization = language
|
||||
|
||||
// Update Available
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update Available", forceLanguageLocalization: language), "التجديد متوفر")
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update Available", forceLanguageLocalization: language), "التحديث متوفر")
|
||||
|
||||
// Next time
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Next time", forceLanguageLocalization: language), "المرة التالية")
|
||||
@@ -152,7 +152,7 @@ extension SirenTests {
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Skip this version", forceLanguageLocalization: language), "تخطى عن هذه النسخة")
|
||||
|
||||
// Update
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update", forceLanguageLocalization: language), "تجديد")
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update", forceLanguageLocalization: language), "تحديث")
|
||||
}
|
||||
|
||||
func testArmenianLocalization() {
|
||||
@@ -279,7 +279,7 @@ extension SirenTests {
|
||||
siren.forceLanguageLocalization = language
|
||||
|
||||
// Update Available
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update Available", forceLanguageLocalization: language), "Update Beschikbaar")
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update Available", forceLanguageLocalization: language), "Update beschikbaar")
|
||||
|
||||
// Next time
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Next time", forceLanguageLocalization: language), "Volgende keer")
|
||||
@@ -784,6 +784,23 @@ extension SirenTests {
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update", forceLanguageLocalization: language), "Güncelle")
|
||||
}
|
||||
|
||||
func testUkrainianLocalization() {
|
||||
let language: Siren.LanguageType = .ukrainian
|
||||
siren.forceLanguageLocalization = language
|
||||
|
||||
// Update Available
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update Available", forceLanguageLocalization: language), "Доступне Оновлення")
|
||||
|
||||
// Next time
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Next time", forceLanguageLocalization: language), "Наступного разу")
|
||||
|
||||
// Skip this version
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Skip this version", forceLanguageLocalization: language), "Пропустити версію")
|
||||
|
||||
// Update
|
||||
XCTAssertEqual(Bundle().testLocalizedString(forKey: "Update", forceLanguageLocalization: language), "Оновити")
|
||||
}
|
||||
|
||||
func testUrduLocalization() {
|
||||
let language: Siren.LanguageType = .urdu
|
||||
siren.forceLanguageLocalization = language
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
+16
-10
@@ -72,6 +72,10 @@ public final class Siren: NSObject {
|
||||
/// By default, it's set to the name of the app that's stored in your plist.
|
||||
public lazy var appName = Bundle.bestMatchingAppName()
|
||||
|
||||
/// Overrides all the Strings to which Siren defaults.
|
||||
/// Defaults to the values defined in `SirenAlertMessaging.Constants`
|
||||
public var alertMessaging = SirenAlertMessaging()
|
||||
|
||||
/// The region or country of an App Store in which your app is available.
|
||||
/// By default, all version checks are performed against the US App Store.
|
||||
/// If your app is not available in the US App Store, set it to the identifier of at least one App Store within which it is available.
|
||||
@@ -97,7 +101,7 @@ public final class Siren: NSObject {
|
||||
fileprivate lazy var alertViewIsVisible: Bool = false
|
||||
|
||||
/// Type of the available update
|
||||
private var updateType: UpdateType = .unknown
|
||||
fileprivate var updateType: UpdateType = .unknown
|
||||
|
||||
/// The App's Singleton
|
||||
public static let shared = Siren()
|
||||
@@ -202,7 +206,7 @@ private extension Siren {
|
||||
guard isUpdateCompatibleWithDeviceOS(for: model) else {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
guard let appID = model.results.first?.appID else {
|
||||
postError(.appStoreAppIDFailure)
|
||||
return
|
||||
@@ -279,7 +283,8 @@ private extension Siren {
|
||||
func showAlert() {
|
||||
storeVersionCheckDate()
|
||||
|
||||
let updateAvailableMessage = Bundle.localizedString(forKey: "Update Available", forceLanguageLocalization: forceLanguageLocalization)
|
||||
let updateAvailableMessage = Bundle.localizedString(forKey: alertMessaging.updateTitle, forceLanguageLocalization: forceLanguageLocalization)
|
||||
|
||||
let newVersionMessage = localizedNewVersionMessage()
|
||||
|
||||
let alertController = UIAlertController(title: updateAvailableMessage, message: newVersionMessage, preferredStyle: .alert)
|
||||
@@ -358,8 +363,8 @@ private extension Siren {
|
||||
return .option
|
||||
}
|
||||
|
||||
let oldVersion = (currentInstalledVersion).characters.split {$0 == "."}.map { String($0) }.map {Int($0) ?? 0}
|
||||
let newVersion = (currentAppStoreVersion).characters.split {$0 == "."}.map { String($0) }.map {Int($0) ?? 0}
|
||||
let oldVersion = (currentInstalledVersion).split {$0 == "."}.map { String($0) }.map {Int($0) ?? 0}
|
||||
let newVersion = (currentAppStoreVersion).split {$0 == "."}.map { String($0) }.map {Int($0) ?? 0}
|
||||
|
||||
guard let newVersionFirst = newVersion.first, let oldVersionFirst = oldVersion.first else {
|
||||
return alertType // Default value is .Option
|
||||
@@ -387,7 +392,7 @@ private extension Siren {
|
||||
|
||||
private extension Siren {
|
||||
func localizedNewVersionMessage() -> String {
|
||||
let newVersionMessageToLocalize = "A new version of %@ is available. Please update to version %@ now."
|
||||
let newVersionMessageToLocalize = alertMessaging.updateMessage
|
||||
let newVersionMessage = Bundle.localizedString(forKey: newVersionMessageToLocalize, forceLanguageLocalization: forceLanguageLocalization)
|
||||
|
||||
guard let currentAppStoreVersion = currentAppStoreVersion else {
|
||||
@@ -398,15 +403,15 @@ private extension Siren {
|
||||
}
|
||||
|
||||
func localizedUpdateButtonTitle() -> String {
|
||||
return Bundle.localizedString(forKey: "Update", forceLanguageLocalization: forceLanguageLocalization)
|
||||
return Bundle.localizedString(forKey: alertMessaging.updateButtonMessage, forceLanguageLocalization: forceLanguageLocalization)
|
||||
}
|
||||
|
||||
func localizedNextTimeButtonTitle() -> String {
|
||||
return Bundle.localizedString(forKey: "Next time", forceLanguageLocalization: forceLanguageLocalization)
|
||||
return Bundle.localizedString(forKey: alertMessaging.nextTimeButtonMessage, forceLanguageLocalization: forceLanguageLocalization)
|
||||
}
|
||||
|
||||
func localizedSkipButtonTitle() -> String {
|
||||
return Bundle.localizedString(forKey: "Skip this version", forceLanguageLocalization: forceLanguageLocalization)
|
||||
return Bundle.localizedString(forKey: alertMessaging.skipVersionButtonMessage, forceLanguageLocalization: forceLanguageLocalization)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -426,7 +431,7 @@ extension Siren {
|
||||
return newVersionExists
|
||||
}
|
||||
|
||||
private func storeVersionCheckDate() {
|
||||
fileprivate func storeVersionCheckDate() {
|
||||
lastVersionCheckPerformedOnDate = Date()
|
||||
if let lastVersionCheckPerformedOnDate = lastVersionCheckPerformedOnDate {
|
||||
UserDefaults.standard.set(lastVersionCheckPerformedOnDate, forKey: SirenDefaults.StoredVersionCheckDate.rawValue)
|
||||
@@ -549,6 +554,7 @@ public extension Siren {
|
||||
case thai = "th"
|
||||
case turkish = "tr"
|
||||
case urdu = "ur"
|
||||
case ukrainian = "uk"
|
||||
case vietnamese = "vi"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
//
|
||||
// SirenAlertMessaging.swift
|
||||
// Siren
|
||||
//
|
||||
// Created by Arthur Sabintsev on 12/6/17.
|
||||
// Copyright © 2017 Sabintsev iOS Projects. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
// MARK: - Siren Alert Messaging Customization
|
||||
|
||||
/// Allows the overriding of all the `UIAlertController` and `UIActionSheet` Strings to which Siren defaults.
|
||||
///
|
||||
/// - Warning: Overriding any of these keys will result in the loss of the built-in internationalization that Siren provides.
|
||||
///
|
||||
/// As SirenAlertMessaging is a Struct, one _or_ more keys can be modified. Overriding only one string will result in the other keys retaining their default (and internationalizable) values.
|
||||
public struct SirenAlertMessaging {
|
||||
|
||||
public struct Constants {
|
||||
public static let nextTime = "Next time"
|
||||
public static let skipVersion = "Skip this version"
|
||||
public static let updateMessage = "A new version of %@ is available. Please update to version %@ now."
|
||||
public static let updateTitle = "Update Available"
|
||||
public static let updateNow = "Update"
|
||||
}
|
||||
|
||||
let nextTimeButtonMessage: String
|
||||
let skipVersionButtonMessage: String
|
||||
let updateButtonMessage: String
|
||||
let updateMessage: String
|
||||
let updateTitle: String
|
||||
|
||||
/// The public initializer
|
||||
///
|
||||
/// - Parameters:
|
||||
/// - title: The title field of the `UIAlertController`.
|
||||
/// - message: The `message` field of the `UIAlertController`.
|
||||
/// - updateButtonMessage: The `title` field of the Update Button `UIAlertAction`.
|
||||
/// - nextTimeButtonMessage: The `title` field of the Next Time Button `UIAlertAction`.
|
||||
/// - skipVersionButtonMessage: The `title` field of the Skip Button `UIAlertAction`.
|
||||
public init(updateTitle title: String = Constants.updateTitle,
|
||||
updateMessage message: String = Constants.updateMessage,
|
||||
updateButtonMessage: String = Constants.updateNow,
|
||||
nextTimeButtonMessage: String = Constants.nextTime,
|
||||
skipVersionButtonMessage: String = Constants.skipVersion) {
|
||||
self.updateTitle = title
|
||||
self.nextTimeButtonMessage = nextTimeButtonMessage
|
||||
self.updateButtonMessage = updateButtonMessage
|
||||
self.updateMessage = message
|
||||
self.skipVersionButtonMessage = skipVersionButtonMessage
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
// MARK: - UIAlertController Extension for Siren
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
// MARK: - UIViewController Extension for Siren
|
||||
|
||||
|
||||
Reference in New Issue
Block a user