這次 App 送審被 Apple 以違反 PLA 3.3.12 而退審,內容大致上是說 Advertising Identifier(IDFA) 僅可基於廣告目的使用於應用程式內,但審核團隊沒發現需用 IDFA 來呈現廣告的地方。
因送審的 App 內僅使用 iAd,而 iAd 是不需 AdSupport framework、ASIdentifierManager 或 Advertising Identifier 的,所以唯一的可能性就是第三方 Framework 使用了 IDFA。
Apple 在退審原因內提示可透過 strings 或 otool 指令來幫忙找出問題點,最終揪出兇手就是 FacebookSDK,在 FBUtility.m
引入了 AdSupport
並使用 advertisingIdentifier
。
暫時的解決方法如下:
git clone FacebookSDK 到本機
開啟
src/Core/FBUtility.m
,將此行註解//#import <AdSupport/AdSupport.h>
將
+ (NSString *)advertiserID { NSString *advertiserID = nil; Class ASIdentifierManagerClass = [FBDynamicFrameworkLoader loadClass:@"ASIdentifierManager" withFramework:@"AdSupport"]; if ([ASIdentifierManagerClass class]) { ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager]; advertiserID = [[manager advertisingIdentifier] UUIDString]; } return advertiserID; }
改為
+ (NSString *)advertiserID { return @""; }
將
+ (FBAdvertisingTrackingStatus)advertisingTrackingStatus { if ([FBSettings restrictedTreatment] == FBRestrictedTreatmentYES) { return AdvertisingTrackingDisallowed; } FBAdvertisingTrackingStatus status = AdvertisingTrackingUnspecified; Class ASIdentifierManagerClass = [FBDynamicFrameworkLoader loadClass:@"ASIdentifierManager" withFramework:@"AdSupport"]; if ([ASIdentifierManagerClass class]) { ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager]; if (manager) { status = [manager isAdvertisingTrackingEnabled] ? AdvertisingTrackingAllowed : AdvertisingTrackingDisallowed; } } return status; }
改為
+ (FBAdvertisingTrackingStatus)advertisingTrackingStatus { return AdvertisingTrackingDisallowed; }
使用
scripts/build_framework.sh
重新打包 FacebookSDK。返回原專案引用新打包的 FacebookSDK 重建 App 並送審。
註:若 App 內使用了 iAd 以外的廣告服務且廣告有正常顯示,應該不會因違反 PLA 3.3.12 而退審。
參考資料: