异常`[[NSURL isAdtechEvent]:删除HockeySDK时,无法识别的选择器发送到实例`

时间:2018-09-12 11:32:23

标签: ios xamarin hockeyapp

我想用App Center SDK替换HockeyApp SDK。但是,当我删除以下代码行var manager = BITHockeyManager.SharedHockeyManager;时,启动时会发生以下未处理的异常:[NSURL isAdtechEvent]: unrecognized selector sent to instance。我不知道Adtech与HockeySDK有什么关系。而且我的代码中没有方法或事件isAdtechEvent或类似的东西。我该怎么办才能缩小此错误?

在这里您将找到AppDelegate类:

using System;
using System.Threading;

using MvvmCross.Platform;
using MvvmCross.iOS.Platform;
using MvvmCross.iOS.Views.Presenters;
using MvvmCross.Core.ViewModels;


using Foundation;

using GoogleConversionTracking.Unified;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
using Microsoft.AppCenter.Crashes;
using MTiRate;
using PCLStorage;
using PushNotification.Plugin;

using UIKit;

namespace MyApp
{
    public static class ShortcutIdentifier
    {
        public const string Parkspace = "parkingspace";
    }

    // The UIApplicationDelegate for the application. This class is responsible for launching the 
    // User Interface of the application, as well as listening (and optionally responding) to 
    // application events from iOS.
    [Register("AppDelegate")]
    public class AppDelegate : MvxApplicationDelegate
    {
        private const string ConversionId = "1054453082";
        private const string ConversionLabel = "VaLvCNaO018Q2trm9gM";
        private const string ConversionValue = "0.00";

        private static readonly ILogger Log = LogManager.GetCurrentClassLogger();

        private static Action _afterPushRegistrationAction;

        private UIWindow _window;

        // Must override the Window property for iRate to work properly
        public override UIWindow Window
        {
            get => _window;
            set => _window = value;
        }

        static AppDelegate()
        {
            // rating window configuration
            iRate.SharedInstance.DaysUntilPrompt = 0.5f; // default is 10!
            iRate.SharedInstance.UsesUntilPrompt = 10;
            iRate.SharedInstance.RemindPeriod = 30; // 30 days
            iRate.SharedInstance.PromptForNewVersionIfUserRated = false;
            iRate.SharedInstance.PromptAtLaunch = false; // trigger prompt manually for it doesn't show on splash screen
            // texts
            iRate.SharedInstance.MessageTitle = $"{AppResources.RatingMessageTitle} {iRate.SharedInstance.ApplicationName}";
            iRate.SharedInstance.Message = AppResources.RatingMessage;
            iRate.SharedInstance.RateButtonLabel = AppResources.RatingRateButton;
            iRate.SharedInstance.RemindButtonLabel = AppResources.RatingRemindButton;
            iRate.SharedInstance.CancelButtonLabel = AppResources.RatingCancelButton;
        }

        public UIApplicationShortcutItem LaunchedShortcutItem { get; set; }

        private UIButton _btn;

        public static MvxIosViewPresenter IosViewPresenter { get; set; }

        public override bool FinishedLaunching(UIApplication app, NSDictionary launchOptions)
        {
            var shouldPerformAdditionalDelegateHandling = true;

            // Get possible shortcut item
            if (launchOptions != null)
            {
                LaunchedShortcutItem = launchOptions[UIApplication.LaunchOptionsShortcutItemKey] as UIApplicationShortcutItem;
                shouldPerformAdditionalDelegateHandling = (LaunchedShortcutItem == null);
            }

            AppCenter.Start(Settings.Default.AppCenterSecretiOS, typeof(Analytics), typeof(Crashes));

            _window = new UIWindow(UIScreen.MainScreen.Bounds);

            if (_btn == null)
            {
                var viewController = new UIViewController();
                _window.RootViewController = viewController;
                var super = viewController.View;
                _btn = new UIButton(UIButtonType.Custom)
                {
                    AccessibilityIdentifier = "StartTrigger",
                    BackgroundColor = UIColor.Red,
                    TranslatesAutoresizingMaskIntoConstraints = false
                };
                _btn.SetTitle("StartTrigger", UIControlState.Normal);
                super.AddSubview(_btn);
                super.AddConstraint(NSLayoutConstraint.Create(_btn, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal,
                                                              super, NSLayoutAttribute.CenterX, 1.0f, 1.0f));
                super.AddConstraint(NSLayoutConstraint.Create(_btn, NSLayoutAttribute.CenterY, NSLayoutRelation.Equal,
                                                                            super, NSLayoutAttribute.CenterY, 1.0f, 1.0f));
                _btn.TouchDown += (object sender, EventArgs e) =>
                {
                    StartMvvmCross();
                    _btn.RemoveFromSuperview();
                    _btn = null;
                };
                super.BringSubviewToFront(_btn);
            }
            StartMvvmCross();

            _window.MakeKeyAndVisible();
            _window.BackgroundColor = UIColor.White;

            return shouldPerformAdditionalDelegateHandling;
        }

        private void StartMvvmCross()
        {
            CrossPushNotification.Initialize<AppleCrossPushNotificationListenerService>();

            //Initialize Google Conversion Tracking with respective parameters
            ACTReporter reporter = new ACTConversionReporter(ConversionId, ConversionLabel, ConversionValue, "USD", false);
            reporter.Report();

            IosViewPresenter = new MvxSlidingPanelsTouchViewPresenter(this, _window);
            var setup = new Setup(this, IosViewPresenter);
            setup.Initialize();

            var startup = Mvx.Resolve<IMvxAppStart>();
            startup.Start();

            _window.MakeKeyAndVisible();
            _window.BackgroundColor = UIColor.White;

            UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval(3600);
        }

        public static void AskForPushPermissionsAndRegister(Action continueWith = null)
        {
            if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
            {
                if (!UIApplication.SharedApplication.IsRegisteredForRemoteNotifications ||
                    string.IsNullOrEmpty(CrossPushNotification.Current.Token))
                {
                    CrossPushNotification.Current.Register();
                    _afterPushRegistrationAction = continueWith;
                }
                else
                {
                    continueWith?.Invoke();
                }
            }
            else
            {
                if (UIApplication.SharedApplication.EnabledRemoteNotificationTypes == UIRemoteNotificationType.None ||
                    string.IsNullOrEmpty(CrossPushNotification.Current.Token))
                {
                    CrossPushNotification.Current.Register();
                    _afterPushRegistrationAction = continueWith;
                }
                else
                {
                    continueWith?.Invoke();
                }
            }
        }

        public bool HandleShortcutItem(UIApplicationShortcutItem shortcutItem)
        {
            var handled = false;

            if (shortcutItem == null) return false;

            var routing = Mvx.Resolve<IRoutingService>();

            switch (shortcutItem.Type)
            {
                case ShortcutIdentifier.Parkspace:

                    routing.Route("fzag://shortcut/parking?id=scan");

                    handled = true;
                    break;
            }

            return handled;
        }

        public override void PerformActionForShortcutItem(UIApplication application, UIApplicationShortcutItem shortcutItem,
            UIOperationHandler completionHandler)
        {
            completionHandler(HandleShortcutItem(shortcutItem));
        }

        public override void OnActivated(UIApplication application)
        {
            // Handle any shortcut item being selected
            HandleShortcutItem(LaunchedShortcutItem);

            // Clear shortcut after it's been handled
            LaunchedShortcutItem = null;
        }

        public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
        {
            // will be called if was clicked
            if (notification.UserInfo == null || !notification.UserInfo.ContainsKey(FromObject("url")))
                return;

            var url = notification.UserInfo["url"].ToString();

            var normalized = Uri.UnescapeDataString(url);

            var routing = new RoutingService();

            if (routing.CanRoute(normalized))
                routing.Route(normalized);
        }


        public override bool OpenUrl(UIApplication app, NSUrl url, string srcApp, NSObject annotation)
        {
            var normalized = Uri.UnescapeDataString(url.ToString());

            var routing = new RoutingService();

            if (routing.CanRoute(normalized))
                routing.Route(normalized);

            return true;
        }

        public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
        {
            var settings = Mvx.Resolve<IAppSettingsService>();
            settings.PushNotifications = false;

            if (CrossPushNotification.Current is IPushNotificationHandler handler)
                handler.OnErrorReceived(error);
        }

        public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
        {
            var appSettings = Mvx.Resolve<IAppSettingsService>();

            if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
            {
                if (!application.IsRegisteredForRemoteNotifications)
                {
                    appSettings.PushNotifications = false;
                    return;
                }
            }
            else
            {
                if (application.EnabledRemoteNotificationTypes == UIRemoteNotificationType.None)
                {
                    appSettings.PushNotifications = false;
                    return;
                }
            }

            var handler = CrossPushNotification.Current as IPushNotificationHandler;
            if (handler == null) return;

            handler.OnRegisteredSuccess(deviceToken);

            if (App.IsInitialized && Mvx.CanResolve<ILoginService>())
            {
                var loginService = Mvx.Resolve<ILoginService>();
                try
                {
                    AsyncHelper.RunSync(() => loginService.UpdateDeviceIdentificationAsync());
                }
                catch (Exception ex)
                {
                    Log.Error(ex);
                }
            }

            _afterPushRegistrationAction?.Invoke();
        }

        public override void DidRegisterUserNotificationSettings(UIApplication application,
            UIUserNotificationSettings notificationSettings)
        {
            application.RegisterForRemoteNotifications();
        }

        public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo,
            Action<UIBackgroundFetchResult> completionHandler)
        {
            if (CrossPushNotification.Current is IPushNotificationHandler handler)
                handler.OnMessageReceived(userInfo);
        }

        public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
        {
            if (CrossPushNotification.Current is IPushNotificationHandler handler)
                handler.OnMessageReceived(userInfo);
        }

        public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application,
            UIWindow forWindow)
        {
            try
            {
                if (App.IsInitialized && Mvx.CanResolve<IMvxIosViewPresenter>())
                {
                    if (Mvx.Resolve<IMvxIosViewPresenter>() is MvxIosViewPresenter mvxIosViewPresenter)
                    {
                        var viewController = mvxIosViewPresenter.MasterNavigationController.TopViewController;

                            return viewController.GetSupportedInterfaceOrientations();
                    }
                }
            }
            catch
            {
                // can be called before Mvx is setup
            }

            return UIInterfaceOrientationMask.Portrait;
        }

        public override void PerformFetch(UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
        {
            var accountStorage = new AppleAccountStorage();

            if (!accountStorage.HasAccount)
            {
                completionHandler(UIBackgroundFetchResult.NoData);
                return;
            }

            var voidMessenger = new VoidMessenger();

            var restService = new RestService(AppleCultureService.Instance);
            var authenticationService = new AuthenticationService(restService, voidMessenger, accountStorage);
            var plannerService = new PlannerService(restService, authenticationService, FileSystem.Current,
                new ZipService());

            var tripService = new RealmTravelPlannerBookmarkService(new Lazy<IPlannerService>(() => plannerService), voidMessenger, accountStorage);

            var command = new ProfileDataUpdateCommand(tripService, accountStorage, authenticationService,
                plannerService);

            try
            {
                AsyncHelper.RunSync(() => command.UpdateAsync(CancellationToken.None));
            }
            catch (Exception)
            {
                completionHandler (UIBackgroundFetchResult.Failed);
                return;
            }
            completionHandler(UIBackgroundFetchResult.NewData);
        }
    }
}

0 个答案:

没有答案