RocketAlert
Rocket Alert 通过提供类似 Chat Bot 的用户友好的过程来解决由无聊的 AlertView 引起的分心问题。
您希望在邀请用户执行某些操作时改善用户体验吗?
使用现代风格和强大的个性化功能,RocketAlert 可帮助您提高转化率。
- 安装
- 通信
- 使用方法
- RocketBlock - 基础协议
- TappableRocketBlock 协议
- TextRocketBlock - 显示一行或多行文本
- Flat style - 如何编写整洁和可读的块
- shownNextAfter 属性:自动显示下一个块
- RocketFont - 如何更改文本样式
- ImageRocketBlock - 显示带文本的图像
- TextRocketBlock - 显示一行或多行文本
- ControlRocketBlock 协议
- ButtonRocketBlock - 显示单个按钮
- TapRocketHandler - 处理并显示在 TouchUpInside 事件后的下一个块
- DoubleButtonBlock - 显示两个按钮
- ButtonRocketBlock - 显示单个按钮
- InputRocketBlock 协议
- TextInputRocketBlock - 请求用户输入文本
- InputRocketHandler - 根据输入,返回不同的块
- TextInputRocketBlock - 请求用户输入文本
- NotificationCenter 截获内部通知
安装
CocoaPods
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'RocketAlert', '1.0-beta.2'
end
然后,运行以下命令
$ pod install
通讯
- 如有问题需要帮助,请使用 Stack Overflow。(标签 'rocketalert')
- 如果你发现了一个错误或有一个功能请求,请打开一个问题。
- 如果你是
iOS 意大利开发者,请关注我们 在 Slack 或 Facebook 群组
- 如果你想贡献力量,请提交一个拉取请求。
用法
您可以通过传递一个 RocketAuthor
和一个 RocketBlock
对象给它的参数来实例化一个 Rocket
。 然后,您可以通过执行 show()
方法来呈现 Rocket
import RocketAlert
let author = RocketAuthor.init(image: yourUIImage, style: RocketImageStyle.round)
let textBlock = TextRocketBlock.init(text: "This is your first Block")
let rocket = Rocket.init(author: author, block: textBlock)
rocket.show()
您可以通过在同一个火箭对象上调用 dismiss()
方法来销毁警报
rocket.dismiss()
RocketBlock
RocketBlock
是一个数据功能的容器,在底层 RocketBlock
什么都不是,只是一个简单的 UITableViewCell
。
根据块类型,用户可以通过 点按、控制事件(例如按钮点击)和 输入事件(目前只有文本输入)与块交互。在事件之后,Rocket
可以显示与交互的块附加的下一个块。
RocketBlock
协议给所有块一个 var id: String? {get set}
属性(创建用于一些高级情况)。还有一个 var cellIdentifier: String {get}
,它被内部用于将块与可重用单元格相匹配。
public protocol RocketBlock {
var id: String? { get set }
var cellIdentifier: String { get }
}
从不将 RocketBlock
协议作为实现类的基协议使用。 相反,您将使用继承的协议,这些协议给块带来一些有用的东西。
重要:当呈现下一个块时,将禁用对前一个块的交互。
可点RocketBlock
从 RocketBlock
继承的 TappableRocketBlock
协议。该 TappableRocketBlock
协议描述了可以由用户点按的块。它给实现类提供两个属性
protocol TappableRocketBlock: RocketBlock {
var next: RocketBlock? { get set }
var showNextAfter: TimeInterval? { get set }
}
next
属性表示在点击后将会展示的下一个RocketBlock
。showNextAfter
属性允许下一个方块在经过一段时间后自动展示。如果你提供了一个值,TapGestureRecognizer
将会被禁用。
TextRocketBlock
你可以使用TextRocketBlock
对象显示一行或多行字符串。 TextRocketBlock
是TappableRocketBlock
协议的一个实现。
你可以通过以下方式创建一个TextRocketBlock
:
TextRocketBlock.init(text: String, next: RocketBlock, showNextAfter: TimeInterval? = nil)
TextRocketBlock.init(text: String, showNextAfter: TimeInterval)
TextRocketBlock.init(text: String, next: RocketBlock? = nil, showNextAfter: TimeInterval? = nil, id: String? = nil, font: RocketFont = .text)
你可以这样使用它
let secondBlock = TextRocketBlock.init(text: "This is your second block")
let firstBlock = TextRocketBlock.init(text: "This is your first block", next: secondBlock)
let rocket = Rocket.init(author: author, block: firstBlock)
rocket.show()
在点击firstBlock
后,将展示secondBlock
。注意,我传递了firstBlock
给rocket
。
平铺风格
当拥有很多方块且希望保持代码清晰时,请使用此风格。
let firstBlock = TextRocketBlock.init(text: "First")
let secondBlock = TextRocketBlock.init(text: "Second")
let thirdBlock = TextRocketBlock.init(text: "Third")
firstBlock.next = second
secondBlock.next = third
secondBlock.font = RocketFont.textBold
showNextAfter
属性
let firstBlock = TextRocketBlock.init(text: "First")
let secondBlock = TextRocketBlock.init(text: "Second")
firstBlock.next = second
firstBlock.showNextAfter = 2.0
secondBlock.font = RocketFont.textBold
thirdBlock
将在2.0秒后自动展示,并紧跟在secondBlock
之后。
RocketFont
你可以通过向font
属性提供一个RocketFont
对象来改变UIFont
。
let firstBlock = TextRocketBlock.init(text: "First", next: secondBlock)
firstBlock.font = RocketFont.init(font: UIFont, color: UIColor)
// or
firstBlock.font = RocketFont.text // the default
RocketFont
提供了一些默认样式。
block.font = RocketFont.emoji
block.font = RocketFont.text
block.font = RocketFont.textBold
block.font = RocketFont.button
block.font = RocketFont.lightButton
block.font = RocketFont.cancel
ImageRocketBlock
你可以使用ImageRocketBlock
对象显示一个带有或不带文本的图片。 ImageRocketBlock
是TextRocketBlock
类的子类,因此你可以编辑相同的属性。
你可以通过以下方式创建一个ImageRocketBlock
:
ImageRocketBlock.init(image: UIImage, text: String?)
ImageRocketBlock.init(image: UIImage, text: String?, next: RocketBlock?, showNextAfter: TimeInterval?, id: String?)
您可以通过编辑paddingLeft
和paddingRight
属性来为内部ImageView
添加填充。 默认填充值是0。
imageBlock.paddingLeft = 10
imageBlock.paddingRight = 10
通过将RocketImageStyle
分配给imageStyle
属性,您可以使ImageView
的角圆形。 默认值是.square
。
imageBlock.imageStyle = .circular
imageBlock.imageStyle = .round
imageBlock.imageStyle = .square
ControlRocketBlock
ControlRocketBlock
是从RocketBlock
继承的协议。 ControlRocketBlock
协议描述可交互块。
ButtonRocketBlock
使用ButtonRocketBlock
对象来显示单个按钮。 您不能直接定义next
块。相反,您需要提供一个TapRocketHandler
以允许您定义自定义动作和在TouchUpInside
事件后触发的下一个块。
您可以使用以下任意一种初始化方法来创建一个ButtonRocketBlock
。
ButtonRocketBlock.init(title: String, tapHandler: TapRocketHandler)
ButtonRocketBlock.init(title: String, tapHandler: TapRocketHandler, font: RocketFont)
ButtonRocketBlock.init(title: String, tapHandler: TapRocketHandler? = nil, font: RocketFont? = RocketFont.button, id: String? = nil)
默认的RocketFont
是.button
。
TapRocketHandler
let button = ButtonRocketBlock.init(title: "PRESS THERE")
let afterTheTapOnButton = TextRocketBlock.init(text: "You press the button!!")
button.tapHandler = TapRocketHandler.init(next: afterTheTapOnButton, action: {
print("the user click the button")
UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
}
})
let rocket = Rocket.init(author: author, block: button)
rocket.show()
DoubleButtonRocketBlock
当您想要显示两个选项时,请使用DoubleButtonRocketBlock
。 您可以通过传递两个ButtonRocketBlock
来初始化一个DoubleButtonRocketBlock
。重要的是要知道,当用户触摸任一按钮时,将对块上的触摸禁用。
let leftButton = ButtonRocketBlock.init(title: "Left Button")
leftButton.font = .button // the default
let rightButton = ButtonRocketBlock.init(title: "Right Button")
rightButton.font = .lightButton
rightButton.tapHandler = // remember to set a tapHandler if you want to show a block or if you want perform an action
let doubleButton = DoubleButtonRocketBlock.init(left: leftButton, right: rightButton)
InputRocketBlock
InputRocketBlock
是从 RocketBlock
继承的协议。 InputRocketBlock
协议描述了具有输入字段的块。 它给实现类提供了一个 InputRocketHandler
属性。
protocol InputRocketBlock: RocketBlock {
associatedtype InputType
var handler: InputRocketHandler<InputType>? { get set }
}
当你创建一个 InputRocketHandler
时,你需要定义一个闭包,该闭包至少返回一个 RocketBlock
。
public struct InputRocketHandler<T> {
public init(action: ((T)->(RocketBlock?))?) {
self.action = action
}
internal let action: ((_ text: T)->(RocketBlock?))?
}
TextInputRocketBlock
当你想要求用户输入一些字符串信息时,请使用 TextInputRocketBlock
。 TextInputRocketBlock
是 InputRocketBlock
协议的一个实现类。
您可以通过以下方式之一创建一个 TextInputRocketBlock
:
TextInputRocketBlock.init(text: String, buttonTitle: String)
TextInputRocketBlock.init(text: text, buttonTitle: buttonTitle, inputHandler: InputRocketHandler<String>?)
TextInputRocketBlock.init(text: String, buttonTitle: String, inputHandler: InputRocketHandler<String>?, id: String? = nil, font: RocketFont? = RocketFont.text, buttonStyle: RocketFont? = RocketFont.lightButton)
在其基本形式下,您可以这样使用它:
let input = TextInputRocketBlock.init(text: "Describe your problem:", buttonTitle: "Send")
input.handler = InputRocketHandler<String>.init(action: { (input) -> RocketBlock? in
return TextRocketBlock.init(text: "Thanks you so much!")
})
返回不同的块
如果您想根据 InputRocketHandler
的值对用户输入进行不同的处理,您可以根据以下返回不同的块:
let input = TextInputRocketBlock.init(text: "Describe your problem:", buttonTitle: "Send")
input.handler = InputRocketHandler<String>.init(action: { (input) -> RocketBlock? in
if (input.isEmpty) {
return TextRocketBlock.init(text: "Why haven't added a text? :(")
}
if (input == "SecretKey") {
return TextRocketBlock.init(text: "Awesome!! you know the secret key")
}
let block = TextRocketBlock.init(text: "Thanks you so much!")
/* you can concatenate more blocks if you want */
return block
})
NotificationCenter
rocketBlockAddedEvent
您可以将对象订阅为 Notification.Name.rocketBlockAddedEvent
的观察者。 该事件在块在屏幕上显示后将被触发。
userInfo
带有自身的 index
和显示的 block
。
// subscribe to the Notification.Name.addedNewRocketBlock
NotificationCenter
.default
.addObserver(self,
selector: #selector(ViewController.handleRocketAlertBlock),
name: Notification.Name.rocketBlockAddedEvent,
object: nil)
// handle the notification
@objc func handleRocketAlertBlock(_ sender: Notification) {
guard
let index = sender.userInfo?["index"] as? Int,
let block = sender.userInfo?["block"] as? RocketBlock
else { return }
print(index, block)
}
rocketDismissEvent
当火箭被消失时(在最后一个块或点击关闭按钮后),将触发 rocketDismissEvent
。 在 userInfo
中,您将找到显示的所有块的 count
和 blocks
数组。
NotificationCenter
.default
.addObserver(self,
selector: #selector(ViewController.handleRocketAlertBlock),
name: Notification.Name.rocketDismissEvent,
object: nil)
@objc func handleRocketDismissEvent(_ sender: Notification) {
guard
let count = sender.userInfo?["count"] as? Int,
let blocks = sender.userInfo?["blocks"] as? [RocketBlock]
else { return }
print(count, blocks)
}