這篇博客真的拖了好久好久累榜。這段時間被各種事情纏身(借口)。終于富弦,能夠好好整理一下最近的工作沟娱。切入正題,這次要講的是在iOS客戶端不使用第三方框架的前提下腕柜,實(shí)現(xiàn)分享的功能济似。該功能前人也造了很多輪子,本篇博客主要是結(jié)合自己在開發(fā)中遇到的一些情況對這個功能做個總結(jié)盏缤,與大家一起探討碱屁。
簡介
目前,我們用到的app幾乎每一個都包含了分享的功能蛾找。實(shí)際開發(fā)中娩脾,大部分情況下使用都是基于第三方,如shareSDK,友盟等平臺實(shí)現(xiàn)社交分享功能打毛。使用第三方平臺的可定制性高柿赊,但需要到每個平臺去注冊應(yīng)用申請key并且引入API就很繁瑣。相對而言幻枉,系統(tǒng)分享就簡易了很多碰声。
一、分享的內(nèi)容
分享的內(nèi)容可以是文字熬甫、圖片胰挑、視頻甚至是GIF。當(dāng)然有些平臺有限制椿肩。比如瞻颂,微信朋友圈和微博是分享不了GIF和視頻的。需要分享的內(nèi)容實(shí)體放在一個數(shù)組里,下面一一介紹郑象。
1. 圖片+文字
- (void)shareImage
{
NSString *textToShare = self.titleTextField.text;
// load你要分享的圖片贡这,通過bundle或者沙盒,或者name
UIImage *imageToShare = [UIImage xxxx];
[self shareWithActivityItems: @[textToShare, imageToShare]];
}
2. 視頻+文字
此處分享的是本地視頻厂榛,self.moviePath是本地視頻沙盒路徑盖矫。上效果圖丽惭。
- (void)shareVideo
{
NSString *textToShare = self.titleTextField.text;
NSURL *urlToShare = [NSURL fileURLWithPath:self.moviePath];
[self shareWithActivityItems: @[textToShare,urlToShare]];
}
3. GIF+文字
這種類型的例子真的太少了。造好了輪子辈双,分享到微信成功责掏,見證奇跡的時刻了。不料湃望,打開卻是靜圖换衬。排查了各種原因,也嘗試了其他造輪子的方法喜爷。終于得出是因?yàn)? 圖片太大了冗疮。合成GIF的時候,沒有對圖片進(jìn)行處理檩帐,圖片過大導(dǎo)致分享出去打開是靜圖而在PC端可以正常打開术幔。
- (void)shareGIF
{
NSString *textToShare = self.titleTextField.text;
NSURL *urlToShare = [NSURL fileURLWithPath:self.gifPath];
[self shareWithActivityItems: @[textToShare,urlToShare]];
}
二、彈出分享框
很明顯上面的shareWithActivityItems()就是彈出分享框的方法了湃密。具體如下诅挑。
- (void)shareWithActivityItems:(NSArray *)activityItems
{
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:[self setupActivityWithActivityItems:activityItems]];
// 根據(jù)需要指定不需要分享的平臺
activityVC.excludedActivityTypes = @[UIActivityTypeMail,UIActivityTypePostToTwitter,UIActivityTypeMessage,UIActivityTypePrint,UIActivityTypeCopyToPasteboard,UIActivityTypeAssignToContact,UIActivityTypeAddToReadingList,UIActivityTypePostToFlickr,UIActivityTypePostToVimeo,UIActivityTypePostToTencentWeibo,UIActivityTypeAirDrop,UIActivityTypeOpenInIBooks];
// >=iOS8.0系統(tǒng)用這個方法
activityVC.completionWithItemsHandler = ^(NSString *activityType,BOOL completed,NSArray *returnedItems,NSError *activityError)
{
if (completed) { // 確定分享
}
else {
}
};
[self presentViewController:activityVC animated:YES completion:nil];
}
三、選擇分享的平臺
一般情況下泛源,系統(tǒng)分享會列出手機(jī)上能夠支持該分享內(nèi)容的平臺拔妥。如微信,QQ达箍,新浪微博没龙,等等。當(dāng)然你也可以在更多里邊進(jìn)行控制這些平臺的展示與否缎玫。如圖硬纤,來自簡書中包含的系統(tǒng)分享。
可以看到有兩行顯示赃磨,分別表示分享和操作筝家。當(dāng)然,你可以指定邻辉。綜上溪王,就可以完成分享的功能了。如果您需要自定義分享的平臺值骇,您可以往下看莹菱。
typedef NS_ENUM(NSInteger, UIActivityCategory) {
UIActivityCategoryAction,
UIActivityCategoryShare,
} NS_ENUM_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
四、自定義UIActivity
官方文檔解釋雷客,UIActivity必須通過繼承的方式來使用芒珠。大概步驟,網(wǎng)上還是很多輪子的搅裙。這里主要講解一下細(xì)節(jié)部分皱卓。
- (void)performActivity
{
if([self.type isEqualToString:ActivityServiceFackBook]) {
if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:kShareFaceBook];
[self shareActionWithVC:composeVC ShareType:self.type];
[self.currentViewController presentViewController:composeVC animated:NO completion:nil];
}
else {
[self showErrorText:@"沒有安裝FaceBook"];
}
}
[self activityDidFinish:YES];
}
(void)performActivity調(diào)用這個方法執(zhí)行具體的服務(wù)操作。比如部逮,你自定義微信和新浪這服務(wù)娜汁。當(dāng)你點(diǎn)擊自定義服務(wù)的時候,會調(diào)用這個方法兄朋。所以你需要這個方法里判斷你點(diǎn)擊的具體服務(wù)是什么掐禁。前面我代碼中演示的是點(diǎn)擊facebook的例子。
如果自定義的服務(wù)實(shí)現(xiàn)分享視頻颅和。你可以按照以下操作傅事。
- (void)shareActionWithVC:(SLComposeViewController *)composeVC
{
// self.shareContexts 是在彈出分享框的時候傳入的,可以參照上面的代碼
for (id obj in self.shareContexts) {
if ([obj isKindOfClass:[NSURL class]]) { // 視頻
NSURL *urlToShare = (NSURL *)obj;
if(urlToShare.absoluteString.length >0) { // 有視頻
[composeVC addURL:urlToShare];
}
}
}
綜上峡扩,您就可以實(shí)現(xiàn)系統(tǒng)分享的功能了蹭越。歡迎討論。