I'm developing an app using Xamarin Forms (Android and iOS). I have the first app version ready, and I'm trying to upload it to TestFlight in order to test the app with different users. In order to reduce the ipa size, I'm setting the linker behavior to "Link framework SDKs only".
After reducing the ipa size, I tried to upload the app to test flight but I got the next error message:
ITMS-90683: Missing Purpose String in Info.plist - Your app's code
references one or more APIs that access sensitive user data. The
app's Info.plist file should contain a NSCalendarsUsageDescription
key with a user-facing purpose string explaining clearly and
completely why your app needs the data.
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no
longer accepted. Instead, use WKWebView for improved security and
reliability.
ITMS-90683: Missing Purpose String in Info.plist - Your app's code
references one or more APIs that access sensitive user data. The
app's Info.plist file should contain a
NSLocationAlwaysUsageDescription key with a user-facing purpose
string explaining clearly and completely why your app needs the data.
ITMS-90683: Missing Purpose String in Info.plist - Your app's code
references one or more APIs that access sensitive user data. The
app's Info.plist file should contain a
NSLocationWhenInUseUsageDescription key with a user-facing purpose
string explaining clearly and completely why your app needs the data.
The problem is that I'm not using none of the items mentioned in the list. I'm not using WebView inside my app and I'm not requesting permissions of Location or Calendar. I know that those errors will disappear once I add the permission to inflo.plist, but I'm not using Location or Calendar.
How can I modify my application in order to remove those errors from TestFlight platform?
How can I notice which library (or NuGet) that I'm using is requesting any of those items?
I had the same issues for my Xamarin project when first uploading to the AppStore: both TMS-90809 although only using WKWebView and practically ALL possible versions of ITMS-90683 (Contacts, Calendars, Music, Siri, Microphone, Location, Bluetooth) while none of this is used by my app.
So, adding the UsageDescriptions to plist would be really bad practice and I had no idea which of my nuget packages was or were causing this. I assume it could be Syncfusion or Google Cloud Translate, but couldn't really find confirmations on the web.
The simple resolution was, to enable Managed Linking, so all those parts creating the issues are not considered part of the app in the Apple validation process:
in the Xamarin iOS Project Options, go to "iOS Build"
select Configuraton "Release" and platform "iPhone"
as "Linker Behaviour" select "Link Framework SDKs Only" (or maybe Link All, if this also works for your app).
That resolved all the problems at once.
To get rid of this
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability.
Soultion - https://learn.microsoft.com/en-us/xamarin/ios/user-interface/controls/webview#uiwebview-deprecation
For the other issues
Soultion - https://learn.microsoft.com/en-us/xamarin/ios/app-fundamentals/security-privacy
You need to manually set a message for the device features that you will be consuming in your app.
For example Camera,Location,Calendar etc
ITMS-90683: You need add this lines in Info.plist
<key>NSLocationAlwaysUsageDescription</key>
<string>We would like to know your location to find places near you</string>
<key>NSCalendarsUsageDescription</key>
<string>This app needs access to calendar when open</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We would like to know your location to find places near you</string>
ITMS-90809:
Update the Xamarin.Forms version
You can go to your iOS project, open the project properties and add this flag in the additional mtouch arguments field: --optimize=experimental-xforms-product-type this flag works together with the Linker Behavior set to SDK Only or All.
https://devblogs.microsoft.com/xamarin/uiwebview-deprecation-xamarin-forms/
Related
I have uploaded a couple of applications to the app store with ease. Sometimes I noticed this warning in xCode when I uploaded my app:
Missing Marketing Icon. iOS Apps must include a 1024x1024px Marketing Icon in PNG format. Apps that do not include the Marketing Icon cannot be submitted for App Review or Beta App Review.
But that was not impeding me to send my app for review in iTunes connect... until now.
I have found a few questions about this but none of those have helped me solving my problem. For example, following advise given here I tried adding my icon width xCode in the AppIcon.iconset file but it doesn't work if I do it after packaging my app with appcelerator (I guess that is the normal outcome). But if I do it and the package again, the icon disappears from the file (I think this is because appcelerator generates those files on its own).
How do I add that icon so appcelerator won't remove it when I package?
Or how do I add it to appcelerator so it generates the iconset including my marketing Icon??
I believe I have followed the guidelines completely (My icon is a .png file, its size is 1024x1024 and has no alpha channels nor transparencies) maybe the naming is not correct but I have not found any specific naming for this case.
Use the latest SDK (6.2.2.GA). It was fixed in 6.2.1.GA (https://github.com/appcelerator/titanium_mobile/pull/9451).
If you can't use it you could add the changes in the PR to your _build.js file
ERROR ITMS-90296: "App sandbox not enabled. The following executables must include the "com.apple.security.app-sandbox" entitlement with a Boolean value of true in the entitlements property list: [( "123123123client.pkg/Payload/123123123Client.app/Contents/MacOS/123123123Client", "123123123client.pkg/Payload/123123123Client.app/Contents/PlugIns/Java.runtime/Contents/Home/jre/lib/jspawnhelper" )] Refer to App Sandbox page at https://developer.apple.com/devcenter/mac/app-sandbox/ for more information on sandboxing your app."
Although i have added the sand box entitlement in info plist .but still getting the same...any help
Not exactly a legitimate solution ....but it solve the purpose that i needed as Since the application is build using JAVA FX i am not able to pinpoint the concern in the build (JAVA APP was developed by Some else and i got the responsibility to submit it to app store since only ios resource in the company :)) . After struggling for day and using various approach to get this work.
I come up with approach where i created a blank project with same build added the app icons ,then sandbox enable for app and the frameworks and then compiled the build got the xcode archive.then i have replaced the project.app with javafx .but before replacing the same i have replaced the info.plist first as after all info.plist have all the settings required.
after doing so i tried uploading the build and surprisingly it work and build uploaded to the app store.
Now the Mac Application is under review....
In my cross-platform app I save application properties in the following way:
Application.Current.Properties["myValue"] = "Test";
await Application.Current.SavePropertiesAsync();
I then retrieve them later like this:
string myVal = Application.Current.Properties["myValue"];
This works perfectly when using the Android emulator. I can close the emulator down, and when I restart it again, my app data is preserved.
However, when I deploy this app to a physical Android device, data preservation works as expected until I close the app and open it again. At this point I retrieve an empty value. It's as though the data is only saved to memory (and not to file).
Furthermore, the iOS version of the exact same app works faultlessly. When I open the app up, all previous values have been saved and I can retrieve them.
What am I doing wrong on the Android version? Is there an Android setting, permission, or option which I need to enable to have the values saved between app sessions when actually deployed to a phone?
I had a similar problem where only the debug version saved Properties. I think we're still waiting for the bug fix, and this is the workaround on Xamarin Forms bugzilla.
In short: go to .Droid project settings -> Android Options -> Linker
and enter/add "System.Runtime.Serialization" to Skip linking assemblies.
Wow! After lots of research, I have getting solution for same issue in mine. Problem is that, when i store List or DataTable in Application.Current.Properties then all properties are removed after reopen app but if i store List or DataTable as serialize, it working fine.
In VS you need to enable the option:
Preserve application data/cache on device between deploys
You can find this at Tools > Options > Xamarin > Android Settings.
I don't know if this has stopped in the latest updates of Xamarin Forms, the data is available until the application is running similar to session but persistent storage does not work.
The best api I think available for this is Akavache https://github.com/akavache/Akavache.
You can read this blog https://codemilltech.com/akavache-is-aka-awesome/.
Update
There is a bug filed in bugzilla:
https://bugzilla.xamarin.com/show_bug.cgi?id=26444
I don't remember exactly which part of this solved the issue, but when I followed the instructions to prepare the Android application for release from start to finish, the issue went away. The problem occurred when debug builds were used on an Android device.
https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/
The link details the suggested settings for the Android project when releasing to device. Following these instructions should solve the issue.
I'm not understanding if a containing app is needed alongside a Today Extension for OSX. I have a very simple and straightforward widget, it does not need nor rely on a main or containing app. With that said, how can I create an Today Extension without a containing app.
What I have so far is that I have a blank app with a today extension.
You cannot create a today extension without having an app. They don't work that way. All iOS app extensions are just that-- extensions to an app. There must be an app, and it must do something to be accepted into the app store (Apple rejects apps for "minimal functionality"). Extensions cannot exist on iOS outside of an app bundle, until or unless Apple decides to change things in the future.
A container app is not needed. Read up the Apple documentation on it. It says:
To deliver an OS X app extension, it’s recommended that you submit your containing app to the App Store, but it’s not required.
My app is ready to upload. Everything works fine in development side. I wonder what I should change (about SSL or something else) before uploading to store?
This is a complex topic and we may not be able to answer this in once sentence.
For submission you may need a Distribution Profile from the Apple Dev Center. Depending on the functionality you're using in your app, and depending on if it's an iOS or Mac App, you may be able to use the provisioning profile Xcode has generated for you. You can set this under Build Settings - Code Signing - Provisioning Profile.
You also need to setup your app in iTunes Connect so you can submit it (this includes screenshots, App Store Category, description, etc).
To check if the submission will be successful, head over to Product - Archive, and from the screen that opens hit "Validate". This will tell you if you're missing anything.
Take a look at the App Distribution Guide for details on how to submit an app to the App Store. There's a whole chapter on Push Notifications in there too which deserve special attention: https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/SubmittingYourApp/SubmittingYourApp.html
Those technicalities aside, make sure that any NSLog and NSAssert statements that you may have used while developing are removed or not compiled before submission.