App压缩方案 3+1,轻松搞定20M限制

2024-02-08 14:58

本文主要是介绍App压缩方案 3+1,轻松搞定20M限制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自: http://www.aiw3.com/iphone/0504969.html

 

App压缩方案 3+1,轻松搞定20M限制

 

方案一:
使用高效的png图片压缩软件,先对所有图片进行一次瘦身。

这里推荐一款Mac下的图片压缩软件--ImageOptim。方便试用,只要简单的把要压缩的文件或者文件夹拖到软件里,它就会自动压缩。
注意:1。不用特意去塞选,因为它会自动识别文件格式,非图片格式的它不会进行处理,所以不用担心,尽管拖!~
    2。压缩的时候它会覆盖原文件,所以担心原文件损坏的童鞋,请自己注意备份。不过到目前为止,没有发现它有什么问题
    3。压缩之后的图片可能会出现无法预览的情况,不用担心,照样编译,照样成功!
    4。压缩率的问题还要看具体的图片文件而定,一般情况平均压缩率在50%以上,最高的见过94%的。哈~
    5。最后提醒一点,可以反复对一系列图片进行多次压缩,以寻求最大压缩率,压到不能再压缩的时候会显示“X”,所以请放心使用!


方案二:
对音乐音效进行降噪处理,还有注意使用的音乐格式!

音乐这块我并不在行,所以不便多评,现在市面上音乐处理软件很多,功能也异常强大。处理建议就是,用尽一切方法让他变小,
只要自己听的不难受就好!

注:我们自己项目中音乐文件本来有20M多。后来经过一系列处理后只有800K!!更重要的是,一般人根本没听出差别!
所以音乐压缩非常有必要!!


方案三:
在以上两点都处理过后,如果还没有达到您的要求。(如,处理后大小21M左右,差一点咯!)可以进行最后一步,也是技术性的压缩。
使用Zip压缩技术,对资源文件中的图片及音乐进行压缩。


首先下载一个zip开源类,网上很多。我用的是--ZipFile-OC。好像也叫minizip。这个开源类是专门针对Obj-C写的。封装的比较好,用法很简单。
http://linglong117.blog.163.com/blog/static/277145472009101814159283/)转至云水蝉心的日志。该日志介绍了两种zip方法,我使用的是第二种。
文章末尾有附上ZipFile-OC的下载。具体的就不再重复啦。请看原著。~在此也鸣谢云水蝉心。

下面主要说下如何实现压缩资源。


先来看下,Xcode是如何处理Resources中的文件的,只要在工程中找到编译好的app文件,右键显示包内容,就会发现,Xcode在编译的时候会将 Resources里的文件,一个个从各自的文件夹中取出来复制到app中供程序调用。

而我们要做的就是将这些文件事先取出并压缩成zip。然后删除原有的资源,将压缩后的zip文件放入Resources进行编译。注意,不可有文件夹,所有的图片及音乐都必须在同一个目录下被压缩。

这里我们会遇到一个问题,那就是如何在程序读取这些图片的时候,把他们解压出来呢?
注意一个问题,苹果是不运行开发者在程序中修改app文件的。所以必须找一个可修改的文件夹存放解压出来的文件。那就是Document的文件夹(每个应用都有次文件夹)。

只要在程序读取资源之前(这个位置取决于你程序代码如何写,应该不用我多说吧),解压所需的资源文件到Document目录下,然后修改读取资源的地址即可。

 

为方便新手理解。附上代码。以一个Cocos2d框架的游戏为例。
在以下函数开头加入Zip代码。

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; //前两句为获取Documents在真机中的地址
    NSString *imagePath = [documentsDirectorystringByAppendingPathComponent:@"/某一个资源名"];
    //获取某一个资源解压之后的地址,特别注意“/”不可少。 该文件地址将作为判断资源是否压缩过的依据,以免重复解压。

    NSData* data = [ NSData dataWithContentsOfFile:imagePath];

    if(data == NULL) //如果标志文件不存在,则表面程序第一次运行,则解压所需资源文件,若存在则跳过。
    {

        NSString *loadImagePath = [[documentsDirectorysubstringToIndex:documentsDirectory.length-9]stringByAppendingPathComponent:@"项目名(Product Name)/ 压缩文件名(*.zip)"];//获取资源中的压缩文件

        ZipArchive *za = [[ZipArchive alloc] init];

        if( [za UnzipOpenFile:loadImagePath] ) //解压
        {
            BOOL ret = [za UnzipFileTo:documentsDirectory overWrite:YES];
            if( NO==ret )
            {
            }
            [za UnzipCloseFile];
        }

        [za release];

    }
/*省略其余代码*/
    return Yes;
}



大家不用担心这个解压过程会很长,粗略估计20M的压缩文件耗时不到3秒,而且只需程序第一次运行时等待,之后就不会再解压。


剩下要做的就是修改原本的资源路径。这里不知道能否再Xcode中直接修改。


我们采用的是最直接也许最笨的方法,就是直接修改图片及音乐处理的底层类。还是拿cocos2d为例。


在TextureMgr.m类中修改addImage(-(Texture2D*) addImage: (NSString*) path;)方法。只要在前面加上以下三句话。


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,    NSUserDomainMask, YES);
    NSString *documentsDirectory = [pathsobjectAtIndex:0];

    path = [[documentsDirectorystringByAppendingPathComponent:@"/"] stringByAppendingPathComponent:path];
这三句话的作用就是在一个文件名前面加上Documents文件夹的路径。



注意:1。切勿将icon.png/*.plist/Defalut.png等系统及框架资源放入压缩包。
    2。若已使用前两种方案,则此方案可压缩的效率有限。


最后说一种方案。
那就是苹果自带的zip压缩。这可能很多发布过项目的朋友就会知道,在发布前,要将app文件压缩成zip后方可上传。而这一步至少可以剩下6M的空间。

注:在实际操作的时候发现,如果一个项目压缩成zip之后有20M,那么发布之后,会变成21.2M左右。这多出来的1.2M不知是否是苹果在其中放了什么所致呢?

*以下引用6L的解答~
多出的1.2M主要是苹果进行验证签名用的,进行账号收费绑定的。也就是说,不同账号用Itunes下载的同一个app都是不一样的。
在此表示感谢哈~~学习咯!

最后,附上一个实际测试的数据:
一个未经任何处理的app,大小约为50M+。其中图片资源占18M。音乐资源占27M。有6M左右被OpenFeint占据(网上载的大约12M,最后导进去的资源3M左右,剩下的3M应该在编译文件中)。
经过前两个方案处理后,图片仅剩10M不到,音乐只有区区1M(也许在专业设备下音质会差,但还是那句话,相信我,一般人根本听不出来)。OpenFeint并没有进行处理,依然是6M。最后编译出的app为22.4M.经过Zip压缩后再加上苹果的签名验证(即第四个方案)。最后的大小仅16.5M。

这篇关于App压缩方案 3+1,轻松搞定20M限制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/691376

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个