背景
先交代下背景:最近一个需求,根据接口返回数据来控制分享形式,即传入分享类别(比如文章、音频、邀请好友下载应用等)、分享平台(比如微信好友、朋友圈等)、分享类别所对应的id(比如文章id、音频id等),接口返回相应的分享形式(图片、小程序、网页)及对应的分享所需信息。以此达到根据多种条件灵活控制分享形式。(好吧~承认感觉实际用处并不太大…)
先上代码
1,图片形式
//1.创建多媒体消息结构体 WXMediaMessage *mediaMsg = [WXMediaMessage message]; //2.创建多媒体消息中包含的图片数据对象 WXImageObject *imgObj = [WXImageObject object]; //图片真实数据 imgObj.imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:dic[@"img_url"]]]; //dic为接口返回的分享所需信息,也可以自己处理链接或者添加本地图片 // UIImage *image = IMAGE(@"invite.jpg"); // // imgObj.imageData = UIImagePNGRepresentation(image); //多媒体数据对象 mediaMsg.mediaObject = imgObj; //3.创建发送消息至微信终端程序的消息结构体 SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; //多媒体消息的内容 req.message = mediaMsg; //指定为发送多媒体消息(不能同时发送文本和多媒体消息,两者只能选其一) req.bText = NO; //指定发送到会话(聊天界面) req.scene = WXSceneSession; //此处可根据实际情况来加判断 WXSceneTimeline-朋友圈 //发送请求到微信,等待微信返回onResp [WXApi sendReq:req];2,小程序形式
//前面最好加个判断,如果以小程序分享到朋友圈,暂时是不支持的 Protocal *data = [[Protocal alloc] init]; data.title = dic[@"title"]; data.desc = dic[@"content"]; data.url = dic[@"url"]; data.img = dic[@"img_url"]; data.programPage = dic[@"app_path"];//小程序路径 data.userName = dic[@"app_userName"];//小程序原始id //dic为接口返回分享所需信息,Protocal为自己创建的分享模型, --后面用的友盟的分享,也可用微信原生的,毕竟图省事 //创建分享消息对象 UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; UMShareMiniProgramObject *shareObject = [UMShareMiniProgramObject shareObjectWithTitle:data_.title descr:data_.desc thumImage:data_.image]; shareObject.webpageUrl =data_.url?:@"";//若url为空此处会无法调起微信,所以此处最好不要写空,见后面遇到的坑 shareObject.userName = data_.userName; shareObject.path = data_.programPage; messageObject.shareObject = shareObject; shareObject.hdImageData = UIImageJPEGRepresentation(data_.image,1); shareObject.miniProgramType = UShareWXMiniProgramTypeRelease; // 可选体验版和开发板 //调用分享接口 [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self.mObject completion:^(id data, NSError *error) { if (error) { UMSocialLogInfo(@"************Share fail with error %@*********",error); }else{ if ([data isKindOfClass:[UMSocialShareResponse class]]) { UMSocialShareResponse *resp = data; //分享结果消息 UMSocialLogInfo(@"response message is %@",resp.message); //第三方原始返回的数据 UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); }else{ UMSocialLogInfo(@"response data is %@",data); } } }];3,网页形式(最原始的分享形式)
Protocal *data = [[Protocal alloc] init]; data.title = dic[@"title"]; data.desc = dic[@"content"]; data.url = dic[@"url"]; data.img = dic[@"img_url"]; --上面基本和小程序类似,下面粘友盟的代码 //创建分享消息对象 UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; //创建网页内容对象 UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:data_.title?:@"" descr:data_.desc?:@"" thumImage:data_.image]; //设置网页地址 shareObject.webpageUrl = data_.url?:@""; //分享消息对象设置分享内容对象 messageObject.shareObject = shareObject; //调用分享接口 [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self.mObject completion:^(id data, NSError *error) { if (error) { UMSocialLogInfo(@"************Share fail with error %@*********",error); }else{ if ([data isKindOfClass:[UMSocialShareResponse class]]) { UMSocialShareResponse *resp = data; //分享结果消息 UMSocialLogInfo(@"response message is %@",resp.message); //第三方原始返回的数据 UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); }else{ UMSocialLogInfo(@"response data is %@",data); } } }]; 因实际项目中用了两个Manager单例封装处理了判断、分类,上面粘的部分代码可能没法直接运行,如有问题可在下方留言…
遇到的坑
分享微信小程序无反应
1,UMShareMiniProgramObject中webpageUrl不可为空
因接口当时返回的是以小程序为分享形式时,并未给url,所以以至于赋值的时候webpageUrl给了空,导致调不起微信。且当时看是适配低版本微信网页链接,所以没有太在意,以至于找了好久才发现这个问题…
2,分享小程序也是以UMSocialPlatformType_WechatSession微信聊天类型,不可自定义类型,否则友盟无法调起微信。
因产品要求分享到微信聊天不只有小程序类型,还有其他类型,所以当时自作聪明在友盟的UMSocialPlatformConfig.h内新添了一种类型
以至于无法调起。并且当时因为原因1中webpageUrl为空,也导致了无法调起,所以此处在自定义类型之前也是无法调起,无反应,所以以为不是这个问题。后来想明白了微信聊天小程序现在也是基于微信聊天发送的,在聊天内只是一种样式而并不是与聊天、朋友圈并列的形式…但当时由于1、2问题都在以至于找了好久都没找出问题…













