《iOS開發進階》觀後-下篇(注意問題篇)

簡介

  • 本篇主要內容是實際開發中的思考總結,分別從安全性、UIWebview/WKWebview、腳本處理、內購、動態字庫、其餘等方面說,其中其餘部分設備比較廣,但實際使用相對較小或較基礎。還會說說對APP持續化概念。

前言

  • 因爲篇幅問題,會分三篇描述對應不一樣內容。輔助工具,底層原理,開發中要注意問題三個方面,談談對應的總結。本人以爲書只是一個索引,特別對於技術類書籍,基本都是經過書籍引入一些觀點,而後在經過其它第三方途徑進行擴展。因此本文描述內容不必定就是書本內容,會與自身實踐經驗,還有部份內容精簡和拓展。有些基礎概念第三方描述已足夠詳細,實例也足夠詳細,本文僅僅提出一些我的總結理解,不在重複描述具體功能原理。javascript

  • 文字不如圖片直觀,因此先上一張本系列描述的觀點的思惟導圖,梳理脈絡。紅色部分爲本文內容梳理。html

  • 《思惟導圖連接(點我打開)最新版本》java

輸入圖片說明

安全性

1 網絡安全性

  • https 通訊協議的加密 《HTTPS鏈接過程及證書自定義認證》 這篇是以前作ssl加密認證總結的。ios

  • URL加密,主要針對get/put/del.後端交互能夠用aes,h5能夠用base64.web

  • 內容加密,主要針對post.json採用AES加密,app與後端同用一套加密發送前加密,到後端解密。返回過程也是。json

  • 出於安全性,我是以爲用post代替全部協議更加好,可是效率上post會比get低。《post和get 請求區別+原理》後端

2 本地安全性

  • 《iOS本地數據存儲安全》 《iOS Keychain理解》xcode

  • 還有各類第三庫TMDiskCache,FDMB,YYCache,這些都是基於文件的因此當沙盒被破時加密性會大大降低。瀏覽器

  • 而Keychain適合存須要加密的信息,如金錢的,帳號的,積分的等等。。。。安全

UIWebview/WKWebview (這裏主要是UIWebview)

1 JS語言特性

  • 解釋性腳本語言,javascript不須要編譯,只須要嵌入到html代碼中,由瀏覽器逐行加載解釋執行。

  • javascript是一種基於對象的語言,使用已經建立好的對象來,和麪向對象的先鋒需設計語言不一樣,javascript並不支持繼承和重載。

  • 語言簡單,弱類型,語法和java,C語言相似,變量不須要聲明和指定類型便可使用,是一種弱類型語言。

  • 最重要的特色就是隻有2點單線程,而且都是異步處理的。

2 同步異步/UI線程阻塞

  • UIWebview的stringByEvaluatingJavaScriptFromString是一個同步方法,會等待js方法執行完成,耗時操做建議利用js異步特色,所有使用setTimeout的function中,以加快回調結束。
//oc

NSString *jsStr = [NSString stringWithFormat:@"setLocation('%@')",@"廣東省深圳市南山區學府路XXXX號"];
[self.webView stringByEvaluatingJavaScriptFromString:jsStr];


//js
function setLocation(location) {
    asyncAlert(location);
    document.getElementById("returnValue").value = location;
}

function asyncAlert(content) {
    setTimeout(function(){
               alert(content);
               },1);
}

3 混編原理

  • 以前也是用UIWebView + 攔截URL 的方式實現的JS與OC 交互。可是,都會封裝一層做爲app的調用函數,而後基礎基類,然而如今的項目,竟然是逐個控制器解析url,再單獨處理。我以爲是很不科學的。
// js調用
function loadURL(url) {
    var iFrame;
    iFrame = document.createElement("iframe");
    iFrame.setAttribute("src", url);
    iFrame.setAttribute("style", "display:none;");
    iFrame.setAttribute("height", "0px");
    iFrame.setAttribute("width", "0px");
    iFrame.setAttribute("frameborder", "0");
    document.body.appendChild(iFrame);
    // 發起請求後這個iFrame就沒用了,因此把它從dom上移除掉
    iFrame.parentNode.removeChild(iFrame);
    iFrame = null;
}

// oc攔截
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *URL = request.URL;
    NSString *scheme = [URL scheme];
    if ([scheme isEqualToString:@"haleyaction"]) {
        [self handleCustomAction:URL];
        return NO;
    }
    return YES;
}

4 WKWebview

腳本處理

1 持續化集成

  • 《手把手教你利用Jenkins持續集成iOS項目》 文章中的xcrun好似在xcode8就開始被廢棄看。

  • 持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。持續集成的目的,就是讓產品能夠快速迭代,同時還能保持高質量。它的核心措施是,代碼集成到主幹以前,必須經過自動化測試。只要有一個測試用例失敗,就不能集成。

  • 打包腳本以在上篇xcodebulid簡述中提供了。

  • 方法一,jenken部署mac服務器上,理由jenken定時任務定時部署。

  • 方法二,Jenkins跑遠程ssh運行打包腳本,而後發佈到第三方(蒲公英之類)。

  • 神器fastlane工具,這個之後準備瞭解一下。

2 動態庫分離 參考《自建framework提交審覈報錯 ERROR ITMS-90087解決辦法》

  • 動態庫分離,架構文件分離。

  • 增長 Thinned Run Script

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

3 其餘

  • 這個就設計到各類其餘處理,如圖片去重,圖片批量壓縮等等,也不詳細說了。

內購 (簡述一些概念,沒有具體開發)

1 基本過程

2 校驗環境

  • 線上包也是採用沙盒驗證的,正式驗證服返回21007,在驗證一次測試服。

3 安全性

  • 這裏主要就是憑證的安全性問題,由於蘋果只有驗證憑證合法不合法,與用戶無關,若是憑證被盜了,就會致使其餘人用了這個憑證,致使金錢丟失。全部建議用Keychain。

動態字庫 《動態下載系統提供的多種中文字體》

1 實現

// 1 假如咱們如今要下載娃娃體字體,它的PostScript名稱爲DFWaWaSC-W5。具體的步驟以下:
- (BOOL)isFontDownloaded:(NSString *)fontName {   
//判斷是否系統支持某種字體
- (BOOL)isFontDownloaded:(NSString *)fontName {
    UIFont* aFont = [UIFont fontWithName:fontName size:12.0];
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame
                  || [aFont.familyName compare:fontName] == NSOrderedSame)) {
        return YES;
    } else {
        return NO;
    }
}

// 3 若是該字體下載過了,則能夠直接使用。不然咱們須要先準備下載字體API須要的一些參數,以下所示:
  
// 用字體的PostScript名字建立一個Dictionary
NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil];

// 建立一個字體描述對象CTFontDescriptorRef
CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);

// 將字體描述對象放到一個NSMutableArray中
NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];
[descs addObject:(__bridge id)desc];
CFRelease(desc);

// 4 準備好上面的descs變量後,則能夠進行字體的下載了,代碼以下:
__block BOOL errorDuringDownload =NO;

CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs,NULL,  ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) {
    double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue];
    if (state == kCTFontDescriptorMatchingDidBegin) {
        NSLog(@"字體已經匹配");
    } elseif (state == kCTFontDescriptorMatchingDidFinish) {
        if (!errorDuringDownload) {
            NSLog(@"字體%@下載完成", fontName);
        }

    } elseif (state == kCTFontDescriptorMatchingWillBeginDownloading) {
        NSLog(@"字體開始下載");
    } elseif (state == kCTFontDescriptorMatchingDidFinishDownloading) {
        NSLog(@"字體下載完成");
        dispatch_async( dispatch_get_main_queue(), ^ {

            // 能夠在這裏修改UI控件的字體

        });
    } elseif (state == kCTFontDescriptorMatchingDownloading) {
        NSLog(@"下載進度 %.0f%% ", progressValue);
    } elseif (state == kCTFontDescriptorMatchingDidFailWithError) {
        NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
        if (error !=nil) {
            _errorMessage = [error description];
        } else {
            _errorMessage = @"ERROR MESSAGE IS NOT AVAILABLE!";
        }
        // 設置標誌
        errorDuringDownload = YES;
        NSLog(@"下載錯誤: %@", _errorMessage);
    }  
    return (BOOL)YES;

});

2 利弊

  • 這種下載不是下載到app是二下載到一個系統公共目錄(/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/)全部APP均可以用的。

  • 節省空間,一個字符要10-20M以上。

其餘

1 CoreText

  • 這個書中是類比UIwebview,HybridApp是APP趨勢,因此個這部分用UIwebview/WKWebview代替就好,全部也沒特別細看這部分。

2 UIwindow

3 開發技巧、調試技巧、審覈技巧

  • 書中描述的也是比較基礎的內容工具使用,基本上幾年開發經驗都會用到,這裏也不細說了。

原文:http://raychow.linkfun.top/2018/01/13/archives/1_ios/2017-section-3/index/

相關文章
相關標籤/搜索