Search Unity

AutoSync PlayerPrefs to iCloud

Discussion in 'Assets and Asset Store' started by Jodon, Sep 20, 2013.

  1. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Hello Folks!

    This is my thread announcing my first plug-in: iCloud PlayerPrefs AutoSync. This plug-in will sync your PlayerPrefs automatically to iCloud without ANY user coding whatsoever.

    When I was developing my game, Fling Theory, I took a look at the other plug-ins available. All other plug-ins wrap PlayerPrefs calls, forcing you to change your codebase. Since my PlayerPrefs was already wrapped, this was going to cause some major pains. After some research, optimizations, and nice packaging, I finally have a solution that will allow you to store your PlayerPrefs in iCloud without ANY programming.

    I am an indie developer, so I'm pricing it with indie-friendly terms. The asset will be $10/seat up to a maximum of $40/studio. You're a single indie developer? $10 gets you iCloud support. Are you a studio of 10 or even 100 people? $40 is your total cost, saving you hours of work.

    Better yet, FULL SOURCE CODE IS INCLUDED. It's fully commented, easy to understand, and is already shipped in Fling Theory.

    Here is the header file which serves as documentation:

    Code (csharp):
    1. /**
    2.  * PlayerPrefsAutoSync v1.0.  Copyright: Coding Jar Studios Inc. 2013.
    3.  *
    4.  * This file ensures that Unity's PlayerPrefs gets sent up to iCloud, and properly syncs from
    5.  * iCloud back to Unity's PlayerPrefs.
    6.  *
    7.  * Unity Instructions:
    8.  *   There are NO code changes needed to ensure this works.  Just export your typical iOS build and everything should just work.
    9.  * You will receive log statements in the debugger output to ensure everything is working.
    10.  *
    11.  * Xcode Instructions:
    12.  *   You must ensure to have your iCloud entitlements set-up properly.
    13.  * This is easily done in XCode5 by clicking on your project, then clicking "Capabilities".  Xcode will tell you if it's not setup correctly.
    14.  * Make sure to enable Key-Value Store.  That's how we're achieving the synchronization.  For older versions of Xcode, check the documentation.
    15.  *
    16.  * Troubleshooting:
    17.  *   There's a couple of duh-moments I've had.  First, make sure your iOS devices are connected to the internet and that their iCloud services are enabled in the Settings.
    18.  * If that's all setup, just double-check the debugger output.  It will tell you what's going wrong, usually that the entitlements aren't set-up properly.
    19.  * Make sure there's at least the "PlayerPrefsAutoSync: Loaded." log output.  Of course, all of the code is below and you can check us out on the support forum:
    20.  *
    21.  * Notes:
    22.  *   Since you cannot control exactly when iCloud updates your local PlayerPrefs, you shouldn't rely on displaying
    23.  * critical information stored in PlayerPrefs upon application start.
    24.  */
     
    Last edited: Oct 5, 2013
  2. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Placeholder post for updates.
     
  3. charmandermon

    charmandermon

    Joined:
    Dec 4, 2011
    Posts:
    352
    It sounds really nice in theory but i have a concern, if you can't control when or how the sync occurs what prevents the possibility of opening the app on another device checking for null > creating new player pref entry then having it completely overwrite the icloud prefs.
     
  4. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    It uses the default key-value store resolve mechanics: newest upload takes precedence. The important thing to note is the conflicts are done per-key, not for all PlayerPrefs together.

    The scenario you're talking about is bad if you store a PlayerPref that says "What level am I currently on", but quite alright if it's broken up like "score on level 1", "score on level 2", etc. since progress will never be overwritten and you'll end up with the latest score.
     
  5. charmandermon

    charmandermon

    Joined:
    Dec 4, 2011
    Posts:
    352
    Thanks, Here is what im doing.

    Code (csharp):
    1.     // Use this for initialization
    2.     void Awake () {
    3.         if (!PlayerPrefs.HasKey ("MasterLevelsCompleted"))
    4.         {
    5.             Debug.Log("Prefs Don't Exist, Creating them for the first time");
    6.              for (int i = 0; i < LevelBuildCount; i++)
    7.                 {
    8.                     MasterEnergyList.Add(0f);
    9.                     MasterCollectableList.Add(false);
    10.  
    11.                 }
    12.             PlayerPrefs.SetInt("MasterLevelsCompleted", 0);
    13.  
    14.             PlayerPrefsX.SetFloatArray("MasterEnergyList",MasterEnergyList.ToArray());
    15.  
    16.             PlayerPrefsX.SetBoolArray("MasterCollectableList",MasterCollectableList.ToArray());
    17.  
    18.  
    19.             PlayerPrefs.Save ();
    20.  
    21.         }
    22.  
    23.  
    24.     //  MasterEnergyList = PlayerPrefsX.GetFloatArray ("MasterEnergyList") as List<float>;
    25.  
    26.  
    27.     }
     
  6. charmandermon

    charmandermon

    Joined:
    Dec 4, 2011
    Posts:
    352
    Are you saying that I should put a temporary loading scene that does nothing but wait...so icloud has its chance to do its thing?
     
  7. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    No I would not do that. It's hard to understand the context of the code so I'll give it my best understanding:

    You want to create default values for LevelsComplete and CollectableList at the start of the game? You should avoid creating them until they're needed. Use the default values instead. Here's the pattern, minus the PlayerPrefsX:

    Code (csharp):
    1.  
    2. public static class Progress
    3. {
    4.     public static bool IsLevelComplete(int level)
    5.     {
    6.         return PlayerPrefs.GetBool( "LevelComplete" + level, false);
    7.     }
    8.  
    9.     public static bool HasLevelCollectable(int level)
    10.     {
    11.         return PlayerPrefs.GetBool( "Collectable" + level, false);
    12.     }
    13.  
    14.     public static float GetEnergy(int level)
    15.     {
    16.         return PlayerPrefs.GetFloat( "Energy" + level, 0.0f );
    17.     }
    18.  
    19.     public static void SetLevelComplete(int level)
    20.     {
    21.         // This will eventually get sent to iCloud
    22.         PlayerPrefs.SetBool( "LevelComplete" + level, true);
    23.         PlayerPrefs.SetFloat( "Energy" + level, SOMEVALUE );
    24.         PlayerPrefs.SetBool( "Collectable" + level, SOMEVALUE );
    25.         PlayerPrefs.Save();
    26.     }
    27.  
    28.     public static int GetNumLevelsCompleted()
    29.     {
    30.         int numCompleted = 0;
    31.         for (int i = 0 ; i < LevelBuildCount ; ++i)
    32.         {
    33.             if ( IsLevelComplete(i) )
    34.                 ++numCompleted;
    35.         }
    36.  
    37.         return numCompleted;
    38.     }
    39.  
    40.     public static float GetTotalEnergy()
    41.     {
    42.         float energy = 0.0f;
    43.         for (int i = 0 ; i < LevelBuildCount ; ++i)
    44.             energy += GetEnergy(i);
    45.  
    46.                return energy;
    47.     }
    48. }
    49.  
    * Code not guaranteed to compile :)
     
  8. Essential

    Essential

    Joined:
    Sep 8, 2011
    Posts:
    265
    Hi I'm interested in this and looks great (unsure why other plugins don't do the same simple approach!) but wanted to learn a bit more about its limitations. I don't fully know how the iCloud API works so I hope you can forgive me for asking these questions...

    1) Does the plugin check if data already exists on iCloud before doing any syncing?

    2) How often does it sync, Is it just whenever a PlayerPref is updated or at another interval?

    2) Basically you say that running a fresh game on another device can overwrite the iCloud save, because certain keys timestamps may be newer. For example I have a currency in my game which is shown in the main menu and is obviously initialized to zero on a fresh install launch. How would I avoid the danger of resetting their currency to zero in this situation?

    On the edge of buying it, just wanted to be sure it'll work for me.
     
    Last edited: Feb 13, 2014
  9. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Hello,

    Apologies the thread subscriptions functions are not working for me. I realize it's probably too late but I'll respond anyway for future users:

    1) iCloud takes care of this, it has its own algorithms to detect if the data is newer or older (see the post made at 06:33 AM 01-17-2014).
    2) Yes it waits about one second after the player prefs have been updated so it can send them as a batch (so you can do multiple updates w/o it spamming the server).
    3) We use the same system in Fling Theory. Avoid writing the zero to the PlayerPrefs, instead use the default value until they gain currency. See my previous post on how to do this (e.g. PlayerPrefs.GetInt("Currency", 0); ). As long as you don't WRITE to it, you're fine. In Fling Theory we don't write to it until you start playing the game (e.g. you're on the title screen and then the level select screen for quite some time, enough for iCloud to sync).
     
  10. Essential

    Essential

    Joined:
    Sep 8, 2011
    Posts:
    265
    Thanks, that sounds pretty simple. There is another concerning scenario I envisage though. If a user has progress on one device but then starts a fresh game on another device in airplane mode then later turns on WiFi, won't their iCloud progress be replaced? It's not an uncommon scenario as it's happened to me in the past, I wish there was a way to display a popup in this situation to let the user choose a save to use, but perhaps I could modify your script.
     
  11. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Yes that's a trouble scenario. In that case, I figure if you're just using iCloud and not some kind of central server that's checking people's currencies, it's not an important enough issue to care. If a user is happy playing the game on the airplane in wifi mode, that's their newest progress :). You can modify the script to achieve what you want, thinking maybe just disabling iCloud if it's unreachable altogether... but the idea for this plug-in was "no work" ... and that's work ;).
     
  12. Corestacks

    Corestacks

    Joined:
    Jun 7, 2013
    Posts:
    5
    Hi I just purchased this and it works great! Super easy to use and just exactly what I needed. You've saved me a lot of trouble and I thank you for that.. honestly this iCloud plugin deserves a whole lot more popularity.

    1 problem though: The first time a 2nd device runs the app and tries to synch from iCloud the data that was uploaded from a 1st device, the app crashes. The error is the following line:

    // Cancel a previous timer if it was set...
    if ( syncTimer != nil && [syncTimer isValid] )

    The crash happens every time a new synch from a new device occurs... how could we avoid this? Can we simply remove that if statement which invalidates the timer completely? The timer gets set again under that, wouldn't that simply overwrite the previous timer?

    I need this resolved asap as I'm about to submit my game tomorrow, Please help!
     

    Attached Files:

  13. Corestacks

    Corestacks

    Joined:
    Jun 7, 2013
    Posts:
    5
    The following fix worked for me:

    // Cancel a previous timer if it was set...
    if ( syncTimer != nil && syncTimer.isValid )
    {
    [syncTimer invalidate];
    syncTimer = nil;
    }

    And added "retain" below:

    syncTimer = [[NSTimerscheduledTimerWithTimeInterval:1.0target:selfselector:mad:selector(syncToCloud) userInfo:nilrepeats:false] retain];

    Hope it helps those who encounters the same problem!
     
    Last edited: Nov 13, 2014
    Deleted User and Jodon like this.
  14. hellobard

    hellobard

    Joined:
    Sep 26, 2012
    Posts:
    140
    I am having the same problem as Corestacks with this, surprised the plugin author hasn't updated the plugin with a fix for this... Will try Corestacks' fix.

    Jodon: Are you still maining this plugin or is it abandonware?
     
  15. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Hellobard,

    It's been abandoned as far as updates go since I do not have any more products on the iOS store or a recent Mac, I have no way to test it. I can't actually remove it from the Asset Store (there's no way to remove your own assets -- imagine that!) I suppose I could submit the code changes, but I can't actually test them in action.

    Cheers.
     
  16. hellobard

    hellobard

    Joined:
    Sep 26, 2012
    Posts:
    140
    That's too bad, it's actually a functioning product.
    I implemented the changes mentioned in this forum thread and it worked.
    I'd suggest you update it with the fix and mention that it's no longer updated in the Asset store description.
     
  17. seejay3061

    seejay3061

    Joined:
    Oct 21, 2013
    Posts:
    12
    This plugin was really easy to use. I think I've run into the same crash issue but syncing and recovering save files seems to be working flawlessly otherwise. I say "I think" since I still need to verify that what I am seeing isn't a connection issue with the cord as it doesn't crash until I pick the phone up.

    I tried to implement Corestacks' fix but I get an error is Xcode:
    "'retain' is unavailable in automatic reference counting mode"

    I am not sure how to get around it. For now I've removed that bit and need to test further to see if it is crashing.
     
  18. JDAUL

    JDAUL

    Joined:
    Aug 27, 2013
    Posts:
    1
    Try adding the "-fno-objc-arc" Compile flag to the PlayerPrefsAutoSync.mm file in Unity.
     
  19. Vexille

    Vexille

    Joined:
    Nov 4, 2015
    Posts:
    5
    Hey Jodon I realize you're not maintaining the plugin anymore, but maybe you can help me out since the solution is working for a lot of people, but I can't get it to work.

    I've placed the plugin in the appropriate place and activated iCloud capabilities for Key-value storage. I get a "PlayerPrefsAutoSync: Loaded." log and even a "PlayerPrefsAutoSync: iCloud Supported. Initializing." but it doesn't work when I tried to sync two devices. They both have local playerprefs saved, and they always load the local data.

    Actually, I was double checking the log because of this post and I noticed that there is another call. Right at the start of the application, I get a "PlayerPrefsAutoSync: Sending to iCloud" log, but the first thing I do is load from PlayerPrefs. Actually, the first thing is a call to PlayerPrefs.HasKey(), then a call to PlayerPrefs.GetString().

    Am I missing anything? Any help would be very much appreciated!
     
  20. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Are you grabbing the data too early? I believe in the documentation that I say you cannot do that immediately because we have no control over when we get the data back from iCloud (it doesn't happen right when you launch the app -- it happens asynchronously). What you want to do is make sure your first scene (main menu) doesn't do anything with PlayerPrefs which gives it time to sync.
     
  21. Vexille

    Vexille

    Joined:
    Nov 4, 2015
    Posts:
    5
    Well there's actually a video that's played before that call, it's about 7 seconds long, I don't know if that enough time there for the data to be loaded. When I said "the first thing I do is a call to PlayerPrefs.HasKey()" I meant to say that I'm sure there isn't a call to save a PlayerPrefs key before that, which might explain getting a "sending to iCloud" log first.

    Still, just to be sure, I made a build with an empty scene with just a button that loads the title scene. I left the game sitting in that scene for about a minute and then proceeded to the normal flow. I got the "loaded" and "initialized" logs from PlayerPrefsAutoSync in that empty scene, but the same thing happened after that. When querying for the PlayerPrefs key, I got a "sending to iCloud" log.

    Could it be that "PlayerPrefs.HasKey()" causes data to be sent to iCloud, which prevents data to be received from iCloud at startup? I'll try manually querying for my profile's key in the empty scene I made before to see if that helps and I'll report back.

    Edit: No luck. Made a button that, when clicked, calls PlayerPrefs.GetString("user_profile") and as soon as it's clicked, I get a "sending to iCloud" log. What could be going wrong?
     
    Last edited: Nov 27, 2015
  22. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    It's possible that Unity changed the export code if you're using a very recent version. The last version tested was Unity 4.2, but judging by the downloads and posts here, I'd think up to 5.2.1 would have been safe. Which version are you on?
     
  23. Vexille

    Vexille

    Joined:
    Nov 4, 2015
    Posts:
    5
    Indeed I'm on a more recent version, I'm using 5.2.2. Actually now that you've mentioned it, I'm using 5.2.2 on Windows but we're still on 5.2.1 on OSX so that's probably not it. And at any rate, what you do with your code is basically what every tutorial and article about iCloud says needs to be done, so I'm really lost here.

    What I have noticed though, is that this is working perfectly in one device, but not across devices. For example, iPad #1 runs the game and successfully retrieves its PlayerPrefs value from iCloud. If I delete the game (and consequently all its data), install it again and run it, it will get the data from iCloud and successfully restore it locally. However, if I run the same build in iPad #2, which is logged in the AppStore and iCloud settings with the same Apple ID as iPad #1, it will fetch a different set of values from PlayerPrefs from iCloud. And this is completely baffling to me, since the documentation shows the key-value storage as something that happens per account, not per device.

    Is there a setting or configuration I'm missing somewhere?
     
  24. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    It's been a very long time since I've worked with iOS, but I believe you need to provision your devices to use a test iCloud service. Is it possible that one of the devices is using the 'real' iCloud and one using the dev one? I believe it's the same for Game Center (there's a dev one and a real one). I may be off-base on the iCloud one, but I remember that for sure for Game Center.
     
  25. Vexille

    Vexille

    Joined:
    Nov 4, 2015
    Posts:
    5
    Oh man, that was it! I was using the company's test account, but it's been used in so many devices in so many ways that it probably generated some inconsistencies in iCloud.

    So what I did was logging out of AppStore and iCloud on both devices and logging in with a fake AppleID that I added as a sandbox tester on iTunes Connect. Worked like a charmed.

    It should be noted that it'll always get the most recent data from iCloud, so you must deal with conflicts manually.

    Anyway, thanks a bunch for the help Jodon!
     
  26. SidarVasco

    SidarVasco

    Joined:
    Feb 9, 2015
    Posts:
    163
    Hey when exactly does it start syncing?
     
  27. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    It starts getting the data when the app starts. There is a note that you can't expect the data to be there (it's done asynchronously) so give it some time before you start relying on the values.

    When a PlayerPrefs is changed, it will send the data after about one second: http://forum.unity3d.com/threads/autosync-playerprefs-to-icloud.201410/#post-1537408
     
  28. SidarVasco

    SidarVasco

    Joined:
    Feb 9, 2015
    Posts:
    163
    Cool, It's a few unlockables we serialize to playerprefs. The data should be small enough to be downloaded quickly me thinks. Thanks.
     
  29. SidarVasco

    SidarVasco

    Joined:
    Feb 9, 2015
    Posts:
    163
    Q: According to apple we need to provide a restore button for certain in game purchases ( these are not linked to any iap system, rather they are saved to the player prefs when unlocked. ). Although your plugin is automated is there a way to manually call the data to be downloaded?
     
  30. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    No, but furthermore this isn't the correct solution for restoring an unlockable. You can't rely on the cloud data in such a case because the user can nuke their cloud data. You need to verify they've actually purchased the item and set the keys again yourself, then this plug-in will upload those keys again to the cloud.
     
  31. SidarVasco

    SidarVasco

    Joined:
    Feb 9, 2015
    Posts:
    163
    The problem with that is that unlockables are local data but needs to be patch trough some database. We probably have to do some serverside stuff ourself then. Sucks.
     
  32. Erikoinen

    Erikoinen

    Joined:
    Nov 10, 2014
    Posts:
    68
    Hey all. I've implemented this in my game now including Corestacks' fix, but for some reason it's just not working. The log says it's loading and saving PlayerPrefs correctly, but for some reason it just doesn't seem to load anything. I also have a 5 second wait in the initializing scene which doesn't do anything that should affect this issue.

    Do you know if there's something I'm not doing right with iCloud altogether?

    My test steps are as follows:
    1) Install fresh game, play for a little so PlayerPrefs have new data
    2) Delete the game from my iPhone
    3) Install the same build again
    4) Launch game (-> not synced)

    Any help appreciated.
     
  33. Erikoinen

    Erikoinen

    Joined:
    Nov 10, 2014
    Posts:
    68
    I noticed I'm not getting any logging for this "PlayerPrefsAutoSync: Receiving from iCloud"

    It seems to initialize correctly, but never seems to receive anything from iCloud. What could be the problem?
     
  34. Erikoinen

    Erikoinen

    Joined:
    Nov 10, 2014
    Posts:
    68
    I got it working. There was nothing wrong with the implementation or my device specific settings. The problem was that my provisioning profile didn't have iCloud support and I hadn't enabled keyvalue storaging on XCode.

    Thanks for the great plugin. :)
     
  35. vexe

    vexe

    Joined:
    May 18, 2013
    Posts:
    644
    Worked seamlessly from first try very nice. Would definitely recommend. Plus it's a single-file library, you can't beat that!. I don't have to import millions of scripts just to get one thing working.
     
  36. ppolonio

    ppolonio

    Joined:
    Jan 13, 2016
    Posts:
    2
    I'm using a slightly modified version of PlayerPrefs That supports a few additional data types, but works the same way as the "vanilla" PlayerPrefs. Will this plugin work with my PlayerPrefs? If not, would it take a lot of modifications to make it work?
     
  37. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Yes, it should. The data gets serialized as a copy of whatever is stored in PlayerPrefs, so as long as the serialization goes through the PlayerPrefs interface you should be fine.
     
  38. IndieFist

    IndieFist

    Joined:
    Jul 18, 2013
    Posts:
    520
    Hi, i`m testing some plugins to get working icloud save.
    I have setup on appid certificate icloud and include cloudkit support.
    Later on xcode, capabilities, icloud, key-value storage and cloudkit
    But when i load data from icloud all data are empty.
     
  39. mfosati

    mfosati

    Joined:
    Apr 24, 2014
    Posts:
    13
    Will this work for Mac and tvOS? Thanks in advance!
     
  40. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    How are you testing this? Are you giving it enough time to fetch the data from iCloud before accessing it? As noted in the documentation, don't access the data on startup, you have to give it enough time and use non-destructive checks for data (i.e. don't write values unless you absolutely need to, instead rely on default values if the keys don't exist).
     
  41. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    No, it is made specifically for iOS so I don't think it's incompatible (but I haven't tried!)
     
  42. MoonDF

    MoonDF

    Joined:
    Dec 7, 2015
    Posts:
    9
    Hi I'm Beginner for iOS Build and not good at English, i Purchased the assets, but i can use this....
    How to Save Playerfrabs at Icloud?, And How to Load Playerfrabs at ICloud.?.
    plz.. explain by some example
    i want cloud Save/Load type is String, if push Button
    Thank you.
     
  43. Jodon

    Jodon

    Joined:
    Sep 12, 2010
    Posts:
    434
    Hello, you do not control when to load/save iCloud settings. It is done automatically on startup. Try to run the documentation through a translation service (translate.google.com). Cheers.
     
  44. darkschneiderds

    darkschneiderds

    Joined:
    Oct 5, 2016
    Posts:
    3
    Hi,

    I have just purchased the plugging and installed it in my game.

    The plugging works fine when you have a single device. It uploads any data stored on the device to the cloud automatically and updates the any new device successfully when you install a fresh app.

    Unfortunately it doesn't work fine when the app is in the background because it is not syncing. It syncs only if you close the app. This brings a few sync issues.

    For example I may be playing on my second device (an iPad which was in the background). This device had a lower score than my first device (an iPhone) After playing my iPad is uploading the data and overwriting whatever is on the iCloud. In this case a lower record than the one you had in the iCloud. I switch on my game on the iPhone and takes whatever is in the cloud overwriting my records...

    I guess the only choice I have is to force a call to the iCloud to get always the last version as soon as the app stops being in the background.
     
  45. darkschneiderds

    darkschneiderds

    Joined:
    Oct 5, 2016
    Posts:
    3
    Actually... it does get the information. Just realised. But it is not updating on screen. I think I need to continue investigating
     
  46. ooblii

    ooblii

    Joined:
    Feb 23, 2013
    Posts:
    30
    Hello just bought the plugin. I think I have everything set up correctly, but I'm not getting any output from the debugger (errors or success). Any ideas?
     
  47. Rajmahal

    Rajmahal

    Joined:
    Apr 20, 2011
    Posts:
    2,101
    Did you make the changes suggested in this thread? I did so recently and it works great. Also have you enabled I cloud in xcode?
     
  48. ooblii

    ooblii

    Joined:
    Feb 23, 2013
    Posts:
    30
    No not the changes in the thread. Thanks for the heads up, I'll take a closer look here. Did enable iCloud in Xcode though.
     
  49. ooblii

    ooblii

    Joined:
    Feb 23, 2013
    Posts:
    30
    Got it working. Applied those changes and logged out of iTunes. Thanks!
     
  50. kman360

    kman360

    Joined:
    Apr 15, 2014
    Posts:
    3
    does this still not work for TVOS?