Search code examples
xamarin.iosxamarinmvvmcross

Access denied using mvxfilestore, mvvmcross annd xamarin touch ios 8.1


My app just got reject from apple and i believe it might be caused by them changing to test with ios 8.1. However I cannot reproduce the error in any way. Their chrash report states the app chrashes on startup.

It seems that the exception(have the crash log) comes from

<Warning> Unhandled managed exception: Access to the path "/var/mobile/Documents/settings" is denied. (System.UnauthorizedAccessException)

which originates from

Cirrious.MvvmCross.Plugins.File.MvxFileStore.WriteFileCommon

I am using the mvvmcross 3.11 MvxFileStore plugin. Deployment target ios7, 8.1 ios sdk.

I have been surfing the web and some states Documents directory has moved in iOS 8 and this might cause the exception. But I cant wrap my head around the fact that I cant reproduce this error.

Do anyone have a similar issue, a suggestion how to fix or an idea how to reproduce their crash.

Anything is appreciated.

Update:

From the post it is suggested to do the following fix

int SystemVersion = Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
        if (SystemVersion >= 8)
        {
            var documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;
            filename = Path.Combine(documents, sFile);
        }
        else
        {
            var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier
            filename = Path.Combine(documents, sFile);
        }

I have tried adding it to our project. We used the MvxFileStore to create the path to the settings file

 var filestore = Mvx.Resolve<IMvxFileStore>();
            string path = filestore.PathCombine(filestore.NativePath (string.Empty), FILENAME);

Now We de the following

 var filestore = Mvx.Resolve<IMvxFileStore>();
            string path = this.DocsDir() + "/" + FILENAME;

public string DocsDir ()
        {
            var version = int.Parse(UIDevice.CurrentDevice.SystemVersion.Split('.')[0]);
            string docsDir = "";
            if (version>=8) {
                var docs = NSFileManager.DefaultManager.GetUrls (NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User) [0];
                docsDir = docs.Path;
                Console.WriteLine("ios 8++ "+docsDir);
            } else {
                docsDir = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
                Console.WriteLine("ios 7.1-- " + docsDir);
            }
            return docsDir;
        }

I will resubmit our app and post the result.


Solution

  • Okay,

    The fix we did by seperating ios 8 and the rest of ios and do different implementations depending on the ios worked.

    Apple has approved our apps and all is love (y)