mirror of
https://github.com/UrbanApps/Armchair.git
synced 2026-07-15 17:22:49 +02:00
Add custom dialog closure
Added an optional closure to allow developers to present their own dialog once all criteria for the dialog are filled. Passes closures for 'Rate', 'Remind', and 'No thanks'
This commit is contained in:
committed by
GitHub
parent
24b4f4ab8f
commit
61f124d82c
+87
-74
@@ -356,6 +356,8 @@ public func resetDefaults() {
|
|||||||
Manager.defaultManager.didDisplayAlertClosure = nil
|
Manager.defaultManager.didDisplayAlertClosure = nil
|
||||||
Manager.defaultManager.didOptToRateClosure = nil
|
Manager.defaultManager.didOptToRateClosure = nil
|
||||||
Manager.defaultManager.didOptToRemindLaterClosure = nil
|
Manager.defaultManager.didOptToRemindLaterClosure = nil
|
||||||
|
|
||||||
|
Manager.defaultManager.customAlertClosure = nil
|
||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
Manager.defaultManager.usesAnimation = true
|
Manager.defaultManager.usesAnimation = true
|
||||||
@@ -562,6 +564,7 @@ public func rateApp() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public typealias ArmchairClosure = () -> ()
|
public typealias ArmchairClosure = () -> ()
|
||||||
|
public typealias ArmchairClosureCustomAlert = (_ rateAppClosure: ArmchairClosure, _ remindLaterClosure: ArmchairClosure, _ noThanksClosure: ArmchairClosure) -> ()
|
||||||
public typealias ArmchairAnimateClosure = (Bool) -> ()
|
public typealias ArmchairAnimateClosure = (Bool) -> ()
|
||||||
public typealias ArmchairShouldPromptClosure = (ArmchairTrackingInfo) -> Bool
|
public typealias ArmchairShouldPromptClosure = (ArmchairTrackingInfo) -> Bool
|
||||||
public typealias ArmchairShouldIncrementClosure = () -> Bool
|
public typealias ArmchairShouldIncrementClosure = () -> Bool
|
||||||
@@ -920,6 +923,8 @@ open class Manager : ArmchairManager {
|
|||||||
var didOptToRateClosure: ArmchairClosure?
|
var didOptToRateClosure: ArmchairClosure?
|
||||||
var didOptToRemindLaterClosure: ArmchairClosure?
|
var didOptToRemindLaterClosure: ArmchairClosure?
|
||||||
|
|
||||||
|
var customAlertClosure: ArmchairClosureCustomAlert?
|
||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
var willPresentModalViewClosure: ArmchairAnimateClosure?
|
var willPresentModalViewClosure: ArmchairAnimateClosure?
|
||||||
var didDismissModalViewClosure: ArmchairAnimateClosure?
|
var didDismissModalViewClosure: ArmchairAnimateClosure?
|
||||||
@@ -1184,83 +1189,91 @@ open class Manager : ArmchairManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func showRatingAlert() {
|
fileprivate func showRatingAlert() {
|
||||||
#if os(iOS)
|
if let customClosure = customAlertClosure {
|
||||||
if (operatingSystemVersion >= 8 && usesAlertController) || operatingSystemVersion >= 9 {
|
customClosure({[weak self] in self?._rateApp()}, {[weak self] in self?.remindMeLater()}, {[weak self] in self?.dontRate()})
|
||||||
/* iOS 8 uses new UIAlertController API*/
|
|
||||||
let alertView : UIAlertController = UIAlertController(title: reviewTitle, message: reviewMessage, preferredStyle: UIAlertControllerStyle.alert)
|
|
||||||
alertView.addAction(UIAlertAction(title: cancelButtonTitle, style:UIAlertActionStyle.cancel, handler: {
|
|
||||||
(alert: UIAlertAction!) in
|
|
||||||
self.dontRate()
|
|
||||||
}))
|
|
||||||
if (showsRemindButton()) {
|
|
||||||
alertView.addAction(UIAlertAction(title: remindButtonTitle!, style:UIAlertActionStyle.default, handler: {
|
|
||||||
(alert: UIAlertAction!) in
|
|
||||||
self.remindMeLater()
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
alertView.addAction(UIAlertAction(title: rateButtonTitle, style:UIAlertActionStyle.default, handler: {
|
|
||||||
(alert: UIAlertAction!) in
|
|
||||||
self._rateApp()
|
|
||||||
}))
|
|
||||||
|
|
||||||
// get the top most controller (= the StoreKit Controller) and dismiss it
|
|
||||||
if let presentingController = UIApplication.shared.keyWindow?.rootViewController {
|
|
||||||
if let topController = topMostViewController(presentingController) {
|
|
||||||
topController.present(alertView, animated: usesAnimation) {
|
|
||||||
print("presentViewController() completed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// note that tint color has to be set after the controller is presented in order to take effect (last checked in iOS 9.3)
|
|
||||||
alertView.view.tintColor = tintColor
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* Otherwise we use UIAlertView still */
|
|
||||||
var alertView: UIAlertView
|
|
||||||
if (showsRemindButton()) {
|
|
||||||
alertView = UIAlertView(title: reviewTitle, message: reviewMessage, delegate: self, cancelButtonTitle: cancelButtonTitle, otherButtonTitles: remindButtonTitle!, rateButtonTitle)
|
|
||||||
} else {
|
|
||||||
alertView = UIAlertView(title: reviewTitle, message: reviewMessage, delegate: self, cancelButtonTitle: cancelButtonTitle, otherButtonTitles: rateButtonTitle)
|
|
||||||
}
|
|
||||||
// If we have a remind button, show it first. Otherwise show the rate button
|
|
||||||
// If we have a remind button, show the rate button next. Otherwise stop adding buttons.
|
|
||||||
|
|
||||||
alertView.cancelButtonIndex = -1
|
|
||||||
ratingAlert = alertView
|
|
||||||
alertView.show()
|
|
||||||
|
|
||||||
if let closure = didDisplayAlertClosure {
|
|
||||||
closure()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#elseif os(OSX)
|
|
||||||
|
|
||||||
let alert: NSAlert = NSAlert()
|
|
||||||
alert.messageText = reviewTitle
|
|
||||||
alert.informativeText = reviewMessage
|
|
||||||
alert.addButton(withTitle: rateButtonTitle)
|
|
||||||
if showsRemindButton() {
|
|
||||||
alert.addButton(withTitle: remindButtonTitle!)
|
|
||||||
}
|
|
||||||
alert.addButton(withTitle: cancelButtonTitle)
|
|
||||||
ratingAlert = alert
|
|
||||||
|
|
||||||
if let window = NSApplication.shared().keyWindow {
|
|
||||||
alert.beginSheetModal(for: window) {
|
|
||||||
(response: NSModalResponse) in
|
|
||||||
self.handleNSAlert(returnCode: response)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let returnCode = alert.runModal()
|
|
||||||
handleNSAlert(returnCode:returnCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let closure = self.didDisplayAlertClosure {
|
if let closure = self.didDisplayAlertClosure {
|
||||||
closure()
|
closure()
|
||||||
}
|
}
|
||||||
#else
|
} else {
|
||||||
#endif
|
#if os(iOS)
|
||||||
|
if (operatingSystemVersion >= 8 && usesAlertController) || operatingSystemVersion >= 9 {
|
||||||
|
/* iOS 8 uses new UIAlertController API*/
|
||||||
|
let alertView : UIAlertController = UIAlertController(title: reviewTitle, message: reviewMessage, preferredStyle: UIAlertControllerStyle.alert)
|
||||||
|
alertView.addAction(UIAlertAction(title: cancelButtonTitle, style:UIAlertActionStyle.cancel, handler: {
|
||||||
|
(alert: UIAlertAction!) in
|
||||||
|
self.dontRate()
|
||||||
|
}))
|
||||||
|
if (showsRemindButton()) {
|
||||||
|
alertView.addAction(UIAlertAction(title: remindButtonTitle!, style:UIAlertActionStyle.default, handler: {
|
||||||
|
(alert: UIAlertAction!) in
|
||||||
|
self.remindMeLater()
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
alertView.addAction(UIAlertAction(title: rateButtonTitle, style:UIAlertActionStyle.default, handler: {
|
||||||
|
(alert: UIAlertAction!) in
|
||||||
|
self._rateApp()
|
||||||
|
}))
|
||||||
|
|
||||||
|
// get the top most controller (= the StoreKit Controller) and dismiss it
|
||||||
|
if let presentingController = UIApplication.shared.keyWindow?.rootViewController {
|
||||||
|
if let topController = topMostViewController(presentingController) {
|
||||||
|
topController.present(alertView, animated: usesAnimation) {
|
||||||
|
print("presentViewController() completed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// note that tint color has to be set after the controller is presented in order to take effect (last checked in iOS 9.3)
|
||||||
|
alertView.view.tintColor = tintColor
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* Otherwise we use UIAlertView still */
|
||||||
|
var alertView: UIAlertView
|
||||||
|
if (showsRemindButton()) {
|
||||||
|
alertView = UIAlertView(title: reviewTitle, message: reviewMessage, delegate: self, cancelButtonTitle: cancelButtonTitle, otherButtonTitles: remindButtonTitle!, rateButtonTitle)
|
||||||
|
} else {
|
||||||
|
alertView = UIAlertView(title: reviewTitle, message: reviewMessage, delegate: self, cancelButtonTitle: cancelButtonTitle, otherButtonTitles: rateButtonTitle)
|
||||||
|
}
|
||||||
|
// If we have a remind button, show it first. Otherwise show the rate button
|
||||||
|
// If we have a remind button, show the rate button next. Otherwise stop adding buttons.
|
||||||
|
|
||||||
|
alertView.cancelButtonIndex = -1
|
||||||
|
ratingAlert = alertView
|
||||||
|
alertView.show()
|
||||||
|
|
||||||
|
if let closure = didDisplayAlertClosure {
|
||||||
|
closure()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#elseif os(OSX)
|
||||||
|
|
||||||
|
let alert: NSAlert = NSAlert()
|
||||||
|
alert.messageText = reviewTitle
|
||||||
|
alert.informativeText = reviewMessage
|
||||||
|
alert.addButton(withTitle: rateButtonTitle)
|
||||||
|
if showsRemindButton() {
|
||||||
|
alert.addButton(withTitle: remindButtonTitle!)
|
||||||
|
}
|
||||||
|
alert.addButton(withTitle: cancelButtonTitle)
|
||||||
|
ratingAlert = alert
|
||||||
|
|
||||||
|
if let window = NSApplication.shared().keyWindow {
|
||||||
|
alert.beginSheetModal(for: window) {
|
||||||
|
(response: NSModalResponse) in
|
||||||
|
self.handleNSAlert(returnCode: response)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let returnCode = alert.runModal()
|
||||||
|
handleNSAlert(returnCode:returnCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let closure = self.didDisplayAlertClosure {
|
||||||
|
closure()
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: -
|
// MARK: -
|
||||||
|
|||||||
Reference in New Issue
Block a user