技術(shù)二

XCode 項(xiàng)目配置說(shuō)明

基本項(xiàng)(Basic)

1、Architectures(指令集)

(1)armv7,支持的機(jī)器iPhone4,iPhone4S

(2)armv7s,支持的機(jī)器iPhone5,iPhone5C

(3)arm64,支持的機(jī)器:iPhone5S及之后版本

Build Active Architecture Only :是否只編譯當(dāng)前適用的指令集。

Valid architectures :指即將編譯的指令集。

Base SDK----當(dāng)前編譯用的SDK版本

iPhone OS Deployment Target----指的是編譯出的程序?qū)⒃谀膫€(gè)系統(tǒng)版本上運(yùn)行。

Localizations:定義了我們應(yīng)用的本地化語(yǔ)言

2、Build Options:

validate Built Product:boolean 類型,指定是否執(zhí)行產(chǎn)品驗(yàn)證測(cè)試(就是說(shuō)是否使用你的證書進(jìn)行驗(yàn)證測(cè)試)。一般在Debug版本設(shè)置成NO,release版本設(shè)置成Yes。

3、Code Signing 代碼簽名

Code Signing Identity-----代碼簽名的身份,即選擇簽名證書,一是開發(fā)證書,二是發(fā)布證書。

4、Search Paths 查詢路徑

Always Search User Paths--- 是否搜索用戶路徑

Header Search Paths (HEADER_SEARCH_PATHS)

TARGET的配置配置,主要分為5大部分GeneralCapabilitiesInfoBuild SettingsBuild Phases和Build Rules。

General:通用配置里面包括了一些應(yīng)用基本信息的配置。這個(gè)里面著重介紹一下下面的著幾個(gè)配置。

version & build:從名字上來(lái)看就可以很清楚的區(qū)分這兩個(gè)字段的不同:一個(gè)是當(dāng)前的版本號(hào),對(duì)應(yīng)Info.plist里面的CFBundleShortVersionString字段;另一個(gè)是你當(dāng)前版本的編譯次數(shù),對(duì)應(yīng)Info.plist里面的CFBundleVersion字段。

Deployment Target:定義了我們這個(gè)應(yīng)用允許在哪個(gè)iOS SDK版本以上才可以安裝或升級(jí)。

General:通用配置里面包括了一些應(yīng)用基本信息的配置。

version & build:一個(gè)是當(dāng)前的版本號(hào),對(duì)應(yīng)Info.plist里面的CFBundleShortVersionString字段;另一個(gè)是你當(dāng)前版本的編譯次數(shù),對(duì)應(yīng)Info.plist里面的CFBundleVersion字段。

Deployment Target:定義了我們這個(gè)應(yīng)用允許在哪個(gè)iOS SDK版本以上才可以安裝或升級(jí)。

Info:這里面定義了我們應(yīng)用里面用到的所有信息。

Custom iOS Target Properties:從上圖中我們可以看出,Custom iOS Target Properties就是Info.plist里面的內(nèi)容。在這個(gè)里面,我們可以更改:Bundle name(iOS桌面上顯示的名字);Bundle identifier等...

URL Types:我們的程序可以向系統(tǒng)注冊(cè)自己的URL Scheme,來(lái)使得另外一個(gè)App可以通過這個(gè) URL Scheme 來(lái)打開我們的應(yīng)用。

Build Settings:這里面包括了我們?cè)诰幾g過程中會(huì)用到的所有配置。

Code Signing Idenity:這個(gè)選項(xiàng)是用來(lái)告訴 Xcode,你編譯的時(shí)候是用哪個(gè)證書來(lái)簽名的。通常情況下,Debug 可以選擇 iOS Developer; Release 可以選擇 iOS Distribution;

Preprocessor Macros:可以這個(gè)里面定義一些預(yù)處理的宏。例如,Xcode 自動(dòng)幫你在 Debug 里面定了一個(gè)宏DEBUG=1,這樣就可以用這個(gè)宏來(lái)判斷當(dāng)前的App是不是Debug版本了。也可以用它來(lái)為你的內(nèi)部版本增加一些測(cè)試功能。

Search Path:可以用來(lái)指定你的工程可以在哪個(gè)目錄下,搜索頭文件、Framework或者庫(kù)。

Build Phases:是應(yīng)用管理源文件、資源和依賴的地方。主要分為下面的這四個(gè)部分:

Target Dependencies:是用來(lái)管理你的Target依賴的。在幾年前,基本上都是使用它來(lái)做第三方工程依賴的?,F(xiàn)在基本上都是使用Cocoapods來(lái)引導(dǎo)第三方的項(xiàng)目了。

Compile Sources:是用來(lái)管理你這個(gè)應(yīng)用里面需要編譯的所有源文件的。所以,一個(gè)Target里面并不一定要編譯和使用左側(cè)工程里面的所有源文件。

Link Binary With Libraries:是用來(lái)管理二進(jìn)制庫(kù)和Framework的。

Copy Bundle Resources:是用來(lái)設(shè)置你需要拷貝到Main Bundle里面的資源文件的,里面可能會(huì)包括 storyboard,xib,圖片文件,JS 文件,CSS 文件,其他的資源包 等等。

Other

Charles:移動(dòng)端抓包工具

通信安全工具:

IP*Works! Internet Toolkit v9.0

IP*Works! EDI/AS2 v9.0

IP*Works! S/MIME v9.0IP*Works! SSHIP*Works! SSL

代碼混淆工具:

.NET Reactor v4.9DotfuscatorDashO Pro v7.3

Zend Guard

MACターミナルの主要コマンド

mkdir

「mkdir 作成したいディレクトリ名」で実行します。

rm

「rm ファイル名」で実行します。

rm -R "削除するディレクトリの最上位にあたるディレクトリのパス"

mv

「mv AAA BBB」

cp

「cp AAA BBB」と入力すると、AAAというファイルがBBBという名前でコピーされます。

man

「man マニュアルを開きたいコマンド名」で実行します。

find

「find 検索する場(chǎng)所 -name 検索するファイル名」で実行します。

open

open "ファイルのパス”

rmdir

rmdir "削除するディレクトリのパス

sudo

指定したコマンドをroot権限で実行する。

sudo "コマンド名"

whites

指定したコマンドの概略機(jī)能を表示する。

whatis "コマンド名"

chmod

其語(yǔ)法格式為:chmod [who] [opt] [mode] 文件/目錄名

其中who表示對(duì)象,是以下字母中的一個(gè)或組合:

u:表示文件所有者

g:表示同組用戶

o:表示其它用戶

a:表示所有用戶

opt則是代表操作,可以為:

+:添加某個(gè)權(quán)限

-:取消某個(gè)權(quán)限

=:賦予給定的權(quán)限,并取消原有的權(quán)限

而mode則代表權(quán)限:

r:可讀

w:可寫

x:可執(zhí)行

sudo chmod -R 777

yum -y install wget

MACSVN的常用命令

1、checkout

svncheckoutsvn地址,簡(jiǎn)寫:svncosvn地址

2、添加文件

svnadd test.txt 添加單一文件

svnadd *.* 添加所有文件

svnadd *.php 添加所有后綴為php的文件

3、提交文件

svnci -m “描述(可留空)” 文件名 提交單一文件

svnci -m “描述(可留空)” 提交所有文件

4、刪除文件

svndelete 文件名

簡(jiǎn)寫:svn(del, remove, rm)

5、加鎖/解鎖

svnlock -m “LockMessage“ [--force] PATH

svnunlock -m “LockMessage“ [--force] PATH

6、svnupdate,簡(jiǎn)寫svnup

svnupdate 更新所有文件

svnupdate -r 200 test.php (將版本庫(kù)中的文件test.php還原到版本200)

svnupdate test.php (更新單一文件,于版本庫(kù)同步。如果在提交的時(shí)候提示過期的話,是因?yàn)闆_突,需要先update,修改文件,然后清除svnresolved,最后再提交commit)

7、查看文件詳細(xì)信息

svninfo 文件名

8、查看日志

svnlog 文件名

9、svnstatus [path]其字符的含義如下:

簡(jiǎn)寫:svnst

‘ ‘ no modifications. 沒有改動(dòng)

‘A’ Added. 新增加的項(xiàng)目

‘C’ Conflicted. 項(xiàng)目?jī)?nèi)容與更新得到的數(shù)據(jù)沖突了

‘D’ Deleted. 要?jiǎng)h除的項(xiàng)目

‘I’ Ignored. 已忽略

‘M’ Modified. 內(nèi)容有改動(dòng)

‘R’ Replaced. 在svn倉(cāng)庫(kù)中是一個(gè)目錄, 在本地是一個(gè)同名的文件. 反之亦然.

‘X’ 項(xiàng)目未版本化, 與外部連接相關(guān)

‘?’ 未版本化的文件

‘!’ 項(xiàng)目丟失, 或者說(shuō)目錄不完整

‘~’ 本地有一個(gè)未版本化的項(xiàng)目, 在svn倉(cāng)庫(kù)里有一個(gè)同名項(xiàng)目

10、比較差異

svndiff path

例如:svndiff test.php

svndiff -r m:n path(對(duì)版本m和版本n比較差異)

例如:svndiff -r 200:201 test.php

簡(jiǎn)寫:svndi

$ svn log -r 20 touched.txt --diff

11、將兩個(gè)版本之間的差異合并到當(dāng)前文件

svnmerge -r m:n path

例如:svnmerge -r 200:205 test.php(將版本200與205之間的差異合并到當(dāng)前文件,但是一般都會(huì)產(chǎn)生沖突,需要處理一下)

12、SVN幫助

svnhelp

svnhelp ci

svn revert --depth=infinity 對(duì)文件夾里所有文件進(jìn)行revert

利用可能なサブコマンド:

add

blame (praise, annotate, ann)

cat

changelist (cl)

checkout (co)

cleanup

commit (ci)

copy (cp)

delete (del, remove, rm)

diff (di)

export

help (?, h)

import

info

list (ls)

lock

log

merge

mergeinfo

mkdir

move (mv, rename, ren)

propdel (pdel, pd)

propedit (pedit, pe)

propget (pget, pg)

proplist (plist, pl)

propset (pset, ps)

resolve

resolved

revert

status (stat, st)

switch (sw)

unlock

update (up)

実際のコマンド使用例

ではでは、個(gè)人的によく使う svn コマンドの使用例です。勝手に分類してご紹介します。

作業(yè)コピー操作系

作業(yè)コピーのチェックアウト。

svn co http://example.com/subversion/repository/trunk /var/www/working_copy

作業(yè)コピーの更新。

svn up /var/www/working_copy

ファイルの追加。--parents オプションを付けるとファイルまでのディレクトリで追加されていないものがあれば一緒に追加してくれます。

svn add --parents /var/www/working_copy/htdocs/index.html

変更點(diǎn)のチェックイン(コミット)。-m オプションはコミット時(shí)のコメントを指定するのに使います。

svn ci -m "index.html を追加。" /var/www/working_copy/htdocs/index.html

作業(yè)コピー上での変更を取り消す。

svn revert /var/www/working_copy/htdocs/index.html

作業(yè)コピーのクリーンアップ。

svn cleanup /var/www/working_copy

作業(yè)コピーの切り替え。

svn sw http://example.com/subversion/repository/branches/20100908 /var/www/working_copy

--relocate オプションで別リポジトリへの切り替えが可能です。(リポジトリの移行時(shí)など)

svn sw --relocate http://old.example.com/subversion/repository/trunk http://new.example.com/subversion/repository/trunk /var/www/working_copy

リポジトリ操作系

trunk をコピーして新しい branch を作成。

svn cp -m "2010/09 作業(yè)分の branch 作成。" http://example.com/subversion/repository/trunk http://example.com/subversion/repository/branches/201009

trunk を branch に移動(dòng)。

svn mv -m "2010/09 時(shí)點(diǎn)での trunk を branch に移動(dòng)。" http://example.com/subversion/repository/trunk http://example.com/subversion/repository/branches/201009

古い branch を削除。

svn rm -m "一年前の branch を削除。" http://example.com/subversion/repository/branches/200909

情報(bào)參照系

作業(yè)コピーの情報(bào)を確認(rèn)。

svn info /var/www/working_copy

変更履歴を表示。

svn log /var/www/working_copy/htdocs/index.html

リポジトリと差分のあるファイル一覧を表示。

svn stat -u /var/www/working_copy/

リポジトリとの差分を表示。

svn di /var/www/working_copy/htdocs/index.html

-r オプションで指定したリビジョンとの差分を見れます。

svn di -r 10 /var/www/working_copy/htdocs/index.html

svn:mergeinfo や svn:ignore などの屬性情報(bào)を表示。

svn pl -v /var/www/working_copy

branch から trunk の作業(yè)コピーにマージ系

リビジョンを指定してマージ。

svn merge -c 10,12,18 http://example.com/subversion/repository/branches/201009 /var/www/working_copy

-r でリビジョン範(fàn)囲を指定できます。

svn merge -r 10:18 http://example.com/subversion/repository/branches/201009 /var/www/working_copy

適用されていない変更點(diǎn)を全てマージ。

svn merge --reintegrate http://example.com/subversion/repository/branches/201009 /var/www/working_copy

ちなみに --dry-run オプションでマージ対象のファイルの一覧が見れます。

svn merge --dry-run --reintegrate http://example.com/subversion/repository/branches/201009 /var/www/working_copy

instruments學(xué)習(xí)筆記(一)

//調(diào)用外部js

#import “../common/common.js”

//導(dǎo)航欄操作

UIATarget.localTarget().frontMostApp().navigationBar().leftButton().tap(); //點(diǎn)擊左側(cè)按鈕

UIATarget.localTarget().frontMostApp().navigationBar().rightButton().tap(); //點(diǎn)擊右側(cè)按鈕

//按鈕點(diǎn)擊

UIATarget.localTarget().frontMostApp().mainWindow().buttons()[“xxxxx”].tap();

//坐標(biāo)點(diǎn)擊

UIATarget.localTarget().tap({x:30,y:131});

//等待n秒,delay(n)

UIATarget.localTarget().delay(3);

//截圖

UIATarget.localTarget().captureScreenWithName(“picname”);

//獲取對(duì)象數(shù)組長(zhǎng)度,length

UIATarget.localTarget().frontMostApp().mainWindow().buttons().length;

//獲取文本字符串,value()

UIATarget.localTarget().frontMostApp().mainWindow().scrollViews()[0].staticTexts()[0].value();

//滾輪滾動(dòng),dragInsideWithOptions()

UIATarget.localTarget().frontMostApp().mainWindow().pickers()[0].wheels()[0].dragInsideWithOptions({startOffset:{x:0.38, y:0.66}, endOffset:{x:0.38, y:0.12}, duration:1.6});

//根據(jù)name模糊查詢控件,firstWithPredicate(“name beginswith ‘xxx'”)

obj= window.tableViews()[0].cells().firstWithPredicate(“name beginswith ‘hello'”);

//根據(jù)name完全匹配,firstWithName(“xxxx”)

obj= window.tableViews()[0].cells().firstWithName(“hello world”);

//根據(jù)key值匹配,firstWithValueForKey(value,key)

obj= window.tableViews()[0].cells().firstWithValueForKey(“hello world”,”name”);

//拖動(dòng)

window.tableViews()[0].scrollDown();

window.tableViews()[0].scrollUp();

window.tableViews()[0].scrollLeft();

window.tableViews()[0].scrollRight();

//打印當(dāng)前屏幕所有空間信息

UIATarget.localTarget().logElementTree();

//記錄日志

UIALogger.logStart(“start”);

UIALogger.logPass(“pass”);

UIALogger.logWarning(“warning”);

UIALogger.logFail(“fail”);

UIALogger.logMessage(“message”);

UIALogger.logError(“error”);

UIALogger.logDebug(“debug”);

UIALogger.logIssue(“issue”);

//九宮格搜索輸入框

UIATarget.localTarget().frontMostApp().mainWindow().searchBars()[0]

//模擬鍵盤操作,keyboard().typeString(“xxx”)

UIATarget.localTarget().frontMostApp().keyboard().typeString(“aaa\n”);

\n=回車

//輸入框輸入,setValue()

UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[“Empty list”].cells()[“用戶名:”].textFields()[0].setValue(“abcd”);

instruments如何處理alert對(duì)話框

被測(cè)應(yīng)用中有出現(xiàn)alert對(duì)話框,需要點(diǎn)擊處理。繞了很多彎路,回頭想想其實(shí)很簡(jiǎn)單。

1. onAlert事件要放在執(zhí)行代碼前面

2. onAlert事件中return值需要為true。如果是false,系統(tǒng)自動(dòng)點(diǎn)擊cancel按鈕,如果cancel按鈕不存在,則點(diǎn)擊默認(rèn)按鈕。

3. 按順序?qū)憟?zhí)行代碼即可

var target = UIATarget.localTarget();

UIATarget.onAlert = function onAlert(alert) {

var title = alert.name();

UIALogger.logWarning(“Alert with title ‘” + title + “‘ encountered.”);

// return false to use the default handler

return true;

}

target.frontMostApp().mainWindow().tableViews()[“空列表”].cells()[“xxx, 用戶注銷”].tap();

// Alert detected. Expressions for handling alerts should be moved into the UIATarget.onAlert function definition.

target.frontMostApp().alert().defaultButton().tap();

1.消息及執(zhí)行結(jié)果打印――UIALogger

UIALogger.logMessage(commonMsg);

UIALogger.logPass(testApp);

UIALogger.logFail(testApp);

UIALogger.logWarning(warningMsg);

2.文本框輸入

app.keyboard().typeString(englishOnly);

window.textFields()[index].setValue(englishChinessMixed);

3.隱藏鍵盤

app.keyboard().typeString("\n");

app.keyboard().buttons()["搜索"].tap();

4.判斷staticText存在與否(不同布局存在差異,以下僅為一種方式)

if (window.elements()["待判斷關(guān)鍵字"]) {

UIALogger.logMessage("存在關(guān)鍵字");

} else {

UIALogger.logMessage("不存在關(guān)鍵字");

}

5.tableView關(guān)鍵字判斷(不同布局存在差異,以下僅為一種方式)

if(window.tableViews()[0].cells()["關(guān)鍵字"].isVisible()) {

UIALogger.logMessage("存在關(guān)鍵字");

} else {

UIALogger.logMessage("不存在關(guān)鍵字");

}

6.scrollView控件選?。ú煌季执嬖诓町悾韵聝H為一種方式)

window.scrollViews()[0].button()[1].tap()

某些有name屬性的element不可見,故不可tap,無(wú)name屬性的element只能使用index索引,如上的imagebutton,雖其image有

name屬性但不可見,故只能選取button進(jìn)行tap操作

7.navigationBar關(guān)鍵字判斷(不同布局存在差異,以下僅為一種方式)

if(nvgBar.staticTexts()["關(guān)鍵字"].isVisible()) {

UIALogger.logMessage("關(guān)鍵字存在");

} else {

UIALogger.logMessage("關(guān)鍵字不存在");

}

注:有時(shí)isVisible()不可用,可換用isValid()嘗試,雖然有些元素在界面上確實(shí)not visible,但是腳本調(diào)試可看出isVisible()返回值是true,此種情況可能就是圖層覆蓋了,可多嘗試幾種判斷方法。

8.tabBar控件選?。ú煌季执嬖诓町悾韵聝H為一種方式)

tabBar.buttons()["關(guān)鍵字"];

9.判斷tarBar當(dāng)前所選控件

var selectedBtn = tabBar.selectedButtons()["關(guān)鍵字"].value();

if (selectedBtn == "關(guān)鍵字") { }

注:有時(shí)直接使用上述已定義的nvgBar.***和tabBar.***會(huì)出錯(cuò),換用app.navigationBar().***和app.tabBar().***則正常,尚不明所以……可能還是跟應(yīng)用不規(guī)范有關(guān)系。

10.截屏

target.captureScreenWithName("screenshot1.png");

11.旋轉(zhuǎn)

target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPELEFT);

UIALogger.logMessage("Current orientation is " + app.interfaceOrientation());

target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_PORTRAIT);

UIALogger.logMessage("Current orientation is " + app.interfaceOrientation());

12.后臺(tái)運(yùn)行再進(jìn)入(模擬home鍵)

target.deactivateAppForDuration(int second);

13.處理提示框

忽略所有提示框:

UIATarget.onAlert = function onAlert(alert) {

var title = alert.name();

UIALogger.logWarning("Alertwithtitle ’" + title + "’ encountered!");

return false; // use default handler

}

處理特定提示框,忽略其他提示框:

UIATarget.onAlert = function onAlert(alert) {

var title = alert.name();

UIALogger.logWarning("Alertwithtitle ’" + title + "’ encountered!");

if (title == "Add Something") {

return true; // bypass default handler

}

return false; // use default handler

}

最后,總結(jié)Automation圖形化界面的編輯快捷鍵:

End:Ctrl+E

Home:Ctrl+A

Delete:Ctrl+D

Backspace:Ctrl+H

Copy:Win+C

Paste:Win+V

Cut:Win+X

左移1:Ctrl+B

下移1:Ctrl+N

上移1:Ctrl+P

右移1:Ctrl+F

刪除當(dāng)前行(光標(biāo)后面數(shù)據(jù)):Ctrl+K

PgDn:Ctrl+V

Ctrl+Y:恢復(fù)粘貼Ctrl+K最后一次刪除的數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.暗闇より夜魔來(lái)たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙諾瓦閱讀 3,413評(píng)論 0 7
  • 1.暗闇より夜魔來(lái)たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙諾瓦閱讀 2,009評(píng)論 1 2
  • 陽(yáng)の光 闇の月 陽(yáng)も月も異なれど、同じように地上を照らす。けれど、両者は決してまみえることはない。陽(yáng)が輝くとき月は...
    波沙諾瓦閱讀 2,380評(píng)論 0 7
  • 題記: 看到桃花社第二期的寫詩(shī)主題:雪,突然想起以前關(guān)于雪花的美妙經(jīng)歷。小時(shí)候堆雪人,打雪仗,砸冰掉,后來(lái)圣誕節(jié)一...
    葉聽雨閱讀 712評(píng)論 0 1
  • 導(dǎo)語(yǔ) android碎片化相信是每一個(gè)android開發(fā)者的痛。機(jī)型適配也是難以繞過去的坎。這其中Android動(dòng)...
    DROIDXL閱讀 14,897評(píng)論 7 16

友情鏈接更多精彩內(nèi)容