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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM