谈谈分享邀请奖励机制(附iOS实现代码)

以后不做标题党了,感觉现在越来越多的技术文章题目屌炸天,内容空泛没有干货,甚至好多把官方文档摘过来,还摘得不全,简直是垃圾。虽然我现在写不出牛逼的文章,但是我最起码不会去做我反对的那种人。

就像这样

一、先说点没用的

  • 经济学十大原理中有一条:人们会对激励做出反应。这一原理指出人们是通过比较成本和收益来做出决策,当收益和成本发生变化时,人的行为也会发生变化
  • 简单介绍一下口碑经济,就是互联网时代,因为传播成本被极大降低,好到让用户忍不住发朋友圈的产品,可以通过大量几乎免费的赢得媒体,获得巨大的流量,同时提高转化率的商业现象(摘自 刘润老师 五分钟商学院)
  • 一般情况下,用户第一次认识到一个产品的途径无非三种
    • 付费媒体:报纸刊登的广告、冠名赞助的电视节目等
    • 自有媒体:官方博客、公众号、官网等
    • 赢得媒体:指那些不属于你,但是也没花钱,别人自发的传播,这个也是传播的最好形式

那么为什么口碑经济是最好的传播形式呢?从用户的两方面需求来分析:

  • 心理需求:用户对于一个陌生的产品往往是持有一定的怀疑态度,通过与周边朋友的确认,朋友间的信任感给自己这个消费行为带来心理上的安全感
  • 社交需求,当朋友都在讨论某产品时,会通过使用该产品的参与感提高自己在圈内的存在感和认同感


二、怎样才能最大限度上激发用户自主进行分享

除了练习内功(自身产品优秀)之外,一些花把势(适当的奖励机制)也可以在一定限度上激发用户进行分享,先举几个别的行业的例子来说明问题:

  • 有的四六级培训班在学员取得证书后(针对男同学),请了一个淘宝模特,穿的美美的来给他们发证书来合影,结果那些学员的朋友圈无一幸免地做了广告
  • 健身房里面介绍私教会员入会也会送给介绍人几节课
  • 很多餐厅开业酬宾打七折,条件就是拍门店照片发朋友圈,凭借朋友圈截图享受折扣

这个激励措施是一定要基于产品好的基础上,就好比:你的女神已经对你有好感了,你卖个萌,她就答应做你女朋友了;如果妹子对你没有好感,“卖萌”只会让对方觉得丑人多作怪

二、产品角度

1、奖励有哪些主要形式?
  • 物质激励

  • 实物:比如微博推广的转发抽奖送iPhone

  • 虚拟物品:滴滴、ofo等交通共享平台分享就送的优惠券、充值卡

  • 精神激励

  • 存在感:点赞、评论、关注等,最直白的比如微博、贴吧等


  • 荣誉:早期的QQ等级、支付宝会员的排行、keep、得到app的各种头衔、勋章,微信运动的排行榜


  • 权利:京东平台的会员等级越高,包邮的最低价格越低


2、该功能主要界面
  • 比如从banner活动页等入口进入“推荐有奖”活动h5页,该页面一般包括
    • 我的成就:显示已经邀请多少人,获得多少奖励
    • 奖励规则按钮:点击进入详细的推荐活动奖励规则
    • 分享途径,总的来说包括以下三种:
    • 分享到微信、qq、微博等第三方平台
    • 二维码(点击后弹出二维码,方便当面分享)
    • 复制短链接(考虑到相关论坛或其他聊天分享)


  • 也可以在导航栏添加一个“明细”按钮,点击后进入邀请明细界面,具体显示邀请了哪些好友,具体获得哪些奖励
  • 分享出去的一个中间页,被分享者先看到这个活动页,然后在这个活动页点击下载按钮后,
    • 已安装app的用户点击分享链接后会直接打开app里的内容页
    • 未安装app的用户点击链接后自动跳转到应用商店.


3、产品必须要了解的技术
  • 使用 LinkedMe 技术生成一个每个推荐用户专属的短链接,然后分享出去,通过此链接下载的用户就会得到匹配,两个用户都得到相应的奖励,不需要用户输入邀请码
  • 专属链接中可以自定义各种参数,比如推荐者的userId、分享平台、分享时间等
  • 被邀请的用户触发深度链接后,LinkedME深度链接自动判断App是否安装
    • 如果判断安装App,直接打开App对应深度链接的内容页面。
    • 如果判断没有安装,直接跳转到用户默认的应用商店,下载安装,注册登陆后直接跳转到具体内容页面。

三、技术实现思路

1、linkedMe主要方法
  • linkedMe官方demo很清楚,集成文档也相对明了,集成的时候在plist文件添加key值的时候注意加前缀,文档没有着重说明,但是给的截图是直接添加了“linkedme_live_”的前缀
  • 生成短链接的方法
// 因为涉及到若干个分享平台,因此封装一个生成短链接的方法
// 生成短链接后,进行相应的操作,因此
- (void)createShotrUrlWithChannel:(NSString *)channel Success:(void (^)())block_success
                          failure:(void (^)())block_failure {
    LMUniversalObject *LMObj = [[LMUniversalObject alloc] initWithCanonicalIdentifier:@"item/12345"];
    LMObj.title = @"";//标题
    LMObj.canonicalUrl = @"http://";
    LMObj.contentDescription = @"plapla推荐活动";
    LMObj.imageUrl = @"http://yourActivityImageUrl";
    
#warning 注意,这里添加参数的方式有两种,一定和要和安卓添加的方式统一,因为涉及到两个平台的分享下载
    // 添加参数方式一
//    [LMObj addMetadataKey:@"linkedMe_appid" value:@"appidNum"];
//    [LMObj addMetadataKey:@"linkedMe_udid" value:@"user_udid"];
//    [LMObj addMetadataKey:@"platform" value:channel];
//    
    NSString *dateDescription = [[NSDate date] description];
//    [LMObj addMetadataKey:@"linkedMe_time" value:dateDescription];
//    [LMObj addMetadataKey:@"linkedMe_user" value:validId];
    
    self.linkedUniversalObject = LMObj;
    
    LMLinkProperties *linkProperties = [[LMLinkProperties alloc] init];
    linkProperties.channel = channel;//渠道(微信,微博,QQ,等...)
    linkProperties.feature = @"Share";//表示深度链接的特点,例如邀请,分享等等;
    linkProperties.tags=@[@"LinkedME", @"Demo"];//表示深度链接的标签特性,自定义任何值;
    linkProperties.stage = @"Live";//表示深度链接的阶段特性,比如第一版产品发布,第二版本测试等等;
    linkProperties.source = @"iOS";
    
    // 添加参数方式二
    [linkProperties addControlParam:@"linkedMe_appid" withValue:AppID];//Demo标识
    [linkProperties addControlParam:@"linkedMe_udid" withValue:UDID];
    [linkProperties addControlParam:@"platform" withValue:channel];
    [linkProperties addControlParam:@"linkedMe_time" withValue:dateDescription];
    [linkProperties addControlParam:@"linkedMe_user" withValue:validId];
    [linkProperties setAndroidPathControlParam:@"*"];
    [linkProperties setIOSKeyControlParam:@"*"];
    
    parmas = [NSString stringWithFormat:@"%@\n%@",[self.linkedUniversalObject description],[linkProperties description]];
    //开始请求短链
    [self.linkedUniversalObject getShortUrlWithLinkProperties:linkProperties andCallback:^(NSString *url, NSError *err) {
        if (url) {
            NSLog(@"[LinkedME Info] SDK creates the url is:%@", url);

            // h5中间页拼接短链接
            self.shortUrl = [NSString stringWithFormat:@"%@?download=%@", @"中间页的url", url];
            if (block_success) {
                block_success();
            }
        } else {
            if (block_failure) {
                block_failure();
            }
            self.shortUrl = H5_LIVE_URL;
        }
    }];
}
  • 由于活动页一般使用h5页,因此调用生成短链接的方式也是js调用来做
- (void)js2oc_recommend:(NSDictionary *)dict {
    NSString *platform = dict[@"linkedMePlatform"];
    // 定义block
    void (^recommendBlock)();
    
    if ([platform isEqualToString:@"wechat"]) { // 分享到微信
        recommendBlock = ^(){
            [self shareAppToWeChatSession];
        };
    } else if ([platform isEqualToString:@"moments"]) { // 分享到朋友圈
        recommendBlock = ^(){
            [self shareAppToWeChatTimeline];
        };
    } else if ([platform isEqualToString:@"weibo"]) { // 分享到微博
        recommendBlock = ^(){
            [self shareAppToSina];
        };
    } else if ([platform isEqualToString:@"qq"]) { // 分享到qq
        recommendBlock = ^(){
            [self shareAppToQQSession];
        };
    } else if ([platform isEqualToString:@"qzone"]) { // 分享到qzone
        recommendBlock = ^(){
            [self shareAppToQzone];
        };
    } else if ([platform isEqualToString:@"qrcode"]) { // 生成二维码
        recommendBlock = ^(){
            [self showQRImageWithString:self.shortUrl];
        };
    } else if ([platform isEqualToString:@"copy"]) { // 拷贝
        recommendBlock = ^(){
            // 这里是拷贝出来“广告语+短链接”,方便论坛等粘贴
            // 楼主在这里使用新浪的api 将中间页+linkedMe短链接 拼接而成的链接再次变短,对用户也友好一些,具体代码就不粘了
#warning 当然也可以使用 LInkedMe 官方推荐的js方法实现再次生成短链接
            UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
            pasteboard.string = [NSString stringWithFormat:@"活动文案啦啦啦  %@",  self.shortURL];
            [MBProgressHUD showSuccess:@"复制成功"];
        };
    }
    [self createShotrUrlWithChannel:platform Success:recommendBlock failure:^{
        [MBProgressHUD showMessage:@"分享失败,请检查网络"];
    }];
}
  • 在 AppDelegate 里面需要粘几个方法,这里着重说一下 被推荐用户第一次下载app后打开app处理的机制:点击分享出去的中间页 上的下载按钮之后,进入appStore下载后,在 didFinishLaunching 方法中需要进行一下检测拦截

其中 LinkedMe 官方 SDK 会自动做一个缓存,比如用户触发深度链接后,第一次打开app没有连接网络,第二次打开时(有网络状态)依旧会生效

- (void)checkoutLinkedMeWithOptions:(NSDictionary *)launchOptions {
    //初始化及实例
    LinkedME* linkedme = [LinkedME getInstance];
    
    //打印日志
    //    [linkedme setDebug];
    
    //获取跳转参数
    [linkedme initSessionWithLaunchOptions:launchOptions automaticallyDisplayDeepLinkController:NO deepLinkHandler:^(NSDictionary* params, NSError* error) {
        if (!error) {
            //防止传递参数出错取不到数据,导致App崩溃这里一定要用try catch
            @try {
                NSLog(@"LinkedME finished init with params = %@",[params description]);
                //获取详情页类型(如新闻客户端,有图片类型,视频类型,文字类型等)
                //            NSString *title = [params objectForKey:@"$og_title"];
                NSString *tag = params[@"$control"][@"share_udid"];
                
                if (tag.length >0) {
                    // 接口一:向服务器上报信息,表示该用户已经下载app
                    [self reportLinkedMeInfoWithPara:params];
                }
            } @catch (NSException *exception) {
                NSLog(@"exception-->%@", exception);
            } @finally {
                
            }
        } else {
            NSLog(@"LinkedME failed init: %@", error);
        }
    }];
}
2、接口设计
  • 第一个接口已在上面讲过:被推荐用户第一次打开app的时候,需要把获取到的 主动分享用户的appId、udid、userId等上报给服务器。
  • 第二个接口是获取奖励数目的api,通过传参可以获取 作为 推荐者 和 被推荐者 的奖励信息
  • 第三个接口是领取奖励的api(被推荐的用户需要注册成功以后才可以领取奖励),这个实在返回的领取奖励的数目大于0的时候自动调用的
3、iOS 10.3 关于keychain 特性的改动
  • 如果 App 被删除,之前存储于 keychain 的数据也一同被删除
  • 如果使用了 keychain group,只要当group 所有相关的 App 被删除,keychain 中的数据就会被删除

这一改动,虽未经 苹果官方公布,但是已经在论坛的帖子里得到了 Apple 员工的确认,原文如下:This is an intentional change in iOS 10.3 to protect user privacy. Information that can identify a user should not be left on the device after the app that created it has been removed.
  It has never been a part of the API contract that keychain items created by an app would survive when the app is removed. This has always been an implementation detail.
  If a keychain item is shared with other apps, it won’t be deleted until those other apps have been deleted as well.

  • 得知这个消息的时候,我和我的小伙伴哭晕在厕所:



    这意味着我们不能再根据设备号来追踪设备的唯一性,果然协议没白签



    在考虑了三个小时之后,实在想不出自己转行还能干啥的时候,只好微笑着拥抱变化
  • 后来研究知乎、微博等 App 重装后直接登录,用的不是简单的keyChain,而是 iOS9 推出的SFSafariViewController,这个可以将密码、共享Cookie、iCloud Web表单数据、证书等存储在系统里面,与 iCloud keyChain 进行绑定。感谢 iOS9,感谢SFSafariViewController!另外,领英也使用了相关技术,而且说得很直白


  • 2017.09.10更新 在 iOS 10.3 版本的 beta 2 - beta 5版本中,keychain 中的数据会因为 APP 的删除而删除,但 10.3 beta 6 版本之后,keychain 又可以继续使用。
    点击查看相关信息

4、最后,下列坑已踩,后来者请直接绕过
  • 微博设置了白名单,只有投放广告的app才能直接进入appStore。其他的要进入一个中间页再次点击下载
  • 在plist文件设置LinkedMe id的时候,需要加上前缀
  • 考虑到 SSO登录、SNS登录、新用户免登陆、老用户直接登录、token过期等问题,最好将检测 linkedMe 深度链接方法往后放,比如在进入主界面之后
  • 添加参数的方式有两种,安卓和iOS要对应,demo中 安卓默认没有设置viewId,但是iOS有默认的唯一标识符,需要统一一下
  • LinkedMe安卓有问题,QQ应用宝就会加问题
  • 缓存不需要做,LinkedMe内部已经做好了,这次没有网,下次会继续请求
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 碧云天黄叶地,波上寒烟翠。一叶已惊秋,窗外梧桐,黄叶遍地。在这个桂花香销,秋虫匿迹的早上,只有几只不畏寒的鸟儿还在...
    半蓑烟雨任平生阅读 187评论 0 0
  • 哈喽,大家好。 在开始主题之前,我想问大家,最近薛之谦挺红的,大家知道发生什么事吗? 薛之谦在微博高调宣布和前妻复...
    JaneHe阅读 299评论 0 0
  • 有什么事情是你一直能坚持下来的呢?那么又是什么初衷让你能够坚持? 你有想过吗? 我们总是喜欢给自己制定计划: 今天...
    辛迪越阅读 291评论 0 0