Reputation: 3110
Sharing class between iOS app and extension app
I want to use a custom class in both my app and the extension app. If I just have the class in the main app folder, the extension doesn't pick up on it. I tried making a copy of it and putting it into the extension folder, but I of course get a invalid redeclaration of [my class]
error. What's the best solution for this? It's just one class, not multiple resources.
Upvotes: 42
Views: 21014
Reputation: 34255
App Extension(e.g Widget aka Today, Photo Editing...)
Containing App
- app which contains an extension or super appHost App
- app which calls App Extension
and starts extension's lifecycleFor example systems Photos app can be Host App
for Photo Editing Extension
like Photoshop Extension which is a part of Photoshop App(Containing App
)
App Extension
- available from iOS v8 - it is a packaged bundle
which uses different process than Containing App
and can communicate with Containing App
through App Groups and with Host App
through IPC. It has .appex
file extension and is located in PlugIns
folder. Something similar to CXTests[About]
Application packaged bundle
SpeedWidgetExtension.appex - Application Extension packaged bundle
Communication of App Extension
and Containing App
App Group
[About]Target Membership
- the simplest way or for pre iOS v8 which allows you to add files into every target. It increases a footprint of package because this file will be duplicated for every target
Framework
- module for grouping/reusing code
Embedded framework
aka Dynamic framework
- the most appropriate way to share common code base. Please turn on APPLICATION_EXTENSION_API_ONLY
[About] for the framework. Please note that for using Embedded framework
you should embed it only in Containing App
(and don't add this framework in App Extension
. If you include this framework additionally to App Extension
it will have the same framework inside App Extension
bundle(additionally to Containing App
) - framework will be duplicated). It is possible to use single framework for both Containing App
and App Extension
because of @prath
[About]//App Extension
LD_RUNPATH_SEARCH_PATHS = @executable_path/../../Frameworks
//It means that App Extension can uses Dynamic framework from Containing app
Static Framework
- link the code to executable binary. You can link library only for Containing App
Limitations:
[iOS Extension Widget(Today) gray background]
[iOS extensions]
[iOS App Group]
[Vocabulary]
Upvotes: 3
Reputation: 650
Just make sure that the files you want to share gets a tick in the section Target Membership.
Select your file, open the utility panel on the right and tick the appropriate target under Target Membership.
Upvotes: 30
Reputation: 2803
Embedded frameworks are a great way to reuse code between your application and your extension. Having moved some of the code to embedded frameworks will provide us with a great opportunity to write some unit tests around it.
See section Using an Embedded Framework to Share Code https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1
Upvotes: 6
Reputation: 17043
Nothing should be copied. Just add required files to compile sources for your extension:
Upvotes: 58