Compare commits

...

16 Commits

Author SHA1 Message Date
Arthur Ariel Sabintsev 42c5ab103d Updated README and podspec 2017-12-08 11:09:23 -05:00
Arthur Ariel Sabintsev a82d13d1a2 Override Siren's Default Copy/Messaging in UIAlertController/UIAlertActionSheet (#187)
* Added SirenAlertMessaging struct to allow for custom overriding of messaging in UIAlertController update modal

* Spacing fix

* Comment updates

* alertMessaging is now long lazy

* Updated Sample message

* Commented sample message

* Updates Keys to Constants
2017-12-08 09:06:08 -07:00
Arthur Ariel Sabintsev 77cda5f933 Updated bundle id 2017-12-07 01:56:49 -05:00
Arthur Ariel Sabintsev a5bd175373 Closes #183. Fixes Country Code App Store URL in comments within AppDelegate. 2017-11-27 10:45:17 -05:00
Arthur Ariel Sabintsev a95766201b Updated Dutch localization 2017-11-21 23:35:30 -05:00
Attia Mo 6a7901f443 Fix Arabic localization. (#182)
* Fix Arabic localization.

* update Arabic localization Tests
2017-11-21 23:28:09 -05:00
Aaron Brager 97b23f2804 Update README with phased rollout options (#181) 2017-11-17 16:54:37 -05:00
Arthur Ariel Sabintsev e475b18892 Updated Contributors docs 2017-11-09 16:07:05 -05:00
Arthur Ariel Sabintsev c41f146a2d Update podspec 2017-11-09 16:05:42 -05:00
NSemakov 12ec30958c Add import UIKit for compilation as static framework. (#179) 2017-11-09 16:04:59 -05:00
Arthur Ariel Sabintsev cdb05f36a1 Update README.md 2017-10-23 21:58:17 -04:00
Arthur Ariel Sabintsev 8a85468354 Updated metadata 2017-10-21 10:37:54 -04:00
Vladislav Jevremović 54e91577a7 'characters' is deprecated in Swift 4 (#176) 2017-10-21 10:36:03 -04:00
Arthur Ariel Sabintsev 171250c580 Updated podspec and Contributors.md file 2017-10-19 23:57:29 -04:00
Dmytro Cheverda 1b07f76f59 Add Ukrainian localization (#175)
* Add Ukrainian localization

* Update tests to cover Ukrainian localization
2017-10-19 23:56:38 -04:00
Arthur Ariel Sabintsev b7819acbd5 Fixed transitive dependency issue by increasing scope from private to fileprivate on a couple variables and functions 2017-10-19 16:14:04 -04:00
14 changed files with 134 additions and 29 deletions
+10 -7
View File
@@ -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.
+14 -2
View File
@@ -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
View File
@@ -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";
+8 -1
View File
@@ -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.
+16 -10
View File
@@ -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"
}
}
+54
View File
@@ -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
+1
View File
@@ -7,6 +7,7 @@
//
import Foundation
import UIKit
// MARK: - UIViewController Extension for Siren