Sandbox App使用第三方Binary文件

所謂sandbox App是指那些為了發(fā)布到App Store的,受到權(quán)限控制的App。一般Sandbox App擁有如下權(quán)限

Paste_Image.png

一波三折 之一

項(xiàng)目需要我們在符合Sandbox權(quán)限約束下的App中使用第三方的一個(gè)開源項(xiàng)目的Binary攒磨。并在之中調(diào)用這個(gè)Binary以進(jìn)行一些功能上的實(shí)現(xiàn)。

于是屹堰,我興高采烈地直接拿到了local build版本的這個(gè)Binary沿腰,以下簡稱N文件。我通過包一個(gè)帶UI的Sandbox App的方式事哭,通過NSTask調(diào)用了這個(gè)Binary漫雷,一切功能運(yùn)行正常。
于是乎直接申請對應(yīng)App ID,上傳之鳍咱,準(zhǔn)備發(fā)布降盹。
然而,正以為一切都盡在掌控之際谤辜,陡生變故蓄坏。在使用Xcode上傳時(shí),連第一步的Validate都未通過丑念。并且錯(cuò)誤顯示我的這個(gè)N文件無Sandbox權(quán)限涡戳。
經(jīng)過研究,原來脯倚,在Sandbox下的可獨(dú)立執(zhí)行的文件都必須符合Sandbox權(quán)限管控渔彰。可是挠将,這是一個(gè)Command Line Tool的項(xiàng)目啊胳岂,這個(gè)如何加入Sandbox權(quán)限呢?

一波三折 之二

經(jīng)過研究舔稀,發(fā)現(xiàn)可以通過

codesign --entitlements ./entitlements.plist -s "copy & paste your certificate from keychain" ./commandlinetool

來將我們手動(dòng)創(chuàng)建的entitlements文件(記錄了app的sandbox權(quán)限信息)sign進(jìn)對應(yīng)的commondlinetool
請參考Stackoverflow原貼

以為一切就如此順利的搞定了乳丰。剛準(zhǔn)備為自己的運(yùn)氣而慶幸,直接運(yùn)行内贮,出現(xiàn)

Illegal instruction: 4

這是因?yàn)槲覀優(yōu)橐粋€(gè)原本不受權(quán)限控制的可執(zhí)行文件強(qiáng)行添加權(quán)限之后無法執(zhí)行产园。
再次研究汞斧,從Apple官方文檔中找到

Add the following arguments to your linker flags:
-sectcreate __TEXT __info_plist Info.plist_path

Info.plist 是記錄一個(gè)SandboxApp 相關(guān)Bundle信息的文件,我一拍腦袋什燕。我只顧為一個(gè)Binary進(jìn)行權(quán)限分配粘勒,而沒有為這個(gè)Binary包相關(guān)的Bundle信息,那么這個(gè)程序在運(yùn)行時(shí)由于缺少Bundle信息屎即,在Sandbox 化時(shí)系統(tǒng)無法為其生成相關(guān)的Container庙睡。根據(jù)文檔,我修改了Makefile技俐,添加了Linkflag

一波三折 之三

折騰了一天乘陪,終于可以下班了吧。在Terminal中完美運(yùn)行了這個(gè)Sandbox化的N文件之后雕擂,我把它重新包進(jìn)了之前帶UI的Sandbox App啡邑。然而,運(yùn)行后程序毫無反饋井赌。調(diào)試后發(fā)現(xiàn)谤逼,既無報(bào)錯(cuò)也無Console。因?yàn)檎H绻腥魏萎惓6紩?huì)有Console報(bào)錯(cuò)仇穗,如果能夠運(yùn)行流部,Console中會(huì)有運(yùn)行中的Log信息。

欲哭無淚纹坐,毫無頭緒贵涵。

經(jīng)過多方求助終于在Apple的一個(gè)developer forum回帖中發(fā)現(xiàn)了一個(gè)相關(guān)回答
其中,有價(jià)值的兩點(diǎn)

1.Sandbox inheritance (com.apple.security.inherit)
2.converting your tool to some sort of script (a shell script, Python, whatever).

先嘗試了包一個(gè)shell恰画,發(fā)現(xiàn)在Sandbox的app中調(diào)用bash去run 自己寫的shell,再通過這個(gè)shell去run我們的binary是不可行的瓷马,報(bào)錯(cuò):operation not permitted

再看第二點(diǎn)拴还,查Apple 文檔和具體的這個(gè)com.apple.security.inherit權(quán)限文檔
深入研究后發(fā)現(xiàn),

To enable sandbox inheritance, a child must use exactly two App Sandbox entitlement keys: com.apple.security.app-sandbox and com.apple.security.inherit. If you specify any other App Sandbox entitlement, the system aborts the child process. You can, however, confer other capabilities to a child process by way of iCloud and notification entitlements.

也就是說欧聘,我們的N文件現(xiàn)在是作為我們包的UI App的子項(xiàng)片林,于是我們需要讓這個(gè)N文件繼承UI App的Sandbox權(quán)限,而不是把它自己作為一個(gè)獨(dú)立的Sandbox App怀骤。
于是费封,

  1. 去掉Makefile中之前添加的linkflag
  2. 將entitlement文件改為

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>

重新make,然后codesign蒋伦,并把新N文件包進(jìn)去

黎明

終于弓摘,這個(gè)程序正常了,并且N文件和外包的UI App公用同樣的Bundle信息痕届,同一個(gè)Container韧献,使用同樣的Sandbox權(quán)限末患。

總結(jié)

整個(gè)過程一波三折,每當(dāng)有進(jìn)展之后以為圓滿解決了又來了更大的問題锤窑。同時(shí)璧针,相關(guān)資料非常少,我全程查英文第一手資料渊啰,但是無奈Apple文檔目錄太深探橱,Google也幫不了我。好在各種機(jī)緣和強(qiáng)大的同事绘证,我們一步一步的猜想隧膏,實(shí)驗(yàn),破解了謎團(tuán)迈窟。
App已經(jīng)提交了私植,也許Apple不允許這樣的通過N文件的方式進(jìn)行包裝,不過在這個(gè)過程中對Sandbox權(quán)限和項(xiàng)目構(gòu)建有了更深的理解车酣。

相關(guān)的中文資料基本沒有曲稼,希望能夠給同樣在坑中的人們帶來一些參考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湖员,一起剝皮案震驚了整個(gè)濱河市贫悄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娘摔,老刑警劉巖窄坦,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凳寺,居然都是意外死亡鸭津,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門肠缨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逆趋,“玉大人,你說我怎么就攤上這事晒奕∥攀椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵脑慧,是天一觀的道長魄眉。 經(jīng)常有香客問我,道長闷袒,這世上最難降的妖魔是什么坑律? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮霜运,結(jié)果婚禮上脾歇,老公的妹妹穿的比我還像新娘蒋腮。我一直安慰自己,他們只是感情好藕各,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布池摧。 她就那樣靜靜地躺著,像睡著了一般激况。 火紅的嫁衣襯著肌膚如雪作彤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天乌逐,我揣著相機(jī)與錄音竭讳,去河邊找鬼。 笑死浙踢,一個(gè)胖子當(dāng)著我的面吹牛绢慢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洛波,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼胰舆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹬挤?” 一聲冷哼從身側(cè)響起缚窿,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焰扳,沒想到半個(gè)月后倦零,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吨悍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年扫茅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片育瓜。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诞帐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爆雹,到底是詐尸還是另有隱情,我是刑警寧澤愕鼓,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布钙态,位于F島的核電站,受9級特大地震影響菇晃,放射性物質(zhì)發(fā)生泄漏册倒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一磺送、第九天 我趴在偏房一處隱蔽的房頂上張望驻子。 院中可真熱鬧灿意,春花似錦、人聲如沸崇呵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽域慷。三九已至荒辕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犹褒,已是汗流浹背抵窒。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叠骑,地道東北人李皇。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像宙枷,于是被迫代替她去往敵國和親掉房。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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

  • PLEASE READ THE FOLLOWING APPLE DEVELOPER PROGRAM LICENSE...
    念念不忘的閱讀 13,478評論 5 6
  • 如果你看完書中的所有例子朦拖,你很可能已經(jīng)做完你的實(shí)驗(yàn)和在已經(jīng)越獄的iPhone上的研究圃阳。因?yàn)楹驮S多人一樣,幾乎所有的...
    fishmai0閱讀 16,051評論 2 42
  • 36【學(xué)習(xí)】科學(xué)的重復(fù)事半功倍 如果我們?nèi)ブ貜?fù)(復(fù)習(xí))璧帝,我們會(huì)記得更多捍岳。 艾賓浩斯記憶曲線: 分為8大周期是:5m...
    依盈閱讀 113評論 0 0
  • 1.海爾 智能化產(chǎn)品的研發(fā)制造基地,海爾集團(tuán)在物聯(lián)網(wǎng)時(shí)代推出的美好住居生活解決方案,青島海爾智能家電科技有限公司 ...
    簡書小飛閱讀 1,287評論 0 0
  • 壹 “叮!” 凌晨一點(diǎn)多睬隶,我收到老師的郵件锣夹,神經(jīng)質(zhì)地一抖,差點(diǎn)打翻面前的酒杯苏潜。 “怎么了银萍?”身邊朋友微微有些醉意,...
    韓半兩閱讀 346評論 0 1