iOS 8昨天发布了一个涉及App Groups的新API。在此之前,共享数据和在应用程序之间进行通信有点混乱,我相信这正是App Groups旨在纠正的问题。
在我的应用程序中,我已经启用了App Groups并添加了一个新组,但我就是找不到任何关于如何使用它的文档。文档和API参考只说明如何添加组。
那么,App Groups的真正目的是什么?是否有任何文档介绍如何使用它?
iOS 8昨天发布了一个涉及App Groups的新API。在此之前,共享数据和在应用程序之间进行通信有点混乱,我相信这正是App Groups旨在纠正的问题。
在我的应用程序中,我已经启用了App Groups并添加了一个新组,但我就是找不到任何关于如何使用它的文档。文档和API参考只说明如何添加组。
那么,App Groups的真正目的是什么?是否有任何文档介绍如何使用它?
使用App Groups的另一个好处是可以共享NSUserDefaults
数据库,这也适用于应用程序扩展(通知中心小部件、自定义键盘等)。
在应用程序组中的所有应用程序中像这样初始化您的NSUserDefaults
对象,它们将共享数据库:
Objective-C:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
Swift:
NSUserDefaults(suiteName: "<group identifier>")
请注意,每个应用程序的[NSUserDefaults standardUserDefaults]
数据库中的所有内容都不会转移到此数据库中。
文档(截至Beta 3)也给出了正确的示例。
并且不要忘记同步数据库:
[yourDefaults synchronize];
在多个应用程序之间共享NSUserDefaults数据
为了在一个应用程序和扩展或两个应用程序之间拥有共享的默认值,您需要按照以下步骤在设置中添加一个App Group:
注意:如果您转到Apple Developer Portal(显示所有证书、标识符、设备和预配配置文件的Apple网站)并转到Identifiers > App Groups,则应看到此新的App Group。
存储数据:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()
获取数据的方法:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String {
print("User Id: \(testUserId)")
}
func application(app: UIApplication,
openURL url: NSURL, options: [String : AnyObject]) -> Bool
- Taimur Ajmal根据我对现有文档的理解,应用程序组主要面向扩展,更具体地说是小部件。小部件是其自己的应用程序包,与您的应用程序共存。由于它们是单独的应用程序,因此具有自己的沙箱,您需要使用应用程序组来共享文件。
经过一些头文件的搜索,我认为我找到了所需的API,但实际上这是作为iOS 7的一部分加入的。
NSFileManager
有一个方法containerURLForSecurityApplicationGroupIdentifier:
,您可以通过该方法传递在打开应用程序组时创建的标识符:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
NSUserDefaults
正常工作,我认为这是 Beta 1 版本的 bug。 - Wayne HartmanNSUserDefaults
数据库有一个解决方法。请查看我的回答。 - Andrewvar userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
这会在很多地方引起问题:
一般情况下,解决此问题的方法是使用当前构建的默认键前缀。您可以通过为配置设置不同的包标识符来轻松检测运行时配置。然后只需从NSBundle.mainBundle()
中读取包标识符即可。如果您具有相同的包标识符,则需要设置不同的预处理器宏,例如
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
NSUserDefaults.standardUserDefaults()
。 - DanieliOS App Group
App Group
允许您在同一开发团队(账户)的不同进程(应用程序、扩展等)之间共享数据(UserDefaults、文件、CoreData(管理模型图)、POSIX锁)。它创建了一个具有 id
的 共享容器
,应以 group.
开头保存/缓存数据,您可以通过URL和IPC访问。
要使用 UserDefaults 使用 App Group
创建后,您可以在 Apple Developer 上进行检查。证书、ID 和配置文件 -> 所有组
let defaults = UserDefaults(suiteName: "group.goforit")
defaults?.setValue("Hello World!", forKey: "key1")
let defaults = UserDefaults(suiteName: "group.goforit")
let result = defaults?.value(forKey: "key1") //Hello World!
let rootURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.goforit")
//file:///Users/alex/Library/Developer/CoreSimulator/Devices/1AF41817-FE2E-485A-A592-12C39C0B0141/data/Containers/Shared/AppGroup/DC14D43F-2C2C-4771-83BE-64A9F54BD2E1/
存储
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()