2017.03.14ios
之後不作標題黨了,感受如今愈來愈多的技術文章題目屌炸天,內容空泛沒有乾貨,甚至好多把官方文檔摘過來,還摘得不全,簡直是垃圾。雖然我如今寫不出牛逼的文章,可是我最起碼不會去作我反對的那種人。api
那麼爲何口碑經濟是最好的傳播形式呢?從用戶的兩方面需求來分析:緩存
除了練習內功(自身產品優秀)以外,一些花把勢(適當的獎勵機制)也能夠在必定限度上激發用戶進行分享,先舉幾個別的行業的例子來講明問題:安全
這個激勵措施是必定要基於產品好的基礎上,就比如:你的女神已經對你有好感了,你賣個萌,她就答應作你女友了;若是妹子對你沒有好感,「賣萌」只會讓對方以爲醜人多做怪服務器
物質激勵微信
實物:好比微博推廣的轉發抽獎送iPhone網絡
虛擬物品:滴滴、ofo等交通共享平臺分享就送的優惠券、充值卡app
精神激勵ide
存在感:點贊、評論、關注等,最直白的好比微博、貼吧等 測試
榮譽:早期的QQ等級、支付寶會員的排行、keep、獲得app的各類頭銜、勳章,微信運動的排行榜
權利:京東平臺的會員等級越高,包郵的最低價格越低
#####一、linkedMe主要方法
// 由於涉及到若干個分享平臺,所以封裝一個生成短連接的方法
// 生成短連接後,進行相應的操做,所以
- (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;
}
}];
}
複製代碼
- (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:@"分享失敗,請檢查網絡"];
}];
}
複製代碼
其中 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);
}
}];
}
複製代碼
這一改動,雖未經 蘋果官方公佈,可是已經在論壇的帖子裏獲得了 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 又能夠繼續使用。 點擊查看相關信息