I have an app with AdMob. In plist I added apps ID and in code added banner ID.
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-XXXX~XXXX</string>
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>
</array>
bannerView.adUnitID = "YYYY/YYYY"
Test ads I can see, if I explicitly add testDeviceIdentifiers, otherwise I am getting an error To get test ads on this device, set: GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers.
The App was published on the App Store few days ago. I was thinking AdMob can determine it and show the real Ads, but it did not happen. What am I missing?
Well the ads appeared after few days. Really weird that it took so much time.
Related
My IOS app is using the map function for showing route and following is the map related configuration from info.plist
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>MKDirectionsRequest</string>
<key>LSHandlerRank</key>
<string>Default</string>
<key>LSItemContentTypes</key>
<array>
<string>com.apple.maps.directionsrequest</string>
</array>
</dict>
</array>
<key>MKDirectionsApplicationSupportedModes</key>
<array>
<string>MKDirectionsModeBike</string>
<string>MKDirectionsModeBus</string>
<string>MKDirectionsModeCar</string>
<string>MKDirectionsModePedestrian</string>
</array>
The app is only focusing on sweden, and following is the "sweden.geojson" file. Where coordinates start with longitude then latitude, with three brackets to close a polygon. Last coordinate is same as the first one.
{
"type": "MultiPolygon",
"coordinates": [
[[[9.755,54.977],[24.960,54.977],[24.960,69.565],[9.755,69.565],[9.755,54.977]]]
]
}
The initial json format validation passes, so I can do the submit, but then I got the emails with error: invalid binary, IOS realease ITMS-90117: Missing routing app coverage file. I even tried the sample json file from apple documentation but it is same error. Been on apple developer forum searching, but it is only problem posting, and no one posts any solution. Help appreciated...
This may or may not help you as I don't know the purpose of your app, but I had the same problem and and have found a solution that works for me.
I use MapKit to provide directions inside the app, but it isn't a directions app.
The solution was to turn off Map from the app capabilities (on the Signing and Capabilities tab). This setting indicates that the app works as a general purpose directions app.
I'm theorizing (but don't know for sure) that the reason the binary was invalid before I turned off the Map capability was that you can't have the capability enabled without providing a way to start the app with a location.
Dark mode support was added to version 2.20.31 (released in March of 2020) of the WhatsApp client. This is an iOS 13-only feature, and from the look & feel it appears to be a fully native implementation. I think it is safe to assume that the app is now being compiled with iOS SDK 13.0 or above.
The thing is, as of iOS 13, Apple now requires the native call screen to be shown whenever a VoIP notification is received - otherwise, the app will not receive any further VoIP notifications. In previous version of iOS, some apps (including WhatsApp) appear to use "fake" incoming VoIP calls to silently wake up the app in background when the user attempted to use the web client, so that the latter could then connect and exchange data directly with the phone.
However, as of the latest version, the web client still appears to work as it did before despite the restriction introduced by Apple. Using a debugger it is possible to observe the iOS app waking up whenever the user opens the web client on a PC, but no call screens are ever shown. This can be done repeatedly and as often as we want.
The logs from WhatsApp seems to confirm what is written above:
default 17:09:44.515731+0000 callservicesd Call source <CXXPCCallSource 0x111ecb0a0 identifier=UKFA9XBX6K.net.whatsapp.WhatsApp isConnected=1 processIdentifier=417 isPermittedToUsePublicAPI=1 isPermittedToUsePrivateAPI=0> registered with configuration <CXProviderConfiguration 0x111e9bb40 localizedName=WhatsApp ringtoneSoundURL=(null) iconTemplateImageData=0x0 maximumCallGroups=1 maximumCallsPerCallGroup=1 supportsAudioOnly=1 supportsVideo=1 supportsEmergency=0 supportsVoicemail=0 supportsCurrentPlatform=1 includesCallsInRecents=1 audioSessionID=1151157 supportedHandleTypes=2>
If we try to do this with our app, the results are quite different:
error 18:56:19.949023+0000 callservicesd Killing VoIP app com.xxxxx.xxxxx.xxxxx because it failed to post an incoming call in time.
Any idea what's going on here? Is WhatsApp using any sort of undocumented workaround or exploiting some sort of private API?
This is WhatsApp latest entitlements file:
<?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>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>57T9237FN3.net.whatsapp.WhatsApp</string>
</array>
<key>com.apple.developer.pushkit.unrestricted-voip</key>
<true/>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
<string>57T9237FN3.net.whatsapp.WhatsApp</string>
</array>
<key>application-identifier</key>
<string>UKFA9XBX6K.net.whatsapp.WhatsApp</string>
<key>com.apple.developer.carplay-messaging</key>
<true/>
<key>aps-environment</key>
<string>production</string>
<key>com.apple.developer.icloud-container-environment</key>
<string>Production</string>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:api.whatsapp.com</string>
<string>applinks:v.whatsapp.com</string>
<string>applinks:chat.whatsapp.com</string>
<string>applinks:wa.me</string>
</array>
<key>com.apple.developer.siri</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>57T9237FN3</string>
<key>com.apple.developer.icloud-services</key>
<array>
<string>CloudDocuments</string>
<string>CloudKit</string>
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.net.whatsapp.WhatsApp.shared</string>
<string>group.com.facebook.family</string>
<string>group.net.whatsapp.WhatsApp.private</string>
<string>group.net.whatsapp.WhatsAppSMB.shared</string>
<string>group.net.whatsapp.family</string>
</array>
</dict>
</plist>
This specific entitlement seems to be the reason that they are allowed to not report an incoming call:
com.apple.developer.pushkit.unrestricted-voip
I can't find any documentation regarding this entitlement, so I'm pretty sure they have been given a special permission by Apple.
I've asked eurodev support about this and just received:
At this point we don’t have any additional information about the unrestricted entitlement that you are asking about. The only information that’s available is linked here.
https://developer.apple.com/documentation/bundleresources/entitlements
Pushing back to them to get more info.
Thanks.
Added iCloud to a working iOS app, with data stored in the public database. I have to log on to iCloud in the simulator, but that done, the app runs fine in the simulator. On an iPad, the program crashes on the following statement:
CKContainer * dbContainer = [CKContainer defaultContainer];
The app is terminated "due to uncaught exception 'CKException', reason: 'The application is missing required entitlement com.apple.developer.icloud-services'
When I turn on the iCloud capability in XCode, XCode creates an entry in the .entitlements file for com.apple.developer.icloud-services, with one item in the array: a string with value "CloudKit".
On my iPad I am logged in to iCloud in the same way as on the simulator.
I have been through Apple's entitlement troubleshooting guide in detail several times, I have searched every way I know how, and I can't figure out why this fails. I did find and read the posts suggested as duplicates and none of the solutions suggested worked for me.
After posting this question, I went through the entitlement troubleshooting guide one more time and found the following entitlement section in the built app:
<dict>
<key>keychain-access-groups</key>
<array>
<string>PTXZTRRTHH.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>application-identifier</key>
<string>PTXZTRRTHH.com.quipzl.Quipzl</string>
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>PTXZTRRTHH.*</string>
<key>com.apple.developer.icloud-services</key>
<string>*</string>
<key>com.apple.developer.icloud-container-environment</key>
<array>
<string>Development</string>
<string>Production</string>
</array>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.quipzl.Quipzl</string>
</array>
<key>com.apple.developer.icloud-container-development-container-identifiers</key>
<array>
<string>iCloud.com.quipzl.Quipzl</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
<string>iCloud.com.quipzl.Quipzl</string>
</array>
<key>com.apple.developer.team-identifier</key>
<string>PTXZTRRTHH</string>
<key>aps-environment</key>
<string>development</string>
</dict>
And the app does run on my iPad - until execution reaches the code above, when it throws an exception. Why?
This crash was not due to any missing entitlements, though the exception said it was. I don't know exactly what fixed the problem, but I do know the process that worked, as follows:
1) create a new iOS project of the same type an make sure it runs.
2) enable CloudKit in the new app, and add #import "CloudKit/CloundKit.h" in the default controller created by XCode.
3) add the statement "[CKContainer defaultContainer];" in the viewDidLoad() method.
4) run the app again and make sure it doesn't crash on the added statement.
5) go through all of the app properties in the old app and make sure all of the values are identical to those in the new app.
This last step included around a dozen value changes, and solved the problem: the old app no longer crashes trying to access iCloud.
I am debugging my integration of Facebook iOS SDK 4.10 on iOS 9 (it works but the login is always done through a webview and doesn't open the Facebook app).
I have a problem with CFBundleUrlTypes, I have added it (many times) through XCode: Project > Info > Url Types... In fact it is persisted, because I can: cat Info.plist|grep -C 10 -i urltypes and get:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string></string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb$(FACEBOOK_APP_ID)</string>
</array>
</dict>
</array>
But I relaunch XCode it's not visible anymore in the project info.
Starting from iOS9, Facebook uses the Safari View Controller for Login rather than a fast app switch. The SDK basically tries to determine the best possible experience for the user so this is probably why you are always routed to the web based login.
It is also partly to get around the "APPNAME wants to open OTHERAPP" you will see in iOS9.
The documentation slightly touches on this here https://developers.facebook.com/docs/ios/ios9#faq
I'm working on my app, I wanted to add AdMob banner like I always do without any problem before, but now on this new app it doesn't show up.
The banner ad is in one of the UITableViewCell's, and I get this log message:
-canOpenURL: failed for URL: "kindle://home" - error: "(null)"
I have disabled Bitcode and I have added the App Transport Security and NSAllowsArbitraryLoads in the info.plist file.
Update to the latest AdMob SDK. This issue was fixed in 7.5.0:
SDK no longer uses UIApplication's canOpenURL method on iOS 9 devices.
AdMob for iOS Release Notes
I simply pasted this into my info.plist file and it all worked
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
as per https://developers.google.com/admob/ios/ios9