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”字符串。
我正在尝试将请求跟踪授权添加到使用 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”字符串。