Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Записки Фрилансера: Делимся навыком, часть 1

Anna | 2.07.2014 | нет комментариев

Я разрабатываю приложения под iOS и Mac OS. Теснее около года занимаюсь фрилансом и, переходя от заказчика к заказчику, начал примечать, что в задаче разбираюсь одиножды; а при возникновении схожего заказа, легко использую теснее разработанные ранее модули. В серии статей «Записки Фрилансера» я постараюсь осветить некоторые Зачастую встречающиеся в заказах аспекты; напишу подобие шпаргалки, прочитав которую, вы сумеете стремительно и безболезненно внедрить новую спецтехнологию в свой план. Мои заметки ни в коем случае не претендуют на большое осознавание процессов, но описывают легкий метод завершить заказ в срок.

Оглавление:

  1. Часть 1: Работа с Файлами; Образец Singleton; Работа с Аудио; Работа с Видео; In-App Purchases
  2. Часть 2: Личные всплывающие окна (Popups); Как применять Modal Segue в Navigation Controller; Core Graphics; Работа с UIWebView и ScrollView
  3. Часть 3: Жизнь без Autolayout; Splash Screen; Работа с ориентацией девайса в iOS 6 ; Сдвиг содержимого UITextField
  4. Часть 4: Google Analytics; Push Notifications; PSPDFKit; Вход в приложение через Facebook; Рассказать друзьям — Facebook, Twitter, Email
  5. Часть 5: Core Data; UITableView и UICollectionView

Работа с Файлами

Многие начинающие iOS разработчики натыкаются на следующую задачу: приложение правильно работает в симуляторе, но отказывается трудиться либо работает некорректно на настоящем устройстве. Одна из допустимых задач состоит в том, что приложение энергично использует файловые источники, неперенесенные в папку документов приложения. Политика Apple такова: вы не можете менять файлы приложения. Исключительное место, где дозволено развлечься — это папка документов. Читать вы можете отовсюду (в рамках своего приложения), а вот писать только в папке документов.
Значит, при первом запуске, необходимо перенести все документы для записи в папку документов! Запросто! Начнем с создания файла Config.h, добавим следующую строчку в Your_App_Name-Prefix.pch (данный файл механически добавлен во все файлы вашего плана):

#import "Config.h"

Отменно! Сейчас все, что есть в Config.h, есть и во каждому плане! Давайте заполним данный файл:

#define pathToApplicationDirectory [[NSBundle mainBundle] bundlePath] // Путь к папке приложения
#define pathToDocuments [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] // Путь к документам

#define pathToSettings [[pathToDocuments URLByAppendingPathComponent:@"settings.plist"] path] // Путь к файлу настроек
#define pathToPopups [[NSBundle mainBundle] pathForResource:@"popups" ofType:@"plist"] // Путь к файлу со всплывающими окнами

Все это делается экстраординарно для нашего с вами комфорта в грядущем (трудиться с файлами мы будем много и отлично бы избавиться от магических строк).
Сейчас дозволено приступить к копированию файлов в папку с документами. Файлы settings.plist и popups.plistмы будем Зачастую изменять, так что пункт с копированием нужен. Добавим дальнейший код в нашapplication: didFinishLaunchingWithOptions:

// Я юзер, а не лузер, так что перемещу источники к документам!
[self placeResourcesToDocumentsDirectory:@{
     @"settings" : @"plist",
     @"popups" : @"plist"}];

И, безусловно же, сам способ placeResourcesToDocumentsDirectory:

Жми меня!

/*!
 Способ, копирующий файлы из словаря в папку с документами
 /param Словарь с именами файлов 
 */
- (void)placeResourcesToDocumentsDirectory:(NSDictionary *)resources {
    // Проверим один из файлов, внезапно скопировано теснее
    if (![[NSFileManager defaultManager] fileExistsAtPath:pathToSettings) {

        for (NSString *fileName in [resources allKeys]) {
            NSString *extension = resources[fileName];

            NSURL *storeURL = [pathToDocuments URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", fileName, extension]];
            NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:fileName ofType:extension]];
            NSError *error = nil;
            [[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&error];
        }
    }
}

Вот и все! Как легко оказалось переместить файлы в надобную папку, не так ли? А получать доступ к файлу и трудиться с ним дозволено вот так:

NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithContentsOfFile:pathToSettings];
settings[@"isThisAppCool"] = @YES;
[settings writeToFile:pathToSettings atomically:YES];

Образец Singleton

Это скорее маленький сниппет, тот, что может облегчить вам работу с одиночками.
Singleton.h:

Жми меня!

<...>
// Упростим доступ к синглтону
#define coolSingleton [Singleton sharedSingleton]

@interface Singleton : NSObject
  (Singleton *)sharedSingleton;
<...>

Singleton.m:

Жми меня!

<...>
@implementation Singleton

static Singleton *sharedSingleton;

  (Singleton *)sharedSingleton {
    if (sharedSingleton == nil) {
        sharedSingleton = [[Singleton alloc] init];
    }
    return sharedSingleton;
}
<...>

Тут все легко. Во-первых, мы упростили одной дефиницией работу с синглтоном. Во-вторых, есть один неподвижный объект класса Singleton. В-третьих, по вызову способа класса sharedSingleton мы получим либо теснее присутствующий объект, либо инициализируем новейший. Неизменно будет только один объект класса Singleton.

Работа с Аудио

Тут нам придется поработать с классом AVAudioPlayer из фреймворка AVFoundation. Правило действия примитивен: создаем объект класса AVAudioPlayer с именем определенного файла, подготавливаем его к воспроизведению и запускаем, когда необходимо. Сделаем примитивный синглтон, тот, что и будет содержать все наши аудиоплееры. У нас будет два аудиоплеера: один для фоновой музыки, 2-й для воспроизведения звука нажатия кнопки.

Посмотрим на SimpleAudioPlayer.h:

Жми меня!

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

#define audioPlayer [SimpleAudioPlayer sharedAudioPlayer]

@interface SimpleAudioPlayer : NSObject
@property (nonatomic, retain) AVAudioPlayer *backgroundMusicPlayer;
@property (nonatomic, retain) AVAudioPlayer *buttonSoundPlayer;

  (SimpleAudioPlayer *)sharedAudioPlayer;

@end

И на SimpleAudioPlayer.m:

Жми меня!

#import "SimpleAudioPlayer.h"

@implementation SimpleAudioPlayer

static SimpleAudioPlayer *sharedAudioPlayer;

  (SimpleAudioPlayer *)sharedAudioPlayer {
    if (sharedAudioPlayer == nil) {
        sharedAudioPlayer = [[SimpleAudioPlayer alloc] init];
    }
    return sharedAudioPlayer;
}

- (id)init {
    self = [super init];
    if (self) {
        [self initAudioPlayers];
    }
    return self;
}

/*!
  Способ, инициализирующий аудиоплееры
 */
- (void)initAudioPlayers {
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:pathToBackgroundAudio];
    self.backgroundMusicPlayer = [[AVAudioPlayer alloc]
                        initWithContentsOfURL:fileURL error:nil];
    [self.backgroundMusicPlayer prepareToPlay];
    self.backgroundMusicPlayer.numberOfLoops = -1;

    fileURL = [[NSURL alloc] initFileURLWithPath:pathToButtonAudio];
    self.buttonSoundPlayer = [[AVAudioPlayer alloc]
                              initWithContentsOfURL:fileURL error:nil];
    [self.buttonSoundPlayer prepareToPlay];
}

Вот и все. Дефиниции путей к аудиофайлам дозволено прописать в Config.h. Стоит подметить, что мы указали негативное число для числа повторений фоновой музыки. Если вы установите негативное число у этого свойства — то аудиофайл будет повторяться безгранично. То, что нужно! Так же не стоит забывать о способеprepareToPlay — если подготовить все аудиоплееры, как только приложение запущено, то не будет крошечной задержки перед первым воспроизведением аудиофайла. А пользоваться нашим аудиоплеером дозволено вот так:

[audioPlayer.backgroundMusicPlayer play];
<...>
[audioPlayer.backgroundMusicPlayer stop];

Работа с видео

Поработаем немножко с фреймворком MediaPlayer. Фактически, дальнейший код дозволено добавить даже в способ viewDidAppear:

NSURL *url = [[NSURL alloc] initFileURLWithPath:pathToMovie];
MPMoviePlayerViewController *movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
[self presentMoviePlayerViewControllerAnimated:movieController];
[movieController.moviePlayer play];

Данный код легко показывает видеофайл по данному URL. В видеопроигрывателе от Apple теснее есть все надобные кнопочки, Дабы видеопроигрыватель закрыть. Так что четыре строчки выше — наименьший комплект символов для включения видео в ваше приложение.

In-App Purchases

Ну, и самое увлекательное на сегодня: фреймворк StoreKit! Правда, трудиться мы будем не напрямую с ним, но с MKStoreKit. Большое спасибо MugunthKumar за изумительный фреймворк!

Все легко: отредактируйте файл MKStoreKitConfigs.plist под ваши нужды (там все подсознательно ясно) и используйте дальнейший код для проверки покупок:

if ([MKStoreManager isFeaturePurchased:@"me.identifier.coolapp.somesinglefeature"]) {
// Юзер теснее приобрел эту фишку! Необходимо ее ему отдать!
}
if ([MKStoreManager isSubscriptionActive:@"me.identifier.coolapp.somesubscription"]) {
// Вау! Да мы можем тащить деньги ежемесячно, еженедельно, каждодневно! Но сегодня юзер теснее уплатил, отдадим ему снисканную плюшку
}

Для осуществления покупок используйте следующее:

[[MKStoreManager sharedManager] buyFeature:@"me.identifier.coolapp.somesinglefeature" 
                                onComplete:^(NSString* purchasedFeature, 
                                             NSData* purchasedReceipt, 
                                             NSArray* availableDownloads) {
     NSLog(@"Юзер приобрел: %@", purchasedFeature);
 }
                               onCancelled:^ {
     NSLog(@"Юзер отказался приобретать :(  уныло.");
 }];

Завершение

Вот и все на сегодня. Эта часть была пилотной, в следующих статьях будем рассматривать примеры поувлекательнее. Скажем, как сделать такое всплывающее окно, Дабы наш заказчик мог изменять его поведение прямо в .xib файлах, без вашего участия.

Обо всех ошибках и неточностях статьи умоляю писать в мой програцентр.

P.S. Если Вы хотите сотрудничать со мною, то мой профиль есть на одной из больших бирж фрилансеров.

Стоит ли продолжать серию статей «Записки Фрилансера»? Выразите свое суждение в комментариях.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB