记录

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的

  • (BOOL)application:(UIApplication )application openURL:(NSURL)url sourceApplication:(
    NSString*)sourceApplication annotation:(id)annotation

由于URL是自己定义的,所以会存在URL重复的情况。经过测试发现,如果试图打开这个URL,那么会打开先安装的那个应用.

3.在Xcode中使项目的Build随项目的启动而递增.

在下图所示位置加入
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也不行的情况下.可以使用:

[self.navigationController popToViewController:[self.navigationController.viewControllersobjectAtIndex:1] animated:YES];

或者
for (UIViewController *controller inself.navigationController.viewControllers) {
if([controller isKindOfClass:[你要跳转到的Controller class]]) {
[self.navigationController popToViewController:controller animated:YES];
}
}

5.如何判断一个页面是web页面还是iOS原生页面.

长按界面,如果出现可复制的界面就是web界面.

6.在Xcode里如何保证不会因为手残改动了系统的源生源码文件(降低权限).

终端输入:
cd /Applications/Xcode.app/sudo chown -hR root:wheel Contents

7.使用Cocoapods导入的第三库文件,发现import无法提示.

9.cocoapods升级或者降级:

升级:
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系统上的正常使用,我们需要在命令行输入这样一句话:

sudo gem install -n /usr/local/bin cocoapods
 
降级:

sudo gem uninstall cocoapods
//选择哪个版本,之后
<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/smule
Mac: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

开发商旗下 AppiOS: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

14.使用AFNetworing 3.0报错信息为:unacceptable content-type: text/html"

对应到自己的项目里面,我用的是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 即可
(这个方案亲测可用)

去除 UserInterfaceState.xcuserstate 文件为版本控制带来的困扰

        ------- git-------

*一、在同 .Git目录下创建.gitignore文件。在文件中加入如下内容:
*.xcuserstate
project.xcworkspace
xcuserdata
UserInterfaceState.xcuserstate
project.xcworkspace/
xcuserdata/
UserInterface.xcuserstate

二、退出xcdoe, 打开终端(Terminal),进入项目目录下。
三、在终端键入 git rm --cached [YourProjectName].xcodeproj/project.xcworkspace/xcuserdata/[ YourUsername].xcuserdatad/UserInterfaceState.xcuserstate
四、在终端键入 git commit -m "Removed file that shouldn't be tracked"
五、重新打开Xcode commit, push。

       ------- svn-------

假设UserInterfaceState.xcuserstate在下面的目录下面:
~/工程目录/工程名字.xcodeproj/project.xcworkspace/xcuserdata/用户名.xcuserdatad
打开终端执行以下命令即可:
1.cd ~/工程目录/工程名字.xcodeproj/project.xcworkspace/xcuserdata/用户名.xcuserdatad
2.svn rm --force UserInterfaceState.xcuserstate [如果svn命令不能执行,请安装xcode中的命令行工具或用Spotlight查找svn所在]
svn update [可能需要]
svn commit -m "忽略该死的UserInterfaceState.xcuserstate"
3.export EDITOR=nano [注释:这是bash下]
4.svn propedit svn:ignore . [注意后面有个点号,代表本目录]
5.第4步执行完了会弹出nano编辑界面,复制粘贴UserInterfaceState.xcuserstate后按Ctrl+X输入Y保存即可.
6.输入svn status就发现不显示UserInterfaceState.xcuserstate了.证明修改成功.

Reveal使用

2、在左边底部面板,点击"+"号按钮,然后选择“Add Symbolic Breakpoint”。
3、在Symbol字段里面填入“UIApplicationMain”。
4、点击“Add Action”按钮,并确认一下“Action”是设置到“Debugger Command”。
5、在Action下的文本框中贴入如下表达式
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 17.0px; font: 14.0px 'Helvetica Neue'}span.s1 {font-kerning: none}

expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void )dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void)0)

打开 Xcode生产的 .xcactivitylog文件转为 .log

(位置) Xcode stores debug logs at
~/Library/Developer/Xcode/DerivedData/<YOURAPP>/Logs/Debug/
The .xcactivitylog files are actually just gz archives. Decompress them:

cd ~/Library/Developer/Xcode/DerivedData/<YOURAPP>/Logs/Debug/
EXT=".xcactivitylog"
for LOG in *.xcactivitylog; do
NAME=basename $LOG $EXT
gunzip -c -S $EXT "${NAME}${EXT}" > "${NAME}.log"
done

Now you can easily search them using grep or Spotlight or what your prefer.

[__NSCFNumber rangeOfCharacterFromSet:]: unrecognized selector sent to instance

这个是由于传的参数类型不对所导致,找了半天才找到原因。
比如 [cell setColumnTitle:[homeData objectAtIndex:row]];
这里其实是要传NSString类型,而其实返回的是NSArray类型,这个错误不会立即出发,而是过一段时间再出发,所以不好定位。

The file “xxx-Info.plist” couldn’t be opened because there is no such file

我们有时候将网上下载或者是别人的项目拷到自己电脑上运行时会出现 The file “xxx-Info.plist” couldn’t be opened because there is no such file这个问题,这就是你在拷贝的时候位置变化了,所以没有找到这个plist文件,解决的办法

1.png
2.png

找到info.plist本地位置直接拖到这两个位置上,

推荐阅读更多精彩内容