ionic cap iOS info.plist issue - ionic-framework

I still get those warn but I think I put all as need... I try to add to my info.pllist to make Facebook login and google login work in my ionic 6 with cap.
please try to help me to fix it I don't find any solution why I keep get those warn..
those the errors I get after sync cap:
[capacitor] [warn] Configuration might be missing for cordova-plugin-facebook-connect.
[capacitor] Add the following to the existing CFBundleURLTypes entry of Info.plist:
[capacitor]
[capacitor] <dict>
[capacitor] <key>CFBundleURLSchemes</key>
[capacitor] <array>
[capacitor] <string>fb$APP_IDFACEBOOK_URL_SCHEME_SUFFIX_PLACEHOLDER</string>
[capacitor] <string>OTHER_APP_SCHEMES_PLACEHOLDER</string>
[capacitor] </array>
[capacitor] </dict>
[capacitor]
[capacitor] [warn] Configuration might be missing for cordova-plugin-googleplus.
[capacitor] Add the following to the existing CFBundleURLTypes entry of Info.plist:
[capacitor]
[capacitor] <dict>
[capacitor] <key>CFBundleTypeRole</key>
[capacitor] <key>CFBundleURLName</key>
[capacitor] <key>CFBundleURLSchemes</key>
[capacitor] <string>Editor</string>
[capacitor] <string>REVERSED_CLIENT_ID</string>
[capacitor] <array>
[capacitor] <string>$REVERSED_CLIENT_ID</string>
[capacitor] </array>
[capacitor] </dict>
[capacitor]
[capacitor] [warn] Configuration might be missing for cordova-plugin-facebook-connect.
[capacitor] Add the following to the existing NSAppTransportSecurity entry of Info.plist:
[capacitor]
[capacitor] <key>NSExceptionDomains</key>
[capacitor] <dict>
[capacitor] <key>facebook.com</key>
[capacitor] <key>fbcdn.net</key>
[capacitor] <key>akamaihd.net</key>
[capacitor] <dict>
[capacitor] <key>NSIncludesSubdomains</key>
[capacitor] <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
[capacitor] <true/>
[capacitor] <false/>
[capacitor] </dict>
[capacitor] <dict>
[capacitor] <key>NSIncludesSubdomains</key>
[capacitor] <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
[capacitor] <true/>
[capacitor] <false/>
[capacitor] </dict>
[capacitor] <dict>
[capacitor] <key>NSIncludesSubdomains</key>
[capacitor] <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
[capacitor] <true/>
[capacitor] <false/>
[capacitor] </dict>
[capacitor] </dict>
this my info.pllst file (all if him):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>myappname</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Role</string>
<key>CFBundleURLName</key>
<string>REVERSED_CLIENT_ID</string>
<key>CFBundleURLSchemes</key>
<array>
<string>REVERSED_CLIENT_ID</string>
</array>
</dict>
<dict>
<key>CFBundleURLSchemes</key>
<string>REVERSED_CLIENT_ID</string>
</dict>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb$APP_IDFACEBOOK_URL_SCHEME_SUFFIX_PLACEHOLDER</string>
<string>OTHER_APP_SCHEMES_PLACEHOLDER</string>
</array>
</dict>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>facebook.com</key>
<dict/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
<key>fbcdn.net</key>
<dict>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>akamaihd.net</key>
<dict>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
<key>FacebookUrlSchemeSuffix</key>
<string>FACEBOOK_URL_SCHEME_SUFFIX_PLACEHOLDER</string>
<key>FacebookHybridAppEvents</key>
<string>$FACEBOOK_HYBRID_APP_EVENTS</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires photo library access to function properly.</string>
<key>NSCalendarsUsageDescription</key>
<string>This app requires calendar access to function properly.</string>
<key>FacebookDisplayName</key>
<string>$APP_NAME</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>$LOCATION_USAGE_DESCRIPTION</string>
<key>NSMotionUsageDescription</key>
<string>This app requires motion detection access to function properly.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>This app requires Bluetooth access to function properly.</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app requires microphone access to function properly.</string>
<key>NSCameraUsageDescription</key>
<string>This app requires camera access to function properly.</string>
<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>
<key>FacebookAutoLogAppEventsEnabled_PLACEHOLDER</key>
<string>FACEBOOK_AUTO_LOG_APP_EVENTS_PLACEHOLDER</string>
<key>FacebookAdvertiserIDCollectionEnabled_PLACEHOLDER</key>
<string>FACEBOOK_ADVERTISER_ID_COLLECTION_PLACEHOLDER</string>
<key>FacebookAppID</key>
<string>$APP_ID</string>
<key>NSRemindersUsageDescription</key>
<string>This app requires reminders access to function properly.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>$PHOTO_LIBRARY_ADD_USAGE_DESCRIPTION</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>citymapper</string>
<string>comgooglemaps</string>
<string>navigon</string>
<string>transit</string>
<string>waze</string>
<string>yandexnavi</string>
<string>uber</string>
<string>tomtomhome</string>
<string>com.sygic.aura</string>
<string>here-route</string>
<string>moovit</string>
<string>lyft</string>
<string>mapsme</string>
<string>cabify</string>
<string>baidumap</string>
<string>taxis99</string>
<string>iosamap</string>
</array>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>This app requires constant Bluetooth access to function properly.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app requires constant access to your location in order to track your position, even when the screen is off or the app is in the background.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app requires constant access to your location in order to track your position, even when the screen is off or the app is in the background.</string>
</dict>
</plist>

If you are using Capacitor, you need to make some changes that are not documented (yet). If you only need the login, you are better off with the #capacitor-community/facebook-login plugin.
You can safely ignore the log-noise from the plugin after you set-up your info-plist correctly.
If you need it to get it work, Here's an example .plist for facebook:
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb<blabla></string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>REVERSED_CLIENT_ID</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.blabla-blabla</string>
</array>
</dict>
[...]
<key>FacebookAppID</key>
<string>blababa</string>
<key>FacebookClientToken</key>
<string>blababa</string>
<key>FacebookDisplayName</key>
<string>blababa</string>
<key>FacebookHybridAppEvents</key>
<string>"true"</string>
<key>FacebookAutoLogAppEventsEnabled</key>
<true/>
<key>FacebookAdvertiserIDCollectionEnabled</key>
<true/>
You should also modify you AppDelegate.swift on iOS i.e.
import UIKit
import Capacitor
import FBSDKCoreKit
#UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FBSDKCoreKit.ApplicationDelegate.shared.application(
application,
didFinishLaunchingWithOptions: launchOptions
)
return true
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
// Called when the app was launched with a url. Feel free to add additional processing here,
// but if you want the App API to support tracking app url opens, make sure to keep this call
if (FBSDKCoreKit.ApplicationDelegate.shared.application(
app,
open: url,
sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
annotation: options[UIApplication.OpenURLOptionsKey.annotation]
)) {
return true;
} else {
return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
}
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: #escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// Called when the app was launched with an activity, including Universal Links.
// Feel free to add additional processing here, but if you want the App API to support
// tracking app url opens, make sure to keep this call
return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: deviceToken)
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error)
}
}

Related

Is there any support for using Facebook SDK (app events to be specific) in Flutter?

I would like to add the Facebook app-events to my Flutter project: https://developers.facebook.com/docs/app-events/android https://developers.facebook.com/docs/app-events/ios
May I know should Flutter users implement their plugin to use the Facebook features?
You can integrate Facebook app events using this package called facebook_app_events(null-safety).
Android Setup:
STEP 1: goto your_project\android\app\src\main\res\values create a new file called strings.xml (if you don't have any already)
In the strings.xml file just paste this
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="facebook_app_id">[APP_ID]</string>
</resources>
Don't forget to replace [APP_ID] with the original APP_ID you got from Facebook e.g
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="facebook_app_id">1234567890</string>
</resources>
STEP 2: goto your_project\android\app\src\main\AndroidManifest.xml and paste this under your app <application> open tag
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="#string/facebook_app_id"/>
Android setup done.
iOS setup:
goto one_app\ios\Runner\info.plist file and add
If your code does not have CFBundleURLTypes, add the following just
before the final </dict> element:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb[APP_ID]</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>[APP_ID]</string>
<key>FacebookDisplayName</key>
<string>[APP_NAME]</string>
If your code already contains CFBundleURLTypes, insert the
following:
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb[APP_ID]</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>[APP_ID]</string>
<key>FacebookDisplayName</key>
<string>[APP_NAME]</string>
iOS setup is done
NOTE: don't forget to add the package to your pubspec.yaml file
dependencies:
facebook_app_events: ^0.12.0
So far, you can find the facebook_app_events package at pub.dev which is very good. Note that (at the time of writing this answer) the package doesn't support null safety, so you should use it with Dart 2.11 and lower.
There are no official packages from Facebook yet.

Error, no entitlements found in bundle " "

Please can someone assist me!
I archived my app, and I get this error:
ERROR ITMS-9000 "Missing code signing entitlements. No entitlements found in bundle "com...."
for executable.
How can I resolve this?
Thank you.
I was having this very problem, due to a recently-introduced automated build script. The script was codesigning the resultant app bundle manually and it turned out I needed to explicitly reference an entitlements file in the codesigning step:
/usr/bin/codesign --force --sign "$CERTIFICATE" --identifier "$BUNDLE_ID" --entitlements Entitlements.plist Payload/${BUNDLE_NAME}.app
The Entitlements.plist file is pretty standard:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>get-task-allow</key>
<false/>
<key>application-identifier</key>
<string>fully-qualified bundleid</string>
<key>keychain-access-groups</key>
<array>
<string>fully-qualified bundleid</string>
</array>
</dict>
</plist>

update version in settings bundle fails iphone

I am trying to write a run script that updates version in Root.plist.
This is the script
version=/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString"
$SRCROOT/AppName/AppName-Info.plist /usr/libexec/PlistBuddy
"$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set
PreferenceSpecifiers:1:DefaultValue $version"
Root.plist in settings bundle is
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList- 1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string>About</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>1.0.24</string>
<key>Key</key>
<string>version_preference</string>
<key>Title</key>
<string>Version</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Root</string>
</dict>
</plist>
I have followed instructions from this answer. The version number updates successfully when I create the .ipa and I can see the new version in itunes. But when I try to upgrade the app, device shows '1 item could not be synced. See iTunes for more information'. However if the older app on phone is deleted and a fresh install is made the app installs successfully and correct version appears in phone settings.I am using xcode 4.5.2
Could anyone please help
The following script works to insert the current subversion revision number into our plist:
G_VERSIONRP="`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}`"
G_BUILDRP="`svnversion -n`"
G_TITLERP="MyApp v"
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:Title ${G_TITLERP}${G_VERSIONRP} (${G_BUILDRP})" ${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Settings.bundle/Root.plist
I tried again a few days later, used the script and did a clean build. Replaced existing copy in iTunes, synched, it worked!! The only step not same as previous attempt was, earlier I had deleted existing copy in iTunes library and dragged in the new one. Not very sure if that was causing the '1 item could not be synced. See iTunes for more information' message but now the correct version does appear in phone settings.

Xcode 4.0 validation error CFBundleVersion

I am trying the Update my iPhone/iPad Application which I had created in Xcode 3.x version.
I have added CFBundleVersion and the other in my Info.plist and I have crossed checked every thing but I am still getting the error which is following below.
This Bundle is Invalid. The Info.plist file is missing the required key: CFBundleVersion (1091)
I am getting it again and again and I have checked the CFBundleVersion which is already in my Info.plist file.
Please help me out
Thanks
Following below is the Info.plist file. I have crossed check it several times
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleDocumentTypes</key>
<array/>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>icon.png</string>
<key>CFBundleIconFiles</key>
<array>
<string>icon-57.png</string>
<string>icon-72.png</string>
<string>icon-144.png</string>
</array>
<key>CFBundleIdentifier</key>
<string>com.my-irc</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.3.5</string>
<key>CFBundleSignature</key>
<string>coRC</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Internet Relay Chat Server</string>
<key>CFBundleURLSchemes</key>
<array>
<string>irc</string>
<string>ircs</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>1.1</string>
<key>CQBuildType</key>
<string>personal</string>
<key>LSMinimumSystemVersion</key>
<string>3.1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MVChatCoreCTCPVersionReplyInfo</key>
<string>http://colloquy.mobi</string>
<key>UIPrerenderedIcon</key>
<true/>
<key>UIRequiresPersistentWiFi</key>
<true/>
<key>UIStatusBarHidden</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UTExportedTypeDeclarations</key>
<array/>
<key>UTImportedTypeDeclarations</key>
<array/>
</dict>
</plist>
I had the same problem. I solved it this way. In XCode 4.2 click on the Target. In the summary section, you will see a version and a build number. If you set them both to the same thing, it works. If you just set the version only and ignore the build field you will get the error. This fixed the problem for me.
Sounds like something went wrong in the transition from 3.x to 4.0 A few things to check:
In the Project Target Build Settings make sure that "Info.plist File" is pointing to the right file.
Check that the Version field in the Project Target Summary is the right value
There should actually be two entries (by default) these days: CFBundleVersion and CFBundleShortVersionString though I doubt that's the issue
Make sure you don't have a space before or after "CFBundleVersion"
Else, you should be able to paste your plist here. In Xcode right-click on the plist file and choose Open As > Source Code. That'll give you the raw-xml that you can paste into your question (edit your question to update it).
In my case the CFBundleVersion is composed of the subversion working copy revision number on build. This is done by a script that is found under:
Target -> Build Phases -> Run script
After checking the build log it turns out that the subversion binaries Xcode uses are different from the ones I use on the command line (MacPorts version). The received error is:
svn: The path '.' appears to be part of a Subversion 1.7 or greater /.../
After modification of the line below:
REV=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
to:
REV=`/opt/local/bin/svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
everything works fine again.
I had that problem too. Here is my solution:
Follow the directions Here
Click Product > Clean
Click Window > Organizer
Click Archives
Click Validate

How to regenerate an iPhone Xcode info.plist file

I have moved my iPhone app from one machine to another. In the process my info.plist file seems to have a bad bundle identifier and is not working. I want to create an entirely new info.plist file for my project.
How can I do this?
Here's a clean info.plist for you. Don't forget to replace xxx.yyy, and rename xib file (if required)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>Icon.png</string>
<key>CFBundleIdentifier</key>
<string>xxx.yyy.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSMainNibFile</key>
<string>MainWindow</string>
</dict>
</plist>
If you just want an empty info.plist file, then just select "New File..." on the "File" menu in XCode.
In the "New File" window you pick "Other" on the left hand and then "Property List" on the right hand.
I had problem finding "Info.plist" file too, especially that some C++ test application target doesn't have "Info" tab, so modification in this file had to be done manually.
To find it:
Select project in project navigator
Select desired target (project can have multiple targets)
Select tab "build Settings"
Search for entry "Info.plist File". There you should find path of this file
Tested on Xcode 7.3.
In my case I had to "Allow Arbitrary Load" in "App Transport Security Settings" to restore insecure HTTP protocol.