I am developing a File Provider Extension on Mac. I am confused about how the extendedAttributes property works. The property never seems to be populated with any extended attributes.
I've tried setting some custom extended attributes on my documents in testing, but they are never populated in the itemTemplates that are produced in the extension. The dictionary that would hold the extended attributes always is empty.
I began to think that it only supported Mac-created attributes such as com.apple.quarantine.
I then tried importing some files that are 'quarantined' with this appropriate extended attribute but still have not seen this data appear in my extension either.
Any clarity here with what I should be expecting or what I should try would be helpful.
File Provider
RSS for tagAllow other apps to access the documents and directories stored and managed by your containing app using File Provider.
Posts under File Provider tag
76 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
TL:DR
Can anyone provide guidance as to how to get the FileProvider testing API to work? It closes with no error and I have not been able to determine the issue despite careful attention to the documentation and signing. The Console logs seem to imply it is a Sandbox issue.
Hi,
Writing this as per suggested in the technical support section.
I am trying to create some tests that involve controlling the calls from MacOS to the corresponding "event" functions in the FileProvider (e.g. fetchContents()) using the FileProviderExtension test API provided by Apple.
I have thoroughly read the documentation (both online and within the API code) in order to get this to work. I have:
Added the com.apple.developer.fileprovider.testing-mode entitlement to both my Main App as well as my FileProviderExtension
Ensured my I have the correct account permissions, and provisioning profiles for my Main App as well as FileProviderExtension
Added the line domain.testingModes = [.alwaysEnabled, .interactive]
The issue: I found that setting the .interactive option in my domain.testingModes will result in my domain in Finder appearing to be stuck loading the root folder, and that my FileProviderExtension instance is being invalidated and closing in ~5s. It is reproducible. Is this a bug?
Some things I have noticed:
Attaching the debugger to the FileProviderExtension process results in no error. Additionally there is no error received when calling add(:domain).
I noticed through testing that the Main App appears to be required to have the com.apple.developer.fileprovider.testing-mode entitlement in order to run a FileProviderExtension with that same entitlement. Otherwise I would receive the error: Error Domain=NSCocoaErrorDomain Code=257 "The file couldn’t be opened because you don’t have permission to view it"
When trying to sign manually using a group Developer ID Application certificate as opposed to automatically with my Apple Development certificate Xcode presents the error "Main app provisioning profile" doesn't support the FileProvider Testing Mode capability." Despite this I can clearly see that is an enabled capability though the online Apple Developer portal under the Profiles section. Note that the only capabilities enabled when viewing the bundle identifiers of the Main App and FileProviderExtension are "FileProvider Testing Mode", "App Groups", and the (seemingly required) "In-App Purchases". I later realized that this was likely due to using the wrong type of provisioning profile so I generated and switched to MacOS Developer Profiles (as opposed to Distribution) and this error in XCode went away. However the above issue (FileProviderExtension instance being invalidated) persisted.
If I look at the Console I see various errors from when the extension is launched till it closes:
Sandbox: mdbulkimport(922) deny(1) mach-lookup com.apple.FileProvider
Sandbox: hiveDiskProvider(37981) deny(1) mach-lookup com.apple.mobile.keybagd.UserManager.xpc
[ERROR] Cannot query for providers. Error: NSError: Cocoa 4099 "<private>"
Error from beginMonitoringProviderDomainChangesWithHandler: Error Domain=NSCocoaErrorDomain Code=4099 UserInfo={NSDebugDescription=<private>}
Synchronizer coordinateReadingItemAtURL error: Error Domain=NSCocoaErrorDomain Code=3072
With the Development Provisioning Profiles I see a couple new errors:
From secinitd(App Sandbox) Failed to set LS data container personality info: <private>
A new error repeated a number of times from cfprefsd after trying to access some .plist files that don't appear to be on my system:
Error: Couldn't open parent path due to [2: No such file or directory]
Paths are: ~/Library/Containers/<extensionBundleID>/Data/Library/Preferences/ByHost/<extensionBundleID>.<ID>.plist
/Library/Managed Preferences/<username>/<extensionBundleID>.plist
Any help would be greatly appreciated :)
Description says this event will be raised when "An identifier for a process that notifies endpoint security that it is updating a file." What does this mean ?
Similarly when will ES_EVENT_TYPE_NOTIFY_FILE_PROVIDER_MATERIALIZE event be raised ?
Do these events get raised if any cloud provider sync app like Google Drive/Dropbox/OneDrive that usages fileprovider framework to sync the data ?
In my endpoint secutiry app, I have registered for these events but i didnt receive any event
*i do receive other endpoint secutiry events like ES_EVENT_TYPE_NOTIFY_CLONE etc.
Hello,
I am encountering an error in my File Provider UI extension where, after calling NSFileProviderManager's getUserVisibleURL(for itemIdentifier: ) method, I receive an error: "The file “...” couldn’t be opened because you don’t have permission to view it."
Looking at the system logs I see the following output:
2024-04-18 12:49:42.847462+0800 0x26c76 Error 0xbec93 6750 0 fileproviderd: (FileProviderDaemon) [com.apple.FileProvider:default] [ERROR] <private> is missing enumerate entitlement to lookup <private>
2024-04-18 12:49:42.847576+0800 0x26c76 Default 0xbec93 6750 0 fileproviderd: (FileProviderDaemon) [com.apple.FileProvider:default] [WARNING] No provider found with identifier <private> for calling bundle (null) on second attempt.
2024-04-18 12:49:42.847688+0800 0x26c76 Error 0xbec93 6750 0 fileproviderd: (FileProviderDaemon) [com.apple.FileProvider:default] [ERROR] Provider ID com.app.name.FileProviderExt is not allowed to provide item ID <private> to consumer ID (null)
This issue only appears on my development machine with the release app bundle codesigned with the intended certificate for release. This is a machine where I have built this same application using a personal development certificate (which works fine and does not face this error). On a second Mac, which has never had this app installed, I do not face this error.
I am using NetFS's NetFSMountURLAsync api to mount SMB share in mac os app. I am able to mount the share however this share is not automatically appearing in Finder's sidebar. I tried using LSSharedFileListInsertItemURL to make the mount point available in Finder's side bar however facing crash on line,
kLSSharedFileListItemBeforeFirst.takeRetainedValue()
from below code snippet.
let itemType: CFString = kLSSharedFileListFavoriteItems.takeRetainedValue()
if let list: LSSharedFileList = LSSharedFileListCreate(nil, itemType, nil)?.takeRetainedValue() {
let inPropertiesToSet: CFMutableDictionary = CFDictionaryCreateMutable(nil, 1, nil, nil)
CFDictionaryAddValue(inPropertiesToSet, unsafeBitCast(kLSSharedFileListVolumesNetworkVisible, to: UnsafeRawPointer.self), unsafeBitCast(kCFBooleanTrue, to: UnsafeRawPointer.self))
let driveUrl = URL(fileURLWithPath: mountPoint)
let shareUrl: CFURL = driveUrl as CFURL
if let item: LSSharedFileListItem = LSSharedFileListInsertItemURL(
list,
kLSSharedFileListItemBeforeFirst.takeRetainedValue(),
nil, iconRef, shareUrl, inPropertiesToSet, nil) {
let itemRefId = LSSharedFileListItemGetID(item)
let itemRefIdStr = "\(itemRefId)"
userDefaults.set(itemRefIdStr, forKey: mountPoint)
}
}
Anything wrong in above code? Also since this api is deprecated is there any alternative API to achieve this. The goal is to make the mount point available in Finder's sidebar so that user can easily access it.
I think I've got all the keys and entitlements set up ok. I have no problem receiving normal alerts via the UNUserNotifications framework. Now I'm trying to use PushKit (for fileProvider). I have the following in my AppDelegate
fileProvider = PKPushRegistry(queue: nil)
fileProvider.delegate = self
fileProvider.desiredPushTypes = [.fileProvider]
along with the required delegate functions. I am never provided with credentials, only an immediate call to the didInvalidatePushToken delegate.
Any suggestions appreciated.
I have verified NSExtensionPrincipalClass, appGroup. We are using authentication with File Provider UI but when I tried to debug the extension, AppDelegate is getting called instead if initialising the File Provider extension class with iOS 17.4 but it's working well with 17.2
I am uploading pdf document through document picker from One drive. When I am uploading pdf document from OneDrive personal account it is working fine but when I am uploading from OneDrive business account it is getting failed.
Hello.
I have the following question. I have a program that creates files with its own extension and reads them. When I select a file with my extension in the Files app, it automatically opens my app. But if a file with my extension is attached to an email, when I click on my file it shows me a screen with programs to open (actually it shows my program the second time I click on the file, if I click the first time, my program is not listed) . I have a question, is it possible to make the file with my extension attached to the letter immediately open in my program without additional screens or is it not allowed. If possible, then what did I miss, based on the fact that it opens immediately from the Files program.
Thank you.
P.S. File how it works below:
![]
[Image Edited by Moderator to Remove Personal Information]
We're trying to implement a file locking mechanism to prevent multiple users from editing the same file at the same time causing conflicts.
Our previous implementation worked well on Ventura, but on Sonoma, even when just previewing a file in Finder in Column View, as opposed to editing, it locks. This is the same behaviour we experienced with Apple's FruitBasket sample code.
There is a isFileViewerRequest flag inside the NSFileProviderRequest object provided with the NSFileProviderReplicatedExtension enumerator function. We thought this would indicate a file being edited.
After further investigation, we were told that the isFileViewerRequest flag just indicates if a file is being presented, not just edited. We find the intended behaviour a bit strange, why would anyone want an icon next to a file to indicate presented? Why is the behaviour working fine on Ventura as a locking mechanism but on Sonoma it can only be considered a presented mechanism? If the intended behaviour is to indicate a file being presented, why did it change behaviour going from Ventura to Sonoma? A feature that was useful in Ventura becomes useless in Sonoma and the fix is for us to adjust to a new meaning of it.
My main question is the following: Is there a recommended mechanism to determine if a file is being edited so that we can implement locking to avoid simultaneous editing?
Thanks
I'm trying to make a macOS app using SwiftUI that supports dragging arbitrary files from the app into finder. However, I'm getting this error:
"Sandbox extension data required immediately for flavor public.file-url, but failed to obtain."
I'm looking through the entitlements and not finding anything obvious here.
I've tried various forms of NSItemProvider():
Try 1:
let itemProvider = NSItemProvider(item: image.data as NSSecureCoding, typeIdentifier: image.uniformType.identifier)
// Tried presenting as data
itemProvider.registerDataRepresentation(for: .fileURL, visibility: .all) { completion in
...
}
// Tried presenting as file
itemProvider.registerFileRepresentation(for: .fileURL, visibility: .all) { completion in
...
}
Try 2:
let itemProvider1 = NSItemProvider(contentsOf: tempFileUrl, contentType: .fileURL)
Tried using this form as well.
In the completion handler for register*Representation(), i'm typically creating a temporary file and returning that.. (either the URL to the file or the data directly, depending on the API):
let tempFileUrl = URL.temporaryDirectory.appending(path: "testfile.png")
_ = tempFileUrl.startAccessingSecurityScopedResource()
defer { tempFileUrl.stopAccessingSecurityScopedResource() }
completion(tempFileUrl as data, nil) // option 1
completion(data, nil) // option 2
Disabling App Sandbox in the entitlements file does not work, but the error message goes away. So it seems like I have two problems: some sort of entitlement error and I must be using NSItemProvider() incorrectly.
Anyone have any suggestions? I don't see to many examples out there for supporting exporting files (e.g. images) from an app into Finder.
Thanks!
This sample program :
@main
struct DocumentPickerApp: App {
var body: some Scene {
DocumentGroup(newDocument: DocumentPickerDocument()) { file in
ContentView(document: file.$document)
}
}
}
This sample program is running correctly on iOS, iPadOS. But this program is not running correctly on macOS.
Xcode version 15.3, compile correctly all OSs, but on macOS cannot change Picker's file. I cannot understand the reason.
Please tell me, the way of this problem!!
Hi all,
with yesterday's macOS 14.4 update, fileproviderctl removed the listproviders option.
I couldn't find a replacement.
Other options like dump domain result in error:
Import Cookie: Der Vorgang konnte nicht abgeschlossen werden. (GSLibraryErrorDomain-Fehler 2 - Invalid volume URL)
Is there anything I can do about this except for wait for Apple to fix this? Or was removing listproviders even done intentionally?
Thanks!
Sebastian
So, I'm looking into startaccessingsecurityscopedresource() function and from my current understanding this is to get temporary access to files/folders you don't implicitly have access to i.e., that don't belong to your sandbox. I can understand what it means wrt macOS, iOS, iPadOS, but what does it mean in watchOS and tvOS where there isn't any file sharing between different apps? And what is it's relevance wrt using iCloud (if there is any?)
Hello,
I'm having issues running a precompiled binary through Terminal. The binary is a custom fork of software used to send code to a microprocessor through USB. The distributor is a known company and they have the binaries working on their machine (but I don't know which version of macOS they use). I was running Ventura 13.2.1 on a 2021 M1 and upgraded to Sonoma 14.3.1 — neither worked.
I'm using zsh. I symlink the location of the binary, and it returns File Exists however, when I try to run the command, I receive zsh: permission denied: command then, when I sudo the command, I receive sudo: command: command not found.
If this binary is not signed by Apple, could this be the reason it's not working?
Could it be because I have FileVault turned on?
Are others having this issue in their applications?
Thank you
For example I created a project aaa.
aaa source folder is called aaa.
that is
aaa
aaa/aaa
then I put a data file in
aaa/aaa/some.data
now i want to test data in
aaa/aaaTests/aaaTests.swift
How can i access aaa/aaa/some.data in aaaTests.swift?
If I want to access some.data inside aaa/aaa/ContentView.swift, how to write the code?
I have been searching google and bing for days, but find no example answering my questions.
Can anyone help me out?
Thanks in advance.
I've defined a FileDocument with an init(configuration: ReadConfiguration) .... I've got a URL via .fileImporter - now I'd like to actually read and process (the JSON content). How do I get the ReadConfiguration from the URL? (And what would I search for to avoid this probably trivial issue?)
Of course, I wrote the JSON file in the first place... so I could just read the contents as Data and decode it to JSON. But then what is the point of FileDocument other than to provide .fileExporter with a required argument?
NSFileProvider Extension based on Xamarin.Mac constantly crashes starting on MacOS 14.4 Beta
Steps to Reproduce:
Create simple Xamarin.Mac solution and add FileProviderExtension project
Storage appears in Locations section in Finder
Expected Behavior:
Cloud storage shows folders content
Actual Behavior:
Cloud storage doesn't show folder content, just infinite running spinner
FileProviderExtension process constantly crashes. It occurs only in OSX starting from 14.4 beta. Please review crash report and help me understand whats wrong and how to fix it. Simple project written with Swift and Xcode works without any issues.
May be it’s related to issue described here https://forums.macrumors.com/threads/fileproviderctl-on-sonoma-14-4-here-we-f-ng-go-again.2418353.
Thanks in advance!
Environment-Info.log
CrashReport.txt
I am trying to sync some metadata fields via NSFileProviderItem extendedAttributes and have been successful when using arbitrary tag names prefixed by "#S"
This is good but pretty much useless as those fields won't be indexed by Spotlight and won't be displayed in Finder
In order to have my fields displayed in Finder I am attempting to return the com.apple.metadata fields but they seem to be all systematically ignored with or without sync suffix.
This is really a big limitation and surprising given the fact that the tagData call works beautifully to synchronised keywords that are then populated in the extended attributes and indexed by Spotlight.
One more drop in the bucket of unanswered / undocumented questions in this forum ...
Thanks for any help.
Hello,
I had a strange bug in a File Provider app and I found out that the problem was that NSFileProviderEnumerator's invalidate() was called during an operation (a download or even a file enumeration operation from the server).
The files are stored on a server and while fetchContent is called and the extension waits for the server to send the file (or enumerate a long list of files), invalidate() is called. And after some time the extension is re-initialised.
I know that the extension can be deallocated by the OS from time to time, but why during an operation? If a do a cleanup inside invalidate() I will lose references to my downloads or operations.
Any thoughts on this? Is there any way to prevent this?
Thank you.