React Native iOS Entitlements file - ios

I'm working on a React Native app that requires use of the camera/photo library. The functionality works in the iOS simulator, however when I test with a physical device I see the following error in the console:
sandbox extension creation failed: client lacks entitlements for path
Based on what I found in the documentation on the Apple development forum, I need to enable the App Sandbox configuration.
This is done by going in Xcode (13.1) to the project > signing & capabilities > click the plus button in the lower-left under TARGETS
When the dialogue box appears, there are various options. However, the sandbox is not one of them.
I found this S/O post that shows the location of the sandbox in the dialogue but does not describe in any detail how to actually add this to a project.
Sandbox extension creation failed: client lacks entitlements? for path:
In the case of a React Native application, how is this done? There is supposed to be a .entitlements file (where I belive the other entitlements should be listed), but I do not see one in the /ios directory in the React Native project or in X-Code. What directory is this located in or if it is to be created, which directory should it be added to? Thanks in advance.

Related

Can't get debug token for Firebase App Check for my Flutter iOS App

So I recently started setting up app check for my existing Flutter project (for both android and iOS platforms). I've had no problem with android's "Play Integrity", got the necessary debug token, and can successfully send and retrieve data to/from firestore (app check for firestore is currently enforced for my project).
The problem is, I can not get such a debug key for my iOS app. I will list the sources I've used and what I've tried so far.
I have firebase_app_check: ^0.1.1+8 installed via pubspec.yaml
I also added pod 'FirebaseAppCheck' to my Podfile
I have the necessary initialization code in my main.dart: await FirebaseAppCheck.instance.activate(...);
For "DeviceCheck", I am using THE SAME private key that I am using
for "Sign in With Apple" (which I have implemented successfully). I
have also enabled the checkbox for DeviceCheck in the settings of
that private key (in Apple Developer).
For my App ID (Apple Developer > Identifiers > App IDs), I have also
enabled the checkbox for "App Attest".
I have put "-FIRDebugEnabled" as an argument passed on launch in
XCode > Product > Scheme > Edit Scheme.
I always uninstall my app from my iOS simulator (iOS 16.2) or real device (iOS 16.1.2),
before trying again, because I have read across multiple forums that
the debug token only gets printed to the output the first time you
run your app.
I have also added these 4 lines of code in my AppDelegate.swift from here:
#if DEBUG
let providerFactory = AppCheckDebugProviderFactory()
AppCheck.setAppCheckProviderFactory(providerFactory)
#endif
Official firebase docs "iOS+ (App Attest)":
I have NOT copied ANY code from this page of the official docs, as I assume it's for native iOS apps only, and not for flutter, and I don't know where exactly I would have to put that code. I have only added the pod dependency and run pod install.
I don't have a .entitlements file.
So after all those steps, I'm apparently supposed to expect to find a debug token in my run output, as in:
Yet the only relevant output I can find is the following:
Runner[72719:33546579] 10.3.0 - [FirebaseFirestore][I-FST000001] AppCheck failed: 'The operation couldn’t be completed. (com.apple.devicecheck.error error 1.)'
If it matters:
I have NOT YET uploaded my iOS app to apple developer, app store connect or whatever (I'm not yet familiar with the process of publishing to the app store).
Neither have I uploaded my android app to Google Play console or created an app there (for this project).
Don't tell me anything about firestore rules. I already had that set up long ago, and everything worked just fine before I started integrating App Check.
Don't recommend any 3rd party plugins to me, I will only use official ones.
The firebase documentation says:
Tip: Confirm in your Xcode project's build settings that it passes the DEBUG flag to the Swift compiler
Try removing the '#if DEBUG' and '#endif' and run the app.
If it works, it mean you have missed that step
I was not able to find that build setting, so i just removed those lines from the AppDelegate, but i need to keep in mind to remove the other 2 lines while building the release mode
See this answer on the flutterfire Github issues page. Basically, call setAppCheckProviderFactory before GeneratedPluginRegistrant.register(with: self) in the app delegate file. I was investigating the same issue and it fixed it for me (the debug token was instantly printed out in Xcode's debug output). Hope it helps you as well!

React Native application doesn't show up on settings in iOS

My config:
react-native: 0.66.3
xcode: 13.2.1
When deploying an application to the simulator, or to real device, I cannot access the settings page of the app in iOS.
I have a button that asks for user location, and I should at least see it on the settings page.
I tried to deploy the application on release variant, but same thing.
I checked some solution on the web, and I found a solution with many upvote but it still did not do the trick.
Maybe there is a way to generate a Settings.bundle with cocoa based to the permission that we have ?
In my case, I came across this and I followed these instructions :
Adding the Settings Bundle Open your workspace inner ios folder with
xcode To add a Settings bundle to your Xcode project: Choose File >
New > New File. Under iOS, choose Resource, and then select the
Settings Bundle template. Name the file Settings.bundle.
My application was available on the Settings application on iOS, and I just updated the file with my permissions.
From now, the purpose of this file is to manually add some permission, or information (like the version code).
But the automatic permissions like geolocation will be added automatically.

Expo Ios Build Does Not Contain Valid Info.plist?

I have built a react native project with expo. Whenever I drag the finished .app file into my xcode window I get this error.
How would I go about fixing this?
We will need more info about your app to really help with this. As you are using Expo, you have no direct access to the Info.plist file for iOS. That would have to be maneuvered using the app.json.
You would need a specific configuration property based on what exactly is believed to be requiring a "Valid Info.plist" the message says.
See Expo's documentation on this here: app.json

How to test the purpose string of NSPhotoLibraryUsageDescription in iOS using Expo?

I've been struggling to verify if the purpose string for photo library access really is working as expected. It started with the application got rejected because it wasn't set.
Using expo-image-picker, it says in the docs that adding this into the plugins section in app.json should set the NSPhotoLibraryUsageDescription:
[
"expo-image-picker",
{
"photosPermission": "This allows you to upload a photo to your Appname profile."
}
]
Before I added this, I basically added NSPhotoLibraryUsageDescription to the plist key inside ios section in app.json. What I can see, both do exactly the same thing.
After building ios using expo build:ios I was able to verify that that the string existed in the Info.plist file:
<key>NSPhotoLibraryUsageDescription</key>
<string>This allows you to upload a photo to your Appname profile.</string>
Using Expo Go doesn't really help since when requesting permissions, it says "Expo Go" in the alert.
Also, I only have experience working with Expo / React Native, and have no access to a mac (or xcode).
When apple test this, it looks like this (according to their screenshot):
While the expected text should be:
This allows you to upload a photo to your Appname profile.
How can I verify that the purpose string is really set (and works) before submitting an application to App store?
My solution:
First I set up my app for an EAS build. If you're not familiar with that you should check out the docs: https://docs.expo.dev/build/introduction/
Basically you do this:
install eas-cli: npm install -g eas-cli
run eas build:configure to initialize an eas.config file.
configure your eas build profiles. Mine look like this:
I collapsed the submit block to hide my credentials. Sorry for the photo instead of code/text. The formatter kept messing it up.
Any way, trigger a build using eas build -p ios --profile development. Notice the simulator flag set to true. This will allow you to run this as a stand-alone binary in your simulator.
When your build completes, go to expo.io and log into your account. Click on your project and download the binary for your ios build (under the builds tab). Unzip the binary and drag it into your simulator. You may be prompted with a message that says that you need to start up your development server. Just follow those simple instructions and there you go. You'll be able to see if your NSPhotoLibraryUsageDescription string updated.
Admittedly, this can be a pain in the (insert donkey emoji here - still don't have one yet Apple....😡) and you're kind of executing outside of the expo environment, but it solves the problem of wondering if your string has updated before posting to the store again.
Best of luck. Hope that helps.

React native IOS app web-services works on simulator but not real IOS device

I have done with all the settings of my react native project and trying to run on the IOS simulator, it's working fine. Means all the api working properly.
So now I have to share my .ipa file to team members for testing, so creating .ipa file I am using procedure defined on react nativeRunning On Device documentation.
For creating .ipa file using Xcode following below process:-
In Edit Scheme option, change Build Configuration to release.
Clean Build Folder
Create Build.
Archive build.
After that exporting .ipa file using valid certificate.
Solutions I have tried:-
Checked with this solution, because the domain I am using to hit web service is not secured.(It's http)
Enable Transport security flag.
Added main.jbundle (created using command line) to Copy Bundle Resource option in Build Phases.
While adding Alert in api call, getting below error (check image)
Still No luck.
Please let me know, what I am doing wrong?
Please check api server live link is working or not. In my case, I am testing whole api's on local network (In LAN). But when trying with live url, I am also facing this issue.
So that time I made one mistake, that my url should contain http:// but in actual it was https://.
It's pointing to main.jsbundle file, that means it's having issue
related with your code.
So check it once.

Resources