据我所知,我知道我们可以通过App Groups
相同的开发者帐户/证书共享两个应用程序之间的文件.
但我的问题是:我可以Sharing file between different apps through App Groups
使用由我自己处理的不同开发者帐户开发的不同应用程序执行相同的操作吗?
目前我正在为已有的App(迁移到Swift 3)进行更新.我有针对Today-,Search-,Message-和Watch Extensions的目标.每个目标都需要访问我的应用程序的核心数据模型,因此我创建了一个AppGroup并为每个目标启用了Capability.虽然我已经将NSPersistentStoreCoordinator子类化,但所有内容都存储在共享文件夹中:
import CoreData
class PFPersistentContainer: NSPersistentContainer {
override open class func defaultDirectoryURL() -> URL {
if let url = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "add-groupname-here") {
return url
}
// Fallback
return super.defaultDirectoryURL()
}
}
Run Code Online (Sandbox Code Playgroud)
这个类文件,以及我的Core-Data-Model和下面的类都是所有提到的目标的目标成员.实体的Codegen设置为Class Definition
.到目前为止,我正在使用Core Data Stack的默认实现:
class DataManager {
/**
* Singleton Implementation
*/
internal static let sharedInstance:DataManager = {
let instance = DataManager()
return instance
}()
// MARK: - Core Data stack
lazy var persistentContainer: PFPersistentContainer = {
let container = PFPersistentContainer(name: "Data")
container.loadPersistentStores(completionHandler: { (storeDescription, …
Run Code Online (Sandbox Code Playgroud) 我有一个消息应用程序,当我收到包含新消息的 APN 时,我使用应用程序扩展来查找联系信息。我在 NSUserDefaults 的帮助下通过应用程序组交换保存在应用程序中的地址簿联系人信息。
最近我不断收到以下错误:
[用户默认值] 无法读取 CFPrefsPlistSource 中的值(域:group.com.xxxx.xxxx,用户:kCFPreferencesAnyUser,ByHost:是,容器:(空),内容需要刷新:是):仅将 kCFPreferencesAnyUser 与容器一起使用允许系统容器,与 cfprefsd 分离
这有时会在我的应用程序中返回空的 NSUserDefaults 并使应用程序表现得像第一次使用一样。我查看了其他链接,特别是这个:无法读取 CFPrefsPlistSource iOS 10 中的值
建议的解决方案都没有解决我的问题。有人知道我应该如何继续吗?
背景
我正在开发一个带有相关 Today Widget 扩展的 OSX 应用程序。我希望主应用程序和扩展程序可以共享用户首选项,这与与Apple 的包含应用程序共享数据中的描述非常相似。就我而言,主应用程序写入首选项,扩展程序读取它们。
应用程序和扩展程序都是沙盒化的。他们也是同一个应用程序组的成员。codesign -d --entitlements
在应用程序和扩展程序上使用 验证的相关权利
:
com.apple.security.app-sandbox: true
com.apple.security.application-groups:
- com.example.Common
Run Code Online (Sandbox Code Playgroud)
代码
应用程序和扩展程序共享相同的代码来初始化和访问NSUserDefaults
.
NSUserDefaults.init(suiteName: "com.example.Common")
Run Code Online (Sandbox Code Playgroud)
问题
主应用程序在以下位置创建首选项:
~/Library/Containers/com.example/Data/Library/Preferences/com.example.Common.plist
Run Code Online (Sandbox Code Playgroud)
当扩展打开时,它的NSUserDefault
实例是空的。
如果我将应用程序创建的 plist 移动到:
~/Library/Group Containers/com.example.Common/Library/Preferences/com.example.Common.plist
Run Code Online (Sandbox Code Playgroud)
扩展的NSUserDefault
实例填充有预期值。
注意:从 Xcode 构建和运行应用程序时不会发生以下情况,只有在选择产品 -> 存档,然后导出 -> 导出为 Mac 应用程序时才会发生。从 Xcode 构建/运行时,主应用程序会创建 plist 文件,其中扩展程序需要如上所述。
当我尝试将我的应用程序上传到 Mac App Store 时,出现错误 -
iTunes Store 操作失败。
无效的代码签名权利。您的应用程序包的签名包含 Mac OS X 不支持的代码签名权利。具体来说,“com.MyCompany.mac”中密钥“com.apple.security.application-groups”的值“[group.MyCompany.MyProject]”。不支持 MyProject.pkg/Payload/MyProject.app/Contents/MacOS/MyProject'。该值应该是一个字符串或一个字符串数组,每个字符串都以您的 TEAMID 开头,后跟一个点“.”。.
但我读到共享组必须以group.
前缀开头- 那么正确的方法是什么?
我正在macOS 10.13上开发一个沙盒应用程序.它是一个类似鞋盒的应用程序,由带工具栏的主窗口组成.在Interface Builder中设置窗口框架和工具栏配置的自动保存.
如果我运行并退出应用程序,我可以<app-identifier>.plist
在应用程序的沙箱容器中看到包含预期数据的首选项文件(已命名).一切正常.
为了与其他沙盒应用程序进行数据交换,我在Capabilities
Xcode的目标选项卡中创建了一个应用程序组.
到目前为止,这是有效的,即在启动应用程序时会创建一个额外的组容器.还可以通过创建UserDefaults
对象来将共享首选项存储到组容器中UserDefaults.init(suiteName:"<group-name>")
.
添加应用程序组后,例如工具栏配置的自动保存机制不再有效.在干净的Mac上启动和退出应用程序不再在应用程序容器.plist
的Preferences
目录中创建文件.而是控制台显示如下消息:
[User Defaults] attempt to set <value> for key in <key> in
non-persistent preferences domain CFPrefsPlistSource<address>
(Domain: <app-identifier>, User: kCFPreferencesCurrentUser,
ByHost: No, Container: (null), Contents Need Refresh: Yes)
Run Code Online (Sandbox Code Playgroud)
它找我,自动保存机制不再能够将其数据写入首选项文件.
是否可以在应用程序组中同时使用标准UserDefaults和共享的UserDefaults?
appgroups ×6
ios ×2
macos ×2
cocoa ×1
core-data ×1
entitlements ×1
objective-c ×1
swift3 ×1
watchos-3 ×1
xcode ×1