zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    程序员指引之路
    RPC 远程过程调用浅谈
    坑爹问题总结
    java 中无符号和有符号int的区别以及byte转int
    python学习Day19 1.产生随机数random、2.序列化【json、 pick、shelve】、3.加 密【hashlib 、hmac】 4.文件的操作【shutil】
    python学习Day18 导包、时间模块【time、calendar datetime】、SYS、OS, OS.path模块、项目开放周期&规范
    python学习Day17 五项【导模块的细节:(跨文件导入模块 &模块的两种执行方式) | 包的概念与使用 | 包中的相对导入语法】
    python学习Day16 模块的概念、模块的导入方式【import 模块名、from 模块 imoprt 功能】、模块的搜索路径、链式导入&循环导入
    python学习Day15 生成器send方法、递归、匿名函数、内置函数
    python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式
  • 原文地址:https://www.cnblogs.com/1oo1/p/4192998.html
Copyright © 2011-2022 走看看