iOS 的 Xamarin facebook sdk 导致应用程序崩溃
Xamarin facebook sdk for iOS causing app crash
我在具有共享代码和表单 UI 以及 Azure 移动应用程序后端的 xamarin 项目中将 xamarin facebook sdk 用于 iOS。我正在尝试使用此 sdk 进行客户端流登录,但我无法做到。该应用程序一启动就在设备上崩溃。但是,当在 android 端使用类似的方法时(对 android 使用 xamarin facebook sdk),一切都很好。我的代码基于 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.5 和 iOS 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
我找到了解决这个问题的方法。问题出在 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,因为它仍然有较旧的代码。希望它能帮助遇到类似问题的人。
我在具有共享代码和表单 UI 以及 Azure 移动应用程序后端的 xamarin 项目中将 xamarin facebook sdk 用于 iOS。我正在尝试使用此 sdk 进行客户端流登录,但我无法做到。该应用程序一启动就在设备上崩溃。但是,当在 android 端使用类似的方法时(对 android 使用 xamarin facebook sdk),一切都很好。我的代码基于 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.5 和 iOS 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
我找到了解决这个问题的方法。问题出在 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,因为它仍然有较旧的代码。希望它能帮助遇到类似问题的人。