V-Zhou / V-Blog

记录 总结 学习
1 stars 0 forks source link

iOS 系统分享 + APP内直接调起微信分享窗口 #2

Open V-Zhou opened 7 years ago

V-Zhou commented 7 years ago

经过测试(2017.11) iOS11 中已无法直接调起系统微信分享 只能先调起系统分享 由用户选择分享平台

相信做过第三方分享的开发者们已经受够了第三方分享的各种埋坑文档 , 辗转各大官方申请 配置 APPKey 等繁琐的操作实在不够人性化

直到我遇到系统分享. 一切都简单了.

系统分享调用相比遇第三方分享 无需查看海量文档 不用引用大量第三方代码 快速, 安全.

调用系统分享

UIActivityViewController *activeViewController = [[UIActivityViewController alloc]initWithActivityItems:@[@"哈哈"] applicationActivities:nil];
    // 这是设置分享列表中哪些东西要隐藏掉
    activeViewController.excludedActivityTypes = @[UIActivityTypeAirDrop];

    [self presentViewController:activeViewController animated:YES completion:nil];
    // 完成分享后的回调
    activeViewController.completionWithItemsHandler = ^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
        NSLog(@"%@    %@",activityType, returnedItems);
    };

直接调用系统分享中的某一个 比如微信!

首先导入 #import <Social/Social.h> 微信的 ServiceType ( com.tencent.xin.sharetimeline )是由直接调用系统分享原生列表时 是在成功调用系统分享列表中的调用微信完成后 在回调方法中打印出来的

activeViewController.completionWithItemsHandler = ^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
//        NSLog(@"%@    %@",activityType, returnedItems);
//    };

知道了某个分享选项的 activityType 后,就可以直接调起而不用先弹出系统分钟列表再点击了(如果需要的话)

SLComposeViewController *svc = [SLComposeViewController composeViewControllerForServiceType:@"com.tencent.xin.sharetimeline"];

    SLComposeViewControllerCompletionHandler myblock = ^(SLComposeViewControllerResult result){
        if(result == SLComposeViewControllerResultCancelled){
            NSLog(@"cancel");
        }else{
            NSLog(@"done");
        }
        [svc dismissViewControllerAnimated:YES completion:nil];
    };
    svc.completionHandler = myblock;
    [svc setInitialText:@"title"];
    [svc addURL:[NSURL URLWithString:@"www.luoo.net"]];

    [self presentViewController:svc animated:YES completion:nil];

以上是尽量精简的演示代码 想了解更多请看以下代码

/*直接调用系统微信分享的ServiceType*/
NSString *const SystemSocialType_WeiXin=@"com.tencent.xin.sharetimeline";

/*调用系统微信分享*/
+(BOOL)showSystemSocialWeiXinShare:(NSString *)title webUrl:(NSString *)weburl viewController:(UIViewController*)viewController
{
    if([SLComposeViewController isAvailableForServiceType:SystemSocialType_WeiXin])
    {//系统分享里有微信才行哦
        if((title==nil||[title isEqualToString:@""])&&(weburl==nil||[weburl isEqualToString:@""]))
        {//title 和 weburl 都为空
            return NO;
        }
        SLComposeViewController *svc = [SLComposeViewController composeViewControllerForServiceType:SystemSocialType_WeiXin];

        SLComposeViewControllerCompletionHandler myblock = ^(SLComposeViewControllerResult result){
            if(result == SLComposeViewControllerResultCancelled){
                NSLog(@"cancel");
            }else{
                NSLog(@"done");
            }
            [svc dismissViewControllerAnimated:YES completion:nil];
        };
        svc.completionHandler = myblock;
        if(title)
        {
            [svc setInitialText:title];
        }
        if(weburl)
        {
            [svc addURL:[NSURL URLWithString:weburl]];
        }

        [viewController presentViewController:svc animated:YES completion:nil];
        return YES;
    }
    return NO;
}
CoderKingXY commented 6 years ago

这个没办法解决了吗?SLComposeViewController automatically dismissing itself ?

V-Zhou commented 6 years ago

@YuDiyi 你好 你具体问的是什么问题

kobe1941 commented 1 year ago

直接使用SLComposeViewController的函数,不去拉起UIActivityViewController,看起来不行,控制台打印了如下日志: sheet not being presented calling premature completion

实际presentVC后,立马就收到了completionHandler的回调,且是cancel的状态,

如果是想直接拉起SLComposeViewController来分享到微信,要如何做到?