wtorek, 30 sierpnia 2016

iOS 10 beta - migracja w Xamarin

iOS 10 beta, ciąg dalszy, witam serdecznie. Dziś parę słów o Xamarin.

Wszystkie potrzebne informacje znajdziemy na stronie Introduction to iOS 10.

W przeciwieństwie do Swift w C# nie trzeba było nic zmieniać! Dodałem jedynie obsługę nowego modelu uprawnień. Podobnie jak ostatnim razem w pliku Info.plist utworzyłem klucz NSAppleMusicUsageDescription. W przeciwieństwie do Xcode 8 musiałem zrobić to ręcznie edytując XML, gdzie wstawiłem:

<key>NSAppleMusicUsageDescription</key>
<string>This app uses your media library in order to track changes</string>

W klasie FileListViewController stworzyłem następujący kod:

        public async override void ViewDidLoad()
        {
            …

            if (UIDevice.CurrentDevice.CheckSystemVersion(9, 3))
            {
                var status = await MPMediaLibrary.RequestAuthorizationAsync();

                if (status == MPMediaLibraryAuthorizationStatus.Authorized)
                    LoadMediaItemsForMediaTypeAsync(MPMediaType.Music);
                else
                    DisplayMediaLibraryError();               
            }
            else
            {
                LoadMediaItemsForMediaTypeAsync(MPMediaType.Music);
            }     
        }

        private void DisplayMediaLibraryError()
        {
            string error;

            switch (MPMediaLibrary.AuthorizationStatus)
            {
                case MPMediaLibraryAuthorizationStatus.Restricted:
                    error = "Media library access restricted by corporate or parental settings";
                    break;
                case MPMediaLibraryAuthorizationStatus.Denied:
                    error = "Media library access denied by user";
                    break;
                default:
                    error = "Unknown error";
                    break;
            }

            var controller = UIAlertController.Create("Error", error, UIAlertControllerStyle.Alert);
            controller.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));

            PresentViewController(controller, true, null);              
        }

W porównaniu nawet do Swift 3  C# ma większą elegancję jeśli chodzi o async. Widzimy już metody z API w tej postaci, jak choćby RequestAuthorizationAsync. Przy enumach wygrywa Swift. W C# musiałem za każdym razem pisać MPMediaLibraryAuthorizationStatus.*.  Podczas tłumaczenia kodu wyszło, że klasy UIAlertController i UIAlertAction dla oczekiwanego zestawu parametrów zamiast typowego konstruktora mają w C# statyczne metody Create.

Wszystko działa jak w oryginale w Swift 3 i Xcode 8 beta. Na designerze w Visual Studio zaobserwowałem jedynie rysowanie linii łączych w innym miejscu niż łączonych przez nie kontrolerów, ale w niczym to nie przeszkodziło.

Brak komentarzy: