2012-04-06 12 views
10

Aslan uygulamamı Uygulama Korumalı Alanı'nı kullanacak şekilde dönüştürüyorum. Bir klasöre kalıcı erişim sağlamak için 10.7.3'te tanıtılan security-scoped bookmarks özelliğinden yararlanmaya çalışıyorum. Aşağıda bulunan kod, bir nil yer işareti döndürür ve aşağıdaki günlük iletisini üretir: XPC couldn't look up the Mach service for scoped bookmarks agent.Güvenlik Kapsamında Oluşturulmakta Sorun Oluşuyor

User Selected File Access yetkilendirmesini Read/Write Access numaralı telefona ayarlıyorum ve aynı zamanda çevreleyen ..AccessingSecurityScopedResource çağrıları ile veya bunlar olmadan da denedim.

Sanırım belgelere göre her şeyi doğru yapıyorum, bu yüzden herhangi bir işaretçiyi takdir ediyorum. Kod, uygulamayı korumayı başlatmadan önce düz bir URL almak için çalışıyordu.

NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
[openPanel setCanChooseFiles:NO]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel setAllowsMultipleSelection:NO]; 

NSInteger result = [openPanel runModal]; 

if(result == NSFileHandlingPanelCancelButton) { 
    return; 
} 

NSArray *urls = [openPanel URLs]; 

if(urls != nil && [urls count] == 1) { 
    NSURL *url = [urls objectAtIndex:0]; 

    NSData *bookmark = nil; 
    NSError *error = nil; 
    bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
      includingResourceValuesForKeys:nil 
           relativeToURL:nil // Make it app-scoped 
             error:&error]; 
    if (error) { 
     NSLog(@"Error creating bookmark for URL (%@): %@", url, error); 
     [NSApp presentError:error]; 
    } 

    NSLog(@"bookmark: %@", bookmark); 
} 

Güncellemesi (x3) o çalışma var, ben -startAccessingSecurityScopedResource ve -stopAccessingSecurityScopedResource için çağrılar kaynağa Powerbox hibe erişim beri, yukarıdaki kodda gerekli olmadığını doğrulayabilirsiniz Şimdi

Kullanıcı NSOpenPanel'da seçtikten sonra.

Başka bir uygulama oturumunda oluşturulan bir uygulamada işaretlenmiş yer işaretinden belge kapsamlı bir yer işareti oluşturma gibi başka bir güvenlik kapsamındaki URL'den bir yer işareti oluşturuyorsanız, önce dosyaya erişmeniz gerekir.

+2

başlangıç ​​/ çağrılar gerekli asla durdurun. NSOpenPanel'den zaten erişiminiz var. Yer imi, gelecekteki işlemler için bu erişimi kaydediyor. Ve gelecekteki bu çalışmalar, startAccessingSecurityScopedResource öğesini (yer işaretini çözümlemek için geri aldığınız URL'de) aramanız gereken yerlerdir. – abarnert

+0

@abarnert Haklı olduğuma inanıyorum, çünkü gönderdiğim kodda bir 'NSOpenPanel' kullanıyorum, ancak bir NSOpenPanel 'veya' NSSavePanel 'dışındaki bir kaynaktan bir yer imi oluşturuyorsanız buna ihtiyacınız var. varolan birinden yeni bir yer imi oluşturuyor. Gönderiyi güncelledim. – Dov

+0

Dokümantasyon gözlerimi 'güvenlik kapsamlı yer imleri' bulduğumdan akıyordu ve bu da gerçekten faydalı örnek koddur. Bir etiket oluşturma gücüm yok, "güvenlik kapsamlı bir yer işareti" etiketi eklememizi önerebilir miyim? – Mark

cevap

8

Ben çok önemli bir hak, the documentation yılında UI listelenen, ancak listede yoksa eksikti çıkıyor: Bir yer imi yaparken

com.apple.security.files.bookmarks.app-scope 
+2

Teşekkürler, bu işi yapmak için ihtiyacım olan şey buydu. Sadece -startAccessingSecurityScopedResource ile ilgili güncellemenize gerek duymadığımı eklemem gerektiğini eklemek istedim; Bunu kodumdan çıkarırsam, kaynağa artık erişemiyorum. – escrafford

+0

Bu çözümü paylaştığınız için çok teşekkür ederim. Kodumu hata ayıklamak için sadece bu yetkinin Aslan'da gerekli olduğunu (Dağ Aslanı'nda olmadığını) keşfetmek için harcadım. – Nickkk

İlgili konular