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

问题描述 投票:0回答:2

我正在尝试将请求跟踪授权添加到使用 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 隐私 -> 跟踪 -> 允许应用程序请求跟踪已打开。 Visual Studio 16.10.2(在 Windows 上) Build 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 本身的问题,我还在使用 iOS 14.5 的 iPhone12 模拟器上运行了代码——在调用 RequestTrackingAuthorization(...) 时再次崩溃。

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

欢迎任何提示!

ios xamarin.ios crash
2个回答
1
投票

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

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

...似乎这被忽略了。当我在 Visual Studio 中编辑了字符串后,一切又开始工作了。

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


0
投票

我也有同样的问题。调用 RequestTrackingAuthorization 有一些延迟。

Task.Delay(1000*10).ContinueWith(t => TrackingPermission());

--

private void TrackingPermission()
    {
        if (UIDevice.CurrentDevice.CheckSystemVersion(14, 0))
        {
            ATTrackingManager.RequestTrackingAuthorization((status) =>
            {
                switch (status)
                {
                    case ATTrackingManagerAuthorizationStatus.Authorized:
                        // User granted permission, you can initialize the Facebook Audience Network SDK or other tracking-related activities here.
                        AudienceNetworkAds.Initialize(null, null);
                        AdSettings.SetAdvertiserTrackingEnabled(true);
                        break;
                    case ATTrackingManagerAuthorizationStatus.NotDetermined:
                        // Consent not yet determined. You can show a consent dialog to explain why tracking is needed and ask for consent.                            
                        break;
                    case ATTrackingManagerAuthorizationStatus.Denied:
                        // User denied permission. Handle accordingly.
                        break;
                    case ATTrackingManagerAuthorizationStatus.Restricted:
                        // Tracking is restricted on this device. Handle accordingly.
                        break;
                }
            });
        }
        else
        {
            // Handle earlier iOS versions
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.