2014-11-04 81 views
18

語境

隨着iOS8上和擴展蘋果推出應用程序組容器(more info here)。containerURLForSecurityApplicationGroupIdentifier返回nil在iOS模擬器

問題

我們使用它來NSFileManagercontainerURLForSecurityApplicationGroupIdentifier:方法。它適用於AppStore上的生產(包括iOS8和iOS7)。問題在於我們的團隊更新到Xcode 6.1 (6A1052d),方法在模擬器上返回nil

我們搜索了很多,但我們沒有設法找到任何線索。即使這questionthis one這裏不適用。

TLDR:問題

NSFileManagercontainerURLForSecurityApplicationGroupIdentifier:方法適用於您的模擬器?有什麼辦法解決這個問題嗎?

+0

您找到的任何解決方案? – 2015-02-04 05:40:59

+0

我正在模擬器上使用WatchOS2和iOS9。同樣的問題發生在我身上,但間歇性地發生。我必須每20分鐘重置/擦除/重新啓動一切。爲什麼? – Josh 2016-01-28 11:14:51

回答

14

我能夠在我身邊解決這個問題。文檔說

您的應用程序必須爲指定的應用程序組擁有com.apple.security.application-group權利 。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/occ/instm/NSFileManager/containerURLForSecurityApplicationGroupIdentifier

在我的應用程序的某個時刻,我已經從我的應用程序的目標/構建設置/代碼簽名/代碼簽名權利刪除的權利文件。調試和發佈都必須包含YOUR_APP.entitlements文件。我的調試不包括它,所以它不能在模擬器上工作

0

方法containerURLForSecurityApplicationGroupIdentifier:在我的模擬器中工作。但是,如果我刪除組文件夾中的所有文件(萬一用戶在我的應用程序中執行註銷),則該方法在Xcode 6.1中的下一個RUN中返回nil。我用Xcode 6.2和iOS SDK 8.2 Beta測試了它,但它不起作用。

該代碼在真實設備上運行良好。

我也試過上述解決方案沒有成功。

0

對我來說,我的iOS團隊配置文件(它不需要在模擬器中運行)有一些混亂。

爲了在我的iPhone上運行我的應用程序,我必須先爲調試環境重新配置iOS團隊配置文件。調用containerURLForSecurityApplicationGroupIdentifier:在設備上工作得非常好。之後我回到了模擬器,並且 - 你去了 - 它再次運行。

18

方法containerURLForSecurityApplicationGroupIdentifier:適用於設備和模擬器。

如果您已經設置了要共享數據以支持組的兩個目標(例如Target和WatchKit擴展),並且它一直返回,,您可能需要檢查目標設置。

  1. 目標設置>常規>團隊>yourCompany簽約團隊應該在這裏選擇。如果有警告和解決這個問題按鈕,善於 並擊中它解決這個問題:)

  2. 目標設置>功能>應用論壇>是+顯示您 group.com。 yourcompany.yourapp.sharedContainter組名稱(「sharedContainer」是我的選擇名稱)被選中,並且處於黑色 (而不是紅色)。如果它是紅色或有警告並修復此問題 按鈕,請更新組或創建一個不同的組。

  3. 目標設置>構建設置>代碼簽名證書>代碼簽名 應享權利:指向您的權利爲Debug和 版本(類似yourApp/yourApp.entitlements

  4. 目標設置文件>構建設置>代碼簽名>代碼簽名 身份:確保身份是上面選擇的團隊的一部分。我用iOS Developer

  5. 目標設置>構建設置>代碼簽名>配置 配置文件:如上所述,確保您使用的PP是團隊 必需的。我將它設置爲自動

檢查那些爲兩個目標共享數據。

我希望它能幫助

+0

我的問題是捆綁ID,我有相同的應用程序捆綁ID和手錶應用程序。通常我們需要3個捆綁ID,應用程序,手錶應用程序和擴展。 – user281300 2015-04-13 15:26:18

+1

FWIW,我必須明確地選擇正確的** Provisioning Profile **,因爲它保持_Automatic_失敗。 – Pascal 2015-08-16 10:41:55

+0

_Fix Issue_按鈕實際上爲我解決了這個問題。 – orkoden 2015-08-19 17:00:45

1

我發現containerURLForSecurityApplicationGroupIdentifier可以做真實的設備和模擬器的工作都和Xcode 6.2。我遇到了這個線程,因爲我也沒有,但現在我發現根本原因是我的'應用程序組'名稱的打字錯誤。

更多,這裏是你需要檢查列表:

  1. 確保「應用程序組」中創建或者通過Xcode中或Web控制檯在https://developer.apple.com
  2. 確保被「啓用」的「應用程序組」在「發展」和「生產」的「Web控制檯:Identifiers->應用ID」
  3. 確保匹配「供應配置文件」是「主動」
  4. 在兩者都含有應用程序和擴展應用程序權利的團體名稱應匹配您在步驟1中創建的那個
  5. 確保所有目標的包標識符是一樣的,從一個「Web控制檯:Identifiers->應用ID
  6. 確保‘所有目標的團隊’內與從Web控制檯
  7. 使一體化一定要挑選正確的組「能力」標籤下對兩者都含有應用和推廣應用目標,並且沒有紅色
  8. 通過CMD清理xcode的高速緩存+移位+ K
  9. 重建和祈禱
4

它沒有清楚的文件,但我發現了組標識符區分大小寫。

0

我發現在我的情況下這個錯誤的原因是一個文件「.com.apple.mobile_container_manager.metadata.plist」。從這個目錄中獲得我的文件後,我刪除了其中的所有文件。所以這個文件也被刪除了。當你刪除此文件,應用程序將返回一個nilcontainerURLForSecurityApplicationGroupIdentifier

所以我改變了我的代碼如下:

NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YGGroupIdentifier]; 
    NSArray *fileArray = [fileManager contentsOfDirectoryAtPath:[groupPath path] error:nil]; 
    for (NSString *filename in fileArray) { 
     if (![filename hasPrefix:@".com"]) { 
      [fileManager removeItemAtPath:[[groupPath path] stringByAppendingPathComponent:filename] error:nil]; 
     } 
    } 

現在,它的偉大工程,即使是在模擬器。