I recently started saving a file, where I hold some app state, to an AppGroup in order to share it with my widget extension.
Of the some 16k daily active users of my app, 55 are initially unable to read the file (it might not yet be created). And they are unable to write a file to the AppGroup as well. I only know this due to logging the error to Crashlytics.
Error Reading: "The file “BFTPreferences” couldn’t be opened because you don’t have permission to view it.
Error Code:257"
My App sees this error and informs the user to restart their device. I have not been contacted by any of these users for support, so I assume the restart fixes things.
Has anyone seen this before? Is restarting the device the only fix? Am I doing something wrong?
The only solution I can think of currently is to save the file to the app's Documents directory and save a copy to the AppGroup for use in my extensions. At least then the main app won't have an issue and it will just be the widget unable to display data until a restart.
Reading the file:
do {
// archive data
let data = try PropertyListSerialization.data(fromPropertyList: preferences, format: .xml, options: 0)
// write data
do {
if let groupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) {
let fullPath = groupURL.appendingPathComponent(preferencesFileName)
try data.write(to: fullPath)
}
else {
fatalError("Unable to find app group \(appGroupIdentifier)")
}
}
catch {
logthis("Failed to write dictionary data to disk. \(error.localizedDescription)")
}
}
catch {
logthis("Failed to archive dictionary. \(error.localizedDescription)")
}
Writing the file:
do {
if let groupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) {
let fullPath = groupURL.appendingPathComponent(preferencesFileName)
let data = try Data(contentsOf: fullPath)
if let dictionary = try PropertyListSerialization.propertyList(from: data, format: nil) as? NSMutableDictionary {
preferences = dictionary
}
}
else {
fatalError("Unable to find app group \(appGroupIdentifier)")
}
} catch {
if (error as NSError).code == NSFileReadNoSuchFileError {
// file doesn't exist so create it
}
else {
logthis("Couldn't read BFTPreferences:\(error.localizedDescription)\nError Code:\((error as NSError).code)") <--error code 257 is caught here
}
}
Post
Replies
Boosts
Views
Activity
I want to add a button to my live activity which stops a timer. The docs say to use a URL deep link, which works fine, however it forces the App to open.
I want the timer to stop after the button is pressed and end the live activity without opening my app, like the built in Clock.app timer works.
Is this possible?
Issue noticed when upgrading to Xcode 12.
Whilst debugging Swift code I noticed that variables of type Date show no value in the debuggers variable view.
notificationDate (Date)
If I put a cast in my Swift code to NSDate:
let nsNotificationDate = notificationDate as NSDate
Then it shows a value in the debugger variables view:
notificationDate = (NSDate) 2020-09-17 16:58:40 UTC
If I 'po' the Date variable in the debug console I can see its value.
Printing description of notificationDate:
▿ 2020-09-17 16:58:40 +0000
- timeIntervalSinceReferenceDate : 622054720.023765
If I 'po' the NSDate cast version I can also see its value.
Printing description of nsNotificationDate:
2020-09-17 16:58:40 +0000
I've not noticed this happening pre Xcode 12 so think its a new Xcode bug.. anyone else notice this or have any pointers?
With the recent changes when I log into AppStore Connect it keeps selecting a clients team as default instead of the one for my company. I can change teams easily but I'd really prefer to select my team as the default choice so that I don't have to keep swapping it every time I login.Any ideas if this is possible?