ROKO.Mobi.Debug 1.8.1

ROKO.Mobi.Debug 1.8.1

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布最新发布2016年7月

Alexey Golovenkov 维护。



Roko Mobi iOS

这是一个包含所有 ROKO Mobi 开源 iOS SDK 的仓库。以下信息应作为我们 iOS SDK 的使用指南。查看下面的目录表以获取此文档中包含的所有内容的完整列表。

目录
获取我们的演示应用
Roko Stickers
Roko Share
Roko Push
Roko Analytics
Roko Promo
Roko Referral

获取我们的演示应用

ROKO 在苹果应用商店的演示应用中展示了我们的大部分组件。检查我们的演示应用, Roko Stickers,它包括贴纸和分享 SDK,苹果应用商店。

ROKOStickers 使用指南

ROKOStickers 框架提供了一种方式来拍照、用贴纸装饰,并通过 FB、Twitter、电子邮件或短信与世界分享结果。

先决条件

1) ROKOStickers 框架需要 iOS 8.0 或更高版本。

2) 安装 Xcode 7.0 或更高版本。

配置 Xcode 项目

有两种方式可以配置 Xcode 项目:手动和通过 CocoaPods。

手动

1) 在项目根目录创建一个 /Frameworks 目录,该目录将包含您要添加的自定义框架。

2) 将 ROKOMobi 框架组件放在该目录中。(请确保在每个目录级别都添加了调试和发布版本。这就像在上一个部分的步骤 #4 中一样

3) 在您的项目目标测试目标中的“运行路径搜索路径”和“框架搜索路径”中添加“$(PROJECT_DIR)/Frameworks/$(CONFIGURATION)”

4) 导航到您的项目目标的“通用”部分,并将 ROKOMobi 框架添加到“嵌入二进制文件”部分。添加找到的发布!那些调试版本将无法通过苹果的验证。这将自动将框架添加到下面的“链接框架和库”中。

5) 添加以下行以使框架对您的代码可用

#import <ROKOMobi/ROKOMobi.h>

使用 ROKOStickers 创建照片

图 #1. ROKOStickers 工作流程

本页面中的代码示例演示了如何微调照片编辑器、显示它以及使用您自己的品牌贴纸套装进行自定义。集成 ROKOStickers,您可以选择几个起始点

1) 显示视图控制器

  • 用户可以通过调用相机来拍摄新照片
  • 或者用户可以使用图片选择器从其相册中获取图像

在您的视图中添加两个按钮(称其为 takePhotoButton 和 choosePhotoButton)。然后使用视图控制器中的相应函数连接它们。如果使用本地贴纸,请将 self 设置为数据源代理;如果使用网络贴纸,使用其他数据源(此示例稍后说明)。

使用 kRLComposerWorkflowTypeCamera 以从屏幕 1a. 相机视图(图 #1)开始。

- (IBAction)takePhotoButtonPressed:(UIButton *)sender {
    RLComposerWorkflowController *workflowController = [RLComposerWorkflowController buildComposerWorkflowWithType:kRLComposerWorkflowTypeCamera useROKOCMS:NO];

    if (nil != workflowController) {
        workflowController.composer.dataSource = self;
        workflowController.composer.delegate = self;
        [self presentViewController:workflowController animated:YES completion:nil];
    }
}

使用 kRLComposerWorkflowTypePhotoPicker 以从屏幕 1b. 图片选择器(图 #1)开始。

- (IBAction)choosePhotoButtonPressed:(UIButton *)sender {
    RLComposerWorkflowController *workflowController = [RLComposerWorkflowController buildComposerWorkflowWithType:kRLComposerWorkflowTypePhotoPicker useROKOCMS:NO];

    if (nil != workflowController) {
        RLPhotoComposerController *photoComposer = workflowController.composer;
        photoComposer.delegate = self;
        photoComposer.dataSource = self;

        [self presentViewController:workflowController animated:YES completion:nil];
    }
}

2) 配置 ROKOStickers 的行为和数据

您可以选择在 ROKO Mobi Portal 上注册您的项目,它提供易于使用的 GUI,也可以配置 ROKOStickers 框架并管理其内容。如果是这样,您可以跳过下面的部分。或者,您可以选择独立管理 ROKOStickers,在这种情况下,下面的部分是您的指南。

a) 定制作曲视图外观。

在您视图控制器中添加实例变量

@interface ViewController () {
    ROKOStickersScheme *_scheme;
}

自定义您自己的外观视图

- (void)viewDidLoad {
    [super viewDidLoad];
    _scheme = [self createScheme];
}

- (ROKOStickersScheme *)createScheme {
    ROKONavigationBarScheme *naviScheme = [ROKONavigationBarScheme new];
    naviScheme.controllerTitle = @"Stickers";
    naviScheme.useTextButtons = YES;
    naviScheme.navigationLeftButtonText = @"back";
    naviScheme.navigationRightButtonText = @"next";
    naviScheme.navigationBarColor = [UIColor whiteColor];

    ROKOStickersTrayScheme *trayScheme = [ROKOStickersTrayScheme new];
    trayScheme.displayType = ROKOStickersTrayDisplayTypeIconOnly;
    trayScheme.backgroundColor = [[UIColor alloc] initWithWhite:1 alpha:0.5];

    ROKOStickersScheme *scheme = [ROKOStickersScheme new];
    scheme.configurationViaPortal = NO;
    scheme.albumName = @"ROKO Strik";
    scheme.navigationBarScheme = naviScheme;
    scheme.trayScheme = trayScheme;
    return scheme;
}

在 willAppear 回调中应用您的计划 -

- (void)composer:(RLPhotoComposerController *)composer willAppearAnimated:(BOOL)animated {
    if (_scheme) {
        composer.scheme = _scheme;
    }
}
b) 从本地资源提供贴纸套装内容

为本地资源创建贴纸套装。确保将资源目录添加到您的项目中。从声明贴纸集合开始,添加 2 个 ivars

@interface ViewController () {
    NSArray *_stickerPacks;
    NSDictionary *_stickerPackToIconsCount;
}

将内容填充到贴纸集合

- (void)viewDidLoad {
    [super viewDidLoad];

    _stickerPackToIconsCount = @{ @"glasses" : @10, @"hats" : @9, @"mustaches" : @9, @"baby" : @22,
                                 @"cake" : @9, @"cat" : @12, @"emoji" : @18, @"wedding" : @12 };

    NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:_stickerPackToIconsCount.allKeys.count];
    for (NSString *key in _stickerPackToIconsCount.allKeys) {
        [mutableArray addObject:[self getStickerPack:key]];
    }
    _stickerPacks = [mutableArray copy];
}

- (RLStickerPackInfo *)getStickerPack:(NSString *)packName {
    RLStickerPackInfo *packInfo = [RLStickerPackInfo new];
    packInfo.title = packName;
    packInfo.iconDefault = [UIImage imageNamed:[NSString stringWithFormat:@"%@_icon_default", packName]];
    packInfo.iconSelected = [UIImage imageNamed:[NSString stringWithFormat:@"%@_icon_selected", packName]];
    packInfo.isLocked = NO;

    NSNumber *iconsCount = [_stickerPackToIconsCount objectForKey:packName];
    if (iconsCount) {
        NSInteger count = [iconsCount integerValue];
        NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:count];
        for (NSInteger i = 0; i < count; ++i) {
            RLStickerInfo *info = [self stickerInfoWithIndex:i packName:packName];
            [mutableArray addObject:info];
        }
        packInfo.stickers = [mutableArray copy];
    }
    return packInfo;
}

在您的视图控制器中实现 RLPhotoComposerDataSource 协议。从接口开始。

@interface ViewController : UIViewController <RLPhotoComposerDataSource>
@end

将 self 设置为 RLComposerWorkflowController 的 "composer" 属性的 "dataSource"。

RLPhotoComposerController *photoComposer = workflowController.composer;
photoComposer.dataSource = self;

然后实现数据源方法。

- (NSInteger)numberOfStickerPacksInComposer:(RLPhotoComposerController *)composer {
    return [_stickerPacks count];
}
// return the number of sticker packs to display on Stickers Selector (Figure #1)


- (NSInteger)numberOfStickersInPackAtIndex:(NSInteger)packIndex composer:(RLPhotoComposerController *)composer {
    RLStickerPackInfo *pack = _stickerPacks[packIndex];
    return [pack.stickers count];
}
// return the number of stickers per each packs

- (RLStickerPackInfo *)composer:(RLPhotoComposerController *)composer infoForStickerPackAtIndex:(NSInteger)packIndex {
    return _stickerPacks[packIndex];
}
// return info for each sticker pack

- (RLStickerInfo *)composer:(RLPhotoComposerController *)composer infoForStickerAtIndex:(NSInteger)stickerIndex packIndex:(NSInteger)packIndex {
    RLStickerPackInfo *pack = _stickerPacks[packIndex];
    RLStickerInfo *info = pack.stickers[stickerIndex];
    return info;
}
// return info for each sticker
c) 从 ROKO Portal 提供贴纸套装内容

开始于在您 .plist 中创建两个字符串。

ROKOMobiAPIURL api.roko.mobi/v1
ROKOMobiAPIToken %YOUR_API_FROM_SERVER%

声明并初始化实例变量 dataSource

@interface ViewController () {
    ROKOPortalStickersDataSource *_dataSource;
}

- (void)viewDidLoad {
_dataSource = [[ROKOPortalStickersDataSource alloc]init];
        _scheme = [self createScheme];
}

设置作曲数据源并刷新贴纸列表。

- (IBAction)choosePhotoButtonPressed:(UIButton *)sender {
    RLComposerWorkflowController *workflowController = [RLComposerWorkflowController buildComposerWorkflowWithType:kRLComposerWorkflowTypePhotoPicker useROKOCMS:NO];

    if (nil != workflowController) {
        workflowController.composer.dataSource = _dataSource;
        [self loadStickersForController:workflowController];
        workflowController.composer.delegate = self;
        [self presentViewController:workflowController animated:YES completion:nil];
    }
}

- (void)loadStickersForController:(RLComposerWorkflowController *)controller {
    __weak RLPhotoComposerController *composer = controller.composer;
    [_dataSource reloadStickersWithCompletionBlock:^(id responseObject, NSError *error) {
        [composer reloadData];
    }];
}
d) 提供要在照片上显示的水印

当用户开始使用某些贴纸套装时,用户可以在图像上添加水印,例如对于“婚礼”贴纸套装。在填充贴纸集合之后,添加以下代码

- (void)addWatermarkToWeddingStickerPack {
    for (RLStickerPackInfo *stickerPack in _stickerPacks) {
        if ([stickerPack.title isEqualToString:@"wedding"]) {
            RLWatermarkInfo *info = [RLWatermarkInfo new];
            info.icon = [UIImage imageNamed:@"watermark_3"];
            info.position = kRLWatermarkPositionBottomRight;
            stickerPack.watermarkInfo = info;
        }
    }
}

它将在使用至少一个来自“婚礼”套装的贴纸时自动添加水印。

用户甚至可以使用作曲器将水印添加到整个图像

RLWatermarkInfo *watermark = [RLWatermarkInfo new];
watermark.icon = [UIImage imageNamed:@"watermark_3"];
watermark.position = kRLWatermarkPositionBottomRight;

RLPhotoComposerController *photoComposer = workflowController.composer;
photoComposer.dataSource = self;
photoComposer.projectWatermark = watermark;

注意

1) 您可以选择在屏幕上的各种选项放置水印

kRLWatermarkPositionTopLeft, 
kRLWatermarkPositionTop, 
kRLWatermarkPositionTopRight, 
kRLWatermarkPositionLeft, 
kRLWatermarkPositionCenter, 
kRLWatermarkPositionRight, 
kRLWatermarkPositionBottomLeft, 
kRLWatermarkPositionBottom, 
kRLWatermarkPositionBottomRight 
kRLWatermarkPositionFullScreen 

2) 您可以为水印提供从 0.1 到 1 的比例因子。默认值是 1。

e) 进一步定制

以以下方式显示贴纸包:

ROKOStickersTrayDisplayTypeIconOnly,
ROKOStickersTrayDisplayTypeTitleOnly,
ROKOStickersTrayDisplayTypeTitleAndIcon

使用

ROKOStickersTrayScheme *trayScheme = [ROKOStickersTrayScheme new];
    trayScheme.displayType = ROKOStickersTrayDisplayTypeIconOnly;

ROKOShare 使用指南

开始之前

1) ROKOMobi 框架需要 iOS 7.0 或更高版本。

2) 安装 Xcode 6.0 或更高版本。

3) ROKOShare 框架支持 iPhone 和 iPad 用户界面。

配置您的 Xcode 项目

1) 添加文件

将 ROKOMobi.framework 和 ROKOMobiResources.bundle 复制到您的项目中(如果需要,请选择“为添加的任何文件夹创建组”)。这些包包含静态库、头文件和必要资源(配置文件和图片)。

2) 在您项目目标的“链接二进制与库”构建阶段中添加以下框架

ROKOMobi.framework
Social.framework
MessageUI.framework
ImageIO.framework
CoreLocation.framework
QuartzCore.framework
UIKit.framework
Foundation.framework

3) 确保ROKOShare.bundle包含在您目标“复制束资源”构建阶段。

4) 通过在 ROKO Mobi 站点上注册您的项目生成 API 令牌。将「ROKOMobiAPIToken」键添加到您的 Xcode 项目info.plist中,并将其值设置为生成的 API 令牌。

5) 包含以下行以使框架可访问您的代码

#import <ROKOMobi/ROKOMobi.h>

使用 ROKOShare 共享内容

ROKOShare 框架提供了一种方式,可以从您的应用程序中分享丰富的内容到短信、电子邮件、Twitter 和 Facebook,包括文本、图片和 URL 附件。本页面的代码示例演示了如何自定义和显示共享对话框,以及通知您的应用程序中的发布结果。

1) 显示视图控制器

要将 ROKOShare 集成到您的应用程序中,创建 RSActivityViewController 的一个实例,并在屏幕上显示它

- (void)showROKOShare{
RSActivityViewController *controller = [RSActivityViewController buildController];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:controller
                  animated:YES
                completion:^{
   self.modalPresentationStyle = UIModalPresentationFullScreen;
}];
}

注意:必须将 UIModalPresentationCurrentContext 应用到您的窗口的根视图控制器上,即如果您的视图控制器嵌入到 UINavigationController 中,则必须将 UIModalPresentationCurrentContext 应用到 UINavigationController 上

  self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

2) 提供要共享的主题、消息、图片、视频和/或 URL

- (void)showROKOShare
{
    RSActivityViewController *controller = [RSActivityViewController buildController];
    controller.displayMessage = @"Sample text to be shared with image and video";
    NSString *videoPath = [[NSBundle mainBundle] pathForResource:@"path_to_video_file" ofType:@"mov"];
    controller.videoData = [[NSData alloc] initWithContentsOfFile:videoPath];
    controller.image = [UIImage imageNamed:@"imagesample.jpeg"];
    controller.URL = [NSURL URLWithString:@"http://rokolabs.com"];
}

注意:ROKOShare 框架提供了两种不同消息的选项

  • 显示消息:要在“消息视图”中显示(请参阅“定制 ROKOShare 外观”部分的图像),通过 addDisplayMessage 设置

  • 共享消息:通过社交服务真正共享,通过 addShareMessage: 设置

此选项仅在“消息视图”不可编辑的情况下(默认情况)才能正常工作。请参考“自定义ROKOShare外观”部分以了解如何让MessageView可编辑。

3) 检测您的app成功分享帖子

a) 声明您的视图控制器实现了RSActivityViewControllerDelegate协议

@interface MyViewController : UIViewController <RSActivityViewControllerDelegate> 

b) 在您显示RSActivityViewController实例之前,请设置您的

RSActivityViewController’s delegate:
controller.delegate = self;

c) 实现代表者的方法

- (void)activityControllerDidCancel:(RSActivityViewController *)controller
{
   NSLog(@"CANCEL BUTTON PRESSED");
}
- (void)activityController:(RSActivityViewController *)controller
didFinishWithActivityType:(RSActivityType)activityType result:
(RSActivityViewControllerResult)result
{
   switch (result) {
       case kRSActivityViewControllerResultCancelled:
           NSLog(@"SHARING CANCELLED");
           break;
       case kRSActivityViewControllerResultFailed:
           NSLog(@"SHARING FAILED");
           break;
       case kRSActivityViewControllerResultDone:
           NSLog(@"SHARED SUCCESSFULLY");
           break;
       default:
break; 
}
}

自定义ROKOShare外观

ROKOShare的外观可以高度自定义。

有两个方法可以自定义标准视图

  • 使用ROKO Mobi门户,在那里您可以方便的界面中自定义视图

  • 只需几行代码即可将标准视图转换为自定义视图

如果您使用ROKO Mobi Portal来自定义ROKOShare,登录到门户,转到分享 - 设置部分,就可以根据您的喜好调整视图外观。

在这种情况下,您可以跳过以下部分

从您的代码中自定义视图

1) 自定义“背景视图”

您可以更改:- 背景颜色;要这样做,请实现以下代码

controller.shouldLoadSchemeFromPortal = NO;   //configure scheme locally
ROKOShareScheme* scheme =  [[ROKOShareScheme alloc]init];
scheme.backgroundColor = [UIColor greenColor];
controller.shareScheme = scheme; // apply local scheme to the controller

2) 自定义“提示视图”

您可以更改:- 文本颜色 - 字体 - 标题 要这样做,请实现以下代码

scheme.preivewScheme = [[ROKOSharePreviewScheme alloc]init];
scheme.preivewScheme.promptText = @"Custom prompt text";
scheme.preivewScheme.promptTextFont = [[ROKOFontDataObject alloc]init];
scheme.preivewScheme.promptTextFont.name = @"Georgia";
scheme.preivewScheme.promptTextFont.size = @32;
scheme.preivewScheme.promptTextFont.color = [UIColor redColor];

3) 自定义“消息视图”

您可以更改:- 文本颜色 - 字体 - 文本  

scheme.preivewScheme.useStaticMode = YES;
scheme.preivewScheme.staticText = @"Custom static text";
scheme.preivewScheme.staticTextFont = [[ROKOFontDataObject alloc]init];
scheme.preivewScheme.staticTextFont.name = @"Georgia";
scheme.preivewScheme.staticTextFont.size = @16;
scheme.preivewScheme.staticTextFont.color = [UIColor redColor];

4) 自定义“关闭按钮”和“取消按钮”

您可以明确地提供以下参数

  • 文本颜色
  • 标题
  • 图片
  • 字体

请实现以下代码。请注意,该代码同样适用于“取消按钮”,请实现以下代码

scheme.navigationScheme = [[ROKOShareNavigationScheme alloc] init];
scheme.navigationScheme.useTextForCloseButton = YES;
scheme.navigationScheme.closeButtonEnabled = YES;
scheme.navigationScheme.closeButtonText = @"CLOSE";
scheme.navigationScheme.closeButtonTextFont.name = @"Georgia";
scheme.navigationScheme.closeButtonTextFont.size = @16;
scheme.navigationScheme.closeButtonTextFont.color = [UIColor yellowColor];
scheme.navigationScheme.doneButtonEnabled = YES;
scheme.navigationScheme.useTextForDoneButton = NO;
ROKOImageDataObject* imageDataObject = [[ROKOImageDataObject alloc]init];
imageDataObject.image = [UIImage imageNamed:@"close"];
scheme.navigationScheme.doneButtonImageFile = imageDataObject;

5) 自定义分享服务

您可以更改以下内容

  • 屏幕上显示服务的顺序
  • 每个服务的图片
ROKOShareChannelScheme * twitterChannel = [[ROKOShareChannelScheme alloc]init];
twitterChannel.type = kRSActivityTypeTwitter;
twitterChannel.enabled = YES;
twitterChannel.bodyText = @"shared in twitter";
ROKOImageDataObject* twitterImage = [[ROKOImageDataObject alloc]init];
twitterImage.image = [UIImage imageNamed:@"twitter"];
twitterChannel.imageFileGroup = twitterImage; 
ROKOShareChannelScheme * facebookChannel = [[ROKOShareChannelScheme alloc]init];
facebookChannel.type = kRSActivityTypeFacebook;
facebookChannel.enabled = YES;
facebookChannel.bodyText = @"shared in facebook";
ROKOImageDataObject* facebookImage = [[ROKOImageDataObject alloc]init];
facebookImage.image = [UIImage imageNamed:@"facebook"];
facebookChannel.imageFileGroup = facebookImage; 
scheme.channels = @[twitterChannel,facebookChannel];

ROKOPush使用指南

ROKOPush是一个简单的组件,允许您处理推送通知。

从ROKO Portal订阅推送通知

调用ROKOPush类的registerWithAPNToken:方法来开始接收由ROKO Portal生成的通知。唯一的参数是标识设备给APNs的令牌。以下示例展示了如何使用此方法

#import <UIKit/UIKit.h>
#import <ROKOMobi/ROKOMobi.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) ROKOPush *pushComponent;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Register for Apple Remote Push Notifications
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [application registerForRemoteNotifications];
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// Create an instanse of ROKOPush component
    self.pushComponent = [[ROKOPush alloc]init];
// Subscribe to notifications from ROKO Portal
    [self.pushComponent registerWithAPNToken:deviceToken];
}

@end

处理ROKO通知

您可以使用一个非常简单的API调用来处理远程通知

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [self.pushComponent handleNotification:userInfo];
}

ROKOAnalytics使用指南

ROKOAnalytics是ROKOFramework的一部分,允许您的应用程序将有关应用程序中不同事件的信息发送到ROKO Portal,并生成和审查各种报告。它具有唯一的公开类

ROKOLogger

ROKOLogger 是主要类,具有唯一的重要方法。

/**
 *  Sends analytic event to ROKO Analytics. Stores message in local db if server is not avaliable
 *
 *  @param eventTitle      Event name
 *  @param eventParameters Optional parameters for the event. Can be nill.
 */
- (void)addEvent:(NSString *)eventTitle withParameters:(NSDictionary *)eventParameters;

建议通过 ROKOLogger 类的 sharedLogger 方法来获取此功能。示例:

[[ROKOLogger sharedLogger]addEvent:@"_ROKO.Stickers.Open" withParameters:nil];

上面的示例发送了名为 "_ROKO.Stickers.Open" 的事件,没有附加参数。

为了优化流量,事件被分批打包。当当前批次的大小达到 50 个事件或自上次发送以来已过 5 秒时,批次就会被发送。此外,每个批次都包含关于设备的基本信息:型号、操作系统等。

ROKOPromo 使用指南

ROKO Promo 是 ROKO Mobi 产品的移动端名为 ROKOPromo 的组件,允许营销人员生成应用程序的促销代码,让用户在应用内购买时获得折扣(金额、百分比或其他)。

促销折扣

此类折扣基于促销代码。应用可以通过给定促销代码下载所有有效折扣的列表。使用以下方法进行此操作:

- (void)loadPromoDiscountsWithPromoCode:(NSString *)discountId completionBlock:(ROKOPromoItemsListCompletionBlock)completionBlock;

此外,每个折扣项或促销代码都可能被当前用户标记为已使用。

- (void)markPromoCodeAsUsed:(NSNumber *)promoCode completionBlock:(ROKOMarkDiscountCompletionBlock)completionBlock;

ROKOReferral 使用指南

ROKOReferral 是用于处理推荐折扣的组件。使用此组件,您可以获取当前用户可用的推荐折扣列表,激活并完成它们。

// Loads all referral discounts are avaliable for current user
- (void)loadReferralDiscountsList:(nullable ROKOItemsListCompletionBlock)completionBlock;

//  Marks referral discount object as used.
- (void)markReferralDiscountAsUsed:(nonnull NSNumber *)discountId completionBlock:(nullable ROKOMarkDiscountCompletionBlock)completionBlock;

//  Loads referral campaing info
- (void)loadDiscountInfoWithCode:(nonnull NSString *)code completionBlock:(nullable ROKOReferralDiscountInfoResponseBlock)completionBlock;

//  Activates discount by the given referral code
- (void)activateDiscountWithCode:(nonnull NSString *)code completionBlock:(nullable ROKOReferralActivateDiscountResponseBlock)completionBlock;

//  Completes discount with given referral code
- (void)completeDiscountWithCode:(nonnull NSString *)code completionBlock:(nullable ROKOReferralCompleteDiscountResponseBlock)completionBlock;