RSS
czwartek, 23 lutego 2012
Programowanie iOS - definiowanie własnych zdarzeń (iPhone / iPad / iPod)

Do napisania tego postu zainspirowało mnie jedno z pytań na stackoverflow  (How to use UIApplication handleOpenURL Notifications) jak również fakt, że kilka dni po jego przeczytaniu, sam stanąłem przed podobnym zadaniem i musiałem szybko znaleźć rozwiązanie. 

 

W moim wypadku, nie byłem jednak zainteresowany jedynie aktualnie widocznym ekranem, a wszystkimi wcześniej załadowanymi do pamięci. Aplikacja po wczytaniu pliku z załącznika e-mail, musiała poinformować o tym fakcie wszystkie ekrany (views), również te niewidoczne w danej chwili tak, aby miały one szanse uaktualnić, w razie potrzeby, swoje dane.

 

Programowanie iOS - definiowanie własnych zdarzeń (iPhone / iPad / iPod)

 

Do problemu można podejść na kilka sposobów, ale najprostszym i zarazem najbardziej eleganckim wydaje się być wykorzystanie centrum notyfikacji - obiekt NSNotificationCenter. 

 

W jaki sposób to implementujemy (bazując na powyższym opisie problemu)?

 

1. Każdy view rejestrujemy jako obserwatora  określonego zdarzenia, nazwijmy je (nasze zdarzenie :) ‘FileUploaded’. 

 

///-views
- (void)viewDidLoad
{
   //dodatkowy kod…
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(recalculateDataAfterFileUpload:) name:@"FileUploaded" object:nil];
   //dodatkowy kod…
}

 

2. W delegacie naszej aplikacji implementujemy rozsyłanie odpowiedniej notyfikacji (broadcast komunikatu ‘FileUploaded’) w momencie zajścia zdarzenia –załadowanie pliku z załącznika email do naszej aplikacji.

 

- (void)handleOpenURL:(NSURL *)url {
   if (url != nil && [url isFileURL]) {
      //dodatkowy kod…
      [[NSNotificationCenter defaultCenter] postNotificationName:@"FileUploaded" object:self];
      //dodatkowy kod…
   }
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
   [self handleOpenURL:url];                
   return YES;
}

//Please note: added here for backward compatibility
-(BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url {
   [self handleOpenURL:url];                
   return YES;
}

 

Zmiany te sprawiają, że wszyscy zarejestrowani/nasłuchujący obserwatorzy zdarzenia ‘FileUploaded’ (tutaj nasze views) zostaną o nim poinformowani i każdy z nich wykonuje odpowiedni kod. W przykładzie powyższym jest to metoda recalculateDataAfterFileUpload:.

Kluczowe dla całego procesu są:


- skonfigurowanie rozsyłania notyfikacji (tutaj ‘FileUploaded’).

 

[[NSNotificationCenter defaultCenter] postNotificationName:@"FileUploaded" 
                                                    object:self];

 

 

- rejestracja w centrum notyfikacji obiektu, jako ‘zainteresowanego’ określonym zdarzeniem (tutaj ‘FileUploaded’) i w efekcie powodująca wykonanie odpowiedniego kodu (tutaj recalculateDataAfterFileUpload:) w wypadku jego wystąpienia.

 

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(recalculateDataAfterFileUpload:) 
                                             name:@"FileUploaded" 
                                           object:nil];

 

sobota, 18 lutego 2012
TOAD - migracja ustawień ze starszych wersji do wersji 11.0
TOAD - migracja ustawień ze starszych wersji do wersji 11.0

Przez dość długi czas korzystałem z TOAD-a dla bazy danych Oracle w wersji 9.7. Po tym jak na rynku pojawiła się wersja 10.x zaryzykowałem i zainstalowałem ją dość szybko po oficjalnej premierze... i to był mój błąd :) TOAD w tej wersji okazał się strasznie niestabilny i niesamowicie wolny, większość kolegów, którzy z niego korzystali mieli podobne doświadczenia. Ja nie zastanawiając się długo wróciłem do poprzedniej wersji 9.7. Gdy niedawno na rynku pojawiła się wersja 11 nie zainteresowałem się nią od razu, dałem szanse innym członkom zespołu na jej wcześniejsze przetestowanie.

 

Po pozytywnych opiniach zdecydowałem się na instalacje. Po pierwszym uruchomieniu TOAD próbuje migrować ustawienia z poprzedniej wersji, (jeśli takową znajdzie) do wersji najnowszej. W moim wypadku odgrzebał on wersje 10.x. Z własnej winy, z pośpiechu bądź z nieuwagi kliknąłem OK i niestety nie wszystkie moje ustawienia zostały przeniesione (wersje 10.x używałem jedynie przez kilka dni). Poniżej pokaże jak zmusić TOAD-a do ponownego uruchomienia kreatora migracji ustawień.

 

Przy instalacji najnowszej wersji TOAD-a najbardziej zależało mi na pełnej migracji wszystkich informacji o bazach danych (użytkownikach i hasłach - wiem... wiem zapamiętywanie haseł w aplikacji jest złe). Postanowiłem najpierw porządnie odinstalować wersje 10.x i usunąć wszystkie pliki konfiguracyjne tej wersji (te, które znalazłem) i zmusić TOAD-a do ponownego uruchomienia kreatora migracji ustawień. Poniższe kroki opisują jak zrobić to drugie. 

 

1. Ustalamy ścieżkę, w której TOAD przechowuje informacje konfiguracyjne. Uruchamiamy z menu View -> TOAD Options...

 

TOAD - migracja ustawień ze starszych wersji do wersji 11.0

 

2. W drzewku po lewej stronie wyszukujemy „General” i kopiujemy/zapamiętujemy ścieżkę z pola „Application data directory” i zamykamy TOAD-a.

 

3. Otwieramy Windows Explorer (bądź inne podobne narzędzie) i przechodzimy do ścieżki/folderu znalezionego w kroku 2.

 

TOAD - migracja ustawień ze starszych wersji do wersji 11.0

 

4. Usuwamy cały katalog konfiguracyjny - 11.0, wraz ze wszystkimi podkatalogami i uruchamiamy ponownie TOAD-a.

 

5. TOAD zapyta nas ponownie o kopiowanie plików konfiguracyjnych. W moim wypadku (poniżej) chciałem przenieść konfiguracje z wersji 9.7.

 

TOAD - migracja ustawień ze starszych wersji do wersji 11.0

 

6. Klikamy „Finish” i czekamy spokojnie.

 

Po ponownym uruchomieniu aplikacji wszystkie ustawienia powinny być przeniesione do najnowszej wersji TOAD-a.

 

Mam nadzieje, że ta wersja będzie lepsza niż poprzednia.

środa, 08 lutego 2012
Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad

System iOS do ikona aplikacji dodaje automatycznie kilka efektów włączając w to:


-    zaokrąglanie rogów,
-    cień,
-    połysk.


Czasami jest to jak najbardziej ok, ale w niektórych wypadkach sprawia że ikony nasze nie wyglądają tak jak powinny. Ilustruje to poniższy przykład.


Ikona podstawowa - bez obróbki iPhone - ikona z efektami automatycznie dodanymi przez iOS iPhone - 
ikona bez efektów iOS
Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad

 

Ikona wyjściowa, przedstawiona po lewej stronie, ma już dodany lekki połysk, wyglądający dokładnie tak jak zaplanowaliśmy. Kolejny efekt zaaplikowany przez iOS sprawia, że staje się ona nieco mniej atrakcyjna (obrazek środkowy).


Na szczęście możemy ten ‘dodatkowy’ efekt wyłączyć. Wynik końcowy przedstawiony jest na prawym obrazku.



Aby to zrobić musimy dodać/ustawić na wartość YES parametr/klucz UIPrerenderedIcon w pliku -Info.plist naszej aplikacji.



W iOS 5+ parametr ten ukryty jest w słowniku CFBundleIcons, który zawiera słownik  CFBundlePrimaryIcon, który oparty jest na tablicy CFBundleIconFiles. Nasz parametr UIPrerenderedIcon (typ BOOL) musimy dodac/zmodyfikowac w slowniku CFBundlePrimaryIcon tak jak pokazują to poniższe ekrany.


Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad

 

Korzystając z menu kontekstowego Xcode pokazanego poniżej, można w prosty sposób przełączyć się z tzw. ‘surowymi’ kluczy, na ich bardziej opisowe i przyjazne odpowiedniki. Jeśli mnie pamięć nie myli zostały one wprowadzone wraz z Xcode4.

 

Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad

 

Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad

 

W starszych wersjach systemu iOS (przed iOS 5) parametr UIPrerenderedIcon powinien zostać dodany/ustawiony na wartość YES w korzeniu pliku -Info.plist naszej aplikacji.

 

Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad

Blokowanie efektów połysku dodawanych automatycznie do ikon aplikacji iPhone/iPod/iPad

czwartek, 02 lutego 2012
Chcesz wiedzieć jak wykryć dostępność aparatu fotograficznego na ‘iUrzadzeniu’ - iPod, iPhone, iPad?

To bardzo proste. Wystarczy skorzystać z metody isSourceTypeAvailable dostępnej w klasie UIImagePickerController tak jak pokazuje to poniższy przykład:

 

if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
   //camera available
} else {
   //camera not available
}



Dodatkowe informacje o klasie UIImagePickerController możecie znaleźć tutaj.


Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time