iOS-微信分享多张图片(UIActivityViewController多图分享和多图分享失败)
前言
微信分享到朋友圈,可分享的类型有:文字类型、图片类型、音乐类型、视频类型和网页类型,但是我们在做图片分享的时候发现微信给的API只能分享一张图片,达不到一些APP的需求,而产品汪或者Boss想要分享多张图片,比如前段时间我做的一个APP,是电商类APP,想把商品的图片都分享到朋友圈,查看微信的API根本没有提供API,在这里我们只能用iOS系统自带的分享了。
UIActivityViewController
UIActivityViewController是在iOS 6开始支持的,同样是不能在Apple TV的开发中使用。而且UIActivityViewController是直接继承UIViewController的,这意味着我们需要自己来展示和解散视图。
主要代码
OC代码
- <span style="font-size:18px;">UIImage *imageToShare = [UIImage imageNamed:@"99687078.jpg"];
- UIImage *imageToShare1 = [UIImage imageNamed:@"2222.jpg"];
- NSArray *activityItems = @[imageToShare,imageToShare1];
- UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
- [self presentViewController:activityVC animated:TRUE completion:nil];</span>
swift代码
- <span style="font-size:18px;">let imageToShare1 = UIImage.init(named: "99687078.jpg")
- let imageToShare2 = UIImage.init(named: "2222.jpg")
- let activityItems = [imageToShare1,imageToShare2]
- let activityVC = UIActivityViewController.init(activityItems: activityItems, applicationActivities: nil)
- self.present(activityVC, animated: true, completion: nil)</span>
运行截图
注意
我们在分享多张图片到朋友圈的时候会发现,我们在不做任何处理的时候,直接从手机相册调取多张图片分享的时候,分享失败。具体什么原因我研究了一下,发现分享的数据总共大小有限制;在这里举个例子,比如电梯,电梯限定的重量是固定的,所以不管你乘坐多少人,乘坐的人比较胖,那就乘坐的人比较少,如果乘坐的人比较瘦,那就可以多坐几个;所以UIActivityViewController分享多张图片到朋友圈的时候,我根据图片数量的多少,然后把图片压缩到指定宽高,比如一张图片,我就压缩成和微信压缩图片一样的大小1280,如果9张我就压缩成500;
代码
压缩图片的方法在下面粘出,其中compressibilityFactor为图片宽高的最大值;
- <span style="font-size:18px;">#import "WeChatJPEGImager.h"
- #define KCompressibilityFactor 1280.00
- @implementation WeChatJPEGImager
- #pragma mark - 压缩一张图片 最大宽高1280 类似于微信算法
- - (UIImage *)getJPEGImagerImg:(UIImage *)image{
- CGFloat oldImg_WID = image.size.width;
- CGFloat oldImg_HEI = image.size.height;
- //CGFloat aspectRatio = oldImg_WID/oldImg_HEI;//宽高比
- if(oldImg_WID > KCompressibilityFactor || oldImg_HEI > KCompressibilityFactor){
- //超过设置的最大宽度 先判断那个边最长
- if(oldImg_WID > oldImg_HEI){
- //宽度大于高度
- oldImg_HEI = (KCompressibilityFactor * oldImg_HEI)/oldImg_WID;
- oldImg_WID = KCompressibilityFactor;
- }else{
- oldImg_WID = (KCompressibilityFactor * oldImg_WID)/oldImg_HEI;
- oldImg_HEI = KCompressibilityFactor;
- }
- }
- UIImage *newImg = [self imageWithImage:image scaledToSize:CGSizeMake(oldImg_WID, oldImg_HEI)];
- NSData *dJpeg = nil;
- if (UIImagePNGRepresentation(newImg)==nil) {
- dJpeg = UIImageJPEGRepresentation(newImg, 0.5);
- }else{
- dJpeg = UIImagePNGRepresentation(newImg);
- }
- return [UIImage imageWithData:dJpeg];
- }
- #pragma mark - 压缩多张图片 最大宽高1280 类似于微信算法
- - (NSArray *)getJPEGImagerImgArr:(NSArray *)imageArr{
- NSMutableArray *newImgArr = [NSMutableArray new];
- for (int i = 0; i<imageArr.count; i++) {
- UIImage *newImg = [self getJPEGImagerImg:imageArr[i]];
- [newImgArr addObject:newImg];
- }
- return newImgArr;
- }
- #pragma mark - 压缩一张图片 自定义最大宽高
- - (UIImage *)getJPEGImagerImg:(UIImage *)image compressibilityFactor:(CGFloat)compressibilityFactor{
- CGFloat oldImg_WID = image.size.width;
- CGFloat oldImg_HEI = image.size.height;
- //CGFloat aspectRatio = oldImg_WID/oldImg_HEI;//宽高比
- if(oldImg_WID > compressibilityFactor || oldImg_HEI > compressibilityFactor){
- //超过设置的最大宽度 先判断那个边最长
- if(oldImg_WID > oldImg_HEI){
- //宽度大于高度
- oldImg_HEI = (compressibilityFactor * oldImg_HEI)/oldImg_WID;
- oldImg_WID = compressibilityFactor;
- }else{
- oldImg_WID = (compressibilityFactor * oldImg_WID)/oldImg_HEI;
- oldImg_HEI = compressibilityFactor;
- }
- }
- UIImage *newImg = [self imageWithImage:image scaledToSize:CGSizeMake(oldImg_WID, oldImg_HEI)];
- NSData *dJpeg = nil;
- if (UIImagePNGRepresentation(newImg)==nil) {
- dJpeg = UIImageJPEGRepresentation(newImg, 0.5);
- }else{
- dJpeg = UIImagePNGRepresentation(newImg);
- }
- return [UIImage imageWithData:dJpeg];
- }
- #pragma mark - 压缩多张图片 自定义最大宽高
- - (NSArray *)getJPEGImagerImgArr:(NSArray *)imageArr compressibilityFactor:(CGFloat)compressibilityFactor{
- NSMutableArray *newImgArr = [NSMutableArray new];
- for (int i = 0; i<imageArr.count; i++) {
- UIImage *newImg = [self getJPEGImagerImg:imageArr[i] compressibilityFactor:compressibilityFactor];
- [newImgArr addObject:newImg];
- }
- return newImgArr;
- }
- #pragma mark - 根据宽高压缩图片
- - (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize{
- UIGraphicsBeginImageContext(newSize);
- [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
- UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return newImage;
- }</span>
Demo下载地址
http://download.csdn.net/detail/u014220518/9702030
相关阅读
http://blog.csdn.NET/u014220518/article/details/58136932
来源:http://blog.csdn.net/u014220518/article/details/53465631
iOS-微信分享多张图片(UIActivityViewController多图分享和多图分享失败)的更多相关文章
- IOS微信分享功能简单实现
PS:此文以简单实现功能为主,不足之前还望指点,大神勿喷. 在此之前如何申请微信认证的Key就不说了,公司一般会有人搞 1.首先下载微信SDK:微信SDK下载地址(更多关于微信SDK信息文档请访问官方 ...
- APP分享多张图片到微信和朋友圈
产品需求: 微信分享多图至好友,朋友圈.由于微信禁用了分享9图至朋友圈功能,这里分享微信只是将图片保存至本地,具体让用户手动分享. 问题分析: 微信没有提供分享多图的SDK,因此我们实现调用系统自带的 ...
- android 实现微信分享多张图片的功能
昨天公司老大通知客户改需求了,原来的微信分享改成分享多张图片,然后屁颠屁颠跑到微信平台看了以后 心里千万只草泥马狂奔而过,微信平台没有提供分享多张的SDK有木有啊,我们只能自己调用系统自带的分享功能实 ...
- vue history模式 ios微信分享坑
vue history模式 ios微信分享坑 问题分析:因为苹果分享会是调取签名失败是因为:苹果在微信中浏览器机制和安卓不同,有IOS缓存问题,和IOS对单页面的优化问题,通俗点说安卓进行页面跳转分享 ...
- vue history模式 ios微信分享 踩过的坑
背景:教育项目,整体依赖于微信环境,涉及到微信分享.微信二次分享 问题:vue使用history模式在iso微信下分享设置出错(签名认证错误.分享设置失败) 问题发现路径 1.按照微信公众号官方文档设 ...
- iOS微信第三方登录实现
iOS微信第三方登录实现 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...
- iOS启动图和开屏广告图,类似网易
iOS启动图和开屏广告图,类似网易 启动图是在iOS开发过程中必不可少的一个部分,很多app在启动图之后会有一张自定义的开屏广告图,点击该广告图可以跳转到广告图对应的页面.今天呢,和大家分享一下如何添 ...
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
- IOS 微信
原文:http://blog.csdn.net/ysy441088327/article/details/8441608 按照常例,列一些网址先: 微信开放平台首页: http://open.weix ...
随机推荐
- 替换Jar包内的文件
要替换Jar包内的文件可以用以下命令实现: jar uvf myjar.jar com/test/myclass.class 这里值得注意的是 myclass.class 必须放在com/test ...
- APP注册&登陆 逻辑细节
前言:有多少用户愿意注册登陆,决定了一款产品的最大活跃度. 用户登陆注册系统分为两大类: 自建用户系统:邮箱/手机号/用户名/二维码/人脸识别/指纹 第三方授权用户系统:微信/微博/支付包/豆瓣/Fa ...
- JS/JavaScript简介及基本常识
JavaScript (JS)以客户端事件为驱动的弱类型脚本语言 JS脚本一般写在<head>内部 流:文本流.html流 回避关键字的基本策略:单词合并(v_function) null ...
- Ubuntu 18.04开启TCP网络协议BBR加速的方法(Google BBR 拥塞控制算法)
TCP BBR 是Google给出的一个改良版的tcp网络协议,相当于在已有TCP协议的基础上打了个补丁的意思,这个改良版TCP协议对拥塞控制有很好的支持,对于网络较差的环境有不错的应用场景,当然这里 ...
- BZOJ4426 :最大生产率(贪心+决策单调性DP)
题意:给出N个人,现在让你分P组,每组的工作效率是最小结束时间-最大开始时间,要求每一组的效率的正数,求最大效率和.N<1000 思路: 把包含至少一个其他的分到A组:否则到B组. A组的要么单 ...
- 用requestAnimationFrame优化Web动画
requestAnimationFrame是什么? 在浏览器动画程序中,我们通常使用一个定时器来循环每隔几毫秒移动目标物体一次,来让它动起来.如今有一个好消息,浏览器开发商们决定:“嗨,为什么我们不在 ...
- 再回首 基本数据类型和 if语句
一 变量:(使用变量是不能加引号,要不就变成字符串了) 变量的命名规则: 1.数字,字母,下划线组成. 2.变量不能是数字开头 3.区分大小写 4.不要使用中文或者拼音 5.要有相应的意义 6.不能使 ...
- LSOF查看linux中文件打开情况
如何查看linux中文件打开情况 前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. lin ...
- Math.floor(-8.5)=多少?
Math.floor() 表示向下取整,返回double类型 (floor---地板) Math.ceil() 表示向上取整,返回double类型 (ceil---天花板) Ma ...
- PyMongo 常见问题
PyMongo是线程安全的吗PyMongo是线程安全的,并且为多线程应用提供了内置的连接池 PyMongo是进程安全的吗PyMongo不是进程安全的,如果你在fork()中使用MongoClient实 ...