談談分享邀請獎勵機制(附iOS實現代碼)

2017.03.14ios

之後不作標題黨了,感受如今愈來愈多的技術文章題目屌炸天,內容空泛沒有乾貨,甚至好多把官方文檔摘過來,還摘得不全,簡直是垃圾。雖然我如今寫不出牛逼的文章,可是我最起碼不會去作我反對的那種人。api

就像這樣

1、先說點沒用的

  • 經濟學十大原理中有一條:人們會對激勵作出反應。這一原理指出人們是經過比較成本和收益來作出決策,當收益和成本發生變化時,人的行爲也會發生變化
  • 簡單介紹一下口碑經濟,就是互聯網時代,由於傳播成本被極大下降,好到讓用戶忍不住發朋友圈的產品,能夠經過大量幾乎免費的贏得媒體,得到巨大的流量,同時提升轉化率的商業現象(摘自 劉潤老師 五分鐘商學院)
  • 通常狀況下,用戶第一次認識到一個產品的途徑無非三種
    • 付費媒體:報紙刊登的廣告、冠名贊助的電視節目等
    • 自有媒體:官方博客、公衆號、官網等
    • 贏得媒體:指那些不屬於你,可是也沒花錢,別人自發的傳播,這個也是傳播的最好形式

那麼爲何口碑經濟是最好的傳播形式呢?從用戶的兩方面需求來分析:緩存

  • 心理需求:用戶對於一個陌生的產品每每是持有必定的懷疑態度,經過與周邊朋友的確認,朋友間的信任感給本身這個消費行爲帶來心理上的安全感
  • 社交需求,當朋友都在討論某產品時,會經過使用該產品的參與感提升本身在圈內的存在感和認同感

2、怎樣才能最大限度上激發用戶自主進行分享

除了練習內功(自身產品優秀)以外,一些花把勢(適當的獎勵機制)也能夠在必定限度上激發用戶進行分享,先舉幾個別的行業的例子來講明問題:安全

  • 有的四六級培訓班在學員取得證書後(針對男同窗),請了一個淘寶模特,穿的美美的來給他們發證書來合影,結果那些學員的朋友圈無一倖免地作了廣告
  • 健身房裏面介紹私教會員入會也會送給介紹人幾節課
  • 不少餐廳開業酬賓打七折,條件就是拍門店照片發朋友圈,憑藉朋友圈截圖享受折扣

這個激勵措施是必定要基於產品好的基礎上,就比如:你的女神已經對你有好感了,你賣個萌,她就答應作你女友了;若是妹子對你沒有好感,「賣萌」只會讓對方以爲醜人多做怪服務器

2、產品角度

一、獎勵有哪些主要形式?
  • 物質激勵微信

  • 實物:好比微博推廣的轉發抽獎送iPhone網絡

  • 虛擬物品:滴滴、ofo等交通共享平臺分享就送的優惠券、充值卡app

  • 精神激勵ide

  • 存在感:點贊、評論、關注等,最直白的好比微博、貼吧等 測試

  • 榮譽:早期的QQ等級、支付寶會員的排行、keep、獲得app的各類頭銜、勳章,微信運動的排行榜

  • 權利:京東平臺的會員等級越高,包郵的最低價格越低

二、該功能主要界面
  • 好比從banner活動頁等入口進入「推薦有獎」活動h5頁,該頁面通常包括
    • 個人成就:顯示已經邀請多少人,得到多少獎勵
    • 獎勵規則按鈕:點擊進入詳細的推薦活動獎勵規則
    • 分享途徑,總的來講包括如下三種:
    • 分享到微信、qq、微博等第三方平臺
    • 二維碼(點擊後彈出二維碼,方便當面分享)
    • 複製短連接(考慮到相關論壇或其餘聊天分享)
  • 也能夠在導航欄添加一個「明細」按鈕,點擊後進入邀請明細界面,具體顯示邀請了哪些好友,具體得到哪些獎勵
  • 分享出去的一箇中間頁,被分享者先看到這個活動頁,而後在這個活動頁點擊下載按鈕後,
    • 已安裝app的用戶點擊分享連接後會直接打開app裏的內容頁
    • 未安裝app的用戶點擊連接後自動跳轉到應用商店.
三、產品必需要了解的技術
  • 使用 LinkedMe 技術生成一個每一個推薦用戶專屬的短連接,而後分享出去,經過此連接下載的用戶就會獲得匹配,兩個用戶都獲得相應的獎勵,不須要用戶輸入邀請碼
  • 專屬連接中能夠自定義各類參數,好比推薦者的userId、分享平臺、分享時間等
  • 被邀請的用戶觸發深度連接後,LinkedME深度連接自動判斷App是否安裝
    • 若是判斷安裝App,直接打開App對應深度連接的內容頁面。
    • 若是判斷沒有安裝,直接跳轉到用戶默認的應用商店,下載安裝,註冊登錄後直接跳轉到具體內容頁面。

3、技術實現思路

#####一、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);
        }
    }];
}
複製代碼
二、接口設計
  • 第一個接口已在上面講過:被推薦用戶第一次打開app的時候,須要把獲取到的 主動分享用戶的appId、udid、userId等上報給服務器。
  • 第二個接口是獲取獎勵數目的api,經過傳參能夠獲取 做爲 推薦者 和 被推薦者 的獎勵信息
  • 第三個接口是領取獎勵的api(被推薦的用戶須要註冊成功之後才能夠領取獎勵),這個實在返回的領取獎勵的數目大於0的時候自動調用的
三、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 又能夠繼續使用。 點擊查看相關信息

四、最後,下列坑已踩,後來者請直接繞過
  • 微博設置了白名單,只有投放廣告的app才能直接進入appStore。其餘的要進入一箇中間頁再次點擊下載
  • 在plist文件設置LinkedMe id的時候,須要加上前綴
  • 考慮到 SSO登陸、SNS登陸、新用戶免登錄、老用戶直接登陸、token過時等問題,最好將檢測 linkedMe 深度連接方法日後放,好比在進入主界面以後
  • 添加參數的方式有兩種,安卓和iOS要對應,demo中 安卓默認沒有設置viewId,可是iOS有默認的惟一標識符,須要統一一下
  • LinkedMe安卓有問題,QQ應用寶就會加問題
  • 緩存不須要作,LinkedMe內部已經作好了,此次沒有網,下次會繼續請求

相關文章
相關標籤/搜索