What is the Parent Tag for <edit-config in config,xml in cordova ios project? - ios

I update an iOS app and it was rejected with below email
Missing Info.plist key - This app attempts to access privacy-sensitive
data without a usage description. The app's Info.plist must contain an
NSPhotoLibraryUsageDescription key with a string value explaining to
the user how the app uses this data.
I try to add below xml tag to config.xml.
<edit-config file="*-Info.plist" mode="merge" target="NSCameraUsageDescription">
<string>Need camera access to take pictures</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryUsageDescription">
<string>Need to photo library access to get pictures from there</string>
</edit-config>
But I am not sure under which tag I need to
My config.xml file.
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.aotsinc.christian.iphone.biblequizcompanion" version="3.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>Bible Quiz Companion</name>
<description>
Bible Quiz Companion is a free app useful for the users to prepare for Jounior Bible Quiz Compatition.
</description>
<author email="dev#cordova.apache.org" href="http://cordova.io">
Alpha Omega Tech Solutions Inc.
</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
<engine name="ios" spec="^4.5.4" />
<plugin name="cordova-plugin-whitelist" spec="^1.3.3" />
<plugin name="cordova-plugin-x-socialsharing" spec="^5.2.1" />
<plugin name="cordova-plugin-camera" spec="^4.0.1" />
<plugin name="cordova-plugin-tts" spec="^0.2.3" />
<plugin name="cordova-plugin-apprate" spec="^1.3.0" />
<plugin name="com.darktalker.cordova.screenshot" spec="git+https://github.com/gitawego/cordova-screenshot.git" />
</widget>
Thanks for your help
EDIT 1
I try to add the code that you gave in plugin.xml inside camera plugin as below. But I didn't see this entry in the info.plist. Can you please tell me whether my change in the plugin.xml is correct. Thanks
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="Camera">
<param name="ios-package" value="CDVCamera" />
</feature>
<preference name="CameraUsesGeolocation" value="false" />
</config-file>
<js-module src="www/ios/CameraPopoverHandle.js" name="CameraPopoverHandle">
<clobbers target="CameraPopoverHandle" />
</js-module>
<preference name="CAMERA_USAGE_DESCRIPTION" default=" " />
<config-file target="*-Info.plist" parent="NSCameraUsageDescription">
<string>Need camera access to take pictures</string>
</config-file>
<preference name="PHOTOLIBRARY_USAGE_DESCRIPTION" default=" " />
<config-file target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
<string>Need to photo library access to get pictures from there</string>
</config-file>
<header-file src="src/ios/UIImage+CropScaleOrientation.h" />
<source-file src="src/ios/UIImage+CropScaleOrientation.m" />
<header-file src="src/ios/CDVCamera.h" />
<source-file src="src/ios/CDVCamera.m" />
<header-file src="src/ios/CDVJpegHeaderWriter.h" />
<source-file src="src/ios/CDVJpegHeaderWriter.m" />
<header-file src="src/ios/CDVExif.h" />
<framework src="ImageIO.framework" weak="true" />
<framework src="CoreLocation.framework" />
<framework src="CoreGraphics.framework" />
<framework src="AssetsLibrary.framework" />
<framework src="MobileCoreServices.framework" />
<framework src="CoreGraphics.framework" />
<framework src="AVFoundation.framework" />
</platform>

see docs
In your config.xml as a child node of <platform name="ios"> add:
<edit-config target="NSPhotoLibraryUsageDescription" file="*-Info.plist" mode="merge">
<string>need to photo library access to get pictures from there</string>
</edit-config>

Use config-file instead of edit-config below PLATFORM tag in PLUGIN.XML file of your plugin that need this:
<platform name="ios">
<preference name="CAMERA_USAGE_DESCRIPTION" default=" " />
<config-file target="*-Info.plist" parent="NSCameraUsageDescription">
<string>Need camera access to take pictures</string>
</config-file>
<preference name="PHOTOLIBRARY_USAGE_DESCRIPTION" default=" " />
<config-file target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
<string>Need to photo library access to get pictures from there</string>
</config-file>
</platform>

Related

Remove iPad from device list in PhoneGap app

I have just finished building my second app in PhoneGap and this problem has arisen again, except this time it's preventing the app being approved by the app store so I can't ignore it any further.
I have Googled and googled this and tried many things but I cannot seem to remove the app from being available to iPads. It is a iPhone only app and I don't even have an iPad to test it on so I can't even 'make it good' for ipad to get it through the to App store. I have included my current version of config.xml at the bottom of this post, you'll see I have the standard:
<preference name="target-device" value="handset" />
...and the supposed work around I have found for this problem online (which seems to be pretty widespread, but should also now be fixed apparently?!):
<gap:config-file platform="ios" parent="UIDeviceFamily" mode="replace">
<string>1</string>
</gap:config-file>
...and when I have compiled the ipa in PhoneGap build and open it in my itunes, it even says it's only available for iPhone and iPod touch:
...but when I upload it through Application loader it appears in iTunes Connect as available for iPads and as well in TestFlight. Strangely it does not require iPad friendly screenshots which makes me think I'm part way there, but the review team are insisting I make it iPad worthy before they allow it into the store and it's getting a little time critical.
Here's my full config.xml (I've XXX'd out the sensitive info as it's not a personal app)
<widget xmlns = "http://www.w3.org/ns/widgets"
xmlns:gap = "http://phonegap.com/ns/1.0"
id = "XXX.XXXXXXX.XXXXXXXX"
version = "14">
<gap:config-file platform="ios" parent="CFBundleShortVersionString">
<string>1.0.0</string>
</gap:config-file>
<name>XXXXXXXX</name>
<description>
XXXXXXXXXX
</description>
<author href="http://XXXXXX.co.uk" email="XXXX#XXXXXXXXX.co.uk">
XXXXXXXXXXX
</author>
<!-- Define the main entry-point to the application -->
<content src="index.html" />
<!-- Customize your app and platform with the preference element. -->
<preference name="orientation" value="portrait" /> <!-- all: default means both landscape and portrait are enabled -->
<preference name="target-device" value="handset" /> <!-- all: possible values handset, tablet, or universal -->
<preference name="fullscreen" value="true" /> <!-- all: hides the status bar at the top of the screen -->
<preference name="webviewbounce" value="true" /> <!-- ios: control whether the screen 'bounces' when scrolled beyond the top -->
<preference name="prerendered-icon" value="true" /> <!-- ios: if icon is prerendered, iOS will not apply it's gloss to the app's icon on the user's home screen -->
<preference name="stay-in-webview" value="false" /> <!-- ios: external links should open in the default browser, 'true' would use the webview the app lives in -->
<preference name="ios-statusbarstyle" value="default" /> <!-- ios: black-translucent will appear black because the PhoneGap webview doesn't go beneath the status bar -->
<preference name="detect-data-types" value="false" /> <!-- ios: controls whether data types (such as phone no. and dates) are automatically turned into links by the system -->
<preference name="exit-on-suspend" value="true" /> <!-- ios: if set to true, app will terminate when home button is pressed -->
<preference name="show-splash-screen-spinner" value="true" /> <!-- ios: if set to false, the spinner won't appear on the splash screen during app loading -->
<preference name="auto-hide-splash-screen" value="true" /> <!-- ios: if set to false, the splash screen must be hidden using a JavaScript API -->
<preference name="deployment-target" value="8.0" />
<preference name="phonegap-version" value="cli-6.5.0" />
<!-- Plugins -->
<!-- Core plugins -->
<plugin name="cordova-plugin-console" source="npm" spec="~1.0.2" />
<plugin name="cordova-plugin-device" source="npm" spec="~1.1.1" />
<plugin name="cordova-plugin-dialogs" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-inappbrowser" source="npm" spec="~1.3.0" />
<plugin name="cordova-plugin-network-information" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-splashscreen" source="npm" spec="~3.2.1" />
<plugin name="cordova-plugin-statusbar" source="npm" spec="~2.1.2" />
<plugin name="cordova-plugin-vibration" source="npm" spec="~2.1.0" />
<plugin name="cordova-plugin-whitelist" source="npm" spec="~1.2.1" />
<gap:config-file platform="ios" parent="ITSAppUsesNonExemptEncryption" mode="add">
<false/>
</gap:config-file>
<gap:config-file platform="ios" parent="UIDeviceFamily" mode="replace">
<string>1</string>
</gap:config-file>
<!-- Define app icon and splashscreen for each platform. -->
<icon src="icon.png" gap:platform="ios" width="57" height="57"/>
<icon src="res/icon/ios/icon-57.png" gap:platform="ios" width="57" height="57"/>
<icon src="res/icon/ios/icon-57#2x.png" gap:platform="ios" width="114" height="114"/>
<icon src="res/icon/ios/icon-72.png" gap:platform="ios" width="72" height="72"/>
<icon src="res/icon/ios/icon-72#2x.png" gap:platform="ios" width="144" height="144"/>
<!-- iPhone / iPod Touch -->
<icon src="res/icon/ios/icon-60.png" gap:platform="ios" width="60" height="60" />
<icon src="res/icon/ios/icon-60#2x.png" gap:platform="ios" width="120" height="120" />
<!-- iPhone 6 / 6+ -->
<icon src="res/icon/ios/icon-60#3x.png" gap:platform="ios" width="180" height="180" />
<!-- Settings Icon -->
<icon src="res/icon/ios/icon-small.png" platform="ios" width="29" height="29" />
<icon src="res/icon/ios/icon-small#2x.png" platform="ios" width="58" height="58" />
<icon src="res/icon/ios/icon-small#3x.png" platform="ios" width="87" height="87" />
<!-- Spotlight Icon -->
<icon src="res/icon/ios/icon-40.png" platform="ios" width="40" height="40" />
<icon src="res/icon/ios/icon-40#2x.png" platform="ios" width="80" height="80" />
<icon src="res/icon/ios/icon-40#3x.png" platform="ios" width="120" height="120" />
<!-- iPhone and iPod touch -->
<gap:splash src="res/screen/ios/Default.png" gap:platform="ios" width="320" height="480" />
<gap:splash src="res/screen/ios/Default#2x.png" gap:platform="ios" width="640" height="960" />
<!-- iPhone 5 / iPod Touch (5th Generation) -->
<gap:splash src="res/screen/ios/Default-568h.png" gap:platform="ios" width="320" height="568" />
<gap:splash src="res/screen/ios/Default-568h#2x.png" gap:platform="ios" width="640" height="1136" />
<!-- iPhone 6 -->
<gap:splash src="res/screen/ios/Default-667h#2x.png" gap:platform="ios" width="750" height="1334" />
<gap:splash src="res/screen/ios/Default-Portrait-736h#3x.png" gap:platform="ios" width="1242" height="2208" />
<gap:splash src="res/screen/ios/Default-Landscape-736h#3x.png" gap:platform="ios" width="2208" height="1242" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
</widget>
I've also just seen that even in iTunes Connect, when I click on the build, it lists it as iPhone / iPod touch with no iPad... it's only when it's in TestFlight and submitted for review that it appears to be available for iPad?! Where do I go from here?!
And I've just found a way to view the plist from the ipa and even in there the devices are listed as 1 correctly. I am totally baffled! Where do I go from here?
You have already removed the iPad from the device list, but there is no way to avoid the installation on iPad devices. All apps can be installed on devices, but if the app is not iPad ready it will appear as a iPhone app that you can scale to fill the whole iPad screen
As the app will display on iPhone 4 size you don't need an iPad to test if it looks fine. Anyway, you can use the simulators to test

Unable to load audio files via XMLHttpRequest using WKWebView

I enjoy making old school arcade games using HTML5 Canvas and JS. I've been doing it for years and am probably a bit set in my ways. The games work great in Chrome / Safari on all modern devices.
I figured I should try wrapping a game up using PhoneGap to see how it might perform as an app on the iOS AppStore.
The game was pretty choppy although the audio played great.
I read about the performance boost of WKWebView over the default UIWebView so added that to my config.xml.
The game played beautifully and was just how I'd wanted it to play all along.
But the audio failed to play.
Digging around the internet I see the issue is likely to be how I load the audio files. Here's the basic code I use to load the audio files - an object is passed into the function containing specifics for the audio file.
My projects are laid out in this way:
--- www
|___ gfx (contains png files)
|___ sfx (contains mp3 files)
|___ script (contains js files)
|___ index.html
|___ config.xml
|___ style.css
Very basic!
function loadSound(o) {
try
{
var request = new XMLHttpRequest();
var url = "sfx/" + o.soundname + "." + AUDIOFORMAT;
request.open('GET', url, true);
request.responseType = 'arraybuffer';
// Decode asynchronously
request.onload = function ()
{
try
{
g.audioContext.decodeAudioData(request.response,
function(buffer)
{
o.buffer = buffer;
o.volume 0.6;
},
function()
{
write("Decode error: " + url + ", " + arguments[0]);
}
);
}
catch (e)
{
write("loadSound(onLoad): " + e.message);
}
}
request.send();
}
catch (e)
{
write("LoadSound: " + e.message);
}};
So if my understanding is correct WKWebView fails to read the file because it is not being served via a local http server.
I'd love to know how to get this working.
Is there something I can add to my config.xml (PhoneGap) to include a local http server within the package?
Would I then change the url to url = 'http://localhost/sfx/...'
Is there a specific port required, e.g. http://localhost:10000/sfx/
I don't use any frameworks it's just old fashioned hand-rolled JavaScript.
Here's the relevant section of my config.xml:
<feature name="CDVWKWebViewEngine">
<param name="ios-package" value="CDVWKWebViewEngine" />
</feature>
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
<name></name>
<description></description>
<content src="index.html" />
<gap:config-file platform="ios" parent="UISupportedInterfaceOrientations" overwrite="true">
<array>
<string>UIInterfaceOrientationLandscapeOmg</string>
</array>
</gap:config-file>
<gap:config-file platform="ios" parent="NSPhotoLibraryUsageDescription" overwrite="true">
<string>Does not use photo library</string>
</gap:config-file>
<preference name="DisallowOverscroll" value="true" />
<preference name="android-minSdkVersion" value="14" />
<preference name="orienation" value="portrait" />
<preference name="fullscreen" value="true" />
<preference name="exit-on-suspend" value="true" />
<plugin name="cordova-plugin-battery-status" source="npm" spec="~1.1.1" />
<plugin name="cordova-plugin-camera" source="npm" spec="~2.1.1" />
<plugin name="cordova-plugin-media-capture" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-console" source="npm" spec="~1.0.2" />
<plugin name="cordova-plugin-contacts" source="npm" spec="~2.0.1" />
<plugin name="cordova-plugin-device" source="npm" spec="~1.1.1" />
<plugin name="cordova-plugin-device-motion" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-device-orientation" source="npm" spec="~1.0.2" />
<plugin name="cordova-plugin-dialogs" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-file" source="npm" spec="~4.1.1" />
<plugin name="cordova-plugin-file-transfer" source="npm" spec="~1.5.0" />
<plugin name="cordova-plugin-geolocation" source="npm" spec="~2.1.0" />
<plugin name="cordova-plugin-globalization" source="npm" spec="~1.0.3" />
<plugin name="cordova-plugin-inappbrowser" source="npm" spec="~1.3.0" />
<plugin name="cordova-plugin-media" source="npm" spec="~2.2.0" />
<plugin name="cordova-plugin-network-information" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-splashscreen" source="npm" spec="~3.2.1" />
<plugin name="cordova-plugin-statusbar" source="npm" spec="~2.1.2" />
<plugin name="cordova-plugin-vibration" source="npm" spec="~2.1.0" />
<plugin name="cordova-plugin-whitelist" source="npm" spec="~1.2.1" />
<plugin name="cordova-plugin-wkwebview-engine" source="npm" version="1.1.2" />
Ok, so after much digging and a valuable heads up from Kerri, I finally figured out how to implement the changes that I required.
I added the following info to my config.xml:
<plugin name="cordova-plugin-wkwebview-engine-localhost" spec="https://github.com/apache/cordova-plugins.git#wkwebview-engine-localhost" />
also in config.xml I changed
<content src="index.html" />
to
<content src="http://localhost" />
Works a treat.

PhoneGap missing plist.key

When I try and load upload my iTunes app installer to iTunes I relieve this error:
Missing Info.plist key - This app attempts to access privacy-sensitive
data without a usage description. The app's Info.plist must contain an
NSPhotoLibraryUsageDescription key with a string value explaining to
the user how the app uses this data.
Missing Info.plist key - This app attempts to access privacy-sensitive
data without a usage description. The app's Info.plist must contain an
NSCameraUsageDescription key with a string value explaining to the
user how the app uses this data.
What can I add to my config file below to let this work:
<preference name="permissions" value="none" />
<preference name="orientation" value="default" />
<preference name="target-device" value="universal" />
<preference name="fullscreen" value="false" />
<preference name="webviewbounce" value="false" />
<preference name="disallowOverscroll" value="true" />
<preference name="prerendered-icon" value="true" />
<preference name="stay-in-webview" value="false" />
<preference name="ios-statusbarstyle" value="black-opaque" />
<preference name="detect-data-types" value="true" />
<preference name="exit-on-suspend" value="false" />
<preference name="show-splash-screen-spinner" value="true" />
<preference name="auto-hide-splash-screen" value="true" />
<preference name="disable-cursor" value="false" />
<preference name="android-minSdkVersion" value="10" />
<preference name="android-targetSdkVersion" value="19" />
<preference name="android-installLocation" value="auto" />
<gap:plugin name="org.apache.cordova.battery-status" source="npm" />
<gap:plugin name="org.apache.cordova.camera" source="npm"/>
<gap:plugin name="org.apache.cordova.media-capture" source="npm"/>
<gap:plugin name="org.apache.cordova.console" source="npm" />
<gap:plugin name="org.apache.cordova.contacts" source="npm"/>
<gap:plugin name="org.apache.cordova.device-motion" source="npm"/>
<gap:plugin name="org.apache.cordova.device-orientation" source="npm"/>
<gap:plugin name="org.apache.cordova.dialogs" source="npm"/>
<gap:plugin name="org.apache.cordova.file" source="npm"/>
<gap:plugin name="org.apache.cordova.file-transfer" source="npm"/>
<gap:plugin name="org.apache.cordova.inappbrowser" source="npm"/>
<gap:plugin name="org.apache.cordova.media" source="npm"/>
<gap:plugin name="org.apache.cordova.network-information" source="npm"/>
<gap:plugin name="org.apache.cordova.splashscreen" source="npm"/>
<gap:plugin name="org.apache.cordova.vibration" source="npm"/>
<icon src="icon.png" />
<gap:splash src="splash.png" gap:platform="android" gap:qualifier="port-ldpi" />
<gap:splash src="splash.png" gap:platform="android" gap:qualifier="port-mdpi" />
<gap:splash src="splash.png" gap:platform="android" gap:qualifier="port-hdpi" />
<gap:splash src="splash.png" gap:platform="android" gap:qualifier="port-xhdpi" />
<gap:splash src="splash.png" gap:platform="blackberry" />
<gap:splash src="splash.png" gap:platform="ios" width="320" height="480" />
<gap:splash src="splash.png" gap:platform="ios" width="640" height="960" />
<gap:splash src="splash.png" gap:platform="ios" width="640" height="1136" />
<gap:splash src="splash.png" gap:platform="ios" width="768" height="1024" />
<gap:splash src="splash.png" gap:platform="ios" width="1024" height="768" />
<gap:splash src="splash.png" gap:platform="winphone" />
<access origin="*" />
<gap:plugin name=" phonegap-plugin-barcodescanner" source="npm" />
<gap:plugin name="uk.co.workingedge.phonegap.plugin.launchnavigator" source="npm" />
<gap:plugin name="cordova-plugin-directions" source="npm" />
<!-- iPhone / iPod Touch - lower 4s -->
<icon src="icon-57.png" gap:platform="ios" width="57" height="57" />
<icon src="icon.png" gap:platform="ios" width="114" height="114" />
<icon src="icon-72.png" gap:platform="ios" width="72" height="72" />
<icon src="152.png" gap:platform="ios" width="152" height="152" />
<icon src="icon-120.png" gap:platform="ios" width="120" height="120" />
<icon src="76.png" gap:platform="ios" width="76" height="76" />
<icon src="icon-40.png" gap:platform="ios" width="40" height="40" />
<!-- iPhone / iPod Touch - 5-5s -->
<icon src="icon.png" gap:platform="ios" width="60" height="60" />
<icon src="icon.png" gap:platform="ios" width="120" height="120" />
<!-- iPhone6-6+ -->
<icon src="icon.png" gap:platform="ios" width="180" height="180" />
<!-- Settings Icon -->
<icon src="icon-29.png" gap:platform="ios" width="29" height="29" />
<icon src="icon.png" gap:platform="ios" width="58" height="58" />
<!-- Spotlight Icon -->
<icon src="icon.png" gap:platform="ios" width="40" height="40" />
<icon src="icon.png" gap:platform="ios" width="80" height="80" />
<plugin name="cordova-plugin-whitelist" version="1" source="npm"/>
<gap:plugin name="cordova-plugin-geolocation" source="npm"/>
<feature name="http://api.phonegap.com/1.0/battery" />
<feature name="http://api.phonegap.com/1.0/camera" />
<feature name="http://api.phonegap.com/1.0/network" />
<feature name="http://api.phonegap.com/1.0/notification" />
<gap:plugin name="cordova-plugin-x-socialsharing" source="npm" />
Another edit:
Most plugins removed the variables for usage description, so now the way of setting them is using edit-config tag in the config.xml like this.
<edit-config target="NSCameraUsageDescription" file="*-Info.plist" mode="overwrite">
<string>We are using the Camera for something...</string>
</edit-config>
But not all plugins have been updated yet, so better read the plugin's README.md before. On the core plugins it's in a section called iOS Quirks.
It also needs the cli 7.0.1 or newer, set it in the config.xml like this:
<preference name="phonegap-version" value="cli-8.0.0" />
EDIT:
My old answer no longer works if you have <preference name='phonegap-version' value='cli-7.0.1' /> (or if you don't have any phonegap-version as it will use it as default)
To set the usage descriptions use the params on the plugin
<plugin name="cordova-plugin-camera">
<param name="CAMERA_USAGE_DESCRIPTION" value="We are using the Camera for something..." />
<param name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="We are using the Photo Library for something..." />
</plugin>
Beware that if you have some plugins with the same usage descriptions and you don't fill them with param tags they might be replaced with the default empty string
You can force to use the old builder with this tag, but it's not recommended, the new builder is better
<preference name='pgb-builder-version' value='1' />
OLD ANSWER:
You can write in the info.plist like this:
<gap:config-file platform="ios" parent="NSCameraUsageDescription" overwrite="true">
<string>We are using the Camera for something...</string>
</gap:config-file>
The overwrite="true" is important because latest version of the camera plugin is already writing empty values.
I have tested it on a sample app and it's working
https://github.com/jcesarmobile/phonegap-template-hello-world/blob/454e852955e66470890cba636450abd422f50598/config.xml#L153-L155
Please open your project in xcode and go to your .plist file in resources folder,
Then at end of in you .plist file click on "+" and add search for "Privacy - Photo Library Usage Description" and add it's value in beside column.
same please do for "NSCameraUsageDescription" again click on "+" and search for "Privacy - Camera Usage Description" and again give some usage description in beside column.
it will solve you issue.
For more info please visit following:
1) Stackoverflow question related to your question
2) Official apple doc for all required keys to be added
Before you access privacy-sensitive data like Camera, Contacts, and so on, you must ask for the authorization, your app will crash when you access them.Then Xcode will log like:
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSContactsUsageDescription key with a string value explaining to the user how the app uses this data.
How to deal with this? As apple say:
You must statically declare your app’s intended use of protected data classes by including the appropriate purpose string keys in your Info.plist file.
In your case you may have to add the following in your info.plist,
<!-- 🖼 Photo Library -->
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) photo use</string>
Also suggest you to look at this link for more detailed info on this. Hope it helps.
You can also check out this plugin which helps in manipulating *-info.plist
In ios you need to install camera-plugin with barcodescanner-plugin after you have to put below line in config.xml for overwriting plist file.
<gap:plugin name="phonegap-plugin-barcodescanner" source="npm" />
<preference name="android-build-tool" value="gradle" />
<config-file platform="ios" target="*-Info.plist" parent="NSCameraUsageDescription">
<string>It is used for scaning QR code.</string>
</config-file>
<edit-config platform="ios" target="*-Info.plist" parent="NSCameraUsageDescription" mode="merge">
<string>It is used for scaning QR code.</string>
</edit-config>
<config-file platform="ios" target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
<string>It is used for scanning QR code</string>
</config-file>
<edit-config platform="ios" target="*-Info.plist" parent="NSPhotoLibraryUsageDescription" mode="merge">
<string>It is used for scanning QR code</string>
</edit-config>
None of the answers here worked for me exactly so I figure I should add my two cents as to how I got this working.
First, I tried the accepted answer (the one written by jcesarmobile). When i tried this and ran: phonegap build ios everytime the configuration was deleted from my config.xml file. So next I tried the solution indicated here:
http://geeklearning.io/how-to-add-specific-configuration-parameters-to-ios-p-list-and-android-manifest/
This did not work at first, There were a number of changes that had to be made, all of which I got from the github repo comments on the file. I suggest you run the build, copy the error message and search in the comments and do what they say. Once I got it to build again, It still did not work upon uploading the itunes connect.
In the end I had to open up the Info.plist file and manually put in the following
<key>NSCameraUsageDescription</key>
<string>We are using the Camera to (blah blah blah, your explanation)</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We are using the Photo Library to (your reason)</string>
<key>NSMainNibFile</key>
Even though the hook did not do exactly as it claimed I still think it was important because before I did this everything was getting deleted, and now it stays put.
I hope this helps someone out.
Phonegap Build - for anyone using cli-7.0.1 as probably everyone should be now:
<edit-config target="NSPhotoLibraryUsageDescription" file="*-Info.plist" mode="overwrite">
<string>Used to allow the user to select media to upload to us</string>
</edit-config>
That does NOT go within the tag, simply within the Widget tag like everything else. Change the string to whatever it suitable for you.

custom splash screens not updating in phonegap build ios

here is my Config.xml and also I have added splash screens in www/res/screen/ios as well as in /platforms/ios/project-name/Resources/splash
and the names of images are default but I have replaced the images and yes icons are changed but not able to change splash screen. it always displays default phonegap splash screen and then white screen and then my original application homepage.
another issue is that the icon is changing at one place only if I'll go to settings and search my app of zegr it gives default icon of phonegap.
<?xml version="1.0" encoding="UTF-8"?>
<!-- config.xml reference: https://build.phonegap.com/docs/config-xml -->
<widget xmlns = "http://www.w3.org/ns/widgets"
xmlns:gap = "http://phonegap.com/ns/1.0"
id = "com.phonegap.helloworld"
version = "1.0.0">
<name>Zegr</name>
<description>
Business Made Simple
</description>
<author href="http://phonegap.com" email="support#phonegap.com">
PhoneGap Team
</author>
<!--
If you do not want any permissions to be added to your app, add the
following tag to your config.xml; you will still have the INTERNET
permission on your app, which PhoneGap requires.
-->
<preference name="permissions" value="none"/>
<!-- Customize your app and platform with the preference element. -->
<preference name="orientation" value="default" /> <!-- all: default means both landscape and portrait are enabled -->
<preference name="target-device" value="universal" /> <!-- all: possible values handset, tablet, or universal -->
<preference name="fullscreen" value="true" /> <!-- all: hides the status bar at the top of the screen -->
<preference name="webviewbounce" value="true" /> <!-- ios: control whether the screen 'bounces' when scrolled beyond the top -->
<preference name="prerendered-icon" value="true" /> <!-- ios: if icon is prerendered, iOS will not apply it's gloss to the app's icon on the user's home screen -->
<preference name="stay-in-webview" value="false" /> <!-- ios: external links should open in the default browser, 'true' would use the webview the app lives in -->
<preference name="ios-statusbarstyle" value="black-opaque" /> <!-- ios: black-translucent will appear black because the PhoneGap webview doesn't go beneath the status bar -->
<preference name="detect-data-types" value="true" /> <!-- ios: controls whether data types (such as phone no. and dates) are automatically turned into links by the system -->
<preference name="exit-on-suspend" value="false" /> <!-- ios: if set to true, app will terminate when home button is pressed -->
<preference name="SplashScreen" value="CDVSplashScreen" />
<preference name="show-splash-screen-spinner" value="false" /> <!-- ios: if set to false, the spinner won't appear on the splash screen during app loading -->
<preference name="auto-hide-splash-screen" value="true" /> <!-- ios: if set to false, the splash screen must be hidden using a JavaScript API -->
<preference name="disable-cursor" value="false" /> <!-- blackberry: prevents a mouse-icon/cursor from being displayed on the app -->
<preference name="android-installLocation" value="auto" /> <!-- android: app install location. 'auto' will choose. 'internalOnly' is device memory. 'preferExternal' is SDCard. -->
<!--
Define a specific version of PhoneGap to build into your app.
<preference name="phonegap-version" value="3.5.0" />
-->
<!-- Plugins -->
<!-- Core plugins -->
<plugin name="cordova-plugin-battery-status" />
<plugin name="cordova-plugin-camera" />
<plugin name="cordova-plugin-media-capture" />
<plugin name="cordova-plugin-console" />
<plugin name="cordova-plugin-contacts" />
<plugin name="cordova-plugin-device" />
<plugin name="cordova-plugin-device-motion" />
<plugin name="cordova-plugin-device-orientation" />
<plugin name="cordova-plugin-dialogs" />
<plugin name="cordova-plugin-file" />
<plugin name="cordova-plugin-file-transfer" />
<plugin name="cordova-plugin-geolocation" />
<plugin name="cordova-plugin-globalization" />
<plugin name="cordova-plugin-inappbrowser" />
<plugin name="cordova-plugin-media" />
<plugin name="cordova-plugin-network-information" />
<plugin name="cordova-plugin-splashscreen" />
<plugin name="cordova-plugin-vibration" />
<!-- Third party plugins -->
<!-- A list of available plugins are available at https://build.phonegap.com/plugins -->
<!--
<plugin name="com.phonegap.plugins.barcodescanner" />
-->
<!-- Define app icon for each platform. -->
<icon src="icon.png" />
<icon src="res/icon/android/icon-36-ldpi.png" gap:platform="android" gap:qualifier="ldpi" />
<icon src="res/icon/android/icon-48-mdpi.png" gap:platform="android" gap:qualifier="mdpi" />
<icon src="res/icon/android/icon-72-hdpi.png" gap:platform="android" gap:qualifier="hdpi" />
<icon src="res/icon/android/icon-96-xhdpi.png" gap:platform="android" gap:qualifier="xhdpi" />
<icon src="res/icon/blackberry/icon-80.png" gap:platform="blackberry" />
<icon src="res/icon/blackberry/icon-80.png" gap:platform="blackberry" gap:state="hover"/>
<icon src="res/icon/ios/icon-57.png" gap:platform="ios" width="57" height="57" />
<icon src="res/icon/ios/icon-72.png" gap:platform="ios" width="72" height="72" />
<icon src="res/icon/ios/icon-57-2x.png" gap:platform="ios" width="114" height="114" />
<icon src="res/icon/ios/icon-72-2x.png" gap:platform="ios" width="144" height="144" />
<icon src="res/icon/webos/icon-64.png" gap:platform="webos" />
<icon src="res/icon/windows-phone/icon-48.png" gap:platform="winphone" />
<icon src="res/icon/windows-phone/icon-173.png" gap:platform="winphone" gap:role="background" />
<!-- Define app splash screen for each platform. -->
<gap:splash src="res/screen/android/screen-ldpi-portrait.png" gap:platform="android" gap:qualifier="port-ldpi" />
<gap:splash src="res/screen/android/screen-mdpi-portrait.png" gap:platform="android" gap:qualifier="port-mdpi" />
<gap:splash src="res/screen/android/screen-hdpi-portrait.png" gap:platform="android" gap:qualifier="port-hdpi" />
<gap:splash src="res/screen/android/screen-xhdpi-portrait.png" gap:platform="android" gap:qualifier="port-xhdpi" />
<gap:splash src="res/screen/blackberry/screen-225.png" gap:platform="blackberry" />
<gap:splash src="res/screen/ios/screen-iphone-portrait.png" gap:platform="ios" width="320" height="480" />
<gap:splash src="res/screen/ios/screen-iphone-portrait-2x.png" gap:platform="ios" width="640" height="960" />
<gap:splash src="res/screen/ios/screen-iphone-portrait-568h-2x.png" gap:platform="ios" width="640" height="1136" />
<gap:splash src="res/screen/ios/screen-ipad-portrait.png" gap:platform="ios" width="768" height="1024" />
<gap:splash src="res/screen/ios/screen-ipad-landscape.png" gap:platform="ios" width="1024" height="768" />
<gap:splash src="res/screen/windows-phone/screen-portrait.jpg" gap:platform="winphone" />
<gap:config-file platform="ios" parent="CFBundleShortVersionString">
<string>100</string>
</gap:config-file>
<feature name="SplashScreen">
<param name="ios-package" value="CDVSplashScreen" />
</feature>
<!--
Define access to external domains.
<access /> - a blank access tag denies access to all external resources.
<access origin="*" /> - a wildcard access tag allows access to all external resource.
Otherwise, you can specify specific domains:
<access origin="http://phonegap.com" /> - allow any secure requests to http://phonegap.com/
<access origin="http://phonegap.com" subdomains="true" /> - same as above, but including subdomains, such as http://build.phonegap.com/
<access origin="http://phonegap.com" browserOnly="true" /> - only allows http://phonegap.com to be opened by the child browser.
-->
<access origin="*"/>
<!-- Added the following intents to support the removal of whitelist code from base cordova to a plugin -->
<!-- Whitelist configuration. Refer to https://cordova.apache.org/docs/en/edge/guide_appdev_whitelist_index.md.html -->
<plugin name="cordova-plugin-whitelist" version="1" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
</widget>

My BB app isn't retrieving data from google feed api

I develop an app using jQuery Mobile.
After compilation, i tested on BB simulators but non is able to display data of the feed.
How do i configure my config.xml file to achieve this.
Below is my current config.xml file.
<?xml version="1.0" encoding="utf-8"?>
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:rim="http://www.blackberry.com/ns/widgets" version="1.0.0" rim:header="RIM-Widget: rim/widget">
<name>on the Go!</name>
<description>Get latest information on the Go!</description>
<content src="index.html" rim:allowInvokeParams="true"/>
<author href="" rim:copyright="Copyright 2013" email="josiahaccounts#gmail.com" xml:lang="en" its:dir="rtl" >Josiah Gerald</author>
<access uri="http://ajax.googleapis.com" subdomains="true" >
<feature id="blackberry.invoke.BrowserArguments" />
<feature id="blackberry.app" />
</access>
<rim:loadingScreen
backgroundColor="#FFFFFF"
backgroundImage="images/news.png"
foregroundImage="theme/images/ajax-loader.gif"
onRemotePageLoad="true"
onLocalPageLoad="true"
onFirstLaunch="true">
<rim:transitionEffect type="fadeIn" duration="300" />
</rim:loadingScreen>
<content src="index.html" />
<rim:cache disableAllCache="true" />
<rim:connection timeout="60000">
<id>TCP_WIFI</id>
<id>MDS</id>
<id>BIS-B</id>
<id>TCP_CELLULAR</id>
<id>WAP2</id>
<id>WAP</id>
</rim:connection>
<license>(c) 2013 www.mobilenizer.com</license>
<icon src="images/icon.png" />
</widget>
I finally got it to work.
Here is the solution:
<access uri="http://ajax.googleapis.com" subdomains="true" />
<feature id="blackberry.invoke" />
<feature id="blackberry.app" required="true" version="1.0.0">
<param name="websecurity" value="disable" />
</feature>
So rather than nesting the feature inside the access, i separated it.

Resources