React Native - 如何在 iOS 上请求应用程序跟踪透明度权限?

She*_*ims 5 react-native ios-permissions react-native-permissions

这里提到的解决方案讨论了如何使用 ATTrackingManager 类进行设置,但是,它没有直接暴露给 React Native。

使用react-native-tracking-transparency包在构建时给我带来了一个问题:

“未定义的符号_RCTRegisterModule”

因为只有在不包含 use_flipper 时它才有效!在你的podfile中......所以我被困住了,不想按照这里的解决方案中的建议进行补丁包(这意味着修复已经被合并,但在用这个构建时我仍然看到“未定义的符号_RCTRegisterModule”......

想知道是否有针对 React Native 的 ATTrackingManager 类的包装器?

She*_*ims 4

在询问了一些之前解决过这个问题的同事并发布了是否有其他人遇到这个问题后找到了解决方案......

在 info.plist 中确保有一个 NSUserTrackingUsageDescription 键。这是请求权限时显示的文本:

<key>NSUserTrackingUsageDescription</key>
    <string>This app uses device identifiers to track marketing attribution and app usage.  Your data is kept confidential and is not shared with any 3rd parties or advertising partners.</string>
Run Code Online (Sandbox Code Playgroud)

将 Tracking pod 添加到您的 podfile 中:

platform :ios, '12.4'
target 'RNPath' do
   config = use_native_modules!
   use_frameworks!
   ...
   # add next line
   pod 'Permission-AppTrackingTransparency', :path => "#{permissions_path}/AppTrackingTransparency"
   ...
   end
end
Run Code Online (Sandbox Code Playgroud)

从项目的 ios 文件夹运行 pod install 和 pod update 以使更改生效

cd ios && pod install && pod update
Run Code Online (Sandbox Code Playgroud)

然后使用react-native-permissions包在应用程序状态变为活动状态时请求跟踪权限

在 App.js 中

.
.
. 
import { PERMISSIONS, RESULTS, request } from 'react-native-permissions';

export default function () {
.
.
.
const handleAppStateChange = async (nextAppState) => {
    if (nextAppState == 'active') {
      request(PERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY)
        .then(async (result) => {
          if (result == RESULTS.GRANTED) {
            console.log('Tracking!');
            // do something related to tracking

          } else {
            console.log('Not Tracking!');
          }
        })
        .catch((error) => {
          console.log('error in request tracking permissions: ', error);
        });
    }
 }

 useEffect(() => {
   let subscription = AppState.addEventListener('change', handleAppStateChange);
   return () => {
      subscription.remove();
   };
 }, []);
.
.
.
return <App/>
Run Code Online (Sandbox Code Playgroud)

这很好,因为每次应用程序在前台运行时都会调用它,并重新检查权限,因此如果他们从手机设置中启用/禁用了它,它会注意到并做出相应的反应。

值得注意的是,如果您不确定应用程序的状态是“活动”,则此请求会失败,如果它是“后台”或“非活动”,它可能会返回不可用,然后可能永远不会呈现给用户并保持在该状态远不理想,因为它永远不会被允许,所以这就是为什么我在最后一个代码段中检查“活动”。