iOS App Metadata Rejected? Anything to Check in ViewDidLoad? - ios

So I just got an app's metadata rejected. Their message:
Your iTunes Connect settings indicate that your app serves third-party advertisements. However, we were unable to locate ads in your app.
Please reply to this message to provide the steps for locating third-party ads in your app. When we hear back from you, we will continue the review.
But my app presents a google adBanner as soon as they game is launched. Even if you somehow press the start button before the Ad is loaded, it still presents itself during the game...
Is there any reason they wouldn't see the AdBanner?
I have my own adUnitID and it displays an Ad on my iPhone 6+ device and also the 4S simulator...
Also, I ticked the "servers advertisements within app" check box before submitting:
I've replied saying:
Hello.
Please see screenshot of a Google AdBanner... It should show upon launch of the game.
Steps:
-Open App
-An Ad should load within seconds.
Please advise. Thanks.
and attached a screenshot, showing it...
I've done it the same way I have in my last app which is live and serving ads.
This is how I load and serve the ad in the gameViewController:
override func viewDidLoad() {
super.viewDidLoad()
googleBannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
googleBannerView.adUnitID = "ca-app-pub-blahblahblah/1010101"
googleBannerView.rootViewController = self
let request: GADRequest = GADRequest()
googleBannerView.loadRequest(request)
googleBannerView.frame = CGRectMake(0, view.bounds.height -googleBannerView.frame.size.height, googleBannerView.frame.size.width, googleBannerView.frame.size.height)
self.view.addSubview(googleBannerView!)
//more stuff
}
Is there anything else I can do to check in the code that it's definitely serving ads? I can't see anything wrong with it.
I can't think of any reason it wouldn't be serving their end...
Also, if it's still in review, do I have to wait another week?

Metadata rejected in itunesconnect means 1) that something wrong with app metadata (description, screenshots, etc.) or 2) Something wrong with things that are serving your app (backend, some authorization, etc.). Also it means that you can resubmit your app without uploading new app binary file. Seems like the second case is yours, and the app review team thinks that something went wrong with you ad serving or ad banner in the place that they couldn't find.

I recently got this rejection when they couldn't find my third party ad, Admob, in my app. This was because I was using admob just for interstitial and I used iAd for banners. I had to tell them how and where to get those admob ads to show.
you can try googleBannerView.hidden = false (this is the default value) and see if there's a difference
But for your case, since you're using admob banners that should have shown in the first place and you were able to make it show on your test, the only reason I could think of why they did not find it is because of no ad inventory from Admob (I stated this reason as well when I replied) which is rare but still happens.
It will stay in review/rejected state until you fix it by uploading a new binary and resubmitting (which would take the normal week submission and reviewing) or when they are convinced that there is a third party ad network used (from replying and stating your case) which they'll change the app status to 'ready for sale' or approved. Mine took 2 days I think.

Related

Stop the UnityAds Cookie permission seeking

I've just added UnityAds to my app and whilst testing production I noticed instead of an ad, it popped up a request to place cookies on the users device.
The SDK integration was fine but is an absolute deal breaker for me. Is there any way to turn on a setting where it doesn't do this? I turned off the seek personalised ads request in the iOS app, I don't want my users interrupted like this. I'd like to reject all on their behalf before they see it.
Yes, you can do that. Use my following code to pass the consent flag to Unity Ads SDK. And make the Unity Ads SDK not request cookie permissions for your users by setting this flag to false
MetaData gdprMetaData = new MetaData("gdpr");
gdprMetaData.Set("consent", "false");
Advertisement.SetMetaData(gdprMetaData);
// then Setup Unity ads
For people who is using Ironsource Mediation and have Unity Ads in waterfall but having the same problem.
IronSource.Agent.setConsent(false);
Warrning: but if you do that, all ads will not be personalized. The best way I recommend to you is:
On first opening, You need to show ATT (Application Tracking Transparency) popup. Then if the user clicks Allow then you set the consent to true if the user clicks Don't allow (Require apps not to track) then you set the consent false.
by the way:
If you don't want to show ATT in the first time. You need to set consent as false until ATT shows
*** Edit *** Ok found it in Swift, posting the code for posterity - Magoo
let meta = UADSMetaData()
meta.setRaw("gdpr.consent", value: false)
meta.commit()

What is the difference between offer code URL and URL to redeem iOS App Store promo codes

So in the App Store Connect In-app purchase manage, Offer Codes tab, we can see offers with Offer Code URL like this format:
(1) https://apps.apple.com/redeem?ctx=offercodes&id=YOUR_APP_ID&code=CODE
When I implement this URL, my iOS 11.0 device can not open to redeem page of the App Store (It showed "Can not connect to App Store"). But other devices with iOS 12.0 and above worked fine.
When researching I found this URL :
(2) tms-apps://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/freeProductCodeWizard?code=YOUR_CODE.
which is also open the redeem page of the App Store. And it worked for all of my devices. So should I use this? And what is the difference between (1) and (2)?
The URL https://apps.apple.com/redeem gets redirected to https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/redeemLandingPage?mt=12. So I would say that the your (1) URL is trying to redirect, but your APP is not coping with the redirect. So yes, use (2)

Google AdMob returns "Configuration does not have valid Google App ID"

It's been almost a week since my app went Live, but my live Google ads are not showing at all.
I've tried double checking everything I could think of, such as making sure the App ID and Ad ID are correct, but I'm having no luck with them.
I have the following 2 functions to load and show the ads
public func loadAd() {
interstitial = GADInterstitial(adUnitID: "ca-app-pub-3228561607874346/1546949023") //Live Ad 2
let request = GADRequest()
interstitial.load(request)
}
public func showAd() {
if (interstitial.isReady) {
interstitial.present(fromRootViewController: self)
loadAd()
} else {
print("Ad wasn't ready")
}
}
I tried running it with test ads using the test ad ID that were given to me on Google's tutorial page and that seems to be working fine, just not my Live Ad.
The only thing that flags or catch my attention is the console is printing:
[I-ACS023136] Configuration does not have valid Google App ID.
and
[I-ACS034010] Transaction failed
But like I said, I double checked my config in my info.plist file and all seems to be fine.
There are over 200 requests made and 0% match-rate. I just don't know what it could be.
I've done some research and most people solved their issues related to AdMob by waiting a few days. Since your app went live more than a week ago, I believe that's not the issue. Another possible solution is to share your app with more people, in order to send more requests to Google Servers. According to this answer:
For newly created ads to work, Admob need more requests to start showing ads.
Also:
Make sure that Google Mobile Ads SDK is properly integrated.
Make sure that you are using the Real ID because sometimes the Test ID is used by default.
Make sure there are no restrictions on your account.
Make sure that the account setup is fully completed. Payment information, name, address, phone number, and tax info in your AdMob account with verification if applicable.
Check that the eCPM floor settings are not set too high.
An unlikely but possible reason could be lack of inventory.
If none of the above worked, you can try these troubleshooters:
Performance Troubleshoot - Can't see ADS Troubleshoot
More info:
Common reasons for ads not showing
Your code loads the interstitial ad inside the if condition.
Call your load before you check if it is ready.
interstitial.isReady indicates that the ad is fully loaded.
You can see this website for more information: https://developers.google.com/admob/ios/interstitial.
It is also better practice to call loadAd function in viewDidLoad and display it when needed.
I also recommend using the test id for Google Admob.
It is listed in the url: https://developers.google.com/admob/ios/test-ads
Don't forget to include Admob App Id in GoogleService-Info.plist. I think it is included automatically, but you can check it.

Does Facebook Deferred Deep Linking on iOS work, and how to test it before publishing the app on Store?

I have a problem with Facebook Deferred Deep Linking on iOS. DEEP LINKING WORKS, BUT DEFERRED DEEP LINKING DOESN'T WORK. I have read a lot about this problem and still cannot find the solution.
I have set up deep linking and it works. When I also try to test deep linking on App Ads Helper and click on "Test deep link", enter deep link and click on "Send notification", I receive a notification on Facebook which opens my app, and this deep linking works. But, when I click "Select Deferred", I don't receive anything. I try to delete app and reinstall it, but [FBSDKAppLinkUtility fetchDeferredAppLink:...]; method doesn't get any deferred deep link after new install.
[FBSDKAppLinkUtility fetchDeferredAppLink:^(NSURL *url, NSError *error) {
if (error) {
NSLog(#"Received error while fetching deferred app link %#", error);
}
if (url) {
[[UIApplication sharedApplication] openURL:url options:#{} completionHandler:^(BOOL success) {
}];
}
}];
In this example, url is always nil.
Note: I still don't have app on Store, so I entered a Apple Id of another application. Even if I had my own app on Store, how could I test deferred deep linking without publishing app on Store?
Also, I have read on Facebook documentation that:
Beginning with iOS 10, iOS doesn't support deferred deep linking, so you can't open content other than the starting screen once people have installed the app. (Source)
So, I am not sure if this is even possible.
Also, I have read another articles on Stackoverflow, but there are not answer that I am looking for, i.e. they look incomplete, or I just don;t see the answer between the lines:
How to use facebook deferred deep linking feature for new installs
and to test the same before publishing iOS App to appStore? -> Answers to this question aren't what I am looking for:
If you want to verify deferred links then check 'Send Deferred' in the dialog.
So, after doing this you need to uninstall the app(if already present) and then install again from the app store. The device in which you will be testing this should have facebook app installed and logged in with the account from which you had sent the "deferred deep link request" from app-ads helper.
Now when you open your app, you should bee able to see your deferred deep link functionality working.
This doesn't work, so that's why I am asking this question.
Also, I have found that I could use Tune SDK for deferred deep linking:
...this is not a problem with the iOS 10 operating system itself. Deferred deep linking works just fine for iOS 10 using the TUNE SDK. (Source)
Also, I have found that I could use Branch.io for deferred deep linking:
With Branch, you get all the basic routing of a Universal Link plus the deferred deep linking and install attribution for the new user acquisition flow. (Source)
I haven't tried Tune and Branch.io. I would like to use Facebook ads and perform deferred deep linking without third party solutions. Is it possible with Facebook, and how to test deferred deep linking for Facebook on iOS?
It worked for us after resetting advertising identifier. Maybe internally they are preventing attribution in the same app twice if it is the same advertising identifier. So go to settings and reset your advertising identifier before testing. Also make sure the phone has not opted out of tracking.
For me, the answer was in my iPhone settings. I had "Limit Ad Tracking" enabled. I don't have much documentation proof that this was causing the issue but after changing it, it is now working. It's worth testing it yourself.
On your iPhone go to: Settings -> Privacy -> Advertising (at the bottom of the page)
There you should ensure that "Limit Ad Tracking" is set to off.
You should then recieve a URL if you have your app URL Scheme correctly set (see here if not) code which for swift should look like this:
AppLinkUtility.fetchDeferredAppLink { [weak self] (url, error) in
guard let self = self else {return}
if (url != nil) {
} else if error != nil {
print("Error: \(error!.localizedDescription)")
}
}
To test the deferred links, you can go here.
A bit late, but per your comment on the previous answer: Once you receive the message:
The link has been queued and is pending you doing a first app launch on your device. This means you need to delete the app, then re-install and open your app. Please first verify your app can handle deferred deep linking by checking the iOS and Android setup information located above.
Delete the application from your device
Open Facebook notifications from your device, you should have a deeplink notification
Selecting the deeplink notification should direct you to the appropriate app store to install the application again
Once installed, launching the application should trigger the intended 'Deferred' deep link
For deferred deep link to work, you also need to be logged in on the Facebook app. The ads helper tool: https://developers.facebook.com/tools/app-ads-helper/ knows your logged in user id on facebook.com. Facebook then uses this info to match your id, the app and the device information and returns an appLink back to your app if so.
Unfortunately, that's not possible on simulator given the limitation to install other apps like Facebook.
Your only option is to use a real device and build your XCode project on it. Make sure you have Facebook installed and that you are logged in with the same user as on your desktop web browser.
If you are running Facebook ads with Deep linking enabled, you can test deferred deep linking setup here: https://developers.facebook.com/tools/app-ads-helper/
You will need to select your app, then you should be able to access the deep-link tester at the bottom of the page (in which you can also select deferred)
Additional info:
So you need to deploy the app to the store? – locoboy Aug 7 '15 at 16:38
For testing Deep Link or Deferred Deep Link as they said before me:
deploy to store not required, use FB Ads panel for testing
check just in case statistic for app installs (not equal zero) - may be AppEvents (automatically logged) doesn't work correct (keep in mind, in the calculation of statistics, there may also be a delay)
Install Facebook application for your device, auth in using the same profile that you use to send notifications (run FB app in background)
Select both 'Send Notification' and 'Send Deferred' check marks (or check only 'Send Deferred' - results will available after manual app reinstall, and don't forgot trigger FBSDKAppEvents activateApp)
Example after successful sending
The main objective - after sending the message you will see it in Facebook! app notifications, with logo + text "Tap to launch your deep link"
Tap on notification

iOS AdMob ads not showing up unless on Test Device

I have followed the tutorial provided by Google here: https://developers.google.com/mobile-ads-sdk/docs/admob/ios/quick-start in order to setup admob banner ads.
My code is exactly how it is shown in the guide from the link above, so when I run the app on my test device or simulator a 'Smart Banner' 'Test Ad' appears..however, the second I remove the line of code below no banner appears at all..
request.testDevices = #[ #"70b9ee4e66c8e6fa26cb84def25706d9" ];
Also, I've loaded the app on another device and still there is no ad banner appearing, which makes me wonder when I submit the app to the App Store it only makes sense that all my users won't be seeing ads on their devices. Why is this happening? I've been scratching my head on this one! I don't want to submit it for review until I am certain everything is working correctly and I know that ads will appear not only on test devices but when the app goes LIVE as well. Thanks in advance! :)
-(void)adViewDidReceiveAd:(GADBannerView *)bannerView;
-(void)adView:(GADBannerView *)bannerView didFailToReceiveAdWithError:(GADRequestError *)error;
There can be number of reasons for not showing the Live ads.
Check your google admob account for the payment info. If not filled, fill it.
Check if your device is registered as test device, else you may get suspension from the google for 30 days or so.
You can check the delegate methods and print the logs:
In my case, I was getting error as { 'error': 'Request Error: No ad to show.', 'adType':'banner' }
But it showed at the client side, after I delivered to the client. So, I think that this issue was due to the reason that google had no advertisements in my region.
If you are working with iOS10, you should add this to your .plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsForMedia</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
Only test ads will appear otherwise. You can find more details about it at Firebase's Admob documentation.
Weird solution but it worked:
By following the guide provided by Google to setup Ad Mediation in iOS, it tells you to implememnt it via Storyboard/nib. Once I removed this method and simply implemented the GADBannerView programmatically, everything began to work as expected. Quite the annoying issue, but thankfully it's solved and I can move on.
I had this same issue.
My mistake was that I had created an app within AdMob for my Android application, which works great, however when it came to creating the app in iOS, all I did was create another ad unit under that same application. Doing that, gave me the same results that you are seeing.
To fix it, I created a new application inside AdMob that was for iOS platform, created an ad unit inside there and it solved my problem, I am now seeing real ads inside my app.
This not appear if will come up if you have limited ad tracking in your settings. On your device, check that Limit Ad Tracking is not enabled:
Settings -> Privacy -> Advertising
Have you registered an account with AdMob? If so, have you replaced the test Ad Unit ID that's included in the quick start with your own? If not, that would explain the behavior you're seeing (the ID in the example is only for test ads, and won't serve real ones).
An Ad Unit ID identifies an ad placement within your app, and is unique to you. The AdMob instructions for generating one are in their help documentation.
In my case it was actually due to the fact I was not using the correct ad unit ID (the part after the slash). I was able to find out as I used the sample IDs google provided, then I went to my admob account, click on the banner ad, I realized the two numbers for the plist (or initial setup in the app in app delegate) and for the ad unit are different. I spent probably hours on it :-(
I had the following error returned: "The ad request was successful, but no ad was returned due to lack of ad inventory." This can also explain why ads won't show up.
You registered your account in google admob account that I believed. You got your own test Id for your registered account. Follow the exact procedures and check the "self.bannerView.adUnitID" and also check the code "self.bannerView.rootViewController = self;" in objectice-c programming what you followed in your code.
Most important thing is to check the correct banner size which is default size.
Wishes for your success result.
Enjoy coding..
HERE'S A SOLUTION IF SOMEONE ELSE STILL LOOKING FOR IT.
bannerView = GADBannerView();
GADMobileAds.sharedInstance().requestConfiguration.testDeviceIdentifiers =
["YOUR DEVICE ID" ]
bannerView.adUnitID = "YOUR ADMOB ID"
bannerView.frame = CGRect(x: 0, y: screenHeight * 0.25, width: screenWidth, height: screenWidth * 0.2) // you can customise this
bannerView.rootViewController = self
let request = GADRequest()
bannerView.load(request)
self.view.addSubview(bannerView);

Resources