为 iOS 14.5 实施 Apple App Tracking Transparency (ATT) 的 React Native Expo

Posted

技术标签:

【中文标题】为 iOS 14.5 实施 Apple App Tracking Transparency (ATT) 的 React Native Expo【英文标题】:React native expo implementing Apple App Tracking Transparency (ATT) for iOS 14.5 【发布时间】:2021-05-04 14:16:54 【问题描述】:

在 react native expo 上实现 Apple App Transparency Tracker (ATT) 功能的最佳方式是什么?即使我添加了以下内容,我的应用仍然被苹果拒绝:

app.json 文件:

"infoPlist": 
  "NSUserTrackingUsageDescription": "App requires permission...."

【问题讨论】:

【参考方案1】:

ios 14 上,Apple 引入了 App Tracking Transparency 权限以访问 IDFA。 您需要提示用户是否允许您的应用使用跟踪它们的库,将其添加到 infoPlist 仅允许您在应用程序中使用此 API。

Expo 还没有这个功能,但是你可以使用一些库来提示权限

示例:https://docs.expo.io/versions/v41.0.0/sdk/facebook/#facebookgetpermissionsasync

您可以使用其他库,例如https://github.com/mrousavy/react-native-tracking-transparency

您可以在哪里请求应用跟踪

    import  getTrackingStatus  from 'react-native-tracking-transparency';

    const trackingStatus = await getTrackingStatus();
    if (trackingStatus === 'authorized' || trackingStatus === 'unavailable') 
      // enable tracking features
    


    import  requestTrackingPermission  from 'react-native-tracking-transparency';
    
    const trackingStatus = await requestTrackingPermission();
    if (trackingStatus === 'authorized' || trackingStatus === 'unavailable') 
      // enable tracking features
    

这可能需要在不久的将来进行更新,因为 expo 发布了一个带有解决方案的新 SDK 版本。

编辑

来自 44+ 世博会

Expo 现在有一个 TrackTransparency 库:(https://docs.expo.dev/versions/latest/sdk/tracking-transparency/)

expo install expo-tracking-transparency

对于裸应用:https://github.com/expo/expo/tree/main/packages/expo-tracking-transparency#installation-in-bare-react-native-projects

您可以将其作为插件添加到您的app.json


  "expo": 
    "plugins": [
      [
        "expo-tracking-transparency",
        
          "userTrackingPermission": "This identifier will be used to deliver personalized ads to you."
        
      ]
    ]
  

现在你可以这样使用:

import React,  useEffect  from 'react';
import  Text, StyleSheet, View  from 'react-native';
import  requestTrackingPermissionsAsync  from 'expo-tracking-transparency';

export default function App() 
  useEffect(() => 
    (async () => 
      const  status  = await requestTrackingPermissionsAsync();
      if (status === 'granted') 
        console.log('Yay! I have user permission to track data');
      
    )();
  , []);

  return (
    <View style=styles.container>
      <Text>Tracking Transparency Module Example</Text>
    </View>
  );

【讨论】:

感谢 Lucas,我​​已经尝试过了,遗憾的是它只有在您退出世博会时才有效 嗨 @Nyasha,我有一个托管的 Expo,Facebook 解决方案对我有用。 此消息应该出现在应用程序的开头还是用户首次使用 FB 登录时?使用requestTrackingPermission 请求访问是否涵盖了 facebook 指南并确保即使用户决定不允许跟踪也没有跟踪? @LucasOliveira 这个消息需要提示你的应用是否打开,否则苹果会拒绝你的新二进制文件。我不使用 FB 登录,所以我不知道在用户使用 FB 帐户登录之前是否需要这样做。当用户拒绝跟踪时,您有责任确保您的应用程序没有调用跟踪用户的 FB 库(例如广告)。老实说,如果你使用这个库,你可以安全地使用 Facebook.setAdvertiserTrackingEnabledAsync(enabled: boolean): Promise 例如。【参考方案2】:

你需要先申请 Tracking 权限(我用的是 react-native-permissions):

import  request, RESULTS, PERMISSIONS  from 'react-native-permissions'

export const requestPermissionTransparency = async () => 
  return await request(PERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY)


useEffect(() => 
    ;(async () => 
      const result = await requestPermissionTransparency()
      if (result === RESULTS.GRANTED) 
        //You need to enable analytics (fb,google,etc...)
        await firebase.analytics().setAnalyticsCollectionEnabled(true)
        console.log('Firebase Analytics: ENABLED')
      
    )()
  , [])

记得在根项目中添加这个文件:

// <project-root>/firebase.json

  "react-native": 
    "analytics_auto_collection_enabled": false
  

参考:https://rnfirebase.io/analytics/usage

【讨论】:

【参考方案3】:

我最终从 expo 使用的解决方案是使用 Facebook.getPermissionsAsync()

https://expo.canny.io/feature-requests/p/expo-permissions-add-support-to-apptrackingtransparency-permission-on-ios

【讨论】:

【参考方案4】:

41+ 世博会

跟踪透明度: https://docs.expo.io/versions/latest/sdk/tracking-transparency/

import  requestTrackingPermissionsAsync  from 'expo-tracking-transparency';
const  status  = await requestTrackingPermissionsAsync();
if (status === 'granted') // do something

40 届及以下世博会

Admob:https://docs.expo.io/versions/latest/sdk/admob/

import  requestPermissionsAsync  from 'expo-ads-admob'
const  status  = await requestPermissionsAsync()
if (status === 'granted') // do something

【讨论】:

以上是关于为 iOS 14.5 实施 Apple App Tracking Transparency (ATT) 的 React Native Expo的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14.5 App Tracking Transparency for firebase log in react-native app

iOS 14.5将强制App加入请求追踪用户权限!

iOS 14.5将强制App加入请求追踪用户权限!

iOS 14.5揭示Airtags新功能丨OLED屏iPad最快明年发布!

iOS 14.5揭示Airtags新功能丨OLED屏iPad最快明年发布!

iOS 14.5,支持戴口罩解锁iPhone!