[Cordova] App 缺少 App Tracking Transparency,被 App Store 拒絕上架?

[Cordova] App 缺少 App Tracking Transparency,被 App Store 拒絕上架?

最近想發布 Cordova 寫的 iOS app 時,

突然被 App Store Connect 在審查時拒絕,

原來是 iOS 14.5 版之後,App 都得要使用 App Tracking Transparency

來請求使用者給予權限,才能追蹤使用者:

 

但是我的 App 裡面,哪裡有用到什麼追蹤碼呢?

查了一下,因為 App 裡面有附 Google Admob 的廣告,

廣告自然就會追蹤使用者的行為,因此我的 App 也得負連帶責任…

 

那在 Cordova 裡面,要怎麼處理這個 App Tracking Transparency 呢?

查了一下,我們可以用 cordova-plugin-idfa 這個外掛來幫忙~

 

1. 安裝 cordova-plugin-idfa 外掛

執行下面指令安裝外掛:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cordova plugin add cordova-plugin-idfa
cordova plugin add cordova-plugin-idfa
cordova plugin add cordova-plugin-idfa

 

2. 編輯 config.xml

打開 Cordova 專案目錄下的 config.xml,

在  

<platform name="ios">
<platform name="ios"> 區塊裡面,

增加一個  

NSUserTrackingUsageDescription
NSUserTrackingUsageDescription 的項目,例如:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<platform name="ios">
<edit-config target="NSUserTrackingUsageDescription" file="*-Info.plist" mode="merge">
<string>此追蹤碼將會被用來傳送個人化的廣告給您。</string>
</edit-config>
</platform>
<platform name="ios"> <edit-config target="NSUserTrackingUsageDescription" file="*-Info.plist" mode="merge"> <string>此追蹤碼將會被用來傳送個人化的廣告給您。</string> </edit-config> </platform>
<platform name="ios">
    <edit-config target="NSUserTrackingUsageDescription" file="*-Info.plist" mode="merge">
        <string>此追蹤碼將會被用來傳送個人化的廣告給您。</string>
    </edit-config>    
</platform>

 

3. 呼叫 idfa 外掛提示使用者

在程式開始要產生廣告 (也就是開始會追蹤使用者) 時,

要呼叫 idfa 外掛來提示使用者給予權限,

下面的程式是 cordova-plugin-idfa 官網給的範例:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const idfaPlugin = cordova.plugins.idfa;
idfaPlugin.getInfo()
.then(info => {
if (!info.trackingLimited) {
return info.idfa || info.aaid;
} else if (info.trackingPermission === idfaPlugin.TRACKING_PERMISSION_NOT_DETERMINED) {
return idfaPlugin.requestPermission().then(result => {
if (result === idfaPlugin.TRACKING_PERMISSION_AUTHORIZED) {
return idfaPlugin.getInfo().then(info => {
return info.idfa || info.aaid;
});
}
});
}
})
.then(idfaOrAaid => {
if (idfaOrAaid) {
console.log(idfaOrAaid);
}
});
const idfaPlugin = cordova.plugins.idfa; idfaPlugin.getInfo() .then(info => { if (!info.trackingLimited) { return info.idfa || info.aaid; } else if (info.trackingPermission === idfaPlugin.TRACKING_PERMISSION_NOT_DETERMINED) { return idfaPlugin.requestPermission().then(result => { if (result === idfaPlugin.TRACKING_PERMISSION_AUTHORIZED) { return idfaPlugin.getInfo().then(info => { return info.idfa || info.aaid; }); } }); } }) .then(idfaOrAaid => { if (idfaOrAaid) { console.log(idfaOrAaid); } });
const idfaPlugin = cordova.plugins.idfa;

idfaPlugin.getInfo()
    .then(info => {
        if (!info.trackingLimited) {
            return info.idfa || info.aaid;
        } else if (info.trackingPermission === idfaPlugin.TRACKING_PERMISSION_NOT_DETERMINED) {
            return idfaPlugin.requestPermission().then(result => {
                if (result === idfaPlugin.TRACKING_PERMISSION_AUTHORIZED) {
                    return idfaPlugin.getInfo().then(info => {
                        return info.idfa || info.aaid;
                    });
                }
            });
        }
    })
    .then(idfaOrAaid => {
        if (idfaOrAaid) {
            console.log(idfaOrAaid);
        }
    });

 

 

4. 編譯 Cordova iOS App

跟平常一樣,執行下面指令來編譯 Cordova iOS App:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cordova prepare ios
cordova compile --release ios
cordova prepare ios cordova compile --release ios
cordova prepare ios
cordova compile --release ios

 

5. 執行 App

下面是 App 在 iOS 模擬器中執行的結果。

當 idfa 外掛被呼叫後,App 就彈出了一個提示訊息來告知使用者,

這個 App 會追蹤使用者的行為:

 

但是,上面的訊息裡面,

並沒有我們列在 config.xml 中 

NSUserTrackingUsageDescription
NSUserTrackingUsageDescription 的字串

「此追蹤碼將會被用來傳送個人化的廣告給您。」

這是怎麼一回事呢?

如果將這樣的 App 提交給 Apple 的話,一樣會被打槍,

只要沒有說明追蹤使用者的原因的話,就沒辦法通過

 

檢查一下 platforms/ios/<project>/<project>-Info.plist 檔案,

發現

NSUserTrackingUsageDescription
NSUserTrackingUsageDescription 沒有像 config.xml 一樣被加進去…

就算重新跑一次

cordova prepare ios
cordova prepare ios 和  
cordova compile
cordova compile 也沒有用…

 

研究了半天,如果這種情況發生的話,

似乎只能將 iOS 平台移除再重新加入,

這樣 platforms/ios/<project>/<project>-Info.plist 檔案才會有 config.xml 下的資料:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cordova platform rm ios
cordova platform add ios
cordova platform rm ios cordova platform add ios
cordova platform rm ios
cordova platform add ios

 

確認 <project>-Info.plist 裡面也有正確的字串後,

再重新編譯一次 App 並執行,

這時我們自訂的訊息就會出現在畫面上了:

 

這樣的 App 提交給 App Store 才會通過囉~

 

參考資料:

(本頁面已被瀏覽過 490 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料