Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Тестирование,
публикация и многое
другое
Разработка приложений для 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. Тестирование, публикация и др.
Nächste SlideShare
Wird geladen in …5
×

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

1.399 Aufrufe

Veröffentlicht am

Veröffentlicht in: Bildung
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Интуит. Разработка приложений для 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

×