使用 Azure 中的集线器注册推送通知时,Xamarin.iOS 本机崩溃错误 SIGSEGV

Posted

技术标签:

【中文标题】使用 Azure 中的集线器注册推送通知时,Xamarin.iOS 本机崩溃错误 SIGSEGV【英文标题】:Xamarin.iOS Native Crash Error SIGSEGV when registering for push notifications with hub in Azure 【发布时间】:2019-09-29 19:08:15 【问题描述】:

我在我的 Xamarin 应用程序项目的 ios 项目中使用此方法向 Azure 中的通知中心注册以进行开发(中心和应用程序已配置为使用证书和在苹果开发人员门户上提供的开发,权利中的关键字。 plist 设置为 dev,hub 上传了 p12 dev 证书)。

这种方法(以及应用程序)在我的 iPhone 5S 的开发模式下运行良好。

但在我的 iPhone 8 Plus 上出现此错误:

=================================================================
    Native Crash Reporting
=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

=================================================================
    Native stacktrace:
=================================================================
    0x103ef09c8 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x103ee67b0 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x103ef4ff0 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : mono_pmip
    0x195cdf894 - /usr/lib/system/libsystem_platform.dylib : <redacted>
    0x10214029c - /private/var/containers/Bundle/Applica
    tion/10179C87-9D6C-4E2B-90AD-57BF86C9C934/ShakeAlarmRR1.iOS.app/ShakeAlarmRR1.iOS : (null)
    0x1021403fc - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x102147ff8 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x102147b38 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x102146364 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x102145768 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x102144620 - /private/var/containers/Bundle/Application/10179C87-9D6C-4E2B-90AD- 
    57BF86C9C934/myapp.iOS.app/myapp.iOS : (null)
    0x1963b90b0 - /System/Library/Frameworks/Foundation.framework/Foundation : <redacted>
    0x195ced1ec - /usr/lib/system/libsystem_pthread.dylib : _pthread_start
    0x195cf0aec - /usr/lib/system/libsystem_pthread.dylib : thread_start

=================================================================
    Basic Fault Address Reporting
=================================================================
Memory around native instruction pointer (0x195cdef44):0x195cdef34  c0 03 5f d6 1f 20 03 d5 1f 20 03 
d5 01 ec 7c 92  .._.. ... ....|.
0x195cdef44  20 00 c0 3d c3 f9 ff 10 62 04 c1 3c 02 0c 40 92   ..
=....b..<..@.
0x195cdef54  63 00 02 cb 61 00 c0 3d 00 1c a1 4e 05 00 00 14  c...a..=...N....
0x195cdef64  1f 20 03 d5 1f 20 03 d5 1f 20 03 d5 20 0c c1 3c  . ... ... .. ..<

在 AppDelegate.cs 中:

public override void RegisteredForRemoteNotifications(
            UIApplication application, NSData deviceToken)
        
            AzureNotifHub = new SBNotificationHub(AppConstants.AZURE_DEVNOTIFHUB3_LISTENSHARED, 
  AppConstants.DEV_NOTIFHUB3);

            // update registration with Azure Notification Hub
            AzureNotifHub.UnregisterAllAsync(deviceToken, (error) =>
            
                if (error != null)
                
                    Debug.WriteLine($"Unable to call unregister error");
                    return;
                

                var tags = new NSSet(AppConstants.IOSSUBSCRIPTIONTAGS.ToArray());
                AzureNotifHub.RegisterNativeAsync(deviceToken, tags, (errorCallback) =>
                
                    if (errorCallback != null)
                    
                        Debug.WriteLine($"RegisterNativeAsync error: errorCallback");
                    
                );

                var templateExpiration = 
 DateTime.Now.AddDays(120).ToString(System.Globalization.CultureInfo.CreateSpecificCulture("en- 
 US"));
                AzureNotifHub.RegisterTemplateAsync(deviceToken, "defaultTemplate", 
 AppConstants.IOS_APNS_TEMPLATE_BODY, templateExpiration, tags, (errorCallback) =>
                
                    if (errorCallback != null)
                    
                        if (errorCallback != null)
                        
                            Debug.WriteLine($"RegisterTemplateAsync error: errorCallback");
                        
                    
                );
            );

我现在在开发模式下使用 iPhone 8 Plus。该设备已从应用商店下载了该应用,因此之前已在生产模式下向通知中心注册,不知道这是否与它有关。

我也在使用 BETA ios 13 操作系统。

什么可能导致此错误以及如何解决?

【问题讨论】:

不是只能在 iOS 13 中使用吗? @JackHua-MSFT iPhone 8 Plus 是我拥有的唯一支持 iOS 13 的测试设备,这是您提出的一个好观点。我只在我的 iPhone 5S 测试设备上测试了 12.4.1,它可以工作。 【参考方案1】:

问题似乎是因为this

NSData.description 在链接到 iOS13/Catalina 时发生了变化,所以如果你依赖它来生成推送令牌的字符串版本,你会遇到一些问题

You need to 拥有最新版本的 NotificationHub 包。如果在 iOS 包的 Xamarin 版本中没有解决这个问题,你将不得不在他们的 Github 上创建一个问题

【讨论】:

以上是关于使用 Azure 中的集线器注册推送通知时,Xamarin.iOS 本机崩溃错误 SIGSEGV的主要内容,如果未能解决你的问题,请参考以下文章

Azure iOS 推送通知在生产模式下未收到?

Azure 通知中心和 Apple APNS 推送通知取消注册设备

如何在没有 azure 的情况下为 UWP 注册推送通知?

如何在 iOS 的 Azure 移动应用通知中心注册目标推送通知

Azure 通知中心 [关闭]

Azure 推送通知是不是支持用户 ID 或别名?