Communicating and persisting data between apps with App Groups
iOS 8 revealed a new API yesterday concerning App Groups. It was kind of messy before to share data and communicate between apps and I believe that's precisely what App Groups is intended to correct.
In my app I have enabled App Groups and added a new group but I just can't find any documentation on how to use it. Documentation and API references only state how to add a group.
So what is App Groups really intended to do? Is there any documentation somewhere on how to use it?
ios objective-c ios8 ios-app-extension
add a comment |
iOS 8 revealed a new API yesterday concerning App Groups. It was kind of messy before to share data and communicate between apps and I believe that's precisely what App Groups is intended to correct.
In my app I have enabled App Groups and added a new group but I just can't find any documentation on how to use it. Documentation and API references only state how to add a group.
So what is App Groups really intended to do? Is there any documentation somewhere on how to use it?
ios objective-c ios8 ios-app-extension
add a comment |
iOS 8 revealed a new API yesterday concerning App Groups. It was kind of messy before to share data and communicate between apps and I believe that's precisely what App Groups is intended to correct.
In my app I have enabled App Groups and added a new group but I just can't find any documentation on how to use it. Documentation and API references only state how to add a group.
So what is App Groups really intended to do? Is there any documentation somewhere on how to use it?
ios objective-c ios8 ios-app-extension
iOS 8 revealed a new API yesterday concerning App Groups. It was kind of messy before to share data and communicate between apps and I believe that's precisely what App Groups is intended to correct.
In my app I have enabled App Groups and added a new group but I just can't find any documentation on how to use it. Documentation and API references only state how to add a group.
So what is App Groups really intended to do? Is there any documentation somewhere on how to use it?
ios objective-c ios8 ios-app-extension
ios objective-c ios8 ios-app-extension
edited Mar 21 '16 at 21:58
TenaciousJay
4,72633143
4,72633143
asked Jun 3 '14 at 12:43
streemstreem
7,40552538
7,40552538
add a comment |
add a comment |
5 Answers
5
active
oldest
votes
Another benefit to App Groups is the ability to share a NSUserDefaults
database. This also works for App Extensions (notification center widgets, custom keyboards, etc).
Initialize your NSUserDefaults
object like this in all applications in the app group and they will share the database:
Objective-C:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
Swift:
NSUserDefaults(suiteName: "<group identifier>")
Keep in mind everything from the [NSUserDefaults standardUserDefaults]
database for each application will not carry over into this database.
The documentation gives a correct example as well (As of Beta 3).
And don't forget to synchronize the database:
[yourDefaults synchronize];
2
Works only on simulator (XCode 6 beta 5, iOS 8 beta 5)
– Otto Boy
Aug 13 '14 at 13:56
8
NOTE: If you're using this with an iOS 8 Extension (e.g. keyboard), you'll need to ensure your extension has RequestsOpenAccess=YES in its Info.plist file.
– Kiran Panesar
Aug 27 '14 at 15:09
1
I did RequestsOpenAccess=YES and follow instruction still it wan't works for me on Device and works fine on Emulator, anything specific for device ?
– MAC
Nov 19 '14 at 12:33
Same issue with me, i have integrated share extension in my app, it work on simulator, but not working on real device ,,i have added the RequestOpenAccess =YES but its not work, my question is stackoverflow.com/questions/30489894/…
– Ravi Ojha
May 29 '15 at 3:35
3
@MikeRichards not sure, but if I remember correctly the app groups are prefixed with a team id
– Santa Claus
Jan 26 '16 at 18:25
|
show 5 more comments
Sharing NSUserDefaults data between multiple apps
In order to have shared defaults between an app and an extension or between 2 apps you have to add an App Group in your settings using the following steps:
- In the Project Navigator click on the *.xcodeproj file (should be at the top).
- To the right of the Project Navigator look for Project and Targets. Under targets click on your primary target (should be the first thing under Targets).
- Towards the top, click on the Capabilities tab.
- In the App Groups section click the switch to the right to turn App Groups ON.
- Click on the + button and add an App Group named group.com.company.myApp.
- Go to the same place in your other apps and this group should now be available to select. Turn this group on for each app that will be using this shared data.
Note: If you go to the Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) and go to Identifiers > App Groups you should see this new App Group.
To store data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()
To retrieve data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String
print("User Id: (testUserId)")
this needs to be voted up. great answer.
– AppA11y
Jan 8 '16 at 16:22
Thanks! It took a bit of searching through documentation to figure out how to do this and I thought others might appreciate the steps I took.
– TenaciousJay
Feb 5 '16 at 3:47
Best answer! Thank you so much, exactly what I needed +1000000
– Unome
Feb 9 '16 at 19:57
Thanks for the detailed description...! do we need to created any certificate from Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) to enable this group? same like Push notification.?
– Arbaz Shaikh
Mar 21 '16 at 8:44
When you do step 5 it should add the App Group to the Apple Developer Portal, you should not have to go directly to the Developer Portal to add it. After you do step 5 you can go to the portal and see that it should have created it for you.
– TenaciousJay
Mar 21 '16 at 21:35
|
show 3 more comments
Application groups, according to my interpretation of the existing documentation, are primarily targeted for extensions, more specifically, for widgets. Widgets are their own application bundle that coexist with your app. Since they are a separate application and therefore have their own sandbox, you will need to use App Groups to share files.
After some header grep'ing, I think I found the API needed, but was actually put in as part of iOS 7.
NSFileManager
has a method on it containerURLForSecurityApplicationGroupIdentifier:
where you can pass in the identifier you created when turning on App Groups for your apps:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
Thanks, I believe you're right about extensibility. I'm a little bit more dubious about this iOS 7 method, it seems pretty static to me, iOS 8 introduced real interactions and communication between apps.
– streem
Jun 4 '14 at 8:15
@Justafinger This iOS 7 method is only for creating a URL to write to and read from data between the shared applications. This particular method is only really useful (from what I see so far) for widgets, but not other extensions.
– Wayne Hartman
Jun 4 '14 at 12:33
Well, i believe Apple wanted to make this easier in iOS 8 without having to create a container programmatically and share custom files. Documentation states that you should be able to share data by using NSUserDefault. I guess i'm missing something, because that's not working for me.
– streem
Jun 4 '14 at 14:47
@Justafinger I have not been able to getNSUserDefaults
to work, either. I chalk to up to Beta 1 bug.
– Wayne Hartman
Jun 4 '14 at 15:59
@WayneHartman There is a workaround for theNSUserDefaults
database. See my answer.
– Santa Claus
Jun 5 '14 at 14:40
add a comment |
One important trap I tapped into today is the following:
In many projects I saw a single app target and with different bundle identifiers set for each configuration of that target. Here things get messy. What the developers intended was to create a debug app for the debug config and a production app for the release target.
If you do so both apps will share the same NSUserDefaults when they are set up like so
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
This causes problems in many places:
- Imagine you set YES for a key when a special app-intro-screen has been shown to the user. The other app will now also read YES and don't show the intro.
- Yes some apps also store oAuth tokens in their user defaults. Anyways... Depending on the implementation, the app will recognize that there's a token and start retrieving data using the wrong token. The chance is high that this will fail with strange errors.
The solution to this problem in general is to prefix the defaults keys with the current configuration built. You can detect the configuration easily at runtime by setting different bundle identifiers for your configurations. Then just read the bundle identifier from NSBundle.mainBundle()
. If you have the same bundle identifiers you need to set different preprocessor macros like
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
In Swift it will look almost the same:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
7
Your problems exist because you mix all your data in a shared UserDefaults. You should useNSUserDefaults.standardUserDefaults()
for data that should not be shared.
– Daniel
Feb 22 '16 at 15:18
add a comment |
To store
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24015506%2fcommunicating-and-persisting-data-between-apps-with-app-groups%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
Another benefit to App Groups is the ability to share a NSUserDefaults
database. This also works for App Extensions (notification center widgets, custom keyboards, etc).
Initialize your NSUserDefaults
object like this in all applications in the app group and they will share the database:
Objective-C:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
Swift:
NSUserDefaults(suiteName: "<group identifier>")
Keep in mind everything from the [NSUserDefaults standardUserDefaults]
database for each application will not carry over into this database.
The documentation gives a correct example as well (As of Beta 3).
And don't forget to synchronize the database:
[yourDefaults synchronize];
2
Works only on simulator (XCode 6 beta 5, iOS 8 beta 5)
– Otto Boy
Aug 13 '14 at 13:56
8
NOTE: If you're using this with an iOS 8 Extension (e.g. keyboard), you'll need to ensure your extension has RequestsOpenAccess=YES in its Info.plist file.
– Kiran Panesar
Aug 27 '14 at 15:09
1
I did RequestsOpenAccess=YES and follow instruction still it wan't works for me on Device and works fine on Emulator, anything specific for device ?
– MAC
Nov 19 '14 at 12:33
Same issue with me, i have integrated share extension in my app, it work on simulator, but not working on real device ,,i have added the RequestOpenAccess =YES but its not work, my question is stackoverflow.com/questions/30489894/…
– Ravi Ojha
May 29 '15 at 3:35
3
@MikeRichards not sure, but if I remember correctly the app groups are prefixed with a team id
– Santa Claus
Jan 26 '16 at 18:25
|
show 5 more comments
Another benefit to App Groups is the ability to share a NSUserDefaults
database. This also works for App Extensions (notification center widgets, custom keyboards, etc).
Initialize your NSUserDefaults
object like this in all applications in the app group and they will share the database:
Objective-C:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
Swift:
NSUserDefaults(suiteName: "<group identifier>")
Keep in mind everything from the [NSUserDefaults standardUserDefaults]
database for each application will not carry over into this database.
The documentation gives a correct example as well (As of Beta 3).
And don't forget to synchronize the database:
[yourDefaults synchronize];
2
Works only on simulator (XCode 6 beta 5, iOS 8 beta 5)
– Otto Boy
Aug 13 '14 at 13:56
8
NOTE: If you're using this with an iOS 8 Extension (e.g. keyboard), you'll need to ensure your extension has RequestsOpenAccess=YES in its Info.plist file.
– Kiran Panesar
Aug 27 '14 at 15:09
1
I did RequestsOpenAccess=YES and follow instruction still it wan't works for me on Device and works fine on Emulator, anything specific for device ?
– MAC
Nov 19 '14 at 12:33
Same issue with me, i have integrated share extension in my app, it work on simulator, but not working on real device ,,i have added the RequestOpenAccess =YES but its not work, my question is stackoverflow.com/questions/30489894/…
– Ravi Ojha
May 29 '15 at 3:35
3
@MikeRichards not sure, but if I remember correctly the app groups are prefixed with a team id
– Santa Claus
Jan 26 '16 at 18:25
|
show 5 more comments
Another benefit to App Groups is the ability to share a NSUserDefaults
database. This also works for App Extensions (notification center widgets, custom keyboards, etc).
Initialize your NSUserDefaults
object like this in all applications in the app group and they will share the database:
Objective-C:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
Swift:
NSUserDefaults(suiteName: "<group identifier>")
Keep in mind everything from the [NSUserDefaults standardUserDefaults]
database for each application will not carry over into this database.
The documentation gives a correct example as well (As of Beta 3).
And don't forget to synchronize the database:
[yourDefaults synchronize];
Another benefit to App Groups is the ability to share a NSUserDefaults
database. This also works for App Extensions (notification center widgets, custom keyboards, etc).
Initialize your NSUserDefaults
object like this in all applications in the app group and they will share the database:
Objective-C:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
Swift:
NSUserDefaults(suiteName: "<group identifier>")
Keep in mind everything from the [NSUserDefaults standardUserDefaults]
database for each application will not carry over into this database.
The documentation gives a correct example as well (As of Beta 3).
And don't forget to synchronize the database:
[yourDefaults synchronize];
edited Mar 28 '17 at 12:08
Marmoy
6,29043767
6,29043767
answered Jun 5 '14 at 14:39
Santa ClausSanta Claus
12.2k55291
12.2k55291
2
Works only on simulator (XCode 6 beta 5, iOS 8 beta 5)
– Otto Boy
Aug 13 '14 at 13:56
8
NOTE: If you're using this with an iOS 8 Extension (e.g. keyboard), you'll need to ensure your extension has RequestsOpenAccess=YES in its Info.plist file.
– Kiran Panesar
Aug 27 '14 at 15:09
1
I did RequestsOpenAccess=YES and follow instruction still it wan't works for me on Device and works fine on Emulator, anything specific for device ?
– MAC
Nov 19 '14 at 12:33
Same issue with me, i have integrated share extension in my app, it work on simulator, but not working on real device ,,i have added the RequestOpenAccess =YES but its not work, my question is stackoverflow.com/questions/30489894/…
– Ravi Ojha
May 29 '15 at 3:35
3
@MikeRichards not sure, but if I remember correctly the app groups are prefixed with a team id
– Santa Claus
Jan 26 '16 at 18:25
|
show 5 more comments
2
Works only on simulator (XCode 6 beta 5, iOS 8 beta 5)
– Otto Boy
Aug 13 '14 at 13:56
8
NOTE: If you're using this with an iOS 8 Extension (e.g. keyboard), you'll need to ensure your extension has RequestsOpenAccess=YES in its Info.plist file.
– Kiran Panesar
Aug 27 '14 at 15:09
1
I did RequestsOpenAccess=YES and follow instruction still it wan't works for me on Device and works fine on Emulator, anything specific for device ?
– MAC
Nov 19 '14 at 12:33
Same issue with me, i have integrated share extension in my app, it work on simulator, but not working on real device ,,i have added the RequestOpenAccess =YES but its not work, my question is stackoverflow.com/questions/30489894/…
– Ravi Ojha
May 29 '15 at 3:35
3
@MikeRichards not sure, but if I remember correctly the app groups are prefixed with a team id
– Santa Claus
Jan 26 '16 at 18:25
2
2
Works only on simulator (XCode 6 beta 5, iOS 8 beta 5)
– Otto Boy
Aug 13 '14 at 13:56
Works only on simulator (XCode 6 beta 5, iOS 8 beta 5)
– Otto Boy
Aug 13 '14 at 13:56
8
8
NOTE: If you're using this with an iOS 8 Extension (e.g. keyboard), you'll need to ensure your extension has RequestsOpenAccess=YES in its Info.plist file.
– Kiran Panesar
Aug 27 '14 at 15:09
NOTE: If you're using this with an iOS 8 Extension (e.g. keyboard), you'll need to ensure your extension has RequestsOpenAccess=YES in its Info.plist file.
– Kiran Panesar
Aug 27 '14 at 15:09
1
1
I did RequestsOpenAccess=YES and follow instruction still it wan't works for me on Device and works fine on Emulator, anything specific for device ?
– MAC
Nov 19 '14 at 12:33
I did RequestsOpenAccess=YES and follow instruction still it wan't works for me on Device and works fine on Emulator, anything specific for device ?
– MAC
Nov 19 '14 at 12:33
Same issue with me, i have integrated share extension in my app, it work on simulator, but not working on real device ,,i have added the RequestOpenAccess =YES but its not work, my question is stackoverflow.com/questions/30489894/…
– Ravi Ojha
May 29 '15 at 3:35
Same issue with me, i have integrated share extension in my app, it work on simulator, but not working on real device ,,i have added the RequestOpenAccess =YES but its not work, my question is stackoverflow.com/questions/30489894/…
– Ravi Ojha
May 29 '15 at 3:35
3
3
@MikeRichards not sure, but if I remember correctly the app groups are prefixed with a team id
– Santa Claus
Jan 26 '16 at 18:25
@MikeRichards not sure, but if I remember correctly the app groups are prefixed with a team id
– Santa Claus
Jan 26 '16 at 18:25
|
show 5 more comments
Sharing NSUserDefaults data between multiple apps
In order to have shared defaults between an app and an extension or between 2 apps you have to add an App Group in your settings using the following steps:
- In the Project Navigator click on the *.xcodeproj file (should be at the top).
- To the right of the Project Navigator look for Project and Targets. Under targets click on your primary target (should be the first thing under Targets).
- Towards the top, click on the Capabilities tab.
- In the App Groups section click the switch to the right to turn App Groups ON.
- Click on the + button and add an App Group named group.com.company.myApp.
- Go to the same place in your other apps and this group should now be available to select. Turn this group on for each app that will be using this shared data.
Note: If you go to the Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) and go to Identifiers > App Groups you should see this new App Group.
To store data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()
To retrieve data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String
print("User Id: (testUserId)")
this needs to be voted up. great answer.
– AppA11y
Jan 8 '16 at 16:22
Thanks! It took a bit of searching through documentation to figure out how to do this and I thought others might appreciate the steps I took.
– TenaciousJay
Feb 5 '16 at 3:47
Best answer! Thank you so much, exactly what I needed +1000000
– Unome
Feb 9 '16 at 19:57
Thanks for the detailed description...! do we need to created any certificate from Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) to enable this group? same like Push notification.?
– Arbaz Shaikh
Mar 21 '16 at 8:44
When you do step 5 it should add the App Group to the Apple Developer Portal, you should not have to go directly to the Developer Portal to add it. After you do step 5 you can go to the portal and see that it should have created it for you.
– TenaciousJay
Mar 21 '16 at 21:35
|
show 3 more comments
Sharing NSUserDefaults data between multiple apps
In order to have shared defaults between an app and an extension or between 2 apps you have to add an App Group in your settings using the following steps:
- In the Project Navigator click on the *.xcodeproj file (should be at the top).
- To the right of the Project Navigator look for Project and Targets. Under targets click on your primary target (should be the first thing under Targets).
- Towards the top, click on the Capabilities tab.
- In the App Groups section click the switch to the right to turn App Groups ON.
- Click on the + button and add an App Group named group.com.company.myApp.
- Go to the same place in your other apps and this group should now be available to select. Turn this group on for each app that will be using this shared data.
Note: If you go to the Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) and go to Identifiers > App Groups you should see this new App Group.
To store data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()
To retrieve data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String
print("User Id: (testUserId)")
this needs to be voted up. great answer.
– AppA11y
Jan 8 '16 at 16:22
Thanks! It took a bit of searching through documentation to figure out how to do this and I thought others might appreciate the steps I took.
– TenaciousJay
Feb 5 '16 at 3:47
Best answer! Thank you so much, exactly what I needed +1000000
– Unome
Feb 9 '16 at 19:57
Thanks for the detailed description...! do we need to created any certificate from Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) to enable this group? same like Push notification.?
– Arbaz Shaikh
Mar 21 '16 at 8:44
When you do step 5 it should add the App Group to the Apple Developer Portal, you should not have to go directly to the Developer Portal to add it. After you do step 5 you can go to the portal and see that it should have created it for you.
– TenaciousJay
Mar 21 '16 at 21:35
|
show 3 more comments
Sharing NSUserDefaults data between multiple apps
In order to have shared defaults between an app and an extension or between 2 apps you have to add an App Group in your settings using the following steps:
- In the Project Navigator click on the *.xcodeproj file (should be at the top).
- To the right of the Project Navigator look for Project and Targets. Under targets click on your primary target (should be the first thing under Targets).
- Towards the top, click on the Capabilities tab.
- In the App Groups section click the switch to the right to turn App Groups ON.
- Click on the + button and add an App Group named group.com.company.myApp.
- Go to the same place in your other apps and this group should now be available to select. Turn this group on for each app that will be using this shared data.
Note: If you go to the Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) and go to Identifiers > App Groups you should see this new App Group.
To store data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()
To retrieve data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String
print("User Id: (testUserId)")
Sharing NSUserDefaults data between multiple apps
In order to have shared defaults between an app and an extension or between 2 apps you have to add an App Group in your settings using the following steps:
- In the Project Navigator click on the *.xcodeproj file (should be at the top).
- To the right of the Project Navigator look for Project and Targets. Under targets click on your primary target (should be the first thing under Targets).
- Towards the top, click on the Capabilities tab.
- In the App Groups section click the switch to the right to turn App Groups ON.
- Click on the + button and add an App Group named group.com.company.myApp.
- Go to the same place in your other apps and this group should now be available to select. Turn this group on for each app that will be using this shared data.
Note: If you go to the Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) and go to Identifiers > App Groups you should see this new App Group.
To store data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()
To retrieve data:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String
print("User Id: (testUserId)")
edited Nov 13 '18 at 4:08
pkamb
15k1283122
15k1283122
answered Oct 27 '15 at 17:59
TenaciousJayTenaciousJay
4,72633143
4,72633143
this needs to be voted up. great answer.
– AppA11y
Jan 8 '16 at 16:22
Thanks! It took a bit of searching through documentation to figure out how to do this and I thought others might appreciate the steps I took.
– TenaciousJay
Feb 5 '16 at 3:47
Best answer! Thank you so much, exactly what I needed +1000000
– Unome
Feb 9 '16 at 19:57
Thanks for the detailed description...! do we need to created any certificate from Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) to enable this group? same like Push notification.?
– Arbaz Shaikh
Mar 21 '16 at 8:44
When you do step 5 it should add the App Group to the Apple Developer Portal, you should not have to go directly to the Developer Portal to add it. After you do step 5 you can go to the portal and see that it should have created it for you.
– TenaciousJay
Mar 21 '16 at 21:35
|
show 3 more comments
this needs to be voted up. great answer.
– AppA11y
Jan 8 '16 at 16:22
Thanks! It took a bit of searching through documentation to figure out how to do this and I thought others might appreciate the steps I took.
– TenaciousJay
Feb 5 '16 at 3:47
Best answer! Thank you so much, exactly what I needed +1000000
– Unome
Feb 9 '16 at 19:57
Thanks for the detailed description...! do we need to created any certificate from Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) to enable this group? same like Push notification.?
– Arbaz Shaikh
Mar 21 '16 at 8:44
When you do step 5 it should add the App Group to the Apple Developer Portal, you should not have to go directly to the Developer Portal to add it. After you do step 5 you can go to the portal and see that it should have created it for you.
– TenaciousJay
Mar 21 '16 at 21:35
this needs to be voted up. great answer.
– AppA11y
Jan 8 '16 at 16:22
this needs to be voted up. great answer.
– AppA11y
Jan 8 '16 at 16:22
Thanks! It took a bit of searching through documentation to figure out how to do this and I thought others might appreciate the steps I took.
– TenaciousJay
Feb 5 '16 at 3:47
Thanks! It took a bit of searching through documentation to figure out how to do this and I thought others might appreciate the steps I took.
– TenaciousJay
Feb 5 '16 at 3:47
Best answer! Thank you so much, exactly what I needed +1000000
– Unome
Feb 9 '16 at 19:57
Best answer! Thank you so much, exactly what I needed +1000000
– Unome
Feb 9 '16 at 19:57
Thanks for the detailed description...! do we need to created any certificate from Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) to enable this group? same like Push notification.?
– Arbaz Shaikh
Mar 21 '16 at 8:44
Thanks for the detailed description...! do we need to created any certificate from Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) to enable this group? same like Push notification.?
– Arbaz Shaikh
Mar 21 '16 at 8:44
When you do step 5 it should add the App Group to the Apple Developer Portal, you should not have to go directly to the Developer Portal to add it. After you do step 5 you can go to the portal and see that it should have created it for you.
– TenaciousJay
Mar 21 '16 at 21:35
When you do step 5 it should add the App Group to the Apple Developer Portal, you should not have to go directly to the Developer Portal to add it. After you do step 5 you can go to the portal and see that it should have created it for you.
– TenaciousJay
Mar 21 '16 at 21:35
|
show 3 more comments
Application groups, according to my interpretation of the existing documentation, are primarily targeted for extensions, more specifically, for widgets. Widgets are their own application bundle that coexist with your app. Since they are a separate application and therefore have their own sandbox, you will need to use App Groups to share files.
After some header grep'ing, I think I found the API needed, but was actually put in as part of iOS 7.
NSFileManager
has a method on it containerURLForSecurityApplicationGroupIdentifier:
where you can pass in the identifier you created when turning on App Groups for your apps:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
Thanks, I believe you're right about extensibility. I'm a little bit more dubious about this iOS 7 method, it seems pretty static to me, iOS 8 introduced real interactions and communication between apps.
– streem
Jun 4 '14 at 8:15
@Justafinger This iOS 7 method is only for creating a URL to write to and read from data between the shared applications. This particular method is only really useful (from what I see so far) for widgets, but not other extensions.
– Wayne Hartman
Jun 4 '14 at 12:33
Well, i believe Apple wanted to make this easier in iOS 8 without having to create a container programmatically and share custom files. Documentation states that you should be able to share data by using NSUserDefault. I guess i'm missing something, because that's not working for me.
– streem
Jun 4 '14 at 14:47
@Justafinger I have not been able to getNSUserDefaults
to work, either. I chalk to up to Beta 1 bug.
– Wayne Hartman
Jun 4 '14 at 15:59
@WayneHartman There is a workaround for theNSUserDefaults
database. See my answer.
– Santa Claus
Jun 5 '14 at 14:40
add a comment |
Application groups, according to my interpretation of the existing documentation, are primarily targeted for extensions, more specifically, for widgets. Widgets are their own application bundle that coexist with your app. Since they are a separate application and therefore have their own sandbox, you will need to use App Groups to share files.
After some header grep'ing, I think I found the API needed, but was actually put in as part of iOS 7.
NSFileManager
has a method on it containerURLForSecurityApplicationGroupIdentifier:
where you can pass in the identifier you created when turning on App Groups for your apps:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
Thanks, I believe you're right about extensibility. I'm a little bit more dubious about this iOS 7 method, it seems pretty static to me, iOS 8 introduced real interactions and communication between apps.
– streem
Jun 4 '14 at 8:15
@Justafinger This iOS 7 method is only for creating a URL to write to and read from data between the shared applications. This particular method is only really useful (from what I see so far) for widgets, but not other extensions.
– Wayne Hartman
Jun 4 '14 at 12:33
Well, i believe Apple wanted to make this easier in iOS 8 without having to create a container programmatically and share custom files. Documentation states that you should be able to share data by using NSUserDefault. I guess i'm missing something, because that's not working for me.
– streem
Jun 4 '14 at 14:47
@Justafinger I have not been able to getNSUserDefaults
to work, either. I chalk to up to Beta 1 bug.
– Wayne Hartman
Jun 4 '14 at 15:59
@WayneHartman There is a workaround for theNSUserDefaults
database. See my answer.
– Santa Claus
Jun 5 '14 at 14:40
add a comment |
Application groups, according to my interpretation of the existing documentation, are primarily targeted for extensions, more specifically, for widgets. Widgets are their own application bundle that coexist with your app. Since they are a separate application and therefore have their own sandbox, you will need to use App Groups to share files.
After some header grep'ing, I think I found the API needed, but was actually put in as part of iOS 7.
NSFileManager
has a method on it containerURLForSecurityApplicationGroupIdentifier:
where you can pass in the identifier you created when turning on App Groups for your apps:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
Application groups, according to my interpretation of the existing documentation, are primarily targeted for extensions, more specifically, for widgets. Widgets are their own application bundle that coexist with your app. Since they are a separate application and therefore have their own sandbox, you will need to use App Groups to share files.
After some header grep'ing, I think I found the API needed, but was actually put in as part of iOS 7.
NSFileManager
has a method on it containerURLForSecurityApplicationGroupIdentifier:
where you can pass in the identifier you created when turning on App Groups for your apps:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
answered Jun 4 '14 at 2:58
Wayne HartmanWayne Hartman
14.2k470107
14.2k470107
Thanks, I believe you're right about extensibility. I'm a little bit more dubious about this iOS 7 method, it seems pretty static to me, iOS 8 introduced real interactions and communication between apps.
– streem
Jun 4 '14 at 8:15
@Justafinger This iOS 7 method is only for creating a URL to write to and read from data between the shared applications. This particular method is only really useful (from what I see so far) for widgets, but not other extensions.
– Wayne Hartman
Jun 4 '14 at 12:33
Well, i believe Apple wanted to make this easier in iOS 8 without having to create a container programmatically and share custom files. Documentation states that you should be able to share data by using NSUserDefault. I guess i'm missing something, because that's not working for me.
– streem
Jun 4 '14 at 14:47
@Justafinger I have not been able to getNSUserDefaults
to work, either. I chalk to up to Beta 1 bug.
– Wayne Hartman
Jun 4 '14 at 15:59
@WayneHartman There is a workaround for theNSUserDefaults
database. See my answer.
– Santa Claus
Jun 5 '14 at 14:40
add a comment |
Thanks, I believe you're right about extensibility. I'm a little bit more dubious about this iOS 7 method, it seems pretty static to me, iOS 8 introduced real interactions and communication between apps.
– streem
Jun 4 '14 at 8:15
@Justafinger This iOS 7 method is only for creating a URL to write to and read from data between the shared applications. This particular method is only really useful (from what I see so far) for widgets, but not other extensions.
– Wayne Hartman
Jun 4 '14 at 12:33
Well, i believe Apple wanted to make this easier in iOS 8 without having to create a container programmatically and share custom files. Documentation states that you should be able to share data by using NSUserDefault. I guess i'm missing something, because that's not working for me.
– streem
Jun 4 '14 at 14:47
@Justafinger I have not been able to getNSUserDefaults
to work, either. I chalk to up to Beta 1 bug.
– Wayne Hartman
Jun 4 '14 at 15:59
@WayneHartman There is a workaround for theNSUserDefaults
database. See my answer.
– Santa Claus
Jun 5 '14 at 14:40
Thanks, I believe you're right about extensibility. I'm a little bit more dubious about this iOS 7 method, it seems pretty static to me, iOS 8 introduced real interactions and communication between apps.
– streem
Jun 4 '14 at 8:15
Thanks, I believe you're right about extensibility. I'm a little bit more dubious about this iOS 7 method, it seems pretty static to me, iOS 8 introduced real interactions and communication between apps.
– streem
Jun 4 '14 at 8:15
@Justafinger This iOS 7 method is only for creating a URL to write to and read from data between the shared applications. This particular method is only really useful (from what I see so far) for widgets, but not other extensions.
– Wayne Hartman
Jun 4 '14 at 12:33
@Justafinger This iOS 7 method is only for creating a URL to write to and read from data between the shared applications. This particular method is only really useful (from what I see so far) for widgets, but not other extensions.
– Wayne Hartman
Jun 4 '14 at 12:33
Well, i believe Apple wanted to make this easier in iOS 8 without having to create a container programmatically and share custom files. Documentation states that you should be able to share data by using NSUserDefault. I guess i'm missing something, because that's not working for me.
– streem
Jun 4 '14 at 14:47
Well, i believe Apple wanted to make this easier in iOS 8 without having to create a container programmatically and share custom files. Documentation states that you should be able to share data by using NSUserDefault. I guess i'm missing something, because that's not working for me.
– streem
Jun 4 '14 at 14:47
@Justafinger I have not been able to get
NSUserDefaults
to work, either. I chalk to up to Beta 1 bug.– Wayne Hartman
Jun 4 '14 at 15:59
@Justafinger I have not been able to get
NSUserDefaults
to work, either. I chalk to up to Beta 1 bug.– Wayne Hartman
Jun 4 '14 at 15:59
@WayneHartman There is a workaround for the
NSUserDefaults
database. See my answer.– Santa Claus
Jun 5 '14 at 14:40
@WayneHartman There is a workaround for the
NSUserDefaults
database. See my answer.– Santa Claus
Jun 5 '14 at 14:40
add a comment |
One important trap I tapped into today is the following:
In many projects I saw a single app target and with different bundle identifiers set for each configuration of that target. Here things get messy. What the developers intended was to create a debug app for the debug config and a production app for the release target.
If you do so both apps will share the same NSUserDefaults when they are set up like so
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
This causes problems in many places:
- Imagine you set YES for a key when a special app-intro-screen has been shown to the user. The other app will now also read YES and don't show the intro.
- Yes some apps also store oAuth tokens in their user defaults. Anyways... Depending on the implementation, the app will recognize that there's a token and start retrieving data using the wrong token. The chance is high that this will fail with strange errors.
The solution to this problem in general is to prefix the defaults keys with the current configuration built. You can detect the configuration easily at runtime by setting different bundle identifiers for your configurations. Then just read the bundle identifier from NSBundle.mainBundle()
. If you have the same bundle identifiers you need to set different preprocessor macros like
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
In Swift it will look almost the same:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
7
Your problems exist because you mix all your data in a shared UserDefaults. You should useNSUserDefaults.standardUserDefaults()
for data that should not be shared.
– Daniel
Feb 22 '16 at 15:18
add a comment |
One important trap I tapped into today is the following:
In many projects I saw a single app target and with different bundle identifiers set for each configuration of that target. Here things get messy. What the developers intended was to create a debug app for the debug config and a production app for the release target.
If you do so both apps will share the same NSUserDefaults when they are set up like so
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
This causes problems in many places:
- Imagine you set YES for a key when a special app-intro-screen has been shown to the user. The other app will now also read YES and don't show the intro.
- Yes some apps also store oAuth tokens in their user defaults. Anyways... Depending on the implementation, the app will recognize that there's a token and start retrieving data using the wrong token. The chance is high that this will fail with strange errors.
The solution to this problem in general is to prefix the defaults keys with the current configuration built. You can detect the configuration easily at runtime by setting different bundle identifiers for your configurations. Then just read the bundle identifier from NSBundle.mainBundle()
. If you have the same bundle identifiers you need to set different preprocessor macros like
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
In Swift it will look almost the same:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
7
Your problems exist because you mix all your data in a shared UserDefaults. You should useNSUserDefaults.standardUserDefaults()
for data that should not be shared.
– Daniel
Feb 22 '16 at 15:18
add a comment |
One important trap I tapped into today is the following:
In many projects I saw a single app target and with different bundle identifiers set for each configuration of that target. Here things get messy. What the developers intended was to create a debug app for the debug config and a production app for the release target.
If you do so both apps will share the same NSUserDefaults when they are set up like so
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
This causes problems in many places:
- Imagine you set YES for a key when a special app-intro-screen has been shown to the user. The other app will now also read YES and don't show the intro.
- Yes some apps also store oAuth tokens in their user defaults. Anyways... Depending on the implementation, the app will recognize that there's a token and start retrieving data using the wrong token. The chance is high that this will fail with strange errors.
The solution to this problem in general is to prefix the defaults keys with the current configuration built. You can detect the configuration easily at runtime by setting different bundle identifiers for your configurations. Then just read the bundle identifier from NSBundle.mainBundle()
. If you have the same bundle identifiers you need to set different preprocessor macros like
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
In Swift it will look almost the same:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
One important trap I tapped into today is the following:
In many projects I saw a single app target and with different bundle identifiers set for each configuration of that target. Here things get messy. What the developers intended was to create a debug app for the debug config and a production app for the release target.
If you do so both apps will share the same NSUserDefaults when they are set up like so
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
This causes problems in many places:
- Imagine you set YES for a key when a special app-intro-screen has been shown to the user. The other app will now also read YES and don't show the intro.
- Yes some apps also store oAuth tokens in their user defaults. Anyways... Depending on the implementation, the app will recognize that there's a token and start retrieving data using the wrong token. The chance is high that this will fail with strange errors.
The solution to this problem in general is to prefix the defaults keys with the current configuration built. You can detect the configuration easily at runtime by setting different bundle identifiers for your configurations. Then just read the bundle identifier from NSBundle.mainBundle()
. If you have the same bundle identifiers you need to set different preprocessor macros like
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
In Swift it will look almost the same:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
edited Mar 7 '16 at 21:26
Nerrolken
1,15321847
1,15321847
answered Dec 10 '15 at 23:31
blackjacxblackjacx
1,81111926
1,81111926
7
Your problems exist because you mix all your data in a shared UserDefaults. You should useNSUserDefaults.standardUserDefaults()
for data that should not be shared.
– Daniel
Feb 22 '16 at 15:18
add a comment |
7
Your problems exist because you mix all your data in a shared UserDefaults. You should useNSUserDefaults.standardUserDefaults()
for data that should not be shared.
– Daniel
Feb 22 '16 at 15:18
7
7
Your problems exist because you mix all your data in a shared UserDefaults. You should use
NSUserDefaults.standardUserDefaults()
for data that should not be shared.– Daniel
Feb 22 '16 at 15:18
Your problems exist because you mix all your data in a shared UserDefaults. You should use
NSUserDefaults.standardUserDefaults()
for data that should not be shared.– Daniel
Feb 22 '16 at 15:18
add a comment |
To store
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
add a comment |
To store
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
add a comment |
To store
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
To store
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
answered Sep 6 '16 at 10:01
Hardik ThakkarHardik Thakkar
7,25114751
7,25114751
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24015506%2fcommunicating-and-persisting-data-between-apps-with-app-groups%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown