Last week, I received a disturbing bug report from an iOS 8 user: Rainbow, it seems, wasn't properly saving any game state. So, I sat down to see what the problem was.
The culprit seems to be the helper function user_data_dir
, which is responsible for figuring out where to store data files for the game:
string user_data_dir(string const &app_name)
/* ... */
#elif defined(IOS)
ret = "../Documents";
#elif defined(ANDROID)
/* ... */
return ret;
}
Hmm. A hardcoded path. That seems brittle.
Looking up user data paths and iOS 8, I came across a tech note which pretty succinctly explained the situation.
Basically, the Documents
directory is no longer a sibling of the application, so must be requested using a (ObjC) call, which I ended up dumping into a different (compiled-as-ObjC++) file:
std::string documents_directory() {
return [[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] path] UTF8String];
}
And that seems to have done it. Expect a 1.5.2 version of Rainbow to appear soon.
No comments:
Post a Comment