RocketAlert 1.0-beta.3

RocketAlert 1.0-beta.3

Giuseppe Sapienza 维护。



RocketAlert 1.0-beta.3

  • 作者:
  • Giuseppe Sapienza

RocketAlert

Rocket Alert 通过提供类似 Chat Bot 的用户友好的过程来解决由无聊的 AlertView 引起的分心问题。

alt textalt text

您希望在邀请用户执行某些操作时改善用户体验吗?

使用现代风格和强大的个性化功能,RocketAlert 可帮助您提高转化率。

安装

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 意大利开发者,请关注我们 在 SlackFacebook 群组
  • 如果你想贡献力量,请提交一个拉取请求。

用法

您可以通过传递一个 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 }
}
  1. next属性表示在点击后将会展示的下一个RocketBlock
  2. showNextAfter属性允许下一个方块在经过一段时间后自动展示。如果你提供了一个值,TapGestureRecognizer将会被禁用。

TextRocketBlock

你可以使用TextRocketBlock对象显示一行或多行字符串。 TextRocketBlockTappableRocketBlock协议的一个实现。

你可以通过以下方式创建一个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。注意,我传递了firstBlockrocket

平铺风格

当拥有很多方块且希望保持代码清晰时,请使用此风格。

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之后。

Screenshot

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对象显示一个带有或不带文本的图片。 ImageRocketBlockTextRocketBlock类的子类,因此你可以编辑相同的属性。

你可以通过以下方式创建一个ImageRocketBlock

ImageRocketBlock.init(image: UIImage, text: String?)
ImageRocketBlock.init(image: UIImage, text: String?, next: RocketBlock?, showNextAfter: TimeInterval?, id: String?)

您可以通过编辑paddingLeftpaddingRight属性来为内部ImageView添加填充。 默认填充值是0。

imageBlock.paddingLeft = 10
imageBlock.paddingRight = 10 

通过将RocketImageStyle分配给imageStyle属性,您可以使ImageView的角圆形。 默认值是.square

imageBlock.imageStyle = .circular
imageBlock.imageStyle = .round
imageBlock.imageStyle = .square

Screenshot

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()

alt text

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 TextInputRocketBlockInputRocketBlock 协议的一个实现类。

您可以通过以下方式之一创建一个 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

当火箭被消失时(在最后一个块或点击关闭按钮后),将触发 rocketDismissEventuserInfo 中,您将找到显示的所有块的 countblocks 数组。

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)
}