MacOS開(kāi)發(fā) 簡(jiǎn)單的應(yīng)用更新升級(jí)

序言

前幾天一直在思考mac APP 的更新升級(jí)要怎么做谒府,網(wǎng)上查了一下 基本沒(méi)有什么文章可以參考击胜, 僅有的思路是 這篇文章?https://blog.csdn.net/lovechris00/article/details/80247987 使用的是三方sparkle洞翩,可以不用寫(xiě)一句代碼骡楼, 只用配置一下mainmenu即可措左。可是sparkle的彈窗滿足不了我們公司的設(shè)計(jì)需求(令人蛋疼)蛙酪,只好按照自己的思路來(lái)寫(xiě)一個(gè)齐苛。

準(zhǔn)備工作

在本地搭建一個(gè)服務(wù)器,提供展示下載服務(wù):

在本地創(chuàng)建一個(gè)文件夾updateServerFile桂塞, 文件夾中存放你的最新的安裝包.dmg文件凹蜂,然后打開(kāi)終端,在終端中輸入

$ cd /Users/administrator/Desktop/updateServerFile

?$ python -m SimpleHTTPServer 8902

這樣子一個(gè)本地服務(wù)就啟動(dòng)了藐俺,此時(shí)我們的本地服務(wù)器地址為:http://(yourhost):8902 或者h(yuǎn)ttp://127.0.0.1:8902

大致思路

先從服務(wù)端獲取更新的信息炊甲,如果需要需要更新 那么拿到更新的信息 和更新的地址:

1. 從服務(wù)端下載完整的dmg文件泥彤,把下載好的文件放在某個(gè)位置欲芹。

2. 自動(dòng)打開(kāi)dmg文件, 讓用戶將app文件拖入application 文件夾中吟吝,完成安裝菱父。

3. 遺留的dmg文件的處理。

1. 下載dmg文件

使用AFN進(jìn)行下載(暫時(shí)沒(méi)有斷點(diǎn)下載的需求)剑逃,將下載封裝成一個(gè)單獨(dú)的類浙宜,下載的操作為一個(gè)實(shí)例方法:

- (void)downloadDmgFileFromTargetUrl:(NSString *)targetUrl?? ? ? ? ? TodestinationFileNamePath:(NSString *)path ? ? ? ? ? ? ? ? ? ?

? ?? WithProgress:(void(^)(CGFloat progress))progressCallback? ? ?

? ? ?doneCallback:(void(^)(void))doneCallback?? ? ? ? ?

? ? ?errorCallback:(void(^)(NSString * errorDomine, NSInteger errorCode))errorCallback;

// targetUrl:為服務(wù)端的下載地址

//TodestinationFileNamePath: 下載為本地文件的路徑地址

//progressCallback :下載進(jìn)度的callback

//doneCall: 下載完成的callback

//errorCallback:出現(xiàn)錯(cuò)誤的callback

- (void)downloadDmgFileFromTargetUrl:(NSString *)targetUrl?? ? ? ? ? TodestinationFileNamePath:(NSString *)path? ? ? ? ? ? ? ? ? ? ? ? WithProgress:(void(^)(CGFloat progress))progressCallback? ? ? ? ? ? ? ? ? ? ? ? doneCallback:(void(^)(void))doneCallback?? ? ? ? ? ? ? ? ? ? ? errorCallback:(void(^)(NSString * errorDomine, NSInteger errorCode))errorCallback {

? ? AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];?

? NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString:targetUrl]];

? ? _downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {? ? ?

? NSLog(@"下載進(jìn)度:%.0f%", downloadProgress.fractionCompleted * 100);? ? ? ? progressCallback(downloadProgress.fractionCompleted);

? ? } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {? ?

? ? return [NSURL fileURLWithPath:path];?

? } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {?

? ? ? if (!error) {? ? ?

? ? ? if (doneCallback) {? ? ? ? ?

? ? ? doneCallback();? ? ? ?

? ? }? ?

? ? } else {? ? ?

? ? ? if (errorCallback) {? ? ? ?

? ? ? ? errorCallback(error.domain, error.code);?

? ? ? ? ? }?

? ? ? }

? ? }];?? ?

? ? [_downTask resume];

} ??

文件下載好, 接下來(lái)要把這個(gè).dmg文件放在哪里呢蛹磺?

我最初的想法是放在Desktop文件夾中或者Downloads文件夾中粟瞬,但是如果這樣子放是不能夠打開(kāi)sandbox,要獲取到最高權(quán)限才可以萤捆,還有一點(diǎn)就是這樣子做有點(diǎn)流氓裙品,沒(méi)有經(jīng)過(guò)用戶的同意就把這個(gè)遺留的文件放在桌面俗批,如果是一個(gè)強(qiáng)迫癥的用戶的話,估計(jì)就受不了這樣子的一種行為市怎。

所以我的想法是岁忘,把這個(gè)安裝包文件放在document的cache文件夾中, 注意:如果要獲取正確的document文件夾, 一定要打開(kāi)沙盒權(quán)限, 否則找到的是系統(tǒng)的document.?

NSString * libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0]; ?

?NSString * cachePath = [libraryDir stringByAppendingPathComponent:@"Caches"];?? ? NSString * lastDestinationFileName = [cachePath stringByAppendingPathComponent:@"XXXX.dmg"];

找好路徑,調(diào)用上面下載方法. 講dmg文件下載到Cache文件夾中. 但是此時(shí)只是下載好, 那么如何使用代碼來(lái)打開(kāi)這個(gè)文件呢?

想到的方法是使用NSTask來(lái)執(zhí)行Shell命令. 使用open命令來(lái)打開(kāi)已經(jīng)下載好的dmg文件. 參考網(wǎng)上的做法, 寫(xiě)了一個(gè)類, 單獨(dú)執(zhí)行某條shell命令

+ (NSString *)cmd:(NSString *)cmd {

? ? // 初始化并設(shè)置shell路徑

? ? NSTask *task = [[NSTask alloc] init];

? ? [task setLaunchPath: @"/bin/bash"]; ? ? // -c 用來(lái)執(zhí)行string-commands(命令字符串)区匠,也就說(shuō)不管后面的字符串里是什么都會(huì)被當(dāng)做shellcode來(lái)執(zhí)行 ?

? NSArray *arguments = [NSArray arrayWithObjects: @"-c", cmd, nil]; ?

? [task setArguments: arguments]; ?? ? ? ? // 新建輸出管道作為Task的輸出

? ? NSPipe *pipe = [NSPipe pipe]; ? ? [task setStandardOutput: pipe]; ?? ? ? ? // 開(kāi)始task ?

? NSFileHandle *file = [pipe fileHandleForReading]; ? ? [task launch]; ?? ? ? ? // 獲取運(yùn)行結(jié)果 ? ? NSData *data = [file readDataToEndOfFile]; ? ? return [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

}

下載好文件之后 執(zhí)行代碼?[XXXX cmd:[NSString stringWithFormat:@"cd %@; open xxx.dmg", cachePath]] 就可以自動(dòng)打開(kāi).

對(duì)于NSTask 剛剛接觸到, 還沒(méi)有時(shí)間去充分的理解里面的東西, 上面的方法是參考別的文章中 拿過(guò)來(lái)的, 若有不足之處, 望指出.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末干像,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驰弄,更是在濱河造成了極大的恐慌麻汰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩懒,死亡現(xiàn)場(chǎng)離奇詭異什乙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)已球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門臣镣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人智亮,你說(shuō)我怎么就攤上這事忆某。” “怎么了阔蛉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵弃舒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我状原,道長(zhǎng)聋呢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任颠区,我火速辦了婚禮削锰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毕莱。我一直安慰自己器贩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布朋截。 她就那樣靜靜地躺著蛹稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪部服。 梳的紋絲不亂的頭發(fā)上唆姐,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音廓八,去河邊找鬼奉芦。 笑死胆描,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仗阅。 我是一名探鬼主播昌讲,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼减噪!你這毒婦竟也來(lái)了短绸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤筹裕,失蹤者是張志新(化名)和其女友劉穎醋闭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體朝卒,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡证逻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抗斤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚企。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瑞眼,靈堂內(nèi)的尸體忽然破棺而出龙宏,到底是詐尸還是另有隱情,我是刑警寧澤伤疙,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布银酗,位于F島的核電站,受9級(jí)特大地震影響徒像,放射性物質(zhì)發(fā)生泄漏黍特。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一锯蛀、第九天 我趴在偏房一處隱蔽的房頂上張望灭衷。 院中可真熱鬧,春花似錦谬墙、人聲如沸今布。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至侵蒙,卻和暖如春造虎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纷闺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工算凿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留份蝴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓氓轰,卻偏偏與公主長(zhǎng)得像婚夫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子署鸡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容