How to get attachment's (NSItemProvider) file path in Swift 'Share App Extension'?
Note: I am very new to Swift programming (2 days only) and I am working on this piece of code as part of an ElectronJS project. So please don't mind my ignorance regarding the basics of the language. Thanks.
I have created a Swift app containing a Share App Extension
.
Requirements:
The
Share App Extension
should be able to send theabsolute file path
of the shared files to the container app, i.e. If the user selectsa file (abc.txt) from Desktop
in Finder and Shares to my Application, then the Share App Extension should be able to get the file path as
/users/userName/Desktop/abc.txt
What I am struggling with here is how to get the file path of the files shared with the Share App Extension. What is the way to get file path of the attachments in
NSExtensionItem
that is available to theShare App Extension
or is it available from some other object ?
(I am able to successfully use
App Groups
to share data betweenShare App Extension
and theApplication
)
In the final project, the
Share App Extension
becomes a part of an ElectronJS project as mentioned earlier.
Is there a standard way to share the aforementioned information (file path of the attachments) from the
Share App Extension
to the main/renderer processes of the Electron application.
swift macos electron
add a comment |
Note: I am very new to Swift programming (2 days only) and I am working on this piece of code as part of an ElectronJS project. So please don't mind my ignorance regarding the basics of the language. Thanks.
I have created a Swift app containing a Share App Extension
.
Requirements:
The
Share App Extension
should be able to send theabsolute file path
of the shared files to the container app, i.e. If the user selectsa file (abc.txt) from Desktop
in Finder and Shares to my Application, then the Share App Extension should be able to get the file path as
/users/userName/Desktop/abc.txt
What I am struggling with here is how to get the file path of the files shared with the Share App Extension. What is the way to get file path of the attachments in
NSExtensionItem
that is available to theShare App Extension
or is it available from some other object ?
(I am able to successfully use
App Groups
to share data betweenShare App Extension
and theApplication
)
In the final project, the
Share App Extension
becomes a part of an ElectronJS project as mentioned earlier.
Is there a standard way to share the aforementioned information (file path of the attachments) from the
Share App Extension
to the main/renderer processes of the Electron application.
swift macos electron
add a comment |
Note: I am very new to Swift programming (2 days only) and I am working on this piece of code as part of an ElectronJS project. So please don't mind my ignorance regarding the basics of the language. Thanks.
I have created a Swift app containing a Share App Extension
.
Requirements:
The
Share App Extension
should be able to send theabsolute file path
of the shared files to the container app, i.e. If the user selectsa file (abc.txt) from Desktop
in Finder and Shares to my Application, then the Share App Extension should be able to get the file path as
/users/userName/Desktop/abc.txt
What I am struggling with here is how to get the file path of the files shared with the Share App Extension. What is the way to get file path of the attachments in
NSExtensionItem
that is available to theShare App Extension
or is it available from some other object ?
(I am able to successfully use
App Groups
to share data betweenShare App Extension
and theApplication
)
In the final project, the
Share App Extension
becomes a part of an ElectronJS project as mentioned earlier.
Is there a standard way to share the aforementioned information (file path of the attachments) from the
Share App Extension
to the main/renderer processes of the Electron application.
swift macos electron
Note: I am very new to Swift programming (2 days only) and I am working on this piece of code as part of an ElectronJS project. So please don't mind my ignorance regarding the basics of the language. Thanks.
I have created a Swift app containing a Share App Extension
.
Requirements:
The
Share App Extension
should be able to send theabsolute file path
of the shared files to the container app, i.e. If the user selectsa file (abc.txt) from Desktop
in Finder and Shares to my Application, then the Share App Extension should be able to get the file path as
/users/userName/Desktop/abc.txt
What I am struggling with here is how to get the file path of the files shared with the Share App Extension. What is the way to get file path of the attachments in
NSExtensionItem
that is available to theShare App Extension
or is it available from some other object ?
(I am able to successfully use
App Groups
to share data betweenShare App Extension
and theApplication
)
In the final project, the
Share App Extension
becomes a part of an ElectronJS project as mentioned earlier.
Is there a standard way to share the aforementioned information (file path of the attachments) from the
Share App Extension
to the main/renderer processes of the Electron application.
swift macos electron
swift macos electron
asked Nov 20 at 12:21
Akshay Anurag
6813
6813
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I am sharing the solutions below. Please bear in mind that these might not be the best possible solutions and I am open to suggestions.
Solution to Point #1:
Briefing: The user selects files from Finder
to be shared via the Share App Extension
of the application which is registered with the OS if the extension context
of the selection matches to that of the Share App Extension
. Upon doing so, the Share App Extension
receives the extension context
alongwith NSExtensionItem
. The NSExtensionItem
object contains the NSItemProvider
object which is the object you'd get for all the files (attachments) shared via the Share App Extension
.
Now, for each item type that you receive via the Share App Extension
, after looking for the data that your function recognizes via hasItemConforminToTypeIdentifier(_:)
, you can use UTI (Uniform Type Identifier) to identify its data.
Remedy: Here, the crucial part is to understand that one should be treating their input files as firstly being of the type: kUTTypeURL
. Then, in the completionHandler
for the loadItem
method of the NSItemProvider
object one would get NSURL
which is basically the file path I was looking for.
Solution to Point #2:
Briefing: The Share App Extension
has the luxury of being written in Swift but the main app in our project does not ! The main application is written in ElectronJS
which is far far far far from being integratable with Swift ! Except for the fact that the application written in ElectronJS
has the ability to be packaged in the form of a dmg
application, there is very little integratability between ElectronJS and Swift as far as the language and framework intertwining is concerned.
Premise:
So, the premise is to be able to share the filepaths extracted earlier to be passed from the Share App Extension
(written in Swift) to the main application (written in ElectronJS). Now, if the main application was a Cocoa application, things would have been much easier. If both of them belong to the same App group
, then using the Swift APIs they could have read/written synchronously to the Shared Memory. However, the problem arises as those APIs are not available in ElectronJS
. One remedy can be to run the Swift code in a sandboxed environment within the ElectronJS
application using nodeJS libraries. However, a sandboxed environment presents its own nuances in data sharing. So, I have kept this approach on hold for now.
So, the approach that I have chosen right now is to use App Data Directory
to share this intermediary information. The Share App Extension
would be writing the filepath information in the App Data
directory of the application and the ElectronJS application would use nodeJs APIs to access this information. Keep in mind that this is a very primitive approach and requires menial efforts but the requirements for this particular case doesn't need stringent security measures anyhow.
However, I am positively looking for a better way to solve Problem #2.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392888%2fhow-to-get-attachments-nsitemprovider-file-path-in-swift-share-app-extension%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I am sharing the solutions below. Please bear in mind that these might not be the best possible solutions and I am open to suggestions.
Solution to Point #1:
Briefing: The user selects files from Finder
to be shared via the Share App Extension
of the application which is registered with the OS if the extension context
of the selection matches to that of the Share App Extension
. Upon doing so, the Share App Extension
receives the extension context
alongwith NSExtensionItem
. The NSExtensionItem
object contains the NSItemProvider
object which is the object you'd get for all the files (attachments) shared via the Share App Extension
.
Now, for each item type that you receive via the Share App Extension
, after looking for the data that your function recognizes via hasItemConforminToTypeIdentifier(_:)
, you can use UTI (Uniform Type Identifier) to identify its data.
Remedy: Here, the crucial part is to understand that one should be treating their input files as firstly being of the type: kUTTypeURL
. Then, in the completionHandler
for the loadItem
method of the NSItemProvider
object one would get NSURL
which is basically the file path I was looking for.
Solution to Point #2:
Briefing: The Share App Extension
has the luxury of being written in Swift but the main app in our project does not ! The main application is written in ElectronJS
which is far far far far from being integratable with Swift ! Except for the fact that the application written in ElectronJS
has the ability to be packaged in the form of a dmg
application, there is very little integratability between ElectronJS and Swift as far as the language and framework intertwining is concerned.
Premise:
So, the premise is to be able to share the filepaths extracted earlier to be passed from the Share App Extension
(written in Swift) to the main application (written in ElectronJS). Now, if the main application was a Cocoa application, things would have been much easier. If both of them belong to the same App group
, then using the Swift APIs they could have read/written synchronously to the Shared Memory. However, the problem arises as those APIs are not available in ElectronJS
. One remedy can be to run the Swift code in a sandboxed environment within the ElectronJS
application using nodeJS libraries. However, a sandboxed environment presents its own nuances in data sharing. So, I have kept this approach on hold for now.
So, the approach that I have chosen right now is to use App Data Directory
to share this intermediary information. The Share App Extension
would be writing the filepath information in the App Data
directory of the application and the ElectronJS application would use nodeJs APIs to access this information. Keep in mind that this is a very primitive approach and requires menial efforts but the requirements for this particular case doesn't need stringent security measures anyhow.
However, I am positively looking for a better way to solve Problem #2.
add a comment |
I am sharing the solutions below. Please bear in mind that these might not be the best possible solutions and I am open to suggestions.
Solution to Point #1:
Briefing: The user selects files from Finder
to be shared via the Share App Extension
of the application which is registered with the OS if the extension context
of the selection matches to that of the Share App Extension
. Upon doing so, the Share App Extension
receives the extension context
alongwith NSExtensionItem
. The NSExtensionItem
object contains the NSItemProvider
object which is the object you'd get for all the files (attachments) shared via the Share App Extension
.
Now, for each item type that you receive via the Share App Extension
, after looking for the data that your function recognizes via hasItemConforminToTypeIdentifier(_:)
, you can use UTI (Uniform Type Identifier) to identify its data.
Remedy: Here, the crucial part is to understand that one should be treating their input files as firstly being of the type: kUTTypeURL
. Then, in the completionHandler
for the loadItem
method of the NSItemProvider
object one would get NSURL
which is basically the file path I was looking for.
Solution to Point #2:
Briefing: The Share App Extension
has the luxury of being written in Swift but the main app in our project does not ! The main application is written in ElectronJS
which is far far far far from being integratable with Swift ! Except for the fact that the application written in ElectronJS
has the ability to be packaged in the form of a dmg
application, there is very little integratability between ElectronJS and Swift as far as the language and framework intertwining is concerned.
Premise:
So, the premise is to be able to share the filepaths extracted earlier to be passed from the Share App Extension
(written in Swift) to the main application (written in ElectronJS). Now, if the main application was a Cocoa application, things would have been much easier. If both of them belong to the same App group
, then using the Swift APIs they could have read/written synchronously to the Shared Memory. However, the problem arises as those APIs are not available in ElectronJS
. One remedy can be to run the Swift code in a sandboxed environment within the ElectronJS
application using nodeJS libraries. However, a sandboxed environment presents its own nuances in data sharing. So, I have kept this approach on hold for now.
So, the approach that I have chosen right now is to use App Data Directory
to share this intermediary information. The Share App Extension
would be writing the filepath information in the App Data
directory of the application and the ElectronJS application would use nodeJs APIs to access this information. Keep in mind that this is a very primitive approach and requires menial efforts but the requirements for this particular case doesn't need stringent security measures anyhow.
However, I am positively looking for a better way to solve Problem #2.
add a comment |
I am sharing the solutions below. Please bear in mind that these might not be the best possible solutions and I am open to suggestions.
Solution to Point #1:
Briefing: The user selects files from Finder
to be shared via the Share App Extension
of the application which is registered with the OS if the extension context
of the selection matches to that of the Share App Extension
. Upon doing so, the Share App Extension
receives the extension context
alongwith NSExtensionItem
. The NSExtensionItem
object contains the NSItemProvider
object which is the object you'd get for all the files (attachments) shared via the Share App Extension
.
Now, for each item type that you receive via the Share App Extension
, after looking for the data that your function recognizes via hasItemConforminToTypeIdentifier(_:)
, you can use UTI (Uniform Type Identifier) to identify its data.
Remedy: Here, the crucial part is to understand that one should be treating their input files as firstly being of the type: kUTTypeURL
. Then, in the completionHandler
for the loadItem
method of the NSItemProvider
object one would get NSURL
which is basically the file path I was looking for.
Solution to Point #2:
Briefing: The Share App Extension
has the luxury of being written in Swift but the main app in our project does not ! The main application is written in ElectronJS
which is far far far far from being integratable with Swift ! Except for the fact that the application written in ElectronJS
has the ability to be packaged in the form of a dmg
application, there is very little integratability between ElectronJS and Swift as far as the language and framework intertwining is concerned.
Premise:
So, the premise is to be able to share the filepaths extracted earlier to be passed from the Share App Extension
(written in Swift) to the main application (written in ElectronJS). Now, if the main application was a Cocoa application, things would have been much easier. If both of them belong to the same App group
, then using the Swift APIs they could have read/written synchronously to the Shared Memory. However, the problem arises as those APIs are not available in ElectronJS
. One remedy can be to run the Swift code in a sandboxed environment within the ElectronJS
application using nodeJS libraries. However, a sandboxed environment presents its own nuances in data sharing. So, I have kept this approach on hold for now.
So, the approach that I have chosen right now is to use App Data Directory
to share this intermediary information. The Share App Extension
would be writing the filepath information in the App Data
directory of the application and the ElectronJS application would use nodeJs APIs to access this information. Keep in mind that this is a very primitive approach and requires menial efforts but the requirements for this particular case doesn't need stringent security measures anyhow.
However, I am positively looking for a better way to solve Problem #2.
I am sharing the solutions below. Please bear in mind that these might not be the best possible solutions and I am open to suggestions.
Solution to Point #1:
Briefing: The user selects files from Finder
to be shared via the Share App Extension
of the application which is registered with the OS if the extension context
of the selection matches to that of the Share App Extension
. Upon doing so, the Share App Extension
receives the extension context
alongwith NSExtensionItem
. The NSExtensionItem
object contains the NSItemProvider
object which is the object you'd get for all the files (attachments) shared via the Share App Extension
.
Now, for each item type that you receive via the Share App Extension
, after looking for the data that your function recognizes via hasItemConforminToTypeIdentifier(_:)
, you can use UTI (Uniform Type Identifier) to identify its data.
Remedy: Here, the crucial part is to understand that one should be treating their input files as firstly being of the type: kUTTypeURL
. Then, in the completionHandler
for the loadItem
method of the NSItemProvider
object one would get NSURL
which is basically the file path I was looking for.
Solution to Point #2:
Briefing: The Share App Extension
has the luxury of being written in Swift but the main app in our project does not ! The main application is written in ElectronJS
which is far far far far from being integratable with Swift ! Except for the fact that the application written in ElectronJS
has the ability to be packaged in the form of a dmg
application, there is very little integratability between ElectronJS and Swift as far as the language and framework intertwining is concerned.
Premise:
So, the premise is to be able to share the filepaths extracted earlier to be passed from the Share App Extension
(written in Swift) to the main application (written in ElectronJS). Now, if the main application was a Cocoa application, things would have been much easier. If both of them belong to the same App group
, then using the Swift APIs they could have read/written synchronously to the Shared Memory. However, the problem arises as those APIs are not available in ElectronJS
. One remedy can be to run the Swift code in a sandboxed environment within the ElectronJS
application using nodeJS libraries. However, a sandboxed environment presents its own nuances in data sharing. So, I have kept this approach on hold for now.
So, the approach that I have chosen right now is to use App Data Directory
to share this intermediary information. The Share App Extension
would be writing the filepath information in the App Data
directory of the application and the ElectronJS application would use nodeJs APIs to access this information. Keep in mind that this is a very primitive approach and requires menial efforts but the requirements for this particular case doesn't need stringent security measures anyhow.
However, I am positively looking for a better way to solve Problem #2.
answered Nov 21 at 7:13
Akshay Anurag
6813
6813
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392888%2fhow-to-get-attachments-nsitemprovider-file-path-in-swift-share-app-extension%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown