适用于 iOS 的 Xamarin facebook sdk 导致应用程序崩溃

Posted

技术标签:

【中文标题】适用于 iOS 的 Xamarin facebook sdk 导致应用程序崩溃【英文标题】:Xamarin facebook sdk for iOS causing app crash 【发布时间】:2017-11-02 20:36:41 【问题描述】:

我在一个 xamarin 项目中使用适用于 ios 的 xamarin facebook sdk,其中包含共享代码和表单 UI 以及 Azure 移动应用后端。我正在尝试使用此 sdk 进行客户端流程登录,但无法做到。该应用程序在启动后立即在设备上崩溃。但是,当在 android 端使用类似的方法(使用 xamarin facebook sdk for android)时,一切都很好。我的代码基于 Adrian Hall 在他的 book 中提出的建议。它在模拟器中运行良好,并打开 Web 视图进行登录,但在设备上失败。以下是iOS项目中的代码:

public class iOSLoginProvider : ILoginProvider

    public async Task LoginAsync(MobileServiceClient client)
    
        var accessToken = await LoginFacebookAsync();
        var zumoPayload = new JObject()
        
            ["access_token"] = accessToken
        ;
        await client.LoginAsync("facebook", zumoPayload);
    

    public UIViewController RootView => UIApplication.SharedApplication.KeyWindow.RootViewController;

    private TaskCompletionSource<string> fbtcs;

    public async Task<string> LoginFacebookAsync()
    
        fbtcs = new TaskCompletionSource<string>();
        var loginManager = new LoginManager();

        loginManager.LogInWithReadPermissions(new[]  "public_profile" , RootView, LoginTokenHandler);
        return await fbtcs.Task;
    
    private void LoginTokenHandler(LoginManagerLoginResult loginResult, NSError error)
    
        if (loginResult.Token != null)
        
            fbtcs.TrySetResult(loginResult.Token.TokenString);
        
        else
        
            fbtcs.TrySetException(new Exception("Facebook Client Flow Login Failed"));
        
    

我在 info.plist 中添加了要求权限,并将 Facebook 应用程序列入白名单。当我注释掉LoginFacebookAsync()LoginTokenHandler() 时,应用程序运行良好。它完美启动,虽然没有登录,因为代码不完整,但它确实启动了。但是,一旦这些方法在代码中,应用程序就无法启动。我也尝试在两台设备(iOS 9.3.5iOS 10.3.3)和模拟器上编译。

更新 以下是来自设备日志的崩溃报告:

Incident Identifier: 8AEC3E39-8670-4C6B-A87E-9B2C014B1A6E
CrashReporter Key:   ce11b8d9b291dbec2269487cc1ef04b41d8b4d35
Hardware Model:      iPhone6,1
Process:             fbloginios.iOS [646]
Path:                /private/var/containers/Bundle/Application/CFE5351F-4DE4-4822-9B42-8C9CE909D905/fbloginios.iOS.app/fbloginios.iOS
Identifier:          com.yourcompany.fbloginios
Version:             1.0 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           com.yourcompany.fbloginios [543]


Date/Time:           2017-11-03 08:58:39.0078 -0400
Launch Time:         2017-11-03 08:58:38.5767 -0400
OS Version:          iPhone OS 10.3.3 (14G60)
Report Version:      104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Application Specific Information:
abort() called

Filtered syslog:
None found

Last Exception Backtrace:
0   CoreFoundation                  0x18a332fe0 __exceptionPreprocess + 124
1   libobjc.A.dylib                 0x188d94538 objc_exception_throw + 56
2   fbloginios.iOS                  0x101596494 0x1000c8000 + 21816468
3   fbloginios.iOS                  0x1015cfbd8 0x1000c8000 + 22051800
4   libobjc.A.dylib                 0x188d95418 CALLING_SOME_+initialize_METHOD + 24
5   libobjc.A.dylib                 0x188d95684 _class_initialize + 612
6   libobjc.A.dylib                 0x188d9d4b4 lookUpImpOrForward + 228
7   libobjc.A.dylib                 0x188da8478 _objc_msgSend_uncached + 56
8   fbloginios.iOS                  0x1000ef02c 0x1000c8000 + 159788
9   fbloginios.iOS                  0x1000effd0 0x1000c8000 + 163792
10  fbloginios.iOS                  0x1017281a8 0x1000c8000 + 23462312
11  fbloginios.iOS                  0x1000f00d4 0x1000c8000 + 164052
12  libdyld.dylib                   0x18921d59c start + 4

【问题讨论】:

什么是异常/堆栈跟踪(本机和/或托管)? VS中的输出日志没有启动。它只说了两件事: *在“iPhone”上启动“fbloginios.iOS”... *该应用程序已终止。我已经用 mac 上的设备登录更新了这个问题。谢谢。 设备控制台:developer.xamarin.com/guides/ios/… 我已经用崩溃报告更新了这个问题。 您需要用符号表示该崩溃(但 看起来 像 nil/null 异常) 【参考方案1】:

我已找到解决此问题的方法。问题在于 info.plist。使用 sdk 4.6.0 及以上版本 info.plist LSApplicationQueriesSchemes 标签中的要求仅为:

<key>LSApplicationQueriesSchemes</key>
<array>
        <string>fbapi</string>
        <string>fb-messenger-api</string>
        <string>fbauth2</string>
        <string>fbshareextension</string>
</array>

我根据旧版本的 sdk 添加了要求,这导致了问题。我正在关注xamarin's official recipe,它仍然有旧代码。希望它可以帮助遇到类似问题的人。

【讨论】:

以上是关于适用于 iOS 的 Xamarin facebook sdk 导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms - 适用于 iOS 和 Android 的推送通知

适用于 iOS 的 Xamarin facebook sdk 导致应用程序崩溃

适用于 iOS 的 Xamarin Firebase 云消息传递(appDelegate)RemoteMessageDelegate 错误

如何使用适用于 Android 和 iOS 的 Xamarin 表单在特定频道上的 youtube 上上传视频?

Xamarin Http 请求仅适用于 iOS 模拟器

Xamarin - 是不是有与适用于 Android 的 Photokit (iOS) 类似的框架,或者是获取图库中所有图像的文件流的好方法?