以后不做標題黨了,感覺現在越來越多的技術文章題目屌炸天,內容空泛沒有干貨,甚至好多把官方文檔摘過來,還摘得不全,簡直是垃圾。雖然我現在寫不出牛逼的文章,但是我最起碼不會去做我反對的那種人。
一、先說點沒用的
- 經濟學十大原理中有一條:人們會對激勵做出反應。這一原理指出人們是通過比較成本和收益來做出決策,當收益和成本發生變化時,人的行為也會發生變化
- 簡單介紹一下口碑經濟,就是互聯網時代,因為傳播成本被極大降低,好到讓用戶忍不住發朋友圈的產品,可以通過大量幾乎免費的贏得媒體,獲得巨大的流量,同時提高轉化率的商業現象(摘自 劉潤老師 五分鐘商學院)
- 一般情況下,用戶第一次認識到一個產品的途徑無非三種
- 付費媒體:報紙刊登的廣告、冠名贊助的電視節目等
- 自有媒體:官方博客、公眾號、官網等
- 贏得媒體:指那些不屬于你,但是也沒花錢,別人自發的傳播,這個也是傳播的最好形式
那么為什么口碑經濟是最好的傳播形式呢?從用戶的兩方面需求來分析:
- 心理需求:用戶對于一個陌生的產品往往是持有一定的懷疑態度,通過與周邊朋友的確認,朋友間的信任感給自己這個消費行為帶來心理上的安全感
-
社交需求,當朋友都在討論某產品時,會通過使用該產品的參與感提高自己在圈內的存在感和認同感
二、怎樣才能最大限度上激發用戶自主進行分享
除了練習內功(自身產品優秀)之外,一些花把勢(適當的獎勵機制)也可以在一定限度上激發用戶進行分享,先舉幾個別的行業的例子來說明問題:
- 有的四六級培訓班在學員取得證書后(針對男同學),請了一個淘寶模特,穿的美美的來給他們發證書來合影,結果那些學員的朋友圈無一幸免地做了廣告
- 健身房里面介紹私教會員入會也會送給介紹人幾節課
- 很多餐廳開業酬賓打七折,條件就是拍門店照片發朋友圈,憑借朋友圈截圖享受折扣
這個激勵措施是一定要基于產品好的基礎上,就好比:你的女神已經對你有好感了,你賣個萌,她就答應做你女朋友了;如果妹子對你沒有好感,“賣萌”只會讓對方覺得丑人多作怪
二、產品角度
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內部已經做好了,這次沒有網,下次會繼續請求