这是一个包含所有 ROKO Mobi 开源 iOS SDK 的仓库。以下信息应作为我们 iOS SDK 的使用指南。查看下面的目录表以获取此文档中包含的所有内容的完整列表。
目录 |
---|
获取我们的演示应用 |
Roko Stickers |
Roko Share |
Roko Push |
Roko Analytics |
Roko Promo |
Roko Referral |
ROKO 在苹果应用商店的演示应用中展示了我们的大部分组件。检查我们的演示应用, Roko Stickers,它包括贴纸和分享 SDK,苹果应用商店。
ROKOStickers 框架提供了一种方式来拍照、用贴纸装饰,并通过 FB、Twitter、电子邮件或短信与世界分享结果。
1) ROKOStickers 框架需要 iOS 8.0 或更高版本。
2) 安装 Xcode 7.0 或更高版本。
有两种方式可以配置 Xcode 项目:手动和通过 CocoaPods。
1) 在项目根目录创建一个 /Frameworks 目录,该目录将包含您要添加的自定义框架。
2) 将 ROKOMobi 框架组件放在该目录中。(请确保在每个目录级别都添加了调试和发布版本。这就像在上一个部分的步骤 #4 中一样
3) 在您的项目目标测试目标中的“运行路径搜索路径”和“框架搜索路径”中添加“$(PROJECT_DIR)/Frameworks/$(CONFIGURATION)”
4) 导航到您的项目目标的“通用”部分,并将 ROKOMobi 框架添加到“嵌入二进制文件”部分。添加找到的发布!那些调试版本将无法通过苹果的验证。这将自动将框架添加到下面的“链接框架和库”中。
5) 添加以下行以使框架对您的代码可用
#import <ROKOMobi/ROKOMobi.h>
图 #1. ROKOStickers 工作流程
本页面中的代码示例演示了如何微调照片编辑器、显示它以及使用您自己的品牌贴纸套装进行自定义。集成 ROKOStickers,您可以选择几个起始点
在您的视图中添加两个按钮(称其为 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];
}
}
您可以选择在 ROKO Mobi Portal 上注册您的项目,它提供易于使用的 GUI,也可以配置 ROKOStickers 框架并管理其内容。如果是这样,您可以跳过下面的部分。或者,您可以选择独立管理 ROKOStickers,在这种情况下,下面的部分是您的指南。
在您视图控制器中添加实例变量
@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;
}
}
为本地资源创建贴纸套装。确保将资源目录添加到您的项目中。从声明贴纸集合开始,添加 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
开始于在您 .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];
}];
}
当用户开始使用某些贴纸套装时,用户可以在图像上添加水印,例如对于“婚礼”贴纸套装。在填充贴纸集合之后,添加以下代码
- (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。
以以下方式显示贴纸包:
ROKOStickersTrayDisplayTypeIconOnly,
ROKOStickersTrayDisplayTypeTitleOnly,
ROKOStickersTrayDisplayTypeTitleAndIcon
使用
ROKOStickersTrayScheme *trayScheme = [ROKOStickersTrayScheme new];
trayScheme.displayType = ROKOStickersTrayDisplayTypeIconOnly;
1) ROKOMobi 框架需要 iOS 7.0 或更高版本。
2) 安装 Xcode 6.0 或更高版本。
3) ROKOShare 框架支持 iPhone 和 iPad 用户界面。
将 ROKOMobi.framework 和 ROKOMobiResources.bundle 复制到您的项目中(如果需要,请选择“为添加的任何文件夹创建组”)。这些包包含静态库、头文件和必要资源(配置文件和图片)。
ROKOMobi.framework
Social.framework
MessageUI.framework
ImageIO.framework
CoreLocation.framework
QuartzCore.framework
UIKit.framework
Foundation.framework
#import <ROKOMobi/ROKOMobi.h>
ROKOShare 框架提供了一种方式,可以从您的应用程序中分享丰富的内容到短信、电子邮件、Twitter 和 Facebook,包括文本、图片和 URL 附件。本页面的代码示例演示了如何自定义和显示共享对话框,以及通知您的应用程序中的发布结果。
要将 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;
- (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可编辑。
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的外观可以高度自定义。
有两个方法可以自定义标准视图
使用ROKO Mobi门户,在那里您可以方便的界面中自定义视图
只需几行代码即可将标准视图转换为自定义视图
如果您使用ROKO Mobi Portal来自定义ROKOShare,登录到门户,转到分享 - 设置部分,就可以根据您的喜好调整视图外观。
在这种情况下,您可以跳过以下部分
您可以更改:- 背景颜色;要这样做,请实现以下代码
controller.shouldLoadSchemeFromPortal = NO; //configure scheme locally
ROKOShareScheme* scheme = [[ROKOShareScheme alloc]init];
scheme.backgroundColor = [UIColor greenColor];
controller.shareScheme = scheme; // apply local scheme to the controller
您可以更改:- 文本颜色 - 字体 - 标题 要这样做,请实现以下代码
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];
您可以更改:- 文本颜色 - 字体 - 文本
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];
您可以明确地提供以下参数
请实现以下代码。请注意,该代码同样适用于“取消按钮”,请实现以下代码
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;
您可以更改以下内容
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类的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
您可以使用一个非常简单的API调用来处理远程通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[self.pushComponent handleNotification:userInfo];
}
ROKOAnalytics是ROKOFramework的一部分,允许您的应用程序将有关应用程序中不同事件的信息发送到ROKO Portal,并生成和审查各种报告。它具有唯一的公开类
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 秒时,批次就会被发送。此外,每个批次都包含关于设备的基本信息:型号、操作系统等。
ROKO Promo 是 ROKO Mobi 产品的移动端名为 ROKOPromo 的组件,允许营销人员生成应用程序的促销代码,让用户在应用内购买时获得折扣(金额、百分比或其他)。
此类折扣基于促销代码。应用可以通过给定促销代码下载所有有效折扣的列表。使用以下方法进行此操作:
- (void)loadPromoDiscountsWithPromoCode:(NSString *)discountId completionBlock:(ROKOPromoItemsListCompletionBlock)completionBlock;
此外,每个折扣项或促销代码都可能被当前用户标记为已使用。
- (void)markPromoCodeAsUsed:(NSNumber *)promoCode completionBlock:(ROKOMarkDiscountCompletionBlock)completionBlock;
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;