UIWebView Deprecation and App Store Rejection on Xamarin Forms - ios

Can i fix the following ?
My setup
Xamarin.iOS Version: 13.16.0.13 (Visual Studio Community)
Visual Studio Community 2019 for Mac Version 8.5.2 (build 13)
Xamarin.Forms 4.5.0.617
I follow the instruction here
https://learn.microsoft.com/en-gb/xamarin/xamarin-forms/user-interface/webview?tabs=macos#uiwebview-deprecation-and-app-store-rejection-itms-90809
and here
https://github.com/xamarin/Xamarin.Forms/issues/7323#issuecomment-542363338
to fix this problem
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no
longer accepted. Instead, use WKWebView for improved security and
reliability.
but i get the following error on publish
Thank you!

As Microsoft mentions in the Microsoft blog, this is fixed in Xamarin.Forms 4.6
Now in 4.6, we are updating the bindings to Google’s library. We have
improved the styling support for things like, setting a button’s
‘Disabled’ text color. The latest library also removes the reference
to Apple’s deprecated UIWebView.
So update your Xamarin.Forms to Version 4.6.

Adding --optimize=force-rejected-types-removal in mtouch arguments works. I have submitted to TestFlight and I did not get email about UIWebView removal.

I dont know why, but when i changed my app's version number and build number it's worked. Also i create a new app version on App Store Connect.
Same errors in this link helps me
https://forums.xamarin.com/discussion/172296/app-store-connect-application-loader-publishing-failed-failed-to-parse-altool-output
Is two different errors I believe. The first is from deprecated UIWebView and another error (publish error) showed up after the first rejection from apple.
Thanks.

This is not an answer, but I share my experience on this particular issue I also have. Maybe it would helps.
When pusblishing to Apple App Store Connect a new app after April 1st 2020, apple could reject your app if you are using UIWebView. Apps submitted before have warnings, but thoses app will not be submitable past December 2020.
My app is new and I publishing after April 1st. I had some hard time publishing this app using VS 2019 Mac and the archive process. I don't like it. You can have a green screen during publishing and see nothing on the appstoreconnect. This is because Apple reject your app. See your emails, you have :
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability
I suggest to use a archive on your disk and use Transporter app to upload it. It has a log view and warns me about build number issue.
Back on my app, I try the mtouch argument --optimized trick but it doesn't work. I tried Don't link, Link SDK only, Link all to be sure. None worked. Apple keep saying I am using UIWebView. I check my code, I cannot see UIWebView anywhere.
So I wanted to try a fresh app from scratch using last version of Xamarin.Forms 4.6 and publish it. I had the same issue message by Apple. Then I add the --optimizer mtouch argument and publish it. Apple was satisfied. So this means that the "patch" is working.
So as my code doesn't have any UIWebView, I think this could be a tiers library... But how to find... I am try this https://levelup.gitconnected.com/how-to-find-and-remove-uiwebview-uses-in-your-ios-app-d9395f7baacc
The command gives me this :
FirebaseCore
FirebaseCoreDiagnostics
GTMSessionFetcher
GoogleAPIClientForREST
GoogleDataTransport
GoogleDataTransportCCTSupport
GoogleToolboxForMac
GoogleUtilities
PersonalizedAdConsent
U _OBJC_CLASS_$_UIWebView
leveldb
libSkiaSharp
nanopb
protobuf
So I presume those libs are not "compatible"...?
I will update if I find something...

Related

How to fix if App rejected for using UIWebView in code?

I have been trying to upload an iOS app to Appstore but its only appearing on "Activity" tab for 3-5 minutes and then disappears.
Then I got an email from Apple saying that my app is rejected because it is using UIWebView in one of the view controller. I deleted that particular screen and reuploaded the app and had the same error email.
Then I checked my third-party sdks like FacebookLoginSDK and GoogleSignInSDK and updated those and then checked that if the app has no UIWebView which it did not. Then i reuploaded the app but this time again I had the same error email. I have searched the whole storyboard source code and the whole app code to look that if there is any sign for UIWebView but there is nothing, but still I am getting this email.
I also tried deleting 'Derived Data' folder several times and cleaning the build folder also but nothing helps.
On the other hand I have uploaded a different app today which had UIWebView and it got approved but I also got the same email for not using UIWebView.
Does anybody had this kind of experience or can anybody tell me whats going on ?
I got the same issue before.
If you have uploaded the build and showing it in activity tab for few minutes then its not mean that issue is only about UIWebview but there can be some other issue as well.
I have uploaded my app n got the mail related to UIWebview, so I coverted the UIWebview to WKWebView and again I uploaded but that time same thing happend.
I failed to tackle the problem.
Then I mailed to Apple Developer Support and they replied like
Any of the third party library internally using some privacy data you should ask permission for the same.
Then I checked Info.plist, I have given each permission in list still how it comes that we don't understand.
Finally then after whole search the one third party library internally using motion related data without permission so this happened.
Then I have added that in plist and then again uploaded and its approved.
So please you can check your info.plist and also check whether your third party library using any privacy sensitive data without permission or not.
May it help you at some point.
Make sure you update all your plugins to the latest version!
Check this: https://ionicframework.com/blog/understanding-itms-90809-uiwebview-api-deprecation where you can find the plugins that have known issues concerning the old WebView usage.
But be aware that uninstalling and re-installing some plugins will NOT will not install the latest available version of the plugin!
So to be sure that you are re-installing the latest version of a plugin, go to the github repository of the cordova plugin and search for the plugin.xml file and open it. Then, copy the version string found in the root xml element.
Finally, install the plugin like that: ionic cordova plugin add plugin_name#copied_version
<?xml version='1.0' encoding='utf-8'?>
<plugin id="cordova-plugin-firebase" version="2.0.5"
xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>Google Firebase Plugin</name>
...
...
...
</plugin>
Are you using the AdMob plugin?
It is not enough to check for the absence of "UIWebView" strings!
You have to make sure that all third party plugins are up to date.
One of the trickiest situations I had went to is when I had tried to update an app (using AdMob) on the AppStore after Apple started rejecting apps using the UIWebView.
The generated iOS source code has no UIWebView references, but still rejected!
After a long headache, I realized that the Google AdMob SDK version I'm using is out of date, knowing that I had updated the AdMob plugin from the CLI, but it seems that the SDK is not updated when updating from the npm.
Finally, I had downloaded the latest AdMob SDK from this link https://developers.google.com/admob/ios/download and replaced it in the source code of the AdMob SDK plugin. Then I had followed the instructions found in this link https://developers.google.com/admob/ios/quick-start to update the code in the xCode.

iOS HERE SDK NMAKit private API usage

I just updated my app to the latest 3.13.2 HERE SDK version but once I uploaded a build to the App Store I got the following warning:
The app references non-public symbols in Frameworks/NMAKit.framework/NMAKit: _getcontext, _makecontext, _setcontext
I haven't tried submitting a build with this warning actually to App Review but this warning doesn't bode well and even if it did make it through would most likely increase the review time for my app significantly. My app relies on the HERE SDK for its navigation features so as such I can't just remove it completely. For now I've rolled back to a previous version which doesn't give this warning for uploaded builds.
In 3.13.2 HERE SDK, openssl library was upgraded to 1.1.1c version which causes such error.
In order to fix it, openssl configuration needs to be changed. It is planned to be implemented in next HERE SDK(3.14) release.
Since it is just warning you can still try submitting your app.
Thanks for reporting!
UPDATE:
Warnings have been fixed in 3.13.3, which is available now.
I experienced the same problem as you with v3.13.2. Meanwhile, my workaround is to use and older version: 3.12.2 and it works. So, just add this in the pod file:
pod 'HEREMaps', '3.12.2'
Hope it helps!

Non-public API usage : The app contains one or more corrupted binaries

I am really frustrate whats going on with iOS application new version uploads. Here are the story.
On the date of 25th Jan 2018 we have uploaded new version 3.3.27 build number 1.0. That successfully process and available on test-flight for testing. After that we found some issue and on 26th Jan 2018 we fix it and uploading new build 1.1 and we get email from iTunes Connect said:
Dear developer,
We have discovered one or more issues with your recent delivery for "appname". To process your delivery, the following issues must be corrected:
Non-public API usage:
The app contains one or more corrupted binaries. Rebuild the app and resubmit.
If method names in your source code match the private Apple APIs
listed above, altering your method names will help prevent this app
from being flagged in future submissions. In addition, note that one
or more of the above APIs may be located in a static library that was
included with your app. If so, they must be removed.
If you think this message was sent in error and that you have only
used Apple-published APIs in accordance with the guidelines, send the
app's nine-digit Apple ID, along with detailed information about why
you believe the above APIs were incorrectly flagged, to
email#apple.com. For further information, visit the
While i am validate build before upload its success:
While i am uploading app i get following success:
In mail i did not get proper information what's the name of corrupted binary or framework. What is the method we used that non-public we have uploaded 100s update build of that application before 25th Jan everything is good and acceptable.
Then i have try following changes:
Rebuild app and submit again get same email.
Uninstall Xcode9.2 and Install again get same email.
Remove changes and upload build number 1.0 again get same email.
Change Mac and try to upload new build again same email.
Try to upload old version that live before and again same emai
We sent an email to iTunes Connect Review but since 3 days we did not get any reply from them side. I do research and from 26th Jan many user face that kind of issue while submit application.
If any one know that solution who face that kind of issue in past or recently Please help us
After a LOT of investigations on this part we finally found the problem for this issue:
It seems like Apple gives this error for applications that suport both 32 and 64 bits.
Apple gave this reminder for Mac Appstore, but it seems that iOS applications are affected as well.
So a solution for this is to support bitcode OR to drop support for 32 bit devices by removing support for ARMV7 and ARMV7S or bellow from Valid Architectures from build settings. This will mean your application will work only on iPhone 5S and above.
I hope this helps someone.
Thank you and happy coding!
There is not one solution for this issue Apple not mention anything now a days about that errors or invalid binary related news on their official account or forums or their official Developer site. Even they are not reply of your email.
Some of get that issue solved by BitCode enable, Some of solve that issue for update PODFILE, Some of Solve that issue by remove some old swift framework used in project.
But finally I get solution by my self that works for me. When i build the project i found some warning at left side panel of Xcode like following.
I think apple now removed old swift support so in case your project use any swift class or podfile we need to update to swift 4.
Once i conversion to swift 4 i get following warning:
The use of Swift 3 #objc inference in Swift 4 mode is deprecated.
Please address deprecated #objc inference warnings, test your code
with “Use of deprecated Swift 3 #objc inference” logging enabled, and
then disable inference by changing the "Swift 3 #objc Inference" build
setting to "Default" for the "appname" target.
For fix this warning i use following link The use of Swift 3 #objc inference in Swift 4 mode is deprecated? and in swift class i used #objc before public declaration.
Also i review all the source code and remove unused library of podfile and class from project.
by above way i fix that issue and after uploading 13th of build finally that accepted.
The non-public API refers to Apple API methods that are not documented and offered to the programmer.
Apple does not guarantee that this part of the API will work in future upgrades. They can freely change this part.
They forbid usage, so that your app won't break in iOS updates, and so protect your future users/buyers of your app!
The webservice is external, hence does not fall under non-public. This part you need to guarantee, not Apple.
In Target -> Build Settings -> Other Linker Flags, remove -interposable. Rebuild app solved the problem.
We found 2 solutions for the issue. Remove 32 bit support, which was referred above. And remove CommonCrypto usage. We replaced CommonCrypto by CryptoSwift (https://github.com/krzyzanowskim/CryptoSwift).
We chose to replace CommonCrypto as we didn't want to loose our 32 bit users (iPhone4S, 5 and 5C).

Non-public selectors in App?

I'm trying to submit an app via iTunes Connect. Xcode is throwing the following error:
iTunes Store operation failed.
The app referenced non-public selectors in Payload/Inflation Calculator.app/Inflation Calculator: allocBatch:withEntity:count:,allowWithEntity:, fastIndexForKnownKey:, indexForKey:
I have no idea what "non-public selectors" I would be using, because I stuck pretty close to the book with my code. Anyone have any ideas?
Code for the view controller (only .swift in my app):
https://gist.github.com/Calda/aefc2f19bae5f3cf2e54
EDIT: As a reference for the future, I confirmed with iTunes Connect Support that this was an issue with iTunes Connect and not a problem with my project. For anyone experiencing this same problem, my best advice would be to wait and try again later.
I had the same problem. I could not submit some of my apps because using non-public selectors. I also tried using Application Loader, but still the same error message
To solve the problem I installed Xcode 6.0.1 - it is still available to download here:
https://developer.apple.com/downloads/index.action
Before installing i moved the old Xcode to trash.
I can now submit any app.
I solved this by doing the following:
edit: I don't think the first step is needed
1) Cleaning the build folder (Hold Alt, Click Product -> Clean)
2) Deleting the Derived Data (Organizer -> Projects -> Select your project -> Delete Derived Data
The API differs between iOS 7 and iOS 8.
I got my App validated by switching to Deployment Target "8.0" - built with XCode 6.1.
It might not be the solution to all you guys but you could give it a try.
Might have happened to me because I recently started using UIAlertController -> seems to be an iOS-8-Feature. On iOS 7 this would be UIAlertView. So if you use some nifty new features they might not have been available with previous iOS versions - thus non-public API.
For the same app, I got this error today on XCode 6.1.
I submit the same app (little variation) 2/3 days ago with XCode 6.0.1 without any error!
Just updated XCode 6.1 and trapped with this error.
I switched back to XCode 6.0.1 and it do not have any problem with the submission. No non-public API usage error. I just download the dmg file and rename xcode.app to XCode_6.0.1. So it coexists with XCode 6.1.
I delete all derived data for xcode projects
/Users/{user_home_folder}/Library/Developer/Xcode/DerivedData
And app was submitted without any problem
I was running into the same issue that looked like an issue on Apple's end. I submitted the same app (v 1.0.1) yesterday, then rejected it, then submitted again today with a one-line code difference. Today's submission got rejected for the reason mentioned above.
I was able to solve this, using the latest versions of everything, by changing the version # of my app (e.g. 1.0.1 -> 1.0.2). Think this worked as I had a previous submission sitting in the queue for my older version that I had rejected, YMMV.

Fails to distribute my app: "Your app contains non-public API usage."

After I fixed some bugs and refactored my project which has been release on App Store, it fails to distribute. The Xcode shows the following error message:
Your app contains non-public API usage. Please review the errors, correct them, and resubmit your application.
The app references non-public symbols in Payload/XXX.app/XXX: UICreateCGImageFromIOSurface
XXX is the app name.
I've search the entire project, and didn't find any this keyword (UICreateCGImageFromIOSurface). How can I fix this?
Remove Reveal.framework from your project. This should not be linked in release mode of your binary.
You app contains code not only from sources, but from all statically linked libraries. You have to check all of those for containing private call. Looks like at least Reveal library contains it.
Double check any third-party libraries you are using in your project
I was facing the issue and after checking my pods file, I found that Look Back - Framwork which is available for debug builds only as for as I know. So removing that fixed the issue. Successfully submitted app through Xcode 6.1 for Apple Testflight beta testing :)
Never ship an app linked against the Reveal library. Reveal exposes
your app to deep introspection and will likely cause your app to be
rejected by the Apple review team. Reveal is intended for internal
development and debugging purposes only.
The Reveal service will stop automatically while the iOS host app is
not the frontmost app. It will automatically start again when the app
is re-opened.
Reveal supports inspection of applications compiled against iOS 6 and
later. The iOS Deployment Target build setting must also be 'iOS 6.0'
or later. You may see link errors if this is not the case.
Reveal uses Bonjour to connect with the running iOS application. If
you are running the iOS application on a device, it will need to be
on the same network as the Reveal Mac app to be able to connect with
it. If you have any problems connecting to your application check
your firewall and proxy setting to ensure they are not blocking
communications.
Find out more...
cordova plugin rm cordova-plugin-ionic-webview
cordova plugin add cordova-plugin-ionic-webview#4.1.0

Resources