UIActivityViewController的相关用法(三)--自定义分享方式(比第三方分享库轻便)

使用UIActivityViewController自定义分享的方式,

以下代码创建一个UIActivityViewController,可以用AirDrop、邮件、QQ、微信分享,AirDrop分享是数据传输,其他三项是文本分享,可以在实现了UIActivityItemSource协议的item类中控制,

// 创建UIActivityViewController,并呈现
-(void)createAndShowActivityViewController
{
    // 构造自定义Activities,只选择系统的 mail 和 airDrop 类型
    NSArray *activities = @[[QQActivity new],
                            [WeChatActivity new]];
    NSArray *excludedActivityTypes = @[UIActivityTypePostToFacebook,
                                    UIActivityTypePostToTwitter,
                                    UIActivityTypePostToWeibo,
                                    UIActivityTypeMessage,
                                    //UIActivityTypeMail,
                                    UIActivityTypePrint,
                                    UIActivityTypeCopyToPasteboard,
                                    UIActivityTypeAssignToContact,
                                    UIActivityTypeSaveToCameraRoll,
                                    UIActivityTypeAddToReadingList,
                                    UIActivityTypePostToFlickr,
                                    UIActivityTypePostToVimeo,
                                    UIActivityTypePostToTencentWeibo];

    // 构造待发送的数据项
    SharedItem *item = [[SharedItem alloc] initWithData:self.data andLink:@"http://www.baidu.com?pid=12j12kjdlsaj&d=jsdlkjfch9802"];

    //构建UIActivityViewController
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[item] applicationActivities:activities];
    activityViewController.excludedActivityTypes = excludedActivityTypes;

    activityViewController.completionHandler = ^(NSString *activityType, BOOL completed){
        // UIActivityViewController 退出时调用此Block
        // 无论是否成功,直接退出
        [self.delegate backToMainView];
    };
    [self presentViewController:activityViewController animated:YES completion:nil];
}

只贴出微信的Activity类

#import <UIKit/UIKit.h>

@interface WeChatActivity : UIActivity

@end

#import "WeChatActivity.h"

@implementation WeChatActivity

-(NSString*)activityType
{
    //相当于 UIActivityTypeAirDrop, 可以用来判断是什么Activity类型
    return @"com.hsun.ShareViaWeChat";
}

-(NSString*)activityTitle
{
    // 显示的Title
    return @"微信";
}
-(UIImage*)activityImage
{
    // 显示的图标,ios8及以后是彩色,大小可以查看此方法的文档
    return [UIImage imageNamed:@"weixin"];
}

-(void)prepareWithActivityItems:(NSArray *)activityItems
{
    //在此做操作,items就是要传输的数据,可以在此直接调用微信的api
    NSLog(@"%@",activityItems);
}

+(UIActivityCategory)activityCategory
{
    // 决定在UIActivityViewController中显示的位置,最上面是AirDrop,中间是Share,下面是Action
    return UIActivityCategoryShare;
}

-(void)performActivity
{
    // 没有自定义的UIViewController才会调用此方法。在这里可以做一些操作,需要在最后消除掉UIActivityviewController
    [self activityDidFinish:YES];
}

-(BOOL)canPerformWithActivityItems:(NSArray *)activityItems
{
    // 可以根据item的不同类型决定是否可以让行为服务操作
    return YES;
}

@end

对应的Item类(在此可以控制不同的Activity做不同的数据传输)

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface SharedItem : NSObject<UIActivityItemSource>

-(instancetype)initWithData:(NSData*)data andLink:(NSString*)link;

@end

#import "SharedItem.h"

@interface SharedItem ()
@property (nonatomic, strong) NSData *data;
@property (nonatomic, strong) NSString *link;
@end

@implementation SharedItem

-(instancetype)initWithData:(NSData *)data andLink:(NSString *)link
{
    self = [super init];
    if (self) {
        _data = data;
        _link = link;
    }
    return self;
}

-(instancetype)init
{
    @throw [NSException exceptionWithName:@"Do not use" reason:@"Please use initWithData:andLink to initiate." userInfo:nil];
    return nil;
}

#pragma mark - UIActivityItemSource
-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    return [NSData data];
}

-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
    // 如果是通过 AirDrop,直接返回NSData
    if ([activityType isEqualToString:UIActivityTypeAirDrop]) {
        return self.data;
    }
    // 其他都是返回链接
    return self.link;
}

-(NSString*)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType
{
    return @"分享数据";
}

-(NSString*)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType
{
    // 如果是通过 AirDrop,直接返回NSData
    if ([activityType isEqualToString:UIActivityTypeAirDrop]) {
         return @"com.hsun.customUTI.hsundata";
    }
    // 其他都是返回链接
    return nil;
}
时间: 2024-11-05 14:43:48

UIActivityViewController的相关用法(三)--自定义分享方式(比第三方分享库轻便)的相关文章

UIActivityViewController的相关用法--NSData的发送和接收

通过AirDrop发送一张图片或者一个文件,需要序列化实现了NSActivityItemSource的容器类实例,以NSData的数据格式传输.app发送/接收自定义的类型实例,还需要创建一个自定义的UTI,需要在Targets的info中添加两个节点:Document Types 和 Exported Type UTIs; 1.Document Types: app注册此字段后可以接受自定义的UTI,同时这个字段也可以用来接收其他标准的UTI文件类型. 2.Exported Type UTIs

UIActivityViewController的相关用法

UIActivityViewController 是一个能为应用程序提供服务的试图控制器.操作系统已经提供了一些标准服务,诸如 复制内容到剪切板,提交内容到社交网站,通过 email 或 短信发送内容等.应用程序也可以自定义服务. 应用程序要复制配置.呈现和消除 UIActivityViewController.UIActivityViewContoller 的配置需要明确指出控制器要表现出的数据对象.使用代码如下: - (IBAction)openActivitySheet:(id)sende

2019年6月14日 Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端传输数据编码格式contentType 批量插入数据和自定义分页器 一.MVC与MTV MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式,所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求. M

Django框架进阶6 多对多三种创建方式, Ajax, Content-Type前后端传输数据编码格式, Ajax发送文件数据, django内置的序列化功能, Ajax结合sweetalert实现删除二次确认, 批量插入数据, 自定义分页器, ajax结合sweetalert实现删除二次确认

多对多三种创建方式 1.全自动(较为常用) class Book(models.Model): title = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') # orm就会自动帮你创建第三张表 class Author(models.Model): name = models.CharField(max_length=32) ''' 好处:第三张表自己创建 不足之处:第三张表无法扩展额外

MyEclipse相关用法介绍

MyEclipse相关用法介绍 ================================================================================ 编辑: Ctrl+Shift+L      显示所有快捷键 Ctrl+K        参照选中的词(Word)快速定位到下一个 Ctrl+Shift+K      参照选中的词(Word)快速定位到上一个 Ctrl+O         快速显示OutLine Ctrl+T        快速显示当前类的

CoreData用法三: NSPredicate在CoreData中的使用

NSPredicate在CoreData中常用作查询使用,相当于sql语句中的where查询子句. 最常用的方法为: NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...]; 比如我们要查询student表中name="jjy"的信息,我们可以这样去用NSPredicate NSEntityDescription * emEty = [NSEntityDescription entityForName:

Apache HTTP Server 与 Tomcat 的三种连接方式介绍

Apache HTTP Server 与 Tomcat 的三种连接方式介绍 整合 Apache Http Server 和 Tomcat 可以提升对静态文件的处理性能.利用 Web 服务器来做负载均衡以及容错.无缝的升级应用程序.本文介绍了三种整合 Apache 和 Tomcat 的方式. 3 评论: 刘 冬 ([email protected]), 开发工程师, 2007 年 1 月 15 日 内容 首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomca

Shell三种执行方式(简单参数说明)

Shell三种执行方式   (非原创,忘记了是谁的博客叻) 1: . 文件名 1.source命令用法:   source FileName    作用:在当前bash环境下读取并执行FileName中的命令.该filename文件可以无"执行权限"     注:该命令通常用命令"."来替代.     如:source bash_profile   . bash_profile两者等效.     source(或点)命令通常用于重新执行刚修改的初始化文档.    

Android学习之XML数据的三种解析方式以及生成XML文件

首先,我得声明,本博客的思想主要参考了此博客:http://blog.csdn.net/liuhe688/article/details/6415593 不过代码我自己一句句敲的 好了,首先讲一下解析XML的三种方式:(恕我粘贴一下哈) SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理.在事件源调用事件处理器中特定方