2013-07-21 12 views
6

/Contents/Resources'da bulunan bir çalıştırmayı başlatan bir Mac OSX uygulamasına sahibim. Uygulama, App Store'da yayınlanmak üzere tasarlanmamıştır ve bu yüzden sanal alan açılmamış.NSTask - Sandboxing sorunları ile çalıştırılabilirlik başlatılıyor mu?

fırlatma kodu:

toolPath = [[[NSBundle mainBundle] pathForResource:@"myexecutable" ofType:@""] copy]; 
task = [[NSTask alloc] init]; 
[task setLaunchPath: toolPath]; 
pipe = [[NSPipe alloc] init]; 
[task setArguments:[NSArray arrayWithObjects:@"-someArg", someVariable, nil]]; 
file = [[NSFileHandle alloc] initWithFileDescriptor:[pipe fileHandleForReading].fileDescriptor]; 
[task setStandardOutput: stderrPipe]; 
[task launch]; 

şey - Xcode çalıştırırken bu her gayet iyi çalışıyor. Ayrıca, uygulamayı masaüstüne dışa aktarırken ve çalıştırırken de iyi çalışır.

Ancak, uygulamayı sıkıştırırsam, onu bir web sunucusuna yükleyin ve ardından aynı bilgisayara yükleyin (veya başka bir Mac'e bırakın), görev artık başlatılamıyor! Sistem konsolunda veya herhangi bir hatada hata yok.

Bu sorun hakkında biraz araştırma yaptım ve OSX'in yeni bir uygulamayı "karantinaya alınmış" özel izin hakkı olarak işaretleyeceğini öğrendim. Xcode benim uygulamayı dışa aktardıktan sonra yürütülebilir üzerinde

İzinler: Ben indirilen uygulaması ve ihraç app arasındaki farkı araştırıldı Bu noktada

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

uygulama çalışıyor ve yürütülebilir bir fırlatılır app içinde düğme. Ben itmek neler olacağı bu nokta şey de

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 
    com.apple.quarantine  26 

:

Ve sunucusuna yüklenebilir uygulama, sıkıştırma sonra

, indirilen sıkıştırması, ve uygulamanın açılması ve kabul diyalog "Bu uygulama internet indirilen edildi" Uygulamamdaki düğme.

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

ama çalıştırılabilir hala başlatılmaktadır değil geçerli:

Sonra bütün uygulaması üzerinde xattr -rd com.apple.quarantine çalıştırırsanız

, karantina uyarısı kaldırılır! Bu noktada

ben artık masaüstü uygulamasında aşağıdaki izinlere sahip:

/İçerik/MacOS:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/İçerik/Kaynaklar:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

Ve indirilen üzerinde xattr -rd'yi kullandığım uygulama:

/İçindekiler/MacOS:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/İçerik/Kaynaklar:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

ilk uygulaması çalışıyor ve ikincisi yürütülebilir başlattı asla. Ne halt oluyor? Aynı bilgisayarda, aynı izinlerle aynı uygulama, ancak indirilen kişi çalışmıyor.

Bu sorun, farklı bilgisayarlardaki tüm OSX sürümlerinde görüntülenir.

cevap

5

benim için bu sorunu çözdük.

Yardım uygulamam, NSTask ile başlatmaya çalıştığımda Could not set sandbox profile data: Operation not permitted (1) ile kilitlenmesine alışkınım. Elma belgelerinden

:

uygulama posix_spawn fonksiyon ya NSTask sınıfına biriyle oluşturulan bir çocuk süreç istihdam ediyorsa, onun ebeveyn kum miras çocuk sürecini yapılandırabilirsiniz. Ancak, bir alt işlem kullanılarak XPC hizmeti kullanılarak sağlanan güvenlik sağlanmaz. com.apple.security.app-kum ve com.apple.security.inherit:

çocuk hedef tam iki App Sandbox hak tuşlarını kullanmalısınız, kum miras sağlamak. Başka bir Uygulama Korumalı Alanı yetkisi belirtirseniz, sistem alt işlemi iptal eder. Bununla birlikte, iCloud ve bildirim yetkileri yoluyla bir çocuk sürecine diğer yetenekleri de verebilirsiniz.

Bir Xcode projesindeki ana uygulama, devralma hakkı için hiçbir zaman EVET değerine sahip olmamalıdır.

Umarım bu çözüm size yardımcı olur.

+0

thx !!!! Bu hiçbir çocuk işlemi –

+0

yardımcı oldu, ana uygulama bu sorunun coz çöktü olsun – Swati

+0

teşekkür ederim! NSTask kullanıyordum ve App Sandbox'ı ekledim = NO yetkisi beni kurtardı. – iOSDec

0

Nihayet bu soruna neden olan sonucu öğrendim, , dosyaları yazan NSTask ile çalıştırılabilir bir dosya başlatmaya çalışırken oldu. Strangely, bu, orijinal yayında belirtilen bazı durumlarda iyi çalışır. Ancak diğer bilgisayarlarda çalışmak için sorunu çözen STPrivilegedTask kullanarak bitti. yardımcı uygulamasına com.apple.security.inherit hak ekleme