2014-11-04 14 views
18

Context

Với iOS8 và phần mở rộng Apple giới thiệu các container nhóm App (more info here).lợi nhuận containerURLForSecurityApplicationGroupIdentifier Nil trên iOS Simulator

Vấn đề

Chúng tôi sử dụng nó thông qua containerURLForSecurityApplicationGroupIdentifier: phương pháp NSFileManager 's. Nó hoạt động tốt trong sản xuất trên AppStore (với cả iOS8 và iOS7). Vấn đề là kể từ khi nhóm của chúng tôi cập nhật thành Xcode 6.1 (6A1052d), phương thức trả về nil trên Trình mô phỏng.

Chúng tôi đã tìm kiếm rất nhiều nhưng chúng tôi không tìm thấy bất kỳ manh mối nào. Ngay cả điều này question hoặc this one không áp dụng tại đây.

TLDR: containerURLForSecurityApplicationGroupIdentifier: phương pháp Câu hỏi

Liệu NSFileManager 's hoạt động trên mô phỏng của bạn? Có cách nào để khắc phục điều đó?

+0

bất kỳ giải pháp nào bạn tìm thấy? –

+0

Tôi đang làm việc với WatchOS2 và iOS9, trên trình mô phỏng. Vấn đề tương tự này xảy ra với tôi nhưng không liên tục. Tôi phải đặt lại/xóa/khởi chạy lại mọi thứ sau mỗi 20 phút. Tại sao? – Josh

Trả lời

14

Tôi đã có thể giải quyết vấn đề này về phía tôi. Tài liệu hướng dẫn cho biết

Ứng dụng của bạn phải có quyền truy cập com.apple.security.application nhóm cho nhóm ứng dụng được chỉ định. https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/occ/instm/NSFileManager/containerURLForSecurityApplicationGroupIdentifier:

Tại một số thời điểm trong ứng dụng của tôi, tôi đã xóa tệp quyền lợi khỏi mục đích đăng ký/cài đặt/ký mã ứng dụng của tôi. Cả bản sửa lỗi và bản phát hành phải bao gồm tệp YOUR_APP.entitlements. Gỡ lỗi của tôi không bao gồm nó để nó không hoạt động trên trình mô phỏng

0

Phương thức containerURLForSecurityApplicationGroupIdentifier: hoạt động trong Trình mô phỏng của tôi. Nhưng nếu tôi xóa tất cả các tệp trong thư mục nhóm (trong trường hợp người dùng thực hiện đăng xuất trong ứng dụng của tôi), phương thức sẽ trả về nil trên RUN tiếp theo trong Xcode 6.1. Tôi đã thử nghiệm điều này với Xcode 6.2 và iOS SDK 8.2 Beta nhưng nó không hoạt động.

Mã chạy tốt trên thiết bị thực.

Tôi cũng đã thử các giải pháp trên mà không thành công.

0

Đối với tôi, có một số sự cố với Hồ sơ cấp phép iOS của nhóm (không bắt buộc phải chạy trong Trình mô phỏng).

Để chạy ứng dụng của tôi trên iPhone của tôi, tôi đã phải đầu tiên cấu hình lại iOS Đội Cung cấp hồ sơ cho môi trường Debug. Gọi containerURLForSecurityApplicationGroupIdentifier: hoạt động hoàn hảo trên thiết bị. Sau đó tôi quay trở lại Simulator và - ở đó bạn đi - nó cũng hoạt động trở lại.

18

Phương pháp containerURLForSecurityApplicationGroupIdentifier: hoạt động trên cả thiết bị và Trình mô phỏng.

Nếu bạn đã thiết lập cả hai mục tiêu (hoặc Mục tiêu và Phần mở rộng WatchKit chẳng hạn) sẽ chia sẻ dữ liệu để hỗ trợ Groups và tiếp tục trả lại nil, bạn có thể muốn kiểm tra cài đặt Mục tiêu của mình.

  1. Cài đặt Target> General> Team>yourCompany đội ký nên được chọn tại đây. Nếu có một cảnh báo và một Fix Nút này Issue, được tốt và khắc phục vấn đề bằng cách nhấn nó :)

  2. Cài đặt Target> Capabilities> App Groups> Is On + cho thấy bạn group.com. yourcompany.yourapp.sharedContainter tên nhóm ("sharedContainer" là tên lựa chọn của tôi) được chọn và có màu đen (không phải màu đỏ). Nếu màu đỏ hoặc có cảnh báo và khắc phục vấn đề này , hãy gia hạn nhóm hoặc tạo nhóm khác.

  3. Target Cài đặt> Build Cài đặt> Mã Ký> Mã Ký Quyền lợi: điểm đến quyền lợi của bạn file cho cả Debug và phát hành (giống như yourapp/yourApp.entitlements)

  4. Cài đặt Target> Xây dựng Cài đặt> Ký mã> Ký mã số Nhận dạng: Đảm bảo danh tính là một phần của Nhóm được chọn ở trên. Tôi sử dụng Nhà phát triển iOS.

  5. Cài đặt mục tiêu> Cài đặt xây dựng> Ký mã> Cấp phép Tiểu sử: Như trên, đảm bảo PP bạn đang sử dụng là của nhóm bắt buộc. Tôi đặt nó thành Tự động.

Kiểm tra các mục này cho cả hai mục tiêu chia sẻ dữ liệu.

Tôi hy vọng nó giúp

+0

Vấn đề của tôi là id gói, tôi có cùng một id gói cho ứng dụng và ứng dụng đồng hồ. Thông thường, chúng tôi cần 3 id nhóm, ứng dụng, ứng dụng đồng hồ và tiện ích mở rộng. – user281300

+1

FWIW, tôi đã phải chọn đúng ** provisioning Profile ** vì nó giữ không thành công với _Automatic_. – Pascal

+0

Nút _Fix Issue_ thực sự đã sửa lỗi này cho tôi. – orkoden

1

tôi thấy containerURLForSecurityApplicationGroupIdentifier có thể làm việc cả trên thiết bị thực tế và mô phỏng với xcode 6.2. Tôi đi qua vào chủ đề này bởi vì tôi cũng có nil, nhưng bây giờ tôi tìm thấy nguyên nhân gốc là lỗi đánh máy của tôi của tên 'Nhóm ứng dụng'.

hơn, đây là danh sách bạn cần kiểm tra:

  1. chắc chắn rằng 'các nhóm ứng dụng' được tạo ra bằng cách xcode hoặc web console tại https://developer.apple.com
  2. chắc chắn của các nhóm ứng dụng 'được 'kích hoạt' về 'Phát triển' và 'Sản xuất' tại 'bảng điều khiển web: Mã định danh-> ID ứng dụng'
  3. đảm bảo 'Hồ sơ cấp phép' phù hợp là 'hoạt động'
  4. tên nhóm quyền lợi trong cả ứng dụng và ứng dụng tiện ích mở rộng nên khớp với tên bạn đã tạo ở bước 1
  5. đảm bảo nhận dạng theo gói của tất cả các mục tiêu cũng giống như một từ 'web console: Identifiers-> App ID
  6. chắc chắn rằng 'đội' bên trong của tất cả các mục tiêu phù hợp với một từ web console
  7. làm chắc chắn để chọn đúng nhóm dưới tab 'khả năng' trên cả hai có chứa ứng dụng và ứng dụng mở rộng mục tiêu, và không có màu đỏ
  8. dọn dẹp bộ nhớ cache xcode bởi cmd + shift + k
  9. xây dựng lại và cầu nguyện
4

Nó không làm rõ các tài liệu nhưng tôi thấy rằng nhận dạng nhóm phân biệt chữ hoa chữ thường.

0

Tôi đã tìm thấy lý do của lỗi này trong trường hợp của tôi là một tệp ".com.apple.mobile_container_manager.metadata.plist". Sau khi tôi đã có tập tin của tôi từ thư mục này, tôi đã xóa tất cả các tập tin trong nó. Vì vậy, tập tin này cũng đã bị xóa. Và khi bạn xóa tập tin này, ứng dụng trả về cho bạn một nil cho containerURLForSecurityApplicationGroupIdentifier

Vì vậy, tôi đã thay đổi mã của tôi như thế này:

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]; 
     } 
    } 

Bây giờ nó hoạt động tuyệt vời, ngay cả trong mô phỏng.

Các vấn đề liên quan