App size with an extension in App Store - ios

I was just wondering if app extension (f.e. stickers) affects containing app size in the App Store?
As far as I can see in the build package, there are resources, main executable file and executable file for the extension. So it probably won't affect final app size, but I'm not sure and cannot find any information in the internet.
Can anybody help me with this question?

Yes, the app extensions will affect the final ipa file size.
Build out your two .ipa files. One for the project without the app extension and one with the app extension. Compare those two file sizes to see the size difference.
To see the size of the .appex, rename your .ipa to .zip and double click the zip file to extract it. Open the extracted folder and control+click the .ios file. You can now look inside that folder and see what is changing.

Related

Does an iOS extension have an IPA file?

I was wondering if a share extension creates an .ipa file similarly to a regular target?
Thanks
No, it's packaged in your app's IPA and delivered to Apple as a single file with it (and everything else).
An IPA itself is a zip format file -- if you make a copy of one and rename it to .zip, you can unzip it and look at what it has.
At the top level it has a Payload folder with a .app file in it. That file is a package (you can right-click and show contents). In there, you'll find a PlugIns folder, which will have *.appex files. These are what your extension targets build.
So, the IPA's Payload/NAME.app/PlugIns/*.appex packages are the extensions.

Add a file to iOS application after install it

I have an iOS project that includes a framework and a .dat file which is used by framework. I add the framework file and the .dat file to a folder in my project and things are working in this way.
However, the .dat file is so big and this makes my project size bigger. I want to download this file after installation to make my app size smaller.
Is it possible? If yes, how can I do that?
First you need to store .dat file on server and get link of that file and download it in app at very first launch.
When app is launched you need to check that .dat file is already exists in your device's doc. folder or not.
If not then you need to download it from url and store it in doc. dir.
When you successfully downloaded file you need to add a bool in user default to true to identify that file is dowloaded correctly, and you can check that too to identify whether file is downloaded or not.
if .dat file download is not successful than file will not be available in app. and you can perform some operations based on that.
Alternatively, you can just check the bool flag in user defaults to check for the successful download of file.
you can place that code in AppDelegate as there are several methods available for different app states.
Hope it will help you:)
Check this [On-Demand Resources]
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083-CH2-SW1

How to know which third party affects my app size?

I want to understand which of the third libraries I'm using affect my app size the most (Mixpanel, Crashlytics, etc...).
How can I do that?
If your 3rd-party library are all dynamic ones, it's in folder of the bundle as Harshal Valanda shows.
If you have some static libraries linked, it may be hard for you to find which one contributes the most in your final binary.
Find a .app file in project and file show in finder.
Show package contents of .app
In package Contents you get information about framework, icon and file size.

Can I access an xcassets directory on the filesystem?

I would like to dynamically load all images in an xcassets directory. The files are named StockPhoto# where # is the number in the list. If I can access my StockPhotos.xcassets at runtime to count all the files in the directory, I won't have to manually load the files each time I add new stock photos.
If there are other solutions to this problem, I'm open to that but I'm also just very curious how xcassets are handled by the file system- whether they're just reference to a set of files, or actually their own directory. Information on this is sparse.
If there are other solutions to this problem, I'm open to that
The problem is that there is no introspection at runtime into an asset catalog: it isn't a "thing" you can "see" as far as Objective-C and Cocoa Touch are concerned.
The usual solution to this kind of problem is to drag a folder full of images into your project at the outset, and when you do, choose "Create folder references for any added folders" in the dialog - not "Create groups for any added folders". The result is that the folder is copied into your app bundle, and now you can use ordinary file system methods to say "every file in this folder".
Upon compilation of your iOS project, xcassets are compiled to produce either image files, or a proprietary .car file. In that latter case images won't be stored in a directory you can browse.
If your "Deployment Target" is less that iOS7 (meaning that your app would still be able to run on iOS6)
It will produces the same set of image files that you would have had to produce without using Assets Catalog, namely <YourImageName>.png, <YourImageName>#2x.png, <YourImageName>~ipad.png, <YourImageName>~ipad#2x.png and so on, for each image set of your xcassets.
If your "Deployment Target" is iOS7 or greater (meaning that your app would only be able to run on iOS7+)
It will produce a single big .car file in the final bundle (I don't really looked up if this file was actually an sqlite3 datatbase or some proprietary format or whatnot, but who cares, you are not supposed to manipulate it anyway). This big .car file contains all the images, with all their provided variants, and even with slicing info (if you did slice some of them for tiling or to use them as 9-patch images using the tool provided for that in the Assets Catalog editor)
Whatever the produced result you shouldn't / are not supposed to dig into internal details of your bundle like that. The format of the .car file may even change from one iOS version to another (who knows? that's internal details after all which we shouldn't have to deal with) so don't base your logic on it.
[EDIT]: If you need to be sure to have a directory with your set of images at the end of the compilation, you could instead use a folder reference (referencing a real folder in the Finder, as opposed to an Xcode "group" as only group files in Xcode's Project Navigator) then use code to browse it. But then you will have to deal with other details, like only browse files that match the current device (iPhone vs. iPad, non-retina vs. retina…), so this would only shift the problem further in your case; you really should use a constant somewhere to declare the number of images (or put this in some PLIST file for example) and iterate thru them.
As the files you provide at compile time will be in your Bundle — which cannot be altered once compiled as it is digitally signed — the number of images will never changed once the app is compiled anyway. (That's not like if you used the Documents directory and enabled iTunes File Sharing or whatever, letting the user add images himself ;-))
If you're targeting iOS 7+ then no. Xcode will package the files into a proprietary format (.car) that you can't access directly.
Either use imageNamed: methods, or don't use Image Catalogs for the files you need to access directly.
as #AliSoftware suggests you can store all assets images to plist and access them later for more details see here

Why is a static library 10Mb, but an .ipa using it is only 4Mb?

I have a workspace that contains a static library and a project using the library, I'm then building the project (using Jenkins) to create an archive for ad-hoc distribution.
The resulting file size for the built library is reported as being 10.4Mb, yet .ipa is reported as being 4.2Mb.
How can the .ipa be so much smaller than the library, and yet the app runs when installed so it must be containing the library.
This have multiple reasons:
Static libraries contains additional information required for linking (like methods names and so on).
IPAs are compressed archives. Similar to ZIP just with another file ending.
The most likely explanation is that the library contains symbols necessary to linking (as well as debugging symbols, possibly), while the ipa file has been already linked (thus it does not contains information for the linker) and stripped of debugging symbols.
On another account, the ipa file is just a zip file, so its content is also compressed.
The algorithm that apple uses to compress into .ipa is very good .
If your bundle doesn't contain too many images the percentage can be as low as 15% (from the uncompressed size on disk).

Resources