iOS工做小技巧及填坑記錄

如下是本人在iOS開發工做中使用的一些小技巧,記錄一下。javascript

1.使用XXX.pch文件便捷開發+加速Buildphp

在IOS開發的項目中有一個XX_Prefix.pchhtml

XX_Prefix.pch:擴展名.pch表示"precompiled header",這是一個你工程要用到的來自於外部框架的頭文件列表。xcode將編譯這些頭到文件,這將減小你在選擇Build 或Build and Go時編譯項目的時間。一般用到的頭文件已經自動包含了pch,系統編譯每一個.m文件前,都會先imort這個文件。這樣就節省了添加include的時 間,至關於加速編譯java

還有就是能夠再這裏面放入宏,在整個工程中均可以用.ios

添加方法:git

 

在targets->Build Setting中Apple LLVM 7.0 - language中作以下修改github

例如在一個項目中有一個hello.h文件,須要在全部.m文件中都要包含這個文件就能夠在web

XX_Prefix.pch文件中引入hello.h面試

2.在一個應用中打開其餘應用.objective-c

在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 width:(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 width:(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] width: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.

 

 

個人問題是一開始我科..學..上..網了.而後到一半我退掉了科...學..上網.出現的.解決方法全程關閉科..學..上..網

相關文章
相關標籤/搜索