Тестирование,
публикация и многое
другое
Разработка приложений для iOS
Лекция 12
Глеб Тарасов
gleb34@gmail.com
Вспомним прошлое
занятие
Какие датчики позволяют
отслеживать положение телефона
в пространстве?
Какие датчики позволяют
отслеживать положение телефона
в пространстве?
Гироскоп, акселерометр, компас, GPS
С помощью какого контроллера
проще всего проиграть видео на
iOS?
С помощью какого контроллера
проще всего проиграть видео на
iOS?
MPMoviePlayerViewController
Какие классы помогают распознавать
жесты?
Какие классы помогают распознавать
жесты?
UIGestureRecognizer и наследники
Лицензия
разработчика
https://developer.apple.com
developer.apple.com
• бета-версии iOS	

• добавление устройств	

• генерация сертификатов	

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

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

• distribution appstore для п...
iTunes Connect
https://itunesconnect.apple.com
itunesconnect.apple.com
• добавление приложений	

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

• публикация ...
Отладка на устройстве
Публикация для
тестировщиков и
заказчиков
https://www.testflightapp.com
TestFlight
• создаем команду	

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

• они принимают приглашение и
добавляю...
Публикация в
AppStore
Полезные сервисы
Crashlytics
отслеживание крешей в Ad Hoc и App Store
версиях
https://www.crashlytics.com
App Annie
отслеживание скачиваний и продаж,	

мест в топах
https://www.appannie.com
AppBot
отслеживание отзывов
http://appbot.co
Flurry
аналитика внутри приложения	

отслеживание эффективности рекламы
http://www.flurry.com
[Flurry startSession:@"2YT83KWNNPGVKJJ4FC"];
NSDictionary *params = @{ @"title" : level.title,
@"index" : @(level.index) }...
Монетизация
• платное приложение	

• in-app purchase	

• реклама
in-app purchases
• consumable	

• non-consumable
• добавить в itunes connect	

• написать код	

• при публикации не забыть...
pod 'MKStoreKit'
MKStoreKitConfigs.plist:
if ([MKStoreManager isFeaturePurchased:@"mobi.krugozor.history.hard"])
{
...
}
[MKStoreManager.sharedManager
buyFeature:@"mobi.krugozor.history.hard"
onComplete:^(NSString *purchasedFeature,
NSData *pu...
не забыть сделать кнопку
«restore purchases»!!
[MKStoreManager.sharedManager restorePreviousTransactionsOnComplete:^{
// у...
Продвижение
• обзоры	

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

• реклама в пабликах	

• баннеры в других приложениях
Измерение
эффективности
• добавляем в приложение Flurry	

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

• Рекламируем через эту ...
Локализация
• папки ru.lproj, en.lproj…	

• Localizable.strings	

• локализация Storyboard
NSString *str = NSLocalizedString(@"Hello, world!", nil);
/*
Localizable.strings
*/
!
"Hello, world!" = "Привет, мир!";
/* Main.strings */
"M56-y0-JDf.text" = "Привет мир!";
"LEK-6m-uDB.text" = "Спасибо!";
Картинки
• Иконки	

• Defaults	

• Ретина
Работа с соц.сетями
• отправка сообщений	

• авторизация через OAuth
http://getsharekit.com
ShareKit
Шаринг
#import "DefaultSHKConfigurator.h"
!
@interface KrugozorSHKConfigurator : DefaultSHKConfigurator
!
@end
!
@implementation KrugozorSHKConfigurator
!
- (NSString*)appName
{
return @"Кругозор: История";
}
!
- (NSString*)appURL
{
...
!
- (NSArray *)facebookReadPermissions
{
return [NSArray arrayWithObjects:@"publish_actions", @"publish_stream", nil];
}
!...
!
!
- (NSNumber *)isUsingCocoaPods
{
return @YES;
}
!
- (NSNumber *)showActionSheetMoreButton
{
return @NO;
}
!
@end
NSString *text = [NSString stringWithFormat:@"Советую попробовать	
образовательное приложение
«Кругозор: История» для
iPho...
Получение токена
pod 'ShareKit/Facebook'!
pod 'ShareKit/Twitter'!
pod 'ShareKit/Vkontakte'
@interface SHKVkontakte : SHKSharer
@interface S...
self.vkontakte = [[SHKVkontakte alloc] init];
self.twitter = [[SHKTwitter alloc] init];
self.facebook = [[SHKFacebook allo...
- (NSString *)currentToken
{
if ([[SHKFacebook class] isServiceAuthorized])
return FBSession.activeSession.accessTokenData...
UIActivityViewController
UIActivityViewController *activity = [[UIActivityViewController alloc]
initWithActivityItems:@[image, @"text"]
application...
@interface InstagramActivity : UIActivity
!
@end
iCloud
NSUbiquitousKeyValueStore
UIDocument
Core Data
http://www.objc.io/issue-10/icloud-core-data
http://www.raywenderlic...
NSURL *ubiq = [NSFileManager.defaultManager
URLForUbiquityContainerIdentifier:nil];
if (!ubiq)
{
// iCloud не доступен
}
e...
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(icloudChanged)
name:NSUbiquitousKeyValueStoreDid...
Рассказать про заказ
• http://tvme.ru
Всё!
Глеб Тарасов	

gleb34@gmail.com	

twitter.com/pilot34
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Upcoming SlideShare
Loading in …5
×

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

1,354 views

Published on

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Тестирование, публикация и многое другое Разработка приложений для iOS Лекция 12 Глеб Тарасов gleb34@gmail.com
  2. 2. Вспомним прошлое занятие
  3. 3. Какие датчики позволяют отслеживать положение телефона в пространстве?
  4. 4. Какие датчики позволяют отслеживать положение телефона в пространстве? Гироскоп, акселерометр, компас, GPS
  5. 5. С помощью какого контроллера проще всего проиграть видео на iOS?
  6. 6. С помощью какого контроллера проще всего проиграть видео на iOS? MPMoviePlayerViewController
  7. 7. Какие классы помогают распознавать жесты?
  8. 8. Какие классы помогают распознавать жесты? UIGestureRecognizer и наследники
  9. 9. Лицензия разработчика https://developer.apple.com
  10. 10. developer.apple.com • бета-версии iOS • добавление устройств • генерация сертификатов • добавление id приложений
  11. 11. Сертификаты • developer для отладки на устройстве • distribution adhoc для тестировщиков • distribution appstore для публикации • push для уведомлений с сервера
  12. 12. iTunes Connect https://itunesconnect.apple.com
  13. 13. itunesconnect.apple.com • добавление приложений • добавление свойств приложений: иконка, описание и т.п. • публикация приложений • добавление банковского счета • данные по продажам, финансовые показатели и т.п.
  14. 14. Отладка на устройстве
  15. 15. Публикация для тестировщиков и заказчиков https://www.testflightapp.com
  16. 16. TestFlight • создаем команду • приглашаем по email тестировщиков или заказчиков • они принимают приглашение и добавляют устройство • вам приходит идентификатор • добавляете его на developer.apple.com • выкладываете приложение
  17. 17. Публикация в AppStore
  18. 18. Полезные сервисы
  19. 19. Crashlytics отслеживание крешей в Ad Hoc и App Store версиях https://www.crashlytics.com
  20. 20. App Annie отслеживание скачиваний и продаж, мест в топах https://www.appannie.com
  21. 21. AppBot отслеживание отзывов http://appbot.co
  22. 22. Flurry аналитика внутри приложения отслеживание эффективности рекламы http://www.flurry.com
  23. 23. [Flurry startSession:@"2YT83KWNNPGVKJJ4FC"]; NSDictionary *params = @{ @"title" : level.title, @"index" : @(level.index) }; ! [Flurry logEvent:@"start_level" withParameters:params]; pod 'FlurrySDK'
  24. 24. Монетизация • платное приложение • in-app purchase • реклама
  25. 25. in-app purchases • consumable • non-consumable • добавить в itunes connect • написать код • при публикации не забыть отправить на проверку
  26. 26. pod 'MKStoreKit' MKStoreKitConfigs.plist: if ([MKStoreManager isFeaturePurchased:@"mobi.krugozor.history.hard"]) { ... }
  27. 27. [MKStoreManager.sharedManager buyFeature:@"mobi.krugozor.history.hard" onComplete:^(NSString *purchasedFeature, NSData *purchasedReceipt, NSArray *availableDownloads) { // купили } onCancelled:^{ // не купили }];
  28. 28. не забыть сделать кнопку «restore purchases»!! [MKStoreManager.sharedManager restorePreviousTransactionsOnComplete:^{ // успешно } onError:^(NSError *error) { // ошибка }];
  29. 29. Продвижение • обзоры • реклама в моб. приложениях соц. сетей • реклама в пабликах • баннеры в других приложениях
  30. 30. Измерение эффективности • добавляем в приложение Flurry • Генерим уникальную ссылку во Flurry • Рекламируем через эту ссылку • Меряем эффективность именно этой рекламы
  31. 31. Локализация
  32. 32. • папки ru.lproj, en.lproj… • Localizable.strings • локализация Storyboard
  33. 33. NSString *str = NSLocalizedString(@"Hello, world!", nil); /* Localizable.strings */ ! "Hello, world!" = "Привет, мир!";
  34. 34. /* Main.strings */ "M56-y0-JDf.text" = "Привет мир!"; "LEK-6m-uDB.text" = "Спасибо!";
  35. 35. Картинки • Иконки • Defaults • Ретина
  36. 36. Работа с соц.сетями • отправка сообщений • авторизация через OAuth http://getsharekit.com ShareKit
  37. 37. Шаринг
  38. 38. #import "DefaultSHKConfigurator.h" ! @interface KrugozorSHKConfigurator : DefaultSHKConfigurator ! @end
  39. 39. ! @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]; }
  40. 40. ! - (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"]; }
  41. 41. ! ! - (NSNumber *)isUsingCocoaPods { return @YES; } ! - (NSNumber *)showActionSheetMoreButton { return @NO; } ! @end
  42. 42. 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];
  43. 43. Получение токена
  44. 44. pod 'ShareKit/Facebook'! pod 'ShareKit/Twitter'! pod 'ShareKit/Vkontakte' @interface SHKVkontakte : SHKSharer @interface SHKFacebook : SHKSharer @interface SHKTwitter : SHKOAuthSharer - (BOOL)authorize; + (BOOL)isServiceAuthorized;
  45. 45. 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];
  46. 46. - (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; }
  47. 47. UIActivityViewController
  48. 48. 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];
  49. 49. @interface InstagramActivity : UIActivity ! @end
  50. 50. iCloud NSUbiquitousKeyValueStore UIDocument Core Data http://www.objc.io/issue-10/icloud-core-data http://www.raywenderlich.com/12779/icloud-and-uidocument-beyond-the-basics-part-1
  51. 51. 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"];
  52. 52. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(icloudChanged) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:nil]; - (void)icloudChanged { // icloud обновился }
  53. 53. Рассказать про заказ • http://tvme.ru
  54. 54. Всё! Глеб Тарасов gleb34@gmail.com twitter.com/pilot34

×