Этот день для iPad

Запустили с товарищем приложение для iPad под названием «Этот день». С почином меня. Подробнее...

Запустили с товарищем приложение для iPad под названием «Этот день». С почином меня. Подробнее...
Шпаргалка. Инструкция по тому, где скачать и как встроить - в документации Facebook. Несмотря на то, что обновляли они проект на Github недавно (23 ноября на данный момент), в нагрузку идёт у них старая версия фреймворка для работы с JSON. А, т.к. в мой проект уже встроена более новая версия фреймворка приложение не компилилось.
Решение:
SBJSON *jsonParser = [[SBJSON new] autorelease]
заменить наSBJsonParser *jsonParser = [[SBJsonParser new] autorelease]
Должно работать.
![]()
Мы наконец-то сделали первую версию AllCafe для iPhone, которую уже можно показывать.
Сколько раз вы попадали в ситуацию, когда приходишь в заведение - а там нет мест или просто вам там сегодня не нравится? Я - довольно часто. И первая мысль - а где можно ещё посидеть/поесть/попить рядом?
На нашем портале AllCafe.ru собрана довольно большая база ресторанов по всей России. А также отзывов пользователей о них. Мы сделали приложение для iPhone, которое, кстати, весил всего около 200 кб. С его помощью можно посмотреть на карте ближайшие заведения, либо увидеть их списком с примерным расстоянием.
О каждом заведении можно посмотреть краткую информацию - адрес, телефон (само собой можно сразу набрать номер из приложения), что за кухня в этом заведении, почитать новости о заведении, и, что немаловажно, почитать отзывы - что люди пишут и стоит ли туда идти.
Помимо этого можно самому написать отзыв о заведении. Например, сидите вы весь довольный (или недовольный) в ресторане - открываете и добавляете отзыв.
Это пока только то, что на данный момент есть в приложении. Список запланированных фич довольно большой и работы мне хватит надолго.
Собственно - это моё первое приложение для iOS. С почином меня.
Скрины:

Мой Rode Stereo VideoMic не справлялся с громкими концертами и засирал звук. Во вторник я стал обладателем прекрасного девайса Zoom H4N.
Описывать чего в нём крутого не буду - это можно прочитать в интернете, скажу только, что качество записи у него очень классное. А самое главное - он отлично справляется с концертами. Дабы испытать его в бою - я сразу пошёл на концерт в Орландину, там вчера выступали ребята из Германии - WE BUTTER THE BREAD WITH BUTTER. Играют они тяжеляк, поэтому рекордер попал сразу в условия громкого и тяжёлого концерта.
В настройках рекордера есть пункт COMP/LIMITER, я так понимаю это некий набор настроек для записи. Снял видео с концерта со звуком из рекордера. Оно из двух частей. Первая - записывал с пресетом LIMIT2 (CONCERT) и ручным уровнем записи (уровень был 8 из 100). То, что записалось, мне не очень нравится. А вот вторая часть была с пресетом LIMIT3 (STUDIO) - с ним даже в домашних условиях звук получается чище и звучит приятнее. А вот уровень записи выставил AUTO. Результат мне нравится сильно больше.
В любом случае то, как записался звук на таком концерте - показатель того, что устройство пишет всё очень достойно. На нём, пожалуй, и остановлюсь.
С начала видео и до 9:43 идёт LIMIT2 (CONSERT) и уровень записи 8, с 9:43 и до конца идёт LIMIT3 (STUDIO) и автоматический уровень записи. Результат:
Появилась нужна использовать в проекте и UINavigationController, и UITabBarController одновременно. Два способа как это сделать.
Создадим пустой проект. Прописывать контроллеры будем вручную. Итак, у нас есть AppDelegate.h и AppDelegate.m.
Способ 1. UINavigationController внутри UITabBarController. (от @vox_humana)
В этом способе в приложении всегда есть Tab Bar, он всегда виден и между табами всегда можно переключаться. Внутри одного из табов (или можно сделать во всех) есть вид с UINavigationController, в котором можно делать перемещение между видами с помощью push и pop.
Создадим два новый файла типа UIViewController subclass (с галкой with XIB for user interface). Назовём их, скажем, FirstViewController и SecondViewController. Это будут два наших вида, которые будут выводиться в двух табах.
Наш AppDelegate.h в пустом проекте выглядит так:
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
Нам нужно добавить новую @property c UITabBarController:
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UITabBarController *tabBarController;
@end
Далее идём в AppDelegate.m. Здесь нужно импортировать созданные FirstViewController и SecondViewController, а также сделать @synthesize для табов:
#import "AppDelegate.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize tabBarController = _tabBarController;
Внутри метода didFinishLaunchingWithOptions прописываем следующее:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// создаём окно для приложения по размеру экрана
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// создаём два экземпляра UIViewController
UIViewController *viewController1, *viewController2;
// первый вид инициализируем с интерфейсом нашего первого контроллера
viewController1 = [[UINavigationController alloc] initWithRootViewController:[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil]];
// второй вид инициализируем с интерфейсом нашего второго контроллера
viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
// подключаем наши виды к таб-бару
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
// как основной контроллер приложению ставим tabBarController
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Теперь при запуске у нас появится таб-бар внизу экрана. В каждом табе будет по контроллеру. Первый контроллер (viewController1) будет иметь в себе UINavigationController, что позволит нам делать push и pop видов. Для примера добавим ещё один UIViewController subclass (с галкой with XIB for user interface). Назовём его MyViewController. Таким образом у нас уже будет 3 UIViewController в проекте:

Поскольку у нас viewController1 (он же FirstViewController) содержит в себе UINavigationController, то добавим в него какое-нибудь действие, чтобы перейти в наш контроллер. Сначала в начале FirstViewController.m сделаем #import "DetailViewController.h", затем добавим метод:
- (IBAction)pushToMyController:(id)sender {
MyViewController * childControl = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[[self navigationController] pushViewController:childControl animated:YES];
}
Ну и само собой не забудем объявить его в FirstViewController.h:
- (IBAction)pushToMyController:(id)sender;
Добавим в FirstViewController.xib кнопку и свяжем её через Connection Inspector с нашим action:

Готово. Можно запускать. На выходе получаем вот такой результат:
По такому принципу сделано приложение Dropbox для iPhone, например. Скачать готовый пример.
Способ 2. UITabBarController внутри UINavigationController.
Начинаем с того, что создаём RootViewController. Ему нужно создать @property:
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
Добавить в xib-файл UITabBarController, связать его в Connections Inspector. Создаём два вида в проекте - FirstViewController и SecondViewController, для UITabBarController, что внутри RootViewController.xib привязываем табы к этим видам.
Приведу начало файла AppDelegate.m:
#import "AppDelegate.h"
#import "RootViewController.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize viewController = _viewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// создаём окно
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// создаём главный контроллер
self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
// создаём UINavigationController
navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
// назначаем главным контроллером UINavigationController
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
return YES;
}
Общая суть в том, что self.window.rootViewController - это UINavigationController. У приложения есть RootViewController со своим xib. Его можно оставить пустым, но ему нужно прописать @property:
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
Когда вид RootViewController загружается - мы сразу делаем push в наш tabBarController. Таким образом первое, что видно при запуске - это табы и верхнюю панель с кнопкой назад, которую в этом месте можно скрыть и показывать только дальше где-то.
Главный плюс - внутри видов, которые грузятся внутри UITabBarController - можно в коде делать перемещение основного экрана в другие виды и возвращаться обратно. Видео:
По такому принципу сделано приложение ВКонтакте для iPhone. Реализовано в моём примере, пожалуй, не идеально, при желании можно допилить, но работает. Скачать пример.
На будущее пригодится, заодно сам ещё раз всё проделал и закрепил.

Ну вот, вышла новая макось с поддержкой iCloud, да и сам iCloud вышел из beta.
Собственно после установки обновлений сразу после перезагрузки системы предлагается войти в iCloud под своим Apple ID. После входа предлагают отметить сервисы, которые ты хочешь использовать.

Почту я решил не отмечать - не вижу как-то смысла. Я итак пользуюсь почтовым клиентом и на компах, и на мобильных девайсах. Почта по imap, так что всё вроде итак синхронизируется. Контакты - штука относительно полезная. Лично мне она пока не нужна, но после включения этой штуки все контакты из записной книжки в телефоне появились на обоих моих маках.

Самое полезно, на мой взгляд - синхронизация календарей. Мне очень не хотелось в своё время заморачиваться с синхронизацией через гугл и ведением календаря там, тем более, что из гугловских сервисов я использую постоянно только YouTube. Очень приятно, что теперь всё из коробки может работать и синхронизироваться. Например, я забил даты премьер фильмов, которые хочу посмотреть. Они появились в календарях на всех моих устройствах и маках. Есть, правда, одна неприятная деталь - забил я эти события на одном из маков. После синхронизации у него эти события продублировались. Но, наверное, это стартовый глюк и недосмотр Apple. После добавления нового события оно везде появилось по одному разу.

С документами пока не понятно. Десктопные программы из iWork предлагают публиковать файлы только на iWork.com, который находится ещё в статусе публичной беты.
Функция «Найти Mac» позволяет отследить потом через сайт iCloud.com - где он находится. Я так понимаю - это на случай, если украли или где-то забыл, но не помнишь где.
Также стал для всех открыт iCloud.com - оформлен в стиле iOS и предлагает 5 инструментов (точнее 4).


Почта должна представлять собой похожий на стандартное приложение Mail веб-интерфейс. Контакты и Календарь выглядят точно так же, как и стандартные приложения Mac OS.


А вот функция Find My iPhone выглядит очень занятно - показывает, несмотря на название, не только телефоны, но и маки, на которых включена функция «Найти Mac».

На устройства можно отправить сообщение и звуковой сигнал. Приходит моментально, да ещё и сообщение на почту отправляет о том, что такое-то сообщение было отправлено и доставлено на устройство. Можно удалённо заблокировать устройство или очистить его. Для iPhone и вовсе есть переключатель - когда найдётся - сразу же отправить себе письмо. То есть мониторится местоположение как-то без твоего участия, похоже.

Раздел iWork пока содержит только рекламки, предлагающие поставить программы из этого пакета на свои iOS устройства. Видимо они уже работают с iCloud. У меня ни одно приложение из iWork на iOS-устройствах не стоит за ненадобностью.
В iOS-устройстве в настройках iCloud можно включить фотопоток. С того момента, как его включить - все новые фотографии начинают заливаться в iCloud и быть доступны на других устройствах. Заливаются только новые, то есть сделанные после включения функции. Сделанные до включения - никуда не заливаются. Вот так они выглядят в iPhoto на маке:

В общем-то в iPhoto надо тоже включить функцию фото-потока. Как только я сделал фотографию на iPhone (и зашёл в список фотографий) - фотография полилась на iCloud. В iPhoto появилась автоматически без моего участия.
Самая непонятная пока для меня функция - Доступ к моему Mac. Судя по иконке - это возможность подключиться по удалённому рабочему столу к своему Mac, однако пока я не нашёл - как же это сделать. Очень хочется пользоваться этой функцией, чтобы подключаться к своему домашнему компу с работы, а то TeamViewer уже порядком достал своими глюками да назойливыми сообщениями, открытиями своего сайта и предложением купить.
Update: описание того, как это работает.
Закладки я не включал в iCloud, т.к. не пользуюсь Safari почти. А закладки используемой мной Opera итак синхронизируются через их встроенный в браузер сервис Opera Link.
В облаке также хранятся резервные копии моего iPhone, которые уже почти половину доступного бесплатного места забили. Штука полезная если внезапно комп сломается. Но как-то это не кажется мне такой уж трагедией. Да и остальные синхронизации тоже своего рода бэкап.
Больше всего я ждал iTunes Match, но он выйдет не скоро, и, увы, работать будет пока только в штатах, как и все облачные музыкальные сервисы - будь то Amazon, будь то Google. Грустно, прям хоть свой пиши.
Такой вот облачный iCloud.
В общем пробовал всяческие настройки микрофона на концерте. Лучший вариант - включённый тумблер -10 db, одетый на микрофон мех (оказывается он не только от ветра помогает, но и от перегруза). Идеального звука, увы, так и не удалось добиться, хотя концерт был довольно громкий. Но сильно лучше, чем первые попытки. Всё равно местами барабаны засираются.
Ещё снижал уровень записи на самом фотоаппарате в настройках. Если сделать около 50% - то звук лучше. Если делать меньше - то просто на итоговом видео громкость тише, а засирания те же. Вот что получилось:
Буду пробовать снимать на других концертах что-то и думать, как ещё лучше звукоизолировать микрофон, чтобы всё записывалось хорошо.