Xcode 7 Code Signing Resource Rules Path issue - app-store-connect

I have the latest Xcode 7 and iOS 9 SDK installed on my El Caption. I just get an issue about the Code Signing Resource Rules Path:
If I specify the CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist then I can not upload the IPA to iTunesConnect because:
ERROR ITMS-90339: "This bundle is invalid. The Info.plist contains an invalid key 'CFBundleResourceSpecification' in bundle
However, if I removed this CODE_SIGN_RESOURCE_RULES_PATH the xcrun PackageApplication will fail as:
/var/folders/9v/_4lr188x5h5019b4bsq2_fyr0000gn/T/ir4fp619hu/Payload/MyApp.app/ResourceRules.plist: cannot read resources
Any walk around?

The issue is that xcrun uses the resource path internally in its script.
The work around to is go and directly edit the script ourselves. I had the same issue and the solution i posted here worked for me. Thought it'd help you as well.

Related

Deprecated API Usage Apple [duplicate]

Yesterday, I uploaded my App to TestFlight and after a while Apple sent me this warning:
ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs . See https://developer.apple.com/documentation/uikit/uiwebview for more information.
The thing is that I don't use UIWebView in my app so I tried to update my pods but still the same thing.By the way this is my 3rd build on TestFlight and this is the first time apple sends me this. Any ideas?
Update
These are my pods:
pod 'Firebase/Core'
pod 'Firebase/Firestore'
pod 'Firebase/MLVision'
pod 'Firebase/MLVisionTextModel'
pod 'SVProgressHUD'
pod 'SPPermission/Camera'
pod 'SPPermission/PhotoLibrary'
pod 'Mantis'
pod 'SwiftKeychainWrapper'
pod 'SwiftyOnboard'
pod 'Fabric'
pod 'Crashlytics'
Update 2
Seems like I found the frameworks with the issue.
Binary file ./Pods/FirebaseMLCommon/Frameworks/FirebaseMLCommon.framework/FirebaseMLCommon matches
Binary file ./Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics matches
Binary file ./Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision matches
So now do I have to wait for google to fix them and update my pods?
Check if you use in your code the UIWebView class; if yes replace your implementation with WKWebView, else need check your Pods.
Go with terminal into your project folder and execute the command:
grep -r "UIWebView" .
All matched pod must be updated.
Now I'm stuck because I found UIWebView into Google AdMob (version 7.49.0) and I'm waiting a new version from Google.
You can examine each of the frameworks in the archived app to see if any of them refer to UIWebView. From the command line, cd to the archived app, e.g.:
cd ~/Library/Developer/Xcode/Archives/<date>/myapp.xcarchive/Products/Applications/myapp.app
Once there, use the nm command to dump the symbols of your app and each of the app's frameworks:
nm myapp | grep UIWeb
for framework in Frameworks/*.framework; do
fname=$(basename $framework .framework)
echo $fname
nm $framework/$fname | grep UIWeb
done
This will at least tell you which framework is the culprit.
I will answer my own question as I have news about this email. Google told me that there are several tickets about this issue and they are going to resolve this as soon as possible.
Also today my app has been approved for the AppStore so it seems to be just a warning for the time being.
For project with cocoapods:
grep -r UIWebView Pods/
WKWebView is the replacement for UIWebView. If you don't have UIWebView usage in your code than by executing the below terminal command you can easily get to know that which library is still using UIWebView reference (don't miss the . (dot)).
From the command line, cd to the archived app, e.g
cd ~/Library/Developer/Xcode/Archives/<date>/myapp.xcarchive/Products/Applications/myapp.app
And then Run
grep -r UIWebView
OR call
grep -r UIWebView /Path/To/Project/*
This will give you Output for framework match
./<ANY>.framework/Headers/ANY.h:#define ANYUseUIWebView ANY_NAME_PASTE(ANY_PREFIX_NAME, ANYUseUIWebView)
Output for library match
Binary file ./<FRAMEWORK-NAME>.framework/<LIB-FILE>.a matches
Update these Libraries
pod update
also check out this Medium Article
brew install ripgrep
cd Pods
rg UIWebView
YoutubePlayer-in-WKWebView/README.md
10:- using WKWebView instead of UIWebView.
TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.h
166: to emulate the link detection behaviour of UIWebView.
TwitterKit/iOS/TwitterKit.framework/Headers/Twitter.h
28: * either UIWebView or SFSafariViewController depending on iOS
TwitterKit/iOS/TwitterKit.framework/Headers/TWTRTweet.h
84: * Suitable for loading in a `UIWebView`, `WKWebView` or passing to Safari:
In order to find where you are using a UIWebView, Go to your project root in terminal
and use this command
grep -r -F "UIWebView" .
The '.' is very important.
It tells the system to search the string "UIWebView" in the current folder and subfolders.
This will search the cocoapods libraries also
I solved this issue by updating ionic webview plugin and adding preferences in config.
I followed following steps:
1.cordova plugin rm cordova-plugin-ionic-webview
2.cordova plugin add cordova-plugin-ionic-webview#latest
3.Added preferences in config file under ios platform :
<preference name="WKWebViewOnly" value="true" />
<feature name="CDVWKWebViewEngine">
<param name="ios-package" value="CDVWKWebViewEngine" />
</feature>
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
After following these steps my app is submitted and later approved in review.
Use latest firebase version
https://firebase.google.com/support/release-notes/ios
Version 6.8.1 : Removed references to UIWebViewDelegate to comply with App Store Submission warning (#3722).
If you are building with Unity 3D, this is a know-issue (acknowledged in changelogs), it's currently fixed for version 2019.3 (being tested and backported).
Check the ticket here https://unity3d.com/unity/whats-new/2019.2.4
It was a long process, but I managed to solve the above mentioned issue. Let me walk you through the process and share my findings.
First things first, its not necessary what worked for me will work for you. You juts need to try every possible solution put out there.
I followed some of the solutions posted in various threads. (Linked below).
When I was on RN 0.59, I found these files comment mentioned here. Didn't work
I upgraded to RN 0.61, I didn't find these files. I tried uploading the app but still got the warning. Didn't work
I updated the following libraries to their latest versions. Didn't work
react-native-device-info
react-native-view
I tried this grep command mentioned here. There were certain libraries that showed up i.e react-native-fbsdk, react-native-google-sign, react-native-gesture-handler. So I upgraded all of them and uploaded the build but still got the warning. Didn't work
The last resort to update all the libraries, which i know was going to take a lot of time. So my first guess was to update 'react-native-firebase' to latest v6 version issue. But it had some issues with Notification not being on so I couldn't use it. Also they mentioned that their v.5.5.6 is clean and doesn't have any UIWebViewIssues given you update your iOS sdk to 6.12.+ More info here.
So this moved me to my second guess which in my case was 'react-native-ux-cam'. Luckily they updated their library to remove all the references of UIWebView. I updated to the lastest version and BOOM, the issue was solved. I submitted my app to Apple and no warnings so far. More info here Worked đŸ’„
Hope this helps someone.
Backstory
On my ReactJS + Cordova project I uploaded an app to the app store and it was successful. Shortly after I received an email citing ITMS-90809: Deprecated API Usage. After hours (over days) of research and multiple failed uploads I connected with Apple using a paid developer token ($50); they responded basically saying "check your node modules folder" and refunded my token because they weren't going to assist me with this extremely ambiguous error.
Previous Attempts
Updated cordova to use the wkwebview-engine and wkwebviewxhrfix plugins
Using grep -r on archives, ios source, and entire project source, I found a LOT of notes but nothing that really helped.
updated all npm packages
cleaned and updated all cocoapod pods
Final Attempt
After removing all "extra" cordova plugins, npm packages, and pods I was left with a shell of an application but still facing the apple rejection. using grep -r again there was still a reference to "facebook" which lead me to an old copy of the FBSDK.
Solution
FBSDK had been manually added to target > Build Phases > Link Binary With Libraries. There was also an associated cordovaFacebook.m in target > Build Phases > Compile Sources. After removing these old, un-maintained files I was able to upload to itunes connect without at issue.
In my case, Firebase/Auth was using deprecated UIWebView API and the version I was using was an older one. So I just updated the Firebase/Auth pod using the command,
pod update 'Firebase/Auth'
Note: To figure out the frameworks which are using this api, just search "UIWebView" (cmd+shift+F)
FB Sdk above Version 7.16.1 have this issue. Actually it have no files in framework folder.
This error remove when you build it using FBSDK v7.16.1, but Appstore got rejected the app, because of depreciated api usage(UIWebView).
I resolve it by using FBSDK v7.19.2.
1) When you build the project for xcode it shows the mention error, shareKit not found. I resolve it by copy the facebookSDK folder from the framework folder of my previous build(with fbsdk v7.16.1), into the same location of the current xcode folder(frameworks/FacebookSDK....)
2) Then, open your xcode project, add files from location: Frameworks/FacebookSDK/Plugins/IOS/ (sharekit, corekit, loginkit) into Frameworks in Xcode.
3) Add "$(PROJECT_DIR)/Frameworks/FacebookSDK/Plugins/iOS" into Framework Search Paths into build settings at Xcode.
4) Open Project into Terminal: type "grep -r "UIWebView" ." , if this shows any match with UIWebView remove it by opening the file.
5) If it shows match in a binary file of FBSDKCoreKit. Open the file in TextEdit at MAC and Find and Replace all "UIWebView" to "WKWebView"
6) Save it and again add it into Frameworks at Xcode. Build and push to appstore.
100% Working Solution #ionic #wkwebview #webview
Here Webview is deprecated by Apple so replace with WKWebview.
Follow few simple steps for solve this issue:-
1.Open Terminal and go to project path
2.cordova plugin rm cordova-plugin-ionic-webview
3.cordova plugin add cordova-plugin-ionic-webview#latest
4.open config.xml file and put below code inside <platform name="ios"> section.
<preference name="WKWebViewOnly" value="true" />
<feature name="CDVWKWebViewEngine">
<param name="ios-package" value="CDVWKWebViewEngine" />
</feature>
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
after following all this step again build using "ionic cordova build ios" command and submit it to again in appstore.
When you build an Ionic app, you can choose between Cordova or Capacitor to deploy a native mobile version. While more recent versions use WKWebView automatically, Cordova still uses UIWebView APIs outright or contain references to them (Capacitor has been updated to remove these references – see below).
Upon app submission, Apple searches the app’s code for the “UIWebView” string then generates a submission warning if found. Therefore, a future release of cordova-ios (the Cordova iOS library) will be required to ensure that all references to UIWebView APIs removed.
another thought. I don't know if it makes sense or is technically possible.
Move UIWebView to a plugin as well and make cordova-ios use this or some of the WKWebView plugins. cordova-ios just contains the code to load a webview. By default the next version should load the Apache WKWebViewEngine (Plugin installed by default on new apps, Migration instruction for old apps). Users who need UIWebView, the Ionic one, a fork or others can specify their own one like it is now.
That way no UIWebView would be in cordova-ios and it would still be flexible enough like today.
I faced the same for React native app. Check below things :
1) You are using react-native-webview module rather than importing it directly from react-native(community webview is deprecated as a lean core removal in v0.60 and will be removed in the next stable release). (check here)
2) Please also verify if you are using any third-party libraries which use webview is up to date, If not please ask the library maintainers to upgrade the react-native-webview.
3) you are good to go for the upload, Please add comments if anyone finds some more difficulties.
Check here the breaking changes in v0.60
Another way to get rid of this warning is:
start passing useWebKit={true}, that is to say, you are using WKWebView not UIWebView at all. Then you can do the following to solve the problem -- Deprecated API Usage.
Remove Libraries/RNCWebView.xcodeproj/RNCUIWebView.h、RNCUIWebView.m、RNCUIWebViewManager.h、RNCUIWebViewManager.m
Remove Libraries/React.xcodeproj/React/Views/RCTWebView.h、RCTWebView.m、RCTWebViewManager.h、RCTWebViewManager.m
Now I has already uploaded app.ipa to AppStore successfully without any permission warnings.
<WebView
style={{flex: 1, backgroundColor: Colors.white}}
useWebKit={true}
startInLoadingState={true}
source={{uri: 'my http url'}}
/>```
If anyone helps I run pod update on terminal and then archive again. That works for me.
For me, scripts didn't help. I had to just manually go through each framework and look at release note, and update them.
I get rid out from this by following below steps-
Step 1:
Search “UIWebView” in xcode project directory
Step 2:
Right click (on RCTWebView.m) and select “Reveal In Project Navigator”
Step 3:
Scroll down and delete the following four files only:
1. RCTWebView.h
2. RCTWebView.m
3. RCTWebViewManager.h
4. RCTWebViewManager.m
Then clean the project & archive.
N.B: If you use 'react-native-community/react-native-webview' library then update with latest version otherwise it's done.
You should install this Cordova Plugin:
https://github.com/apache/cordova-plugin-wkwebview-engine
Then add <preference name="WKWebViewOnly" value="true" /> in your config.xml, under the iOS section.
Then increase the version and re-upload it.
To update WebView depreceated in ios
This solved my problem successfully
cd platforms/ios
grep -r UIWebView Pods/
Open Podfile and add/replace AFNetworking pod as
pod 'AFNetworking', '~> 4.0'
Finally in terminal pod update
As per new Apple policies, the new/old apps that use UIWebView are no longer accepted. The best solution is to use WKWebView for improved security. The issue is there because of some deprecated old plugins like GoogleAd or GoogleVR SDK. If you want a quick solution then replace the UIWebView with WKWebView framework.
In Terminal, run this command in your iOS project folder:
grep -r "UIWebView"
Then you will find the list of all the files that use UIWebview. Update whatever files to use WKWebView (Or replaced them with WKWebView using gVim). If your pod libraries are showing that it has UIWebView. Update the pods files as well.
In my case, the unsupported plugin was GVR SDK and steps to resolve are:
Step1: Remove UIWebView:
Get vim for mac.
List item In Vim open {Path to your build folder} \Pods\GVRSDK\Libraries\libGVRSDK.a
Click ESC
Type ":"
Paste "%s/UIWebView/WKWebView/g"
Click enter
Step 2: Adding Frameworks to Your Xcode Project
Select the project file from the project navigator on the left side of the project window.
Select the target for where you want to add frameworks in the project settings editor.
Select the “Build Phases” tab, and click the small triangle next to “Link Binary With Libraries” to view all of the frameworks in your application.
To Add frameworks, click the “+” below the list of frameworks.
Select WebKit.framework

Error: Cannot find entry file ./node_modules/react-native-scripts/build/bin/crna-entry.js in any of the roots:

I keep receiving this error when running my App.js for React Native that was working perfectly well before I attempted installing Victory charts. Somehow something broke and after over three hours of work I am unable to figure out a solution. I have tried everything I could find on the web including uninstalling watchman, reinstalling watchman, reverting to React Native 0.55.4, some other recommended commands. Nothing is working.I am so confused.
$ yarn add react-native-scripts
This helped.
I think the other library may hurt the installation part of your package. To solve this issue on IOS you need to add its library like below:
First do 'yarn add react-native-scripts'. In the case that it dose't work continue other steps.
1-Go to the node module of your project and find the package folder and find the ios file inside it.
2- Then drag it into ‘library’ section of your xcode. (It is the subset of your project folders)
3- Then go to ‘build phase’ and in the ‘Link binary with libraries’ add it there by clicking on the plus sign
4- Then in some cases you need to add the correct path of the ios file inside your node module in the xcode. To do that you should go to ‘build setting’ section in the xcode and search header there. Then you need to add the path there below other paths.
5- Then clear everything (cmd+shift+k) and then finally compile it.
I hope it works for you.
In my case the "crna-entry.js" file does exist in the roots and my project should work (nothing have been modified from last time when it does work).
After hours searching, finally I figured out the reason:
the packager's directory checking is case-sensitive and in windows terminal the drive "c:/" will not be auto-corrected to "C:/" which will lead to error.
Hope this will help someone who gets the same error.
Below is the full error message:
The development server returned response error code:404 Cannot find
entry file node_modules/react-native-scripts/build/bin/crna-entry.js
in any of the roots:

Cannot add a new app to fabric

I am unable to add a new iOS app to fabric by following the instructions of the Fabric macOS plug in.
I have followed all of the instructions found at Crashlytics documentation
When running the app, I receive this error:
2018-03-12 14:22:24.090838-0400 [19139:8550117] [Crashlytics] Version 3.10.1 (129)
2018-03-12 14:22:24.636050-0400 [19139:8550293] [Fabric] unable to complete application configure: Error Domain=FABNetworkError Code=-5 "(null)" UserInfo={status_code=422, type=2, request_id=fbc432572e6f0e10f21d2ddc24c7f272, content_type=text/html; charset=utf-8}
I have tried searching StackOverflow and following answers, but no luck avoiding this error message.
Any ideas on this error message?
I had this problem and discovered that my 'visible' (in Xcode) info.plist was not a file in my root directory, and was an out of date version from earlier development activity. I am not sure why my correct/current info.plist did not display in Xcode. I found the current info.plist in Finder (it was in the root directory in Finder, just not appearing in Xcode). I dragged the file from Finder to Xcode and accepted all the defaults in the dialog that appeared. Then I simply built and ran the current scheme and all worked as it should.
Note: It appears that for some time I have been updating the 'invisible' info.plist directly from my apps Target / Info tab.
Make sure to include all dependency then throw a force crash or runtime error and do not forget to turn on your data or internet connection.

no valid 'aps-environment' entitlement string found for application

I am trying to configure my app to support push notification, but keep getting this error:
Failed to get token, error: Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application" UserInfo=0x1f818fc0 {NSLocalizedDescription=no valid 'aps-environment' entitlement string found for application}
I did enable my app to support push notifications (only for development at this point).
I did create the provisioning profile AFTER enabling the push notifications.
My bundle identifier is the same as appears in the profile.
In my profile file there is a string: aps-environment
I made sure that in both project and target under the "Code signing identity" section ALL the values are selected to be my provisioning profile.
Any more ideas? Thanks.
In my case, the stuff in my provisioning profile:
security cms -D -i ~/Downloads/spolskyDevelop.mobileprovision
...
<key>application-identifier</key>
<string>P5GM95Q9VV.com.dca.spolsky</string>
<key>aps-environment</key>
<string>development</string>
Was different than the stuff in the app that was actually built (you can find out where it is built by looking at Xcode's Logs tab)
codesign -d --entitlements - '/Users/drew/Library/Developer/Xcode/DerivedData/spolsky-bdbtdfjeeywhqzccpmmceqvnhgtm/Build/Products/Debug-iphoneos/spolsky-ios.app'
<dict>
<key>application-identifier</key>
<string>Y2X6Z7Z2GR.com.dca.spolsky-ios</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>Y2X6Z7Z2GR.com.dca.spolsky-ios</string>
</array>
</dict>
This was true even though the "Currently Matches" hint text under Code Signing Identity was indicating the correct provisioning profile--weird, huh? To make a weird story weirder, the correct provisioning profile was being installed on the device when I ran, (Settings->General->Profiles) leading me to believe the provisioning profile was right--but it was falling back to a wildcard ID when the app was actually launched.
The clue was the difference in the output of these two commands:
Y2X6Z7Z2GR.com.dca.spolsky-ios vs P5GM95Q9VV.com.dca.spolsky
When I made the bolded part match, the italicized part changed to match automatically. In addition, the output of security and codesign were in agreement, and no more aps-entitlement error.
My guess here is that XCode was using a wildcard-style match on my non-wildcard ID. ("spolsky" is, after all, quite nearly "spolsky-ios"), and this explains the "Currently Matches" output. But something in the build chain is more strict about this, so it falls back to an actual wildcard ID during the build.
The problem is due to current Provisioning Profile does not contain APNS information, as the Provisioning Profile is created BEFORE creating the APNS certificate.
Therefore, to solve the problem, create a new Provisioning Profile & select the Provisioning Profile in Xcode will clear the error.
I had this same problem after push notifications were already working on my device. Seemed like Xcode cached something incorrectly so refreshing it fixed my problem:
Xcode -> Preferences -> Accounts
View Details for your Developer Account
Just click Refresh for the Provision Profiles a few times. I was seeing these change with each refresh. Keep refreshing until they stop changing.
i got this error and did not create a new provisioning profile; created a new one and then had to restart xCode but works now!
Be aware that the bundle identifier must match the provisioning profile in a case-sensitive manner. I had something like com.FirstLast.appname when it should have been com.firstlast.appname. Well, that kept me busy for quite a while.
I fixed this problem by enabling push notification capability.
Select Project > Target > Capabilities > Turn On Push notifications
If this problem happened suddenly after upgrading to Xcode 8 you might find a warning in the capabilities screen that'll allow you to fix this automatically:
Select Project > Target > Capabilities > Turn On Push notifications
Product->Clean did it for me. Hopefully it does it for someone else.
I ran into this in what's possibly a non-frequent use case. I'm working with Xcode 6 and iOS 8. I was creating a series of entirely new app projects, and attempting to re-use the same bundle ID, so as not to need to go through all of the portal-side setup again. This too was just for sandbox testing.
I would find that, while the setup and registration would work fine for the first app, if I deleted that app from the device, set the same bundle ID for the second app, and then attempted to register PNs with that app, I would get this error.
My solution was to:
Remove the associated provisioning profile from the device.
Remove the associated provisioning profile from Xcode.
Close Xcode
Double-click my downloaded .mobileprovision file to install it back into Xcode
Open the project and deploy it.
This approach seems to jar loose whatever previous state was there, and I'm able to register for PNs with the new app / same bundle ID.
For those who got this error in ios 10, you can try following steps:
1.clean your project.
2.and check Targets -> Capabilities -> Push Notification.If it is off,On it.
And problem will solve.The above steps help me to get rid off this problem. Hope it will helpful to someone.
New provisioning profile worked for me. Make sure to use a Developer profile if you are in development (don't use Ad Hoc). It was fine after that, no idea why the old one stopped working right.

Error when uploading new iPad app version: "iPad: application executable contains unsupported architecture(s): i386"

I'm trying to update my iPad app on the App Store. I filled out the "new version" form on iTunes Connect and then tried to upload the new version with Application Loader. It rejected the .zip file giving me three errors.
I had changed the "Bundle Version" line in the Info.plist file to 1.1, and added "Bundle versions string, short" (also 1.1). Then I build the .app file, and zipped it up with the .mobileprovision file.
The zip file: Chordpad.zip
Contains: ChordPad.app, ChordPad_Distribution.mobileprovision
These are the errors Application Loader is giving me:
1. iPad: application executable contains unsupported architecture(s): i386
2. Application failed codesign verification. The signature was invalid, or it was not signed with an Apple submission certificate.
3. Unable to extract codesigning entitlements from your application. Please make sure ChordPad.app is a valid Mach executable that's properly codesigned.
As far as I know, all my certificates are valid. Could anyone please help me fix this?
If the i386 architecture is being used, you are probably building for the simulator. Switch to device to get the arm architectures.