最近公司APP里有个朋友圈功能,但又需要把自己的朋友圈内容(主要是文字、图片、视频)分享到微信当中去,基本的实现是满足了:
- 利用系统自带的ActivityViewController 调出系统分享页面,然后点击微信分享,会弹出微信的分享页面,将图片、文字、URL分享到微信的朋友圈或发送给朋友。而且可以多图分享,如图所示:
这样是没问题,但是,不觉得中间弹出系统框的那一步比较多余吗,而且调出的时间还挺长,用户体验会很不好,如果使用友盟分享,无法实现多图分享。
我还想过,能不能在系统activityViewController弹出的时候让他隐藏,遍历其中的cell,哪个是微信就自动点击哪个按钮,但是,想法是很美好的,我反正没实现得了。。。
最终从gitHub上找到了方法。真的是感激涕零啊。。。我在他的基础上优化了视频功能的分享。方法如下:
利用系统自带的 SLComposeViewController 实现直接弹出微信分享功能
-
SLComposeViewController
这个类通过组成一个视图页面将用户数据分享到指定的社交服务器中。 - 首先导入
<Social/Social.h>
系统框架 - 判断分享类型,如果需要使用系统自带的分享,就直接调用activityViewController实现分享
if(type == XHHShareToolShareTypeOthers) //其他,调用系统activityViewController
{
UIActivityViewController * activityCtl = [[UIActivityViewController alloc]initWithActivityItems:items applicationActivities:nil];
[controller presentViewController:activityCtl animated:YES completion:nil];
}
- 需要微信、qq、新浪等方式分享:
//1.判断分享是否可用。
if (![SLComposeViewController isAvailableForServiceType:serviceType]) {
NSLog(@"不可用,请到系统设置中配置账号和密码");
return NO;
}
//
SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:serviceType];
// 添加要分享的图片
for ( id obj in items)
{
if ([obj isKindOfClass:[UIImage class]])
{
[composeVC addImage:(UIImage *)obj];
}
//视频的本地url
else if ([obj isKindOfClass:[NSURL class]])
{
这里需要详细说明一下:
//因为我在项目中只需要分享视频 而且传进来的是本地的url所以没有用下面的addURL
//addURL这个方法是直接分享链接形式。所以如果有需要可以单独在后面加个if else()
//[composeVC addURL:(NSURL *)obj];
// 这里利用系统方法自己创建一个视频类型的item
NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithItem:(NSURL *)obj typeIdentifier:(NSString *)kUTTypeQuickTimeMovie];
NSExtensionItem *extensionItem = [NSExtensionItem new];
//指定item的附件信息,用数组来装
extensionItem.attachments = [NSArray arrayWithObject:itemProvider];
//通过消息机制 调用它的私有方法 addExtensionItem:添加视频item进来。
[composeVC performSelector:@selector(addExtensionItem:) withObject:extensionItem];
}
}
// 添加要分享的文字
[composeVC setInitialText:@"分享"];
// 设置弹出分享控制器之后的回调操作
composeVC.completionHandler = ^(SLComposeViewControllerResult result){
if (result == SLComposeViewControllerResultDone) {
NSLog(@"点击了发送");
}
else if (result == SLComposeViewControllerResultCancelled)
{
NSLog(@"点击了取消");
}
};
//如果没有安装相关的分享APP,跳过,不然会崩溃。
@try
{
[controller presentViewController:composeVC animated:YES completion:nil];
return YES;
} @catch (NSException *exception)
{
NSLog(@"没有安装");
[XWSimpleTipView xw_showOnWindowWithTitle:@"手机中没有相关软件"];
return NO;
} @finally {
}
- 这里面有很关键的一步需要注意:跳出系统的ActivityViewController 之后点击某个需要分享到的APP 之后弹出了的那个页面其实本质上就是
SLComposeViewController
,而每一个分享页面是有一个唯一的标识符:serviceType
这个NSString类型的常量定义在这里:
系统提供的分享服务器类型
可以看到,系统提供 的类型只有几个,那怎么知道微信和qq的那些标识符是哪些呢?这就需要用到系统自带的activityController中的一个方法来打印出这个唯一的标识符。
UIActivityViewController *activity=[[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
//点击某个item后的回调中可以看出activityType这个字符串。
activity.completionWithItemsHandler= ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
NSLog(@"activityType --------%@",activityType);
//activityType --------com.tencent.xin.sharetimeline
};
至于这个字符串会不会在以后会有更改?这个我就不知道了,以上内容只是一个小方法分享,以便学习之用,欢迎大家批评指正。
网友评论