前言

微信分享到朋友圈,可分享的类型有:文字类型、图片类型、音乐类型、视频类型和网页类型,但是我们在做图片分享的时候发现微信给的API只能分享一张图片,达不到一些APP的需求,而产品汪或者Boss想要分享多张图片,比如前段时间我做的一个APP,是电商类APP,想把商品的图片都分享到朋友圈,查看微信的API根本没有提供API,在这里我们只能用iOS系统自带的分享了。

UIActivityViewController

UIActivityViewController是在iOS 6开始支持的,同样是不能在Apple TV的开发中使用。而且UIActivityViewController是直接继承UIViewController的,这意味着我们需要自己来展示和解散视图。

主要代码

OC代码

  1. <span style="font-size:18px;">UIImage *imageToShare = [UIImage imageNamed:@"99687078.jpg"];
  2. UIImage *imageToShare1 = [UIImage imageNamed:@"2222.jpg"];
  3. NSArray *activityItems = @[imageToShare,imageToShare1];
  4. UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
  5. [self presentViewController:activityVC animated:TRUE completion:nil];</span>

swift代码

  1. <span style="font-size:18px;">let imageToShare1 = UIImage.init(named: "99687078.jpg")
  2. let imageToShare2 = UIImage.init(named: "2222.jpg")
  3. let activityItems = [imageToShare1,imageToShare2]
  4. let activityVC = UIActivityViewController.init(activityItems: activityItems, applicationActivities: nil)
  5. self.present(activityVC, animated: true, completion: nil)</span>

运行截图

注意

我们在分享多张图片到朋友圈的时候会发现,我们在不做任何处理的时候,直接从手机相册调取多张图片分享的时候,分享失败。具体什么原因我研究了一下,发现分享的数据总共大小有限制;在这里举个例子,比如电梯,电梯限定的重量是固定的,所以不管你乘坐多少人,乘坐的人比较胖,那就乘坐的人比较少,如果乘坐的人比较瘦,那就可以多坐几个;所以UIActivityViewController分享多张图片到朋友圈的时候,我根据图片数量的多少,然后把图片压缩到指定宽高,比如一张图片,我就压缩成和微信压缩图片一样的大小1280,如果9张我就压缩成500;

代码

压缩图片的方法在下面粘出,其中compressibilityFactor为图片宽高的最大值;

  1. <span style="font-size:18px;">#import "WeChatJPEGImager.h"
  2. #define KCompressibilityFactor 1280.00
  3. @implementation WeChatJPEGImager
  4. #pragma mark - 压缩一张图片 最大宽高1280 类似于微信算法
  5. - (UIImage *)getJPEGImagerImg:(UIImage *)image{
  6. CGFloat oldImg_WID = image.size.width;
  7. CGFloat oldImg_HEI = image.size.height;
  8. //CGFloat aspectRatio = oldImg_WID/oldImg_HEI;//宽高比
  9. if(oldImg_WID > KCompressibilityFactor || oldImg_HEI > KCompressibilityFactor){
  10. //超过设置的最大宽度 先判断那个边最长
  11. if(oldImg_WID > oldImg_HEI){
  12. //宽度大于高度
  13. oldImg_HEI = (KCompressibilityFactor * oldImg_HEI)/oldImg_WID;
  14. oldImg_WID = KCompressibilityFactor;
  15. }else{
  16. oldImg_WID = (KCompressibilityFactor * oldImg_WID)/oldImg_HEI;
  17. oldImg_HEI = KCompressibilityFactor;
  18. }
  19. }
  20. UIImage *newImg = [self imageWithImage:image scaledToSize:CGSizeMake(oldImg_WID, oldImg_HEI)];
  21. NSData *dJpeg = nil;
  22. if (UIImagePNGRepresentation(newImg)==nil) {
  23. dJpeg = UIImageJPEGRepresentation(newImg, 0.5);
  24. }else{
  25. dJpeg = UIImagePNGRepresentation(newImg);
  26. }
  27. return [UIImage imageWithData:dJpeg];
  28. }
  29. #pragma mark - 压缩多张图片 最大宽高1280 类似于微信算法
  30. - (NSArray *)getJPEGImagerImgArr:(NSArray *)imageArr{
  31. NSMutableArray *newImgArr = [NSMutableArray new];
  32. for (int i = 0; i<imageArr.count; i++) {
  33. UIImage *newImg = [self getJPEGImagerImg:imageArr[i]];
  34. [newImgArr addObject:newImg];
  35. }
  36. return newImgArr;
  37. }
  38. #pragma mark - 压缩一张图片 自定义最大宽高
  39. - (UIImage *)getJPEGImagerImg:(UIImage *)image compressibilityFactor:(CGFloat)compressibilityFactor{
  40. CGFloat oldImg_WID = image.size.width;
  41. CGFloat oldImg_HEI = image.size.height;
  42. //CGFloat aspectRatio = oldImg_WID/oldImg_HEI;//宽高比
  43. if(oldImg_WID > compressibilityFactor || oldImg_HEI > compressibilityFactor){
  44. //超过设置的最大宽度 先判断那个边最长
  45. if(oldImg_WID > oldImg_HEI){
  46. //宽度大于高度
  47. oldImg_HEI = (compressibilityFactor * oldImg_HEI)/oldImg_WID;
  48. oldImg_WID = compressibilityFactor;
  49. }else{
  50. oldImg_WID = (compressibilityFactor * oldImg_WID)/oldImg_HEI;
  51. oldImg_HEI = compressibilityFactor;
  52. }
  53. }
  54. UIImage *newImg = [self imageWithImage:image scaledToSize:CGSizeMake(oldImg_WID, oldImg_HEI)];
  55. NSData *dJpeg = nil;
  56. if (UIImagePNGRepresentation(newImg)==nil) {
  57. dJpeg = UIImageJPEGRepresentation(newImg, 0.5);
  58. }else{
  59. dJpeg = UIImagePNGRepresentation(newImg);
  60. }
  61. return [UIImage imageWithData:dJpeg];
  62. }
  63. #pragma mark - 压缩多张图片 自定义最大宽高
  64. - (NSArray *)getJPEGImagerImgArr:(NSArray *)imageArr compressibilityFactor:(CGFloat)compressibilityFactor{
  65. NSMutableArray *newImgArr = [NSMutableArray new];
  66. for (int i = 0; i<imageArr.count; i++) {
  67. UIImage *newImg = [self getJPEGImagerImg:imageArr[i] compressibilityFactor:compressibilityFactor];
  68. [newImgArr addObject:newImg];
  69. }
  70. return newImgArr;
  71. }
  72. #pragma mark - 根据宽高压缩图片
  73. - (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize{
  74. UIGraphicsBeginImageContext(newSize);
  75. [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
  76. UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
  77. UIGraphicsEndImageContext();
  78. return newImage;
  79. }</span>

Demo下载地址

http://download.csdn.net/detail/u014220518/9702030

相关阅读

iOS-微信朋友圈图片压缩算法

http://blog.csdn.NET/u014220518/article/details/58136932

来源:http://blog.csdn.net/u014220518/article/details/53465631

iOS-微信分享多张图片(UIActivityViewController多图分享和多图分享失败)的更多相关文章

  1. IOS微信分享功能简单实现

    PS:此文以简单实现功能为主,不足之前还望指点,大神勿喷. 在此之前如何申请微信认证的Key就不说了,公司一般会有人搞 1.首先下载微信SDK:微信SDK下载地址(更多关于微信SDK信息文档请访问官方 ...

  2. APP分享多张图片到微信和朋友圈

    产品需求: 微信分享多图至好友,朋友圈.由于微信禁用了分享9图至朋友圈功能,这里分享微信只是将图片保存至本地,具体让用户手动分享. 问题分析: 微信没有提供分享多图的SDK,因此我们实现调用系统自带的 ...

  3. android 实现微信分享多张图片的功能

    昨天公司老大通知客户改需求了,原来的微信分享改成分享多张图片,然后屁颠屁颠跑到微信平台看了以后 心里千万只草泥马狂奔而过,微信平台没有提供分享多张的SDK有木有啊,我们只能自己调用系统自带的分享功能实 ...

  4. vue history模式 ios微信分享坑

    vue history模式 ios微信分享坑 问题分析:因为苹果分享会是调取签名失败是因为:苹果在微信中浏览器机制和安卓不同,有IOS缓存问题,和IOS对单页面的优化问题,通俗点说安卓进行页面跳转分享 ...

  5. vue history模式 ios微信分享 踩过的坑

    背景:教育项目,整体依赖于微信环境,涉及到微信分享.微信二次分享 问题:vue使用history模式在iso微信下分享设置出错(签名认证错误.分享设置失败) 问题发现路径 1.按照微信公众号官方文档设 ...

  6. iOS微信第三方登录实现

    iOS微信第三方登录实现   一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...

  7. iOS启动图和开屏广告图,类似网易

    iOS启动图和开屏广告图,类似网易 启动图是在iOS开发过程中必不可少的一个部分,很多app在启动图之后会有一张自定义的开屏广告图,点击该广告图可以跳转到广告图对应的页面.今天呢,和大家分享一下如何添 ...

  8. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  9. IOS 微信

    原文:http://blog.csdn.net/ysy441088327/article/details/8441608 按照常例,列一些网址先: 微信开放平台首页: http://open.weix ...

随机推荐

  1. MacBookPro-OSX

    修改用户名 sudo hostname macbookpro sudo scutil --set HostName macbookpro sudo scutil --set LocalHostName ...

  2. DRBD常用管理篇

          在DRBD进入使用阶段之后,要经常查看它的工作状态,通过这些状态来判断DRBD运行情况. 1) 使用drbd-overview命令观察状态      最为简便的方式就是运行drbd-ove ...

  3. 16 多校8 Rikka with Parenthesis II

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...

  4. sudo with no password

    /********************************************************************************* * sudo with no pa ...

  5. 获取图像的ROI模板区域

    前言 项目需要得到视频帧图像的某一区域作为模板,首先需要确定ROI区域的坐标范围,很简单,直接上代码. % /********************************************* ...

  6. Linux按照时间顺序列出文件

    按照递增时间顺序列出所有文件 ls -ltr -l表示列出长串数据,-t表示按照时间顺序,-r表示将排序的结果反向输出 按照时间递减的顺序列出所有文件 ls -lt

  7. Angular 组件

    1 2 change是TimepickerDemoCtrl上的,mytime在timepicker内部改变生效就会触发 3 timepicker内部绑定TimepickerDemoCtrl对值的监控 ...

  8. PAT-7-14 电话聊天狂人

    ps: 真不明白为什么水题不能一次ac 7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条 ...

  9. 基于C#利用ffmpeg提取视频帧

    利用ffmepg提取视频帧实际上是利用C#调用ffmepg命令行进行处理对应的视频,然后输出出视频帧 GetPicFromVideo("); static public string Get ...

  10. 字符串转json格式

    方法一:var json = JSON.parse(str)方法二:eval