以下是本人在iOS开发工作中使用的一些小技巧,记录一下。
1.使用XXX.pch文件便捷开发+加速Build
在IOS开发的项目中有一个XX_Prefix.pch
XX_Prefix.pch:扩展名.pch表示"precompiled header",这是一个你工程要用到的来自于外部框架的头文件列表。xcode将编译这些头到文件,这将减少你在选择Build 或Build and Go时编译项目的时间。通常用到的头文件已经自动包含了pch,系统编译每个.m文件前,都会先imort这个文件。这样就节省了添加include的时 间,相当于加速编译
还有就是可以再这里面放入宏,在整个工程中都可以用.
添加方法:
在targets->Build Setting中Apple LLVM 7.0 - language中做如下修改
例如在一个项目中有一个hello.h文件,需要在所有.m文件中都要包含这个文件就可以在
XX_Prefix.pch文件中引入hello.h
2.在一个应用中打开其他应用.
在iOS开发中,如何实现从app1打开app2。
基本的思路就是,可以为app2定义一个URL,在app1中通过打开这个URL来打开app2,在此过程中,可以传送一些参数。下面来讨论一下具体的实现过程。
1. 在app2的info.plist中定义URL,就是在文件中添加URL types一项。可按下图进行添加。
2. 在app1的代码中打开刚才定义的URL,代码如下:
1 NSURL *url = [NSURL URLWithString:@"myapp://test?para1=1¶2=2"]; 2 [[UIApplication sharedApplication] openURL:url];
当然,这个URL的形式可以是其他形式的,只要以"myapp://"开始即可。
这样,就可以在app1中打开app2.
打开之后,会调用app2的AppDelegate的
1
|
- (
BOOL
)application:(UIApplication *)application openURL:(
NSURL
*)url sourceApplication:(
NSString
*)sourceApplication annotation:(
id
)annotation
|
由于URL是自己定义的,所以会存在URL重复的情况。经过测试发现,如果试图打开这个URL,那么会打开先安装的那个应用.
3.在Xcode中使项目的Build随项目的启动而递增.
在下图所示位置加入
1
2
3
4
|
version=`/usr/libexec/PlistBuddy -c
"Print CFBundleVersion"
$PRODUCT_SETTINGS_PATH`
version=`expr $version + 1`
/usr/libexec/PlistBuddy -c
"Set :CFBundleVersion $version"
$PRODUCT_SETTINGS_PATH
#/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $version" $PRODUCT_SETTINGS_PATH 这行代码会让version也自增,一般不需要
|
4.界面跳转.如电商项目中,A:商品界面(不是rootViewController)B:付款界面C:订单界面,想直接从C跳到A(中间跳转没有出现B的过渡效果),这时使用popToViewController时不行,popViewControllerAnimated也不行的情况下.可以使用:
1
|
[
self
.navigationController popToViewController:[
self
.navigationController.viewControllers objectAtIndex:1] animated:
YES
];
|
或者
1
2
3
4
5
|
for
(UIViewController *controller inself.navigationController.viewControllers) {
if
([controller isKindOfClass:[你要跳转到的Controller
class
]]) {
[
self
.navigationControllerpopToViewController:controller animated:
YES
];
}
}
|
5.如何判断一个页面是web页面还是iOS原生页面.
长按界面,如果出现可复制的界面就是web界面.
6.在Xcode里如何保证不会因为手残改动了系统的源生源码文件(降低权限).
终端输入:
cd /Applications/Xcode.app/
sudo chown -hR root:wheel Contents
7.使用Cocoapods导入的第三库文件,发现import无法提示.
9.cocoapods升级或者降级:
升级:
1
2
3
4
5
|
sudo gem update --system
//更新gem
sudo gem install cocoapods
pod setup
pod --version
//查看版本
|
最近把mac系统升级到10.11系统,但是在用pod install命令的时候,却提示command not found或者:
在stackoverflow搜到的解释是这样的,This is happening because Apple has enabled rootless on the new install,也就是说在10.11系统上苹果已经启用无根的安装.
所以,保证Cocoapods在OS X 10.11系统上的正常使用,我们需要在命令行输入这样一句话:
1
|
sudo gem install -n /usr/local/bin cocoapods
|
降级:
1
|
sudo gem uninstall cocoapods
//选择哪个版本,之后Y
|
1
|
<code>sudo gem install cocoapods -v 0.34.4</code>
//选择那个版本
|
其中的Podfile文件最好是用Xcode编写,省的报错.
10.Xcode在archive时出现no identity found:
1.首先确定开发者账号的相应证书和描述文件是否是最新,打开钥匙链删除旧版,更新新版
2.Xcode->prefrence->Accounts.重新添加appid,把多余的描述文件删除,重新下载新的描述文件.
3.整改项目里面的code Signing identify和PP文件.
4.clean一下.
11.因为Cocoapods导致有些工程会出现liarary not funnd for -lPods如图所示:
同时,在相应位置处,其他导入的库正常,只有这个报红现象,右键show in finder也没反应.哪怕重新添加或者重新是用Cocoapods再次导入也无济于事.
依然报红,可以archive打包成ipa,但是无法连接手机测试观察,按照网上给的很多方法依然无效.只能:
新建一个全新项目,把原来的库重新导入新工程一次,一般新工程里面的libPod.a就是正常的了,如果非正常就是Cocoapods的原因了.如果正常就把新工程的libPod.a文件手动拷入原来的工程之中.
原工程仍然报红,但是可以连接手机测试了.
12.用xml格式打开xxx.plist.
13.点击按钮直接跳转至APP store相应APP的下载页面.
以微信为例,想要点击按钮跳转到APP store的微信下载页面.
最为关键的是跳转链接,这里的链接不是像https://appsto.re/cn/S8gTy.i这种.也不是
https://itunes.apple.com/cn/app/wei-xin/id414478124?mt=8(这种跳转中间会有Safari的过渡)
如果想要直接跳转至微信的下载页面,可以把https://换为itms:// 或者 itms-apps://.如:itms-apps://itunes.apple.com/cn/app/wei-xin/id414478124?mt=8
这种可以直接跳转至APP store的下载页面.其中链接可以使用Mac的APP store或者iTunes获取.
为了让开发者宣传自己产品时,下载地址更简短易记,苹果开放了 appstore.com “短” 链接服务。规则如下:
开发商主页
iOS:https://appstore.com/<公司名>,比如,http://appstore.com/smuleMac:https://appstore.com/mac/<公司名>,比如,http://appstore.com/mac/popcap
应用下载地址
iOS:https://appstore.com/<应用名>,比如,http://appstore.com/ocarina
Mac:https://appstore.com/mac/<应用名>,比如,http://appstore.com/mac/peggle
开发商旗下 App
iOS:https://appstore.com/<公司名>/<应用名>,比如,http://appstore.com/smule/ocarina
Mac:https://appstore.com/mac/<公司名>/<应用名>,比如,http://appstore.com/mac/popcap/peggle
评论App跳转页面:itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=448165862
对应到自己的项目里面,我用的是AFNetworking这套网络请求包,需要改的是:
AFURLResponseSerialization.m文件
226行:
self.acceptableContentTypes = [NSSetsetWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript", nil];
加上蓝色部分,其实就是添加一种服务器返回的数据格式。
15.因为Mac系统升级和Xcode升级导致Cocoapods失效.
1.如果只是Xcode升级导致Cocoapods失效只需在终端中:
(这里最好先打开Xcode)
a.先获取到UUID:
defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
如: XXXX-XXXX-VVVDF-JHFF
b.find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add 这里加上上面的UUID
如:find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add XXXX-XXXX-VVVDF-JHFF
c.把Xcode完全退出,接着重启,会弹出是否加载插件界面,加载插件即可.
2.因为Mac系统升级导致Cocoapods失效:
这里的GEM_PATH会显示为空
解决方案1:
终端里输入:gem env
可以查到gem的安装路径,找到SHELL PATH,如:
接着依次试一下上面的这些路径.(这个方案我没用亲自试过,太麻烦)
解决方案2:
终端输入:sudo gem install -n /usr/local/bin cocoapods
安装完成之后,接着在cocoapods插件的GEM_PATH里写入 /usr/local/bin 即可
(这个方案亲测可用)
15.使用Xcode查看不同机型下的UI效果图.
1.首先打开storyboard或者xib,点击左上角的符号(如下图1中),接着Preview,然后按住option+shift键,选择你想要查看的视图文件.
2.接着会跳出下面的视图.双击+号
3.OK,接着右面会弹出各尺寸的效果图.点击+号可以添加机型
16.查找私有api字段:
有时在上传APP Store时会报使用私有API的问题,解决方案:
cd 到项目文件夹
grep -r XXXX
上面就是查找私有字段XXXX所在的目录
17.出现Unable to copy asset information from https://mesu.apple.com/assets/for asset type com.apple.MobileAsset.TextInput.SpellChecker 或者copy matching assets reply或者Daemon configuration query reply字样,如:
我的解决方案:在storyBoard中,修改TextView中的correction和spell Checking 为NO.如:
18.查看plist文件中key的正确原始值:
19.修改github上面的源码类型显示.如
1.打开命令行,cd 到本地仓库的项目根目录.然后新建一个文件 .gitattributes
1
|
touch
.
gitattributes
|
2.用文本编辑器打开该文件,如果隐藏,需要先 打开隐藏文件显示(第10)
然后输入
1
2
|
*.
h
linguist
-
language
=
swift
*.
m
linguist
-
language
=
swift
|
意思就是将.h 和.m文件当作Swift语言来统计,简单粗暴。
3.再次提交改变到github上即可.
20. 图片模糊处理
写个扩展实现模糊:
1 import UIKit 2 3 extension UIImage{ 4 func blurImage(value:NSNumber) -> UIImage{ 5 let content = CIContext.init(options: [kCIContextUseSoftwareRenderer:true]) 6 let ciImage = CoreImage.CIImage.init(image: self) 7 let blurFiter = CIFilter.init(name: "CIGaussianBlur") 8 blurFiter?.setValue(ciImage, forKey: kCIInputImageKey) 9 blurFiter?.setValue(value, forKey: "inputRadius") 10 let imageRef = content.createCGImage((blurFiter?.outputImage)!, from: (ciImage?.extent)!) 11 let newImage = UIImage.init(cgImage: imageRef!) 12 return newImage 13 } 14 15 16 }
使用:
blurImage.image = UIImage.init(named: "pic.jpg")?.blurImage(value: 8)
21.网友的多年开发总结:http://www.jianshu.com/p/1ff9e44ccc78
22.cocoapods在升级,安装三方库,降级等操作发生错误:
ERROR: While executing gem ...(Error::EPERM)
Operation not permitted - /usr/bin/update_rudygems
如图
使用命令即可:
sudo gem install -n /usr/local/bin cocoapods --pre
OK成功了,现在版本是最新的,也可以使用正常.