Xamarin Forms App在iOS上的发布模式下崩溃,但在调试模式下工作 [英] Xamarin Forms App crashing in release mode on iOS but works in debug mode

查看:158
本文介绍了Xamarin Forms App在iOS上的发布模式下崩溃,但在调试模式下工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有支持iOS和Android的Xamarin Forms应用程序.在发布模式下,它可以在Android上正常运行.在iOS上,它无法在发布模式下运行,但可以在调试模式下运行.单击一个调用很少功能的按钮时,它会崩溃.我在下面附加了错误日志.奇怪的是,它可以在发布模式下的Simulator上运行.

I have Xamarin Forms app supporting iOS and Android. It works correctly on Android in release mode. On iOS, it doesn't work in release mode but works in Debug mode. It's crashing when clicked on a button which calls few functions. I have attached error log below. The strange thing is, it works on Simulator in release mode.

错误日志:

Incident Identifier: 391C564C-028D-4084-BC4A-21ED49BB1F25
CrashReporter Key:   30B4418D-AA04-4575-97A3-97A9F491C62D
Hardware Model:      iPhone7,2
Process:         TestApp.iOS [600]
Path:            /var/containers/Bundle/Application/7F4E5392-9BEA-4578-9E23-02112B61EB96/TestApp.iOS.app/TestApp.iOS
Identifier:      uk.co.company.testapp
Version:         0.0.1 (1.0)
Code Type:       ARM-64
Parent Process:  ??? [1]

Date/Time:       2018-01-22T13:02:31Z
Launch Time:     2018-01-22T13:02:23Z
OS Version:      iPhone OS 9.3.2 (13F69)
Report Version:  104-Xamarin

Exception Type:  SIGABRT
Exception Codes: #0 at 0x180da811c
Crashed Thread:  0

Application Specific Information:
*** Terminating app due to uncaught exception 'System.ArgumentNullException', reason: 'System.ArgumentNullException: Value cannot be null.'

Xamarin Exception Stack:
Parameter name: method
  at System.Linq.Expressions.Expression.Call (System.Linq.Expressions.Expression instance, System.Reflection.MethodInfo method, System.Collections.Generic.IEnumerable`1[T] arguments) [0x00111] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/MethodCallExpression.cs:1239 
  at System.Linq.Expressions.Expression.Call (System.Linq.Expressions.Expression instance, System.Reflection.MethodInfo method, System.Linq.Expressions.Expression[] arguments) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/MethodCallExpression.cs:1046 
  at System.Linq.Expressions.Expression.Call (System.Reflection.MethodInfo method, System.Linq.Expressions.Expression[] arguments) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/MethodCallExpression.cs:1001 
  at System.Dynamic.ExpandoObject+MetaExpando.BindSetMember (System.Dynamic.SetMemberBinder binder, System.Dynamic.DynamicMetaObject value) [0x00033] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Dynamic/ExpandoObject.cs:863 
  at System.Dynamic.SetMemberBinder.Bind (System.Dynamic.DynamicMetaObject target, System.Dynamic.DynamicMetaObject[] args) [0x00035] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Dynamic/SetMemberBinder.cs:57 
  at System.Dynamic.DynamicMetaObjectBinder.Bind (System.Object[] args, System.Collections.ObjectModel.ReadOnlyCollection`1[T] parameters, System.Linq.Expressions.LabelTarget returnLabel) [0x000c6] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Dynamic/DynamicMetaObjectBinder.cs:90 
  at System.Runtime.CompilerServices.CallSiteBinder.BindCore[T] (System.Runtime.CompilerServices.CallSite`1[T] site, System.Object[] args) [0x00019] in <8bc31b0df50a4d32b3f1d5af764165ad>:0 
  at System.Runtime.CompilerServices.CallSiteOps.Bind[T] (System.Runtime.CompilerServices.CallSiteBinder binder, System.Runtime.CompilerServices.CallSite`1[T] site, System.Object[] args) [0x00000] in <8bc31b0df50a4d32b3f1d5af764165ad>:0 
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00032] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:305 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:152 
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Exception source) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:156 
  at System.Linq.Expressions.Interpreter.ExceptionHelpers.UnwrapAndRethrow (System.Reflection.TargetInvocationException exception) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/Utilities.cs:172 
  at System.Linq.Expressions.Interpreter.MethodInfoCallInstruction.Run (System.Linq.Expressions.Interpreter.InterpretedFrame frame) [0x00035] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/CallInstruction.cs:327 
  at System.Linq.Expressions.Interpreter.Interpreter.Run (System.Linq.Expressions.Interpreter.InterpretedFrame frame) [0x00015] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Interpreter/Interpreter.cs:63 
  at System.Linq.Expressions.Interpreter.LightLambda.Run3[T0,T1,T2,TRet] (T0 arg0, T1 arg1, T2 arg2) [0x00038] in <8bc31b0df50a4d32b3f1d5af764165ad>:0 
  at TestApp.LoginPage+<onLoginClicked>d__1.MoveNext () [0x00205] in <42b3f78eef3b4fad8ca201e1a739e68b>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:152 
  at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018 
  at UIKit.UIKitSynchronizationContext+<Post>c__AnonStorey0.<>m__0 () [0x00000] in /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit/UIKitSynchronizationContext.cs:24 
  at Foundation.NSAsyncActionDispatcher.Apply () [0x00000] in /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/Foundation/NSAction.cs:163 
  at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit/UIApplication.cs:79 
  at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit/UIApplication.cs:63 
  at TestApp.iOS.Application.Main (System.String[] args) [0x00000] in <52e34ea9026340479b8dc6a53c640f1e>:0

我有一个有趣的发现.我在触摸按钮时调用onLoginClicked函数,然后调用PostData函数,该函数进行REST调用以将数据发送到服务器.每当调用PostData函数时,应用程序就会崩溃.

I have an interesting finding. I'm calling onLoginClicked function on the touch of a button, which then calls PostData function which makes a REST Call to send data to the server. Whenever the PostData function is called, app crashes.

如果我将所有代码从PostData函数移到onLoginClicked函数,那么它将起作用!

If I move all the code from PostData function to onLoginClicked function, it works!

请在下面找到其他信息:

Please find additional information below:

  • 我尝试清洁和重建解决方案,但是没有用.
  • 在PostData方法的每一行上放置断点是没有意义的,因为该应用仅在发布模式下崩溃,而在调试模式下工作.
  • 应用在onLoginClicked方法中崩溃,该行在其中调用PostData函数的那一行.

  • I tried cleaning and rebuilding the solution but, it didn't work.
  • There is no point in putting break points on each line in the PostData method as the app is crashing only in release mode, but works in debug mode.
  • The app crashes in onLoginClicked method at a line where PostData function is called i.e.

string responseData =等待PostData(user,"auth/login");

string responseData = await PostData(user, "auth/login");

当我尝试在PostData函数中放置一些警报以查看哪些内容时 指出它到达了,但是发现它甚至没有击中第一 该方法中的行.这很奇怪.

When I tried putting some alerts in PostData function to see what point it reaches but found that it doesn't even hit the very first line in that method. This is very strange.

代码:

async void onLoginClicked(object sender, System.EventArgs e)
{
    string error = "";

    if (txtEmail.Text == null || txtEmail.Text == "")
    {
        error += Constants.ERR_BLANK_EMAIL + "\r\n";
    }
    else if (txtEmail.Text.Length < 6)
    {
        error += Constants.ERR_EMAIL_LENGTH + "\r\n";
    }
    else if (!Common.isEmailValid(txtEmail.Text))
    {
        error += Constants.ERR_EMAIL_VALIDATION + "\r\n";
    }

    if (txtPassword.Text == null || txtPassword.Text == "")
    {
        error += Constants.ERR_BLANK_PASSWORD;
    }

    if (error != "")
    {
        lblError.Text = error;
        errorContainer.IsVisible = true;
        return;
    }
    else
    {
        errorContainer.IsVisible = false;
    }

    if (CrossConnectivity.Current.IsConnected)
    {
        var loadingPage = new LoadingPage();
        await Navigation.PushPopupAsync(loadingPage);

        var device_token = App.channelId;

        dynamic user = new System.Dynamic.ExpandoObject();

        user.email = txtEmail.Text;
        user.user_type = "b2b";
        user.device_token = device_token;
        user.password = txtPassword.Text;

        if (Device.RuntimePlatform == Device.iOS)
        {
            user.device_type = "ios";
        }else{
            user.device_type = "android";
        }

        string responseData = await PostData(user, "auth/login");
        dynamic responseObj = JObject.Parse(responseData);

        if (responseObj["error_code"].Value == 0)
        {
            var data = responseObj["data"];
            Constants.user = Common.GetUserObject(data.ToString());
            Helpers.Settings.Password = "" + txtPassword.Text;
            Helpers.Settings.UserId = "" + Constants.user.userId;
            Helpers.Settings.accessToken = ""+data.access_token; 
            Helpers.Settings.Email = "" + txtEmail.Text;
            var outletResp = responseObj["outlet_details"];
            var outlet_count = outletResp.Count;

            if(outlet_count>0)
            {
                Constants.outlets = new List<Outlet>();
                foreach(var store in outletResp){
                    Outlet shop = new Outlet();
                    shop.access_token = store["access_token"];
                    shop.email = store["email"];
                    shop.user_id = store["id"];
                    shop.master_id = store["master_id"];
                    shop.outlet_id = store["outlet_id"];
                    shop.post_code = store["post_code"];
                    shop.profile_pic = store["profile_pic"];
                    shop.retailer_id = store["retailer_id"];
                    shop.retailer_image = store["retailer_image"];
                    shop.store_name = store["store_name"];
                    shop.tutorial_pricing_tool = int.Parse(""+store["tutorial_pricing_tool"]);

                    Constants.outlets.Add(shop);
                }
            }

            var isPinSet = Helpers.Settings.PinSet;

            await Navigation.RemovePopupPageAsync(loadingPage);

            if (responseObj.data.pin==0 || !isPinSet){
                App.Current.MainPage = new NavigationPage(new SetPinPage(false));
            }
            else{
               App.Current.MainPage = new NavigationPage(new StoreListPage()); 
            }
        }
        else
        {
            await Navigation.RemovePopupPageAsync(loadingPage);

            if (responseObj["error_code"].Value == 1)
                lblError.Text = responseObj["error"];
            else
                lblError.Text = responseObj["message"];

            errorContainer.IsVisible = true;
        }
    }
    else
    {
        await DisplayAlert(Constants.APP_TITLE, "Please check your internet connection.", "OK");
    }
}

async public Task<string> PostData(System.Dynamic.ExpandoObject args, string actionUrl)
{
    string responseData = "";

    HttpClient client = new HttpClient();
    client.MaxResponseContentBufferSize = 256000;

    var param = Constants.JWT ? GetJWTToken(args, actionUrl) : JsonConvert.SerializeObject(args);
    var content = new StringContent(param, Encoding.UTF8, "application/json");
    client.DefaultRequestHeaders.Add("Authorization", param);

    client.DefaultRequestHeaders.Add("X-Device-Type", "android");
    client.DefaultRequestHeaders.Add("X-APP-Type", "b2b");
    client.DefaultRequestHeaders.Add("X-APP-Platform", "xamarin");

    HttpResponseMessage response = null;
    response = await client.PostAsync(Constants.BaseUrl + actionUrl, content);

    if (response.IsSuccessStatusCode)
    {
        response.EnsureSuccessStatusCode();
    }

    responseData = await response.Content.ReadAsStringAsync();

    if (Constants.JWT)
    {
        var resp = JObject.Parse(responseData);
        var respToken = resp["token"];
        var rtokenStr = respToken.ToObject<String>();
        var respPayloadStr = rtokenStr.Split('.');
        byte[] data = JWTLibrary.Converter.Base64UrlDecode(respPayloadStr[1]);
        responseData = JWTLibrary.Converter.GetStringFromBytes(data);
    }

    return responseData;
}

private string GetJWTToken(System.Dynamic.ExpandoObject args, string actionUrl)
{
    var dt = DateTime.Now;
    var ticks = dt.Ticks;
    var currentSec = ticks / TimeSpan.TicksPerSecond;
    var newEndTime = currentSec + 60;

    Object payload = new Dictionary<string, object>()
    {
        { "iat", currentSec },
        { "nbf", currentSec },
        { "exp", newEndTime },
        { "iss", actionUrl },
        { "jti", "" },
        { "bat_data", args }
    };

    var secret_key = "key";

    dynamic n_header = new System.Dynamic.ExpandoObject();
    n_header.typ = "jwt";
    n_header.alg = "HS256";

    byte[] headerBytes = JWTLibrary.Converter.GetBytesFromString(JsonConvert.SerializeObject(n_header));
    byte[] payloadBytes = JWTLibrary.Converter.GetBytesFromString(JsonConvert.SerializeObject(payload));

    var enc_header = JWTLibrary.Converter.Base64UrlEncode(headerBytes);
    var enc_payload = JWTLibrary.Converter.Base64UrlEncode(payloadBytes);

    string jwt_token = enc_header + "." + enc_payload;

    var sh_h256 = JWTLibrary.Converter.CreateToken(jwt_token, secret_key);
    var jwt_enc_signature = JWTLibrary.Converter.Base64UrlEncode(sh_h256);

    jwt_token = jwt_token + "." + jwt_enc_signature;

    return jwt_token;
}

推荐答案

我担心问题是由dynamic关键字引起的.

I'm afraid the problem was caused by dynamic keyword.

DynamicMethod类是System.Reflection.Emit驻留的一组运行时代码生成功能的一部分.但是,System.Reflection.Emit API在iOS中不可用.

The DynamicMethod class is a part of the set of runtime code generation features that reside with System.Reflection.Emit. However,System.Reflection.Emit API is not available in iOS.

详细信息请参见为什么我不能使用Xamarin.iOS中的动态" C#关键字?

这篇关于Xamarin Forms App在iOS上的发布模式下崩溃,但在调试模式下工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆