2013-12-19 27 views
0

我正在開發一個小應用,充當第三方應用的插件。爲了它的功能,我需要從第三方應用程序(這裏是「其他應用程序」)訪問保存的文件。在較新的版本中,另一個應用程序將它保存在〜/ Application Support/Test App/Saved Files /中。快速找到名稱中包含特定短語的應用的完整路徑

這是很容易去使用這樣的事情:

NSString *savedFiles = [NSHomeDirectory() stringByAppendingPathComponent:@"~/Application Support/Test App/Saved Files"]; 

但我也想讓它與舊版本兼容,並且它們不使用的應用程序支持文件夾。舊版本的用戶的應用程序文件夾中的文件夾中去,例如這種結構: 〜/應用/測試應用程序/測試App.app 〜/應用/測試應用程序/保存的文件/

我可以使用相同的上面找到保存文件的位置。但是應用程序不會一直安裝在此處,或者文件夾名稱可能會因不同的語言而不同。這就是問題。

我覺得到目前爲止,我還以爲下面是選項,以獲取路徑:

  1. 要求用戶導航到該文件從 我的應用程序中的文件選擇器。
  2. 詢問用戶「Test App.app」的位置,通過「../Saved Files /」得到 路徑。
  3. 應用程序可以通過系統獲取以前運行的應用程序的路徑嗎?
  4. 應用程序可以使用聚光燈來快速找到位置嗎?
  5. 還有其他方法可以自動,可靠,快速地做到這一點嗎?

1和2不是首選,因爲這需要用戶「工作」才能爲應用提供路徑。你們都在想什麼? 有沒有其他的方法來實現這個自動化? 這將是最快的?

+0

因此,你是否試圖從應用程序支持中獲取某些東西,或者修改應用程序的包? – CodaFi

+0

兩者都不是。我試圖獲得應用程序的完整路徑,我只知道名稱。例如。我知道應用名稱包含「測試應用」 – Tiago

+0

有一個完整的搜索框架 - 閱讀[SearchKit](https://developer.apple.com/library/mac/documentation/userexperience/conceptual/SearchKitConcepts/searchKit_intro/searchKit_intro .html)的所有你想知道的。 – Caleb

回答

2

你可以試着問了應用程序的位置LaunchServices,鑑於其與LSFindApplicationForInfo電話捆綁標識符:

CFURLRef urlRef = NULL; 
LSFindApplicationForInfo(kLSUnknownCreator, (CFStringRef)@"com.example.some-app", NULL, NULL, &urlRef); 
NSLog(@"URL: %@", (__bridge id)urlRef); 

這假定捆綁標識符是你所提到的兩個變體之間的相同。如果它真的只是名稱是相同的,你可以通過名稱來代替:

CFURLRef urlRef = NULL; 
LSFindApplicationForInfo(kLSUnknownCreator, NULL, (CFStringRef)@"Test App.app", NULL, &urlRef); 
NSLog(@"URL: %@", (__bridge id)urlRef); 
+0

這太棒了,標識符是唯一不同的版本和語言,否則我不得不考慮某種形式的部分「應用程序名稱」匹配,基於什麼沒有改變。我會試試這個,並會讓你知道。謝謝! – Tiago

+0

這似乎工作,謝謝!你知道是否有情況LaunchServices可能不會返回上述任何內容,使用包標識符? (應用程序不存在) – Tiago

+0

我不太確定是否有與Spotlight的連接,因此您可能想要在卷或整個系統上禁用Spotlight的情況下嘗試使用Spotlight。您可以始終使用以下命令查詢LaunchServices數據庫:'/ System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister' –

相關問題