67
Тестирование, публикация и многое другое Разработка приложений для iOS Лекция 12 Глеб Тарасов [email protected]

Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

  • Upload
    -

  • View
    688

  • Download
    3

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Тестирование, публикация и многое

другое

Разработка приложений для iOS

Лекция 12

Глеб Тарасов[email protected]

Page 2: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Вспомним прошлое занятие

Page 3: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Какие датчики позволяют отслеживать положение телефона

в пространстве?

Page 4: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Какие датчики позволяют отслеживать положение телефона

в пространстве?

Гироскоп, акселерометр, компас, GPS

Page 5: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

С помощью какого контроллера проще всего проиграть видео на

iOS?

Page 6: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

С помощью какого контроллера проще всего проиграть видео на

iOS?

MPMoviePlayerViewController

Page 7: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Какие классы помогают распознавать жесты?

Page 8: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Какие классы помогают распознавать жесты?

UIGestureRecognizer и наследники

Page 9: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Лицензия разработчика

https://developer.apple.com

Page 10: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 11: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 12: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 13: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

developer.apple.com

• бета-версии iOS

• добавление устройств • генерация сертификатов • добавление id приложений

Page 14: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Сертификаты

• developer для отладки на устройстве

• distribution adhoc для тестировщиков

• distribution appstore для публикации

• push для уведомлений с сервера

Page 15: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

iTunes Connect

https://itunesconnect.apple.com

Page 16: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 17: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

itunesconnect.apple.com

• добавление приложений • добавление свойств приложений: иконка, описание и т.п.

• публикация приложений • добавление банковского счета • данные по продажам, финансовые показатели и т.п.

Page 18: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Отладка на устройстве

Page 19: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Публикация для тестировщиков и заказчиков

https://www.testflightapp.com

Page 20: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 21: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

TestFlight• создаем команду

• приглашаем по email тестировщиков или заказчиков

• они принимают приглашение и добавляют устройство

• вам приходит идентификатор

• добавляете его на developer.apple.com

• выкладываете приложение

Page 22: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Публикация в AppStore

Page 23: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Полезные сервисы

Page 24: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Crashlytics

отслеживание крешей в Ad Hoc и App Store версиях

https://www.crashlytics.com

Page 25: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 26: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

App Annieотслеживание скачиваний и продаж,

мест в топах

https://www.appannie.com

Page 27: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 28: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

AppBot

отслеживание отзывов

http://appbot.co

Page 29: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 30: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Flurryаналитика внутри приложения

отслеживание эффективности рекламы

http://www.flurry.com

Page 31: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 32: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

[Flurry startSession:@"2YT83KWNNPGVKJJ4FC"];

NSDictionary *params = @{ @"title" : level.title, @"index" : @(level.index) }; ![Flurry logEvent:@"start_level" withParameters:params];

pod 'FlurrySDK'

Page 33: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 34: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 35: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Монетизация

• платное приложение • in-app purchase

• реклама

Page 36: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

in-app purchases

• consumable

• non-consumable

• добавить в itunes connect

• написать код • при публикации не забыть отправить на проверку

Page 37: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

pod 'MKStoreKit'

MKStoreKitConfigs.plist:

if ([MKStoreManager isFeaturePurchased:@"mobi.krugozor.history.hard"]) { ... }

Page 38: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

[MKStoreManager.sharedManager buyFeature:@"mobi.krugozor.history.hard" onComplete:^(NSString *purchasedFeature, NSData *purchasedReceipt, NSArray *availableDownloads) { // купили } onCancelled:^{ // не купили }];

Page 39: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

не забыть сделать кнопку «restore purchases»!!

[MKStoreManager.sharedManager restorePreviousTransactionsOnComplete:^{ // успешно } onError:^(NSError *error) { // ошибка }];

Page 40: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Продвижение

• обзоры • реклама в моб. приложениях соц. сетей • реклама в пабликах • баннеры в других приложениях

Page 41: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Измерение эффективности

• добавляем в приложение Flurry

• Генерим уникальную ссылку во Flurry

• Рекламируем через эту ссылку

• Меряем эффективность именно этой рекламы

Page 42: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Локализация

Page 43: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

• папки ru.lproj, en.lproj…

• Localizable.strings

• локализация Storyboard

Page 44: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

NSString *str = NSLocalizedString(@"Hello, world!", nil);

/* Localizable.strings */ !"Hello, world!" = "Привет, мир!";

Page 45: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

/* Main.strings */ "M56-y0-JDf.text" = "Привет мир!"; "LEK-6m-uDB.text" = "Спасибо!";

Page 46: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Картинки

• Иконки • Defaults

• Ретина

Page 47: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Работа с соц.сетями

• отправка сообщений • авторизация через OAuth

http://getsharekit.com

ShareKit

Page 48: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Шаринг

Page 49: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

#import "DefaultSHKConfigurator.h" !@interface KrugozorSHKConfigurator : DefaultSHKConfigurator !@end

Page 50: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

!@implementation KrugozorSHKConfigurator !- (NSString*)appName { return @"Кругозор: История"; } !- (NSString*)appURL { return APP_URL; } !- (NSString*)vkontakteAppId { return @"413781232"; } !- (NSString*)facebookAppId { return @"123323432342432"; } !- (NSArray*)facebookWritePermissions { return [NSArray arrayWithObjects:@"publish_actions", @"publish_stream", nil]; }

Page 51: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

!- (NSArray *)facebookReadPermissions { return [NSArray arrayWithObjects:@"publish_actions", @"publish_stream", nil]; } !- (NSString *)twitterSecret { return @"asdsadasdadasdas"; } !- (NSString *)twitterConsumerKey { return @"asdasdasdasdassdsada"; } !- (NSString *)twitterCallbackUrl { return @"http://krugozor.mobi"; } !- (NSArray*)defaultFavoriteURLSharers { return @[@«SHKTwitter", @«SHKFacebook", @"SHKVkontakte"]; } !- (NSArray*)defaultFavoriteTextSharers { return @[@"SHKMail",@"SHKTextMessage"]; }

Page 52: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

!!- (NSNumber *)isUsingCocoaPods { return @YES; } !- (NSNumber *)showActionSheetMoreButton { return @NO; } !@end

Page 53: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

NSString *text = [NSString stringWithFormat:@"Советую попробовать образовательное приложение «Кругозор: История» для iPhone и iPad: %@", APP_URL]; SHKItem *item = [SHKItem text:text]; item.title = @"Кругозор"; !SHKActionSheet *a = [SHKActionSheet actionSheetForItem:item]; [a showFromRect:self.button.frame inView:self.button.superview animated:YES];

Page 54: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 55: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Получение токена

Page 56: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

pod 'ShareKit/Facebook'!pod 'ShareKit/Twitter'!pod 'ShareKit/Vkontakte'

@interface SHKVkontakte : SHKSharer

@interface SHKFacebook : SHKSharer

@interface SHKTwitter : SHKOAuthSharer

- (BOOL)authorize;

+ (BOOL)isServiceAuthorized;

Page 57: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

self.vkontakte = [[SHKVkontakte alloc] init]; self.twitter = [[SHKTwitter alloc] init]; self.facebook = [[SHKFacebook alloc] init]; !![NSNotificationCenter.defaultCenter addObserver:self selector:@selector(shareKitAuthenticationFinished:) name:SHKAuthDidFinishNotification object:self.vkontakte]; ![NSNotificationCenter.defaultCenter addObserver:self selector:@selector(shareKitAuthenticationFinished:) name:SHKAuthDidFinishNotification object:self.twitter]; ![NSNotificationCenter.defaultCenter addObserver:self selector:@selector(shareKitAuthenticationFinished:) name:SHKAuthDidFinishNotification object:self.facebook];

Page 58: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

- (NSString *)currentToken { if ([[SHKFacebook class] isServiceAuthorized]) return FBSession.activeSession.accessTokenData.accessToken; else if ([[SHKVkontakte class] isServiceAuthorized]) return [NSUserDefaults.standardUserDefaults objectForKey:kSHKVkontakteAccessTokenKey]; else if ([[SHKTwitter class] isServiceAuthorized]) return self.twitter.accessToken.key; else return nil; }

Page 59: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

UIActivityViewController

Page 60: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:@[image, @"text"] applicationActivities:nil]; !!activity.excludedActivityTypes = @[ UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop ]; !![activity setCompletionHandler:^(NSString *activityType, BOOL completed) { if (completed) { // отправили } }]; ![self presentViewController:activity animated:YES completion:nil];

Page 61: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

@interface InstagramActivity : UIActivity !@end

Page 62: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

iCloud

NSUbiquitousKeyValueStore

UIDocument

Core Datahttp://www.objc.io/issue-10/icloud-core-data.html

http://www.raywenderlich.com/12779/icloud-and-uidocument-beyond-the-basics-part-1

Page 63: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др
Page 64: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

NSURL *ubiq = [NSFileManager.defaultManager URLForUbiquityContainerIdentifier:nil]; if (!ubiq) { // iCloud не доступен } else { [NSUbiquitousKeyValueStore.defaultStore setString:@"value" forKey:@"key"]; ! [NSUbiquitousKeyValueStore.defaultStore synchronize]; }

NSString *v = [NSUbiquitousKeyValueStore.defaultStore stringForKey:@"key"];

Page 65: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(icloudChanged) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:nil];

- (void)icloudChanged { // icloud обновился }

Page 66: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Рассказать про заказ

• http://tvme.ru

Page 67: Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др

Всё!

Глеб Тарасов [email protected] twitter.com/pilot34