Xamarin.iOS:调用 ATTrackingManager.RequestTrackingAuthorization 时崩溃

Xamarin.iOS: Crash when calling ATTrackingManager.RequestTrackingAuthorization

我正在尝试将请求跟踪授权添加到使用 Xamarin.iOS(本机,而非表单)开发的旧应用程序。

我相信我已正确完成所有操作,但每当应用程序调用 ATTrackingManager.RequestTrackingAuthorization(...) 时,应用程序就会崩溃。崩溃日志显示 libsystem_kernel.dylib:

中的崩溃

从崩溃日志中提取:

Incident Identifier: 232ea144-6daf-49fd-a667-fe2b0b793977
CrashReporter Key:   900B8799-DDED-4E90-826D-58841C364052
Hardware Model:      iPhone10,6
Process:         ***** [397]
Path:            /private/var/containers/Bundle/Application/*****
Identifier:      *******
Version:         4.2.0 (529)
Code Type:       arm64
Parent Process:   [1]

Date/Time:       2021-06-24T09:15:46.999Z
Launch Time:     2021-06-24T09:15:36Z
OS Version:      iPhone OS 14.6 (18F72)
Report Version:  104

Exception Type:  SIGABRT
Exception Codes: #0 at 0x1b37ec154
Crashed Thread:  4

Thread 4 Crashed:
0   libsystem_kernel.dylib               0x00000001b37ec154 0x1b37c6000 + 155988
1   libsystem_kernel.dylib               0x00000001b37f095c 0x1b37c6000 + 174428
2   TCC                                  0x00000001c84b1848 0x1c84af000 + 10312
3   TCC                                  0x00000001c84b21c0 0x1c84af000 + 12736
4   TCC                                  0x00000001c84b626c 0x1c84af000 + 29292
5   libxpc.dylib                         0x00000001cfea54b8 0x1cfe8d000 + 99512
6   libxpc.dylib                         0x00000001cfe99bb0 0x1cfe8d000 + 52144
7   libdispatch.dylib                    0x00000001876f3318 0x187692000 + 398104
8   libdispatch.dylib                    0x00000001876c88c8 0x187692000 + 223432
9   libdispatch.dylib                    0x00000001876d8f74 0x187692000 + 290676
10  libsystem_pthread.dylib              0x00000001cfe795f4 0x1cfe6e000 + 46580
11  libsystem_pthread.dylib              0x00000001cfe7c86c 0x1cfe6e000 + 59500

我已将 NSUSerTrackingUsageDescription 键和字符串添加到 info.plist。 我正在使用 iOS 14.6 调试 iPhoneX Privacy->Tracking->Allow Apps to Request to Track 已打开。 Visual Studio 16.10.2(在 Windows 上) 构建 MAC 有 MacOS 11.4 和 XCode 12.5.1.

我的代码是:

        public static void RequestTracking(UIViewController vc)
        {
            if (GlobalItems.FlagHasRequestedTracking)
            {
                return;
            }

#if DEBUG
            Console.WriteLine("iOS version: {0}", UIDevice.CurrentDevice.SystemVersion);
#endif
            if (!UIDevice.CurrentDevice.CheckSystemVersion(14, 5))
            {
                return;
            }

            try
            {
                //Facebook.CoreKit.Settings.AdvertiserTrackingEnabled = false;
                var status = AppTrackingTransparency.ATTrackingManager.TrackingAuthorizationStatus;
#if DEBUG
                Console.WriteLine("TrackingAuthorizationStatus: ==> {0}", status);
#endif

                if (status == AppTrackingTransparency.ATTrackingManagerAuthorizationStatus.NotDetermined)
                {
                    AppTrackingTransparency.ATTrackingManager.RequestTrackingAuthorization((_status) =>
                    {
#if DEBUG
                        Console.WriteLine("RequestTrackingAuthorization: ==> {0}", _status);
#endif
                        GlobalItems.FlagHasRequestedTracking = true;
                        if (_status == AppTrackingTransparency.ATTrackingManagerAuthorizationStatus.Authorized)
                        {
                            Facebook.CoreKit.Settings.AdvertiserTrackingEnabled = true;
                        }
                    });
                }
                else if (status == AppTrackingTransparency.ATTrackingManagerAuthorizationStatus.Authorized)
                {
                    Facebook.CoreKit.Settings.AdvertiserTrackingEnabled = true;
                }
            }
            catch (Exception e)
            {
#if DEBUG
                Console.WriteLine(e.ToString());
#endif
            }
        }

AppTrackingTransparency.ATTrackingManager.TrackingAuthorizationStatus 始终读取为 NotDetermined。因此它尝试请求跟踪授权。

但是,在发出该调用的那一刻,应用程序崩溃了。它甚至不会触发可以捕获的异常——应用程序会立即崩溃。弹窗不显示,执行不到回调代码

我尝试将此代码块移动到应用程序的各个不同部分。最初我把它放在 AppDelegate.OnActivated() 函数中。但随后将其移至视图控制器的 ViewDidAppear() 函数。然后我还尝试将调用延迟 5 秒 - 并确保调用是从主 (UI) 线程完成的。

我也尝试了调用的异步版本:ATTrackingManager.RequestTrackingAuthorizationAsync 但结果相同:瞬间崩溃。

为了确保这不是实际 iphone 本身的问题,我还 运行 iPhone12 模拟器上的代码 iOS 14.5 - - 在调用 RequestTrackingAuthorization(...) 时再次崩溃。

出了点问题,但我不知道是什么。我搜索过类似的报告,但没有找到任何内容 - 所以我想我做错了什么。

欢迎任何提示!

我不太明白为什么,但问题出在 Info.plist 文件上。虽然它有所需的密钥:

<key>NSUserTrackingUsageDescription</key>
<string>Placeholder text...</string>

...这似乎被忽略了。一旦我编辑了 Visual Studio 中的字符串,它又开始工作了。

请求跟踪授权时神秘崩溃 == Check/update Info.plist 文件中的“NSUserTrackingUsageDescription”字符串。