zoukankan      html  css  js  c++  java
  • iOS工作小技巧及填坑记录

    以下是本人在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的

     

        - (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.viewControllers objectAtIndex:1] animated:YES];
    

     或者

    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升级或者降级:

    升级:

    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  //选择哪个版本,之后Y
    
    sudo gem install cocoapods -v 0.34.4   //选择那个版本
                               

    其中的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
    开发商旗下 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
    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    即可

    (这个方案亲测可用)

     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

    touch .gitattributes
    

    2.用文本编辑器打开该文件,如果隐藏,需要先  打开隐藏文件显示(第10)

    然后输入

    *.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成功了,现在版本是最新的,也可以使用正常.

     23.判断该界面是push过来的还是present过来的.

        NSArray *viewcontrollers=self.navigationController.viewControllers;
        if (viewcontrollers.count>1) {
            if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) {
                //push方式
                
            }
        }
        else{
            //present方式
             
        }
    

    24.大神博客,学习网站 

      KenshinCui KenshinCui

      唐巧的博客

      标哥的笔记博客

      Bison的技术博客

      KeanuZhang

      HeartPower

      黄文臣的专栏 

      阿曌

      一大推博客 

     航歌

     swiftV课堂 

    爱酷学习网 

     sunnyxx

    Garan no dou 

    招聘一个靠谱的 iOS

    刘坤的技术博客

    gf&zjの盗梦空间

    Hexo

    玉令天下的博客

    美团点评技术团队

    慕课网

    .....

    25.runloop学习 

       https://blog.ibireme.com/2015/05/18/runloop/#base

       http://v.youku.com/v_show/id_XODgxODkzODI0.html

    26.runtime学习

        http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/

        Method Swizzling

        https://www.valiantcat.cn/index.php/2017/11/03/53.html

     

    27.多线程学习

        https://ke.qq.com/course/224900

       http://www.jianshu.com/p/2d57c72016c6

    28.深入理解Objective-C:Category

      美团点评技术团队对Category的总结:https://tech.meituan.com/DiveIntoCategory.html

     29.动画学习 swift3.0一些动画基础整理

                       Quartz 2D

                       动画

                        Bison的技术博客

                        动画一大堆

           动画一小堆  

    30.iPhone X刘海打理指南:

        美团点评技术团队

        LEE's博客关于iPhone X的适配

        iOS11安全区域适配总结

        适配iOS11&iPhoneX的一些坑

      简书适配iOS11

    .......

    31.网络基本知识

    TCP/IP 系列文章
    [网络基础知识(-)](http://www.jianshu.com/p/885201e68707)
    [TCP/IP基础知识(二)](http://www.jianshu.com/p/21c24dc84a50)
    [物理层(三)](http://www.jianshu.com/p/5299766420e8)
    [数据链路层(四)](http://www.jianshu.com/p/4afc43f0b015)
    [IP 协议(五)](http://www.jianshu.com/p/6f89a0dc3141)
    [IP 协议相关技术(六)](http://www.jianshu.com/p/7b445133aa1f)
    [TCP与UDP(七)](http://www.jianshu.com/p/7fa4ae2cc73a)

    32.IM知识详解 

         http://www.52im.net/

    33.iOS离屏渲染  

        学习笔记     

     学习文档

    相关技巧

    渲染优化

    UITableView优化

    34. JSON和XML的异同

    35.iOS 编译期 运行期 

      1 

      2 

    36.为何要这样?

    当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。

    当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。

    37.iOS中的三个定时器.

    38.ARC模式下,使用Core Foundation也需要内存管理.

    39.长短链接简介

        短链接使用场景: 常见的网页浏览,app页面展示,适用于网页浏览等数据刷新频度较低的场景.

        长链接使用场景: 适用于客户端和服务端通信频繁的场景,例如聊天室,实时游戏等,Socket的基本使用.

    39.经典面试题

    40.导出电脑公钥

    1.检查本机是否已有公钥

    $ cd ~/.ssh
    2.如果电脑中有以前遗留的密钥,将其删除掉

    $ mkdir key_backup

    $ cp id_rsa* key_backup

    $ rm id_rsa*
    3.生成新的公钥

    $ ssh-keygen -t rsa -C "邮箱地址"
    4.查询

    cat ~/.ssh/id_rsa.pub

     41.Xcode出现 黄色警告 Treating Unicode character as whitespace

     因为在复制粘贴代码时出现不规则的换行导致,只需要在xcode中重新换行即可.

     42.RunLoop的一个常用点, 用户交互和NSTimer的问题. 把timer加到runloop中的该模式下.

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

     43.iOS cell高度自适应
    iOS8以上:
     

        UITableView * tabelView  =  [[UITableView alloc]init];

        tabelView.estimatedRowHeight = 64;

        tabelView.rowHeight = UITableViewAutomaticDimension;

    计算label高度:
    写一个NSString的Category:

    NSString+height.h

    //
    //  NSString+height.h
    //  lockView
    //
    //  Created by Shaoting Zhou on 2018/1/31.
    //  Copyright © 2018年 Shaoting Zhou. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import  <UIKit/UIKit.h>
    @interface NSString (height)
    -(CGFloat)heightWithText:(NSString *)text font:(UIFont *)font (CGFloat )width;
    @end

    NSString+height.m

    //
    //  NSString+height.m
    //  lockView
    //
    //  Created by Shaoting Zhou on 2018/1/31.
    //  Copyright © 2018年 Shaoting Zhou. All rights reserved.
    //
    
    #import "NSString+height.h"
    #import  <Foundation/Foundation.h>
    #import  <UIKit/UIKit.h>
    
    @implementation NSString (height)
    
    -(CGFloat)heightWithText:(NSString *)text font:(UIFont *)font (CGFloat )width{
        NSDictionary * dic = @{NSFontAttributeName:font};
        CGSize size = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:(NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin) attributes:dic context:nil].size;
        return  size.height;
    }
    @end

    使用:

        NSString * str = @"2222222222222222222222222222222222";
        CGFloat ff = [str heightWithText:str font:[UIFont systemFontOfSize:12] 40];
        NSLog(@"%f",ff);

     44.NSRunLoop 在子线程上需要手动开启:

    [[NSRunLoop currentRunLoop] run];

    同时,子线程的定时器,需要在子线程上invalidate,不要在主线程,否则会造成runLoop资源的浪费.

    45.SourceTree每次推拉代码都需要输入两次密码.

    主要是在http://  加上  git用户名:密码@ 即可.然后一路确定即可.

     46.xcode 安装真机 出现 App instanllation failed.如图

    这个看似很明确的问题,其实是个巨大无比的坑.

    我一开始,先添加了新的描述文件===无效

        新建立证书===无效

        听信网上谣言,改xcode版本===无效

        清除xcode缓存===无效

        修改手机时间===无效

        换网络环境===无效

        然后看网上说,product name需要英语,不能为汉字.可我的就是英语啊.但我的有_存在.

    我试着删除_,运行.马丹,竟然就好了.........

    浪费我两天时间.......码农不易,且行且悲哀!!!

    47. 使用carthage拉取三方库时: carthage update.

    找到 /var/folders/8r/l6swljzd11gg11mgt_9s6c400000gn/T/carthage-xcodebuild.9QXfgA.log 文件.

    发现:

     直接把该库版本删除或者提高即可.

     48.iOS 上传App Store发生 'XXXXX' has one iOS Distribution certificate but its private key is not installed .contact the creator of this certificate to get a copy of the private key.

    点击Manage Certificates...

    然后重新+一个就好了......

     49.TestFlight 上传过程中出现communication error.please use diagonstic mode to ........TCP port 443.

    我的问题是一开始我科..学..上..网了.然后到一半我退掉了科...学..上网.出现的.解决方法全程关闭科..学..上..网

  • 相关阅读:
    PAT 解题报告 1009. Product of Polynomials (25)
    PAT 解题报告 1007. Maximum Subsequence Sum (25)
    PAT 解题报告 1003. Emergency (25)
    PAT 解题报告 1004. Counting Leaves (30)
    【转】DataSource高级应用
    tomcat下jndi配置
    java中DriverManager跟DataSource获取getConnection有什么不同?
    理解JDBC和JNDI
    JDBC
    Dive into python 实例学python (2) —— 自省,apihelper
  • 原文地址:https://www.cnblogs.com/shaoting/p/5028805.html
Copyright © 2011-2022 走看看