App Won't Compile with Embedded Third Party Framework: Could not install at this time. Failed to load Info.plist from bundle at path

So, I'm getting this error when trying to run the app. "Build succeeds" but the app won't run and Xcode spits out an error:


Could not install at this time.

Failed to load Info.plist from bundle at path


And the path points to a 3rd party framework I use, pointing to its Info.plist: Extra info about plist: ACL=<not found>.


If I choose "Do Not Embed" in the "Frameworks, Libraries, and Embedded Content" section of Xcode, the app build & runs. But if I choose "Link and Embed" the app, I get this error and the app won't run.


Obviously, if I'm shipping the app to the App Store I need to embed the 3rd party framework in the application...


Upon further inspection, if I look inside the .framework of the third party library it does not include an Info.plist file. Never had an issue related to this third party framework before. It's the GoogleMobileAds.framework...

Okay, reached out to Apple via Feedback and got a response. They brought to my attention that the binaries aren't .dylibs and framework binaries need to be dylibs.


So even though Google distributes their Admob SDK as frameworks (GoogleMobileAds.framework, GoogleUtilities.framework, ect), the binaries apparently can't be embedded in the app like a 'dynamic framework'. I guess in Google's Xcode project they changed the Mach-O type to "Static"? I didn't even realize that was supported. Wonder why they don't ship these as static libraries instead of .frameworks? Is there any advantage to using a .framework over a static library in this case?


If I just link to the framework (and not embed) the app will run on my device. I was thinking I needed to embed them, because GoogleMobileAds.framework is obviously not included in iOS and didn't realize the 'framework' wasn't meant to be embedded in the app like frameworks usually are.

If I just throw an Info.plist in GoogleMobileAds.framework and make up a bundle identifier in the Info.plist...it runs...bizarre...

Okay...this works... before my configuration was this:


I have my own framework which links to this third party framework (but does not embed). My main app links and embeds my framework and links and embeds the third party framework.


So, this apparently doesn't work anymore? If I remember correctly, I did this because I had a hard time embedding a third party framework within one of my own frameworks in a previous version of Xcode.


New configuration:

In Xcode I changed my framework to link & embed the third party framework. Now my main app only links and embeds my framework and does not link or embed the third party framework anymore.


And the app compiles and runs....no info.plist required.

Have to retract my previous post as the correct answer. While doing what I described above works as far as getting the app to run in the simulator and on my iOS device, the App Store rejects it when I submit the app.


App Store Connect Operation Error

ERROR ITMS----: "Invalid Bundle Structure - The binary file 'MyApp.app/Frameworks/MyCustomFramework.framework/Frameworks/GoogleUtilities.framework/GoogleUtilities' is not permitted. Your app can’t contain standalone executables or libraries, other than a valid CFBundleExecutable of supported bundles. Refer to the Bundle Programming Guide at https://developer.apple.com/go/?id=bundle-structure for information on the iOS app bundle structure."


This is really annoying...

Aside from the Info.plist issues, the path in that error shows you have a framework nested inside another framework. This is not supported except on macOS. TN2435 describes how to handle this siutation.

Thanks a lot for the reply. My original configuration was exactly as described in the link:


"If your app has dependencies between frameworks, configure the dependency with these instructions:

  1. In the framework target's General settings, add the frameworks it depends on to the Linked Frameworks and Libraries section, as shown in Figure 2.
  2. In the app project, follow the instructions for Embedding a Framework. The app target is responsible for embedding all of the frameworks, including any frameworks that other frameworks depend on."

---


My framework references the 3rd party framework (as described in point number 1). And my main app embeds the third party framework (as described in point number 2).


This has always worked for me (until now). The app build will succeed but it won't launch (get the error about the info.plist as mentioned in my original post).


Now because I'm just trying to get this all to work, I experimented with my configuration. Turns out embedding the third party framework inside my framework works in my development environment (i can test the app on my device and it works as expected) but I cannot submit it to the App Store (I get the Invalid Bundle Structure error).


In any case, I reverted back to my original configuration (embedding the 3rd party framework inside the main app). Just to recap, my main app links to the frameworks like below:

Third party framework: Embed & Sign.

My framework: Embed & Sign.


And now My framework links to the Third Party Framework but with "Do Not Embed" specified.


And now "Build succeeds" but the app won't run (back to info.plist error). I tried archiving and submitting to the App Store anyway just to see if it'd go through. But App Store Connect won't accept the build and I still get Invalid Bundle Structure error.

Also just to add, when attempting to run on my iOS device I get a different error than in the simulator. I get:


App installation failed

Domain: com.apple.dtdevicekit

Code: -402653103

Failure Reason: Could not inspect the application package.


And when attempting to run in the simulator I get:


"Could not install at this time.

Failed to load Info.plist from bundle at path..."

This sounds like the framework is missing its Info.plist file, and that's the real issue to solve. You should consult Google's support for how they expect their product to integrate into your app, and get an updated version with the Info.plist file provided in the framework package.

>This sounds like the framework is missing its Info.plist file,


Indeed. All frameworks contained in the Google Mobile Ads SDK version 7.52.0 do not contain an Info.plist file (h ttps://developers.google.com/admob/ios/download). For what it's worth, I went back and poked around in previous versions of the SDK, and it looks like GoogleMobileAds.framework never actually included one but it never caused an issue uploading to the store in previous versions of Xcode.


Wonder if there was ever a version of Xcode that built .frameworks without Info.plist files or if Google was incorrectly shipping their framework all along and it just basically became a fatal error in Xcode 11. Another 3rd party framework I used in the past (which I don't use anymore) I see didn't have an Info.plist either.


In any case, guess I have to reach out to them somehow about this. Kind of suprised this hasn't already been brought to their attention yet, I imagine a lot of apps use Google's Admob.


Thanks again for your help.

Accepted Answer

Okay, reached out to Apple via Feedback and got a response. They brought to my attention that the binaries aren't .dylibs and framework binaries need to be dylibs.


So even though Google distributes their Admob SDK as frameworks (GoogleMobileAds.framework, GoogleUtilities.framework, ect), the binaries apparently can't be embedded in the app like a 'dynamic framework'. I guess in Google's Xcode project they changed the Mach-O type to "Static"? I didn't even realize that was supported. Wonder why they don't ship these as static libraries instead of .frameworks? Is there any advantage to using a .framework over a static library in this case?


If I just link to the framework (and not embed) the app will run on my device. I was thinking I needed to embed them, because GoogleMobileAds.framework is obviously not included in iOS and didn't realize the 'framework' wasn't meant to be embedded in the app like frameworks usually are.

After inspecting my projects "framework" folder I found 3 occurrences of GoogleMobileAds.framework in it.

I removed all of them and run "pod install --repo-update" in app folder, as mentioned in Google Ads installation instructions page.

It worked.

App Won't Compile with Embedded Third Party Framework: Could not install at this time. Failed to load Info.plist from bundle at path
 
 
Q