启动 CMMotionActivityManager 给 SIGABRT

Posted

技术标签:

【中文标题】启动 CMMotionActivityManager 给 SIGABRT【英文标题】:Starting CMMotionActivityManager gives SIGABRT 【发布时间】:2017-07-01 03:50:49 【问题描述】:

我正在尝试检测在 iPhone 6s 上运行的本机 Xamarin.ios 应用程序中的运动活动。我是这样启动管理器的:

var _manager = new CMMotionActivityManager();
_manager.StartActivityUpdates(new NSOperationQueue(), (activity) =>

    // do something with activity 
);

当我运行该应用程序时,它因以下错误而失败:

2017-07-01 11:38:51.722 iosapp[1095:318780] 严重:本机 堆栈跟踪:

2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:0 libmonosgen-2.0.dylib 0x00000001007d5920 mono_handle_native_crash + 260 2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:1 libsystem_platform.dylib 0x000000018ca1131c _sigtramp + 52 2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:2 libsystem_kernel.dylib 0x000000018c9484d0 + 100 2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:3 libsystem_kernel.dylib 0x000000018c9484fc system_set_sfi_window + 0 2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:4 TCC 0x000000018fb64498 + 0 2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:5 TCC 0x000000018fb643b8 + 0 2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:6 TCC 0x000000018fb673d4 + 340 2017-07-01 11:38:51.813 iosapp[1095:318780] 严重:7 libxpc.dylib 0x000000018ca46f38 + 80 2017-07-01 11:38:51.814 iosapp[1095:318780] 严重:8 libxpc.dylib 0x000000018ca46ea8 + 40 2017-07-01 11:38:51.814 iosapp[1095:318780] 严重:9 libdispatch.dylib 0x000000018c80a9a0 + 16 2017-07-01 11:38:51.814 iosapp[1095:318780] 严重:10 libdispatch.dylib 0x000000018c8190d4 + 644 2017-07-01 11:38:51.814 iosapp[1095:318780] 严重:11 libdispatch.dylib 0x000000018c81aa50 + 540 2017-07-01 11:38:51.814 iosapp[1095:318780] 严重:12 libdispatch.dylib 0x000000018c81a7d0 + 124 2017-07-01 11:38:51.814 iosapp[1095:318780] 严重:13 libsystem_pthread.dylib 0x000000018ca13100 _pthread_wqthread + 1096 2017-07-01 11:38:51.814 iosapp[1095:318780] 严重:14 libsystem_pthread.dylib 0x000000018ca12cac start_wqthread + 4 2017-07-01 11:38:51.814 iosapp[1095:318780] 关键: ==================================================== =============== 执行本机代码时收到 SIGABRT。这通常表示致命 单声道运行时或您使用的本机库之一中的错误

应用程序。

我实例化管理器的方式有问题吗?

【问题讨论】:

【参考方案1】:

可能需要更多代码,但请尝试使用主 NSOperationQueue

public void StartMotionUpdates (Action<ActivityType> handler)
        
            motionActivityMgr.StartActivityUpdates (NSOperationQueue.MainQueue, ((activity) => 
                handler (ActivityDataManager.ActivityToType (activity));
            ));
        

注意*我在构造函数中初始化 motionActivityMgr = new CMMotionActivityManager (); 我要离开样本: https://github.com/xamarin/ios-samples/blob/master/ios8/MotionActivityDemo/MotionActivityDemo/ActivityDataManager.cs

【讨论】:

想通了。看我的回答。谢谢【参考方案2】:

解决了。这是 info.plist 的权限问题。

来自iOS Core Motion docs:

重要事项 在 iOS 10.0 或之后链接的 iOS 应用程序必须包含使用情况 它的 Info.plist 文件中的描述键,用于它的数据类型 需要。未能包含这些键将导致应用程序崩溃。到 具体访问运动和健身数据,它必须包括 NSMotionUsageDescription。

在我将这个键包含在 info.plist 中之后:

<key>NSMotionUsageDescription</key>
<string>MotionActivity App needs Motion Access</string>

它就像一个魅力。

【讨论】:

以上是关于启动 CMMotionActivityManager 给 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

android 性能优化 -- 启动过程 冷启动 热启动

windows的服务启动类型的延迟启动要系统开机后多少秒才自动启动?

uefi启动中删除多余的启动项

windowsxp软件添加启动项怎么延迟启动?

win11增加开机启动项不启动?

Linux如何启动流程?Linux启动流程详解