59
Расширенные возможности устройств Разработка приложений для iOS Лекция 11 Глеб Тарасов [email protected]

Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

  • Upload
    -

  • View
    641

  • Download
    6

Embed Size (px)

DESCRIPTION

 

Citation preview

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

Расширенные возможности устройств

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

Лекция 11

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

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

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

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

Какие UIViewController от Apple работают только на iPad?

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

Какие UIViewController от Apple работают только на iPad?

UIPopoverController, UISplitViewController

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

Какие есть два вида автоматического растягивания

интерфейсов в iOS?

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

Какие есть два вида автоматического растягивания

интерфейсов в iOS?

старый и более простой Autosizing, новый и мудреный Autolayout

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

Как отключить AutoLayout в StoryBoard?

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

Как отключить AutoLayout в StoryBoard?

снять галку «use auto layout» в первой вкладке справа

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

Акселерометр, гироскоп

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

Ориентация

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; !if (UIInterfaceOrientationIsPortrait(orientation)) NSLog(@"portrait"); else NSLog(@"landscape");

typedef enum { UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight } UIInterfaceOrientation;

Page 11: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Когда телефон лежит на столе: x = 0 y = 0 z = -1

ускорение +1.0g вдоль этой оси

1.0 по оси

Акселерометр

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

- (void)viewDidLoad { [super viewDidLoad]; self.manager = [[CMMotionManager alloc] init]; [self.manager startAccelerometerUpdates]; self.timer = [NSTimer scheduledTimerWithTimeInterval:1/30.0 target:self selector:@selector(doAccUpdate) userInfo:nil repeats:YES]; }

- (void)doAccUpdate { CMAcceleration acc = self.manager.accelerometerData.acceleration; NSLog(@"%g %g %g", acc.x, acc.y, acc.z); }

#import <CoreMotion/CoreMotion.h>

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

Гироскоп

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

- (void)viewDidLoad { [super viewDidLoad]; self.motionManager = [[CMMotionManager alloc] init]; [self.manager startGyroUpdates]; ! self.timer = [NSTimer scheduledTimerWithTimeInterval:1/30.0 target:self selector:@selector(doGyroUpdate) userInfo:nil repeats:YES]; }

- (void)doGyroUpdate { CMRotationRate rate = self.motionManager.gyroData.rotationRate; NSLog(@"%g %g %g", rate.x, rate.y, rate.z); }

радианы в секунду

#import <CoreMotion/CoreMotion.h>

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

- (void)viewDidLoad { [super viewDidLoad]; self.manager = [[CMMotionManager alloc] init]; } !- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.manager startGyroUpdates]; self.timer = ... } !- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.timer invalidate]; [self.manager stopGyroUpdates]; }

Page 16: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Фильтр нижних частот

http://developer.apple.com/library/ios/#samplecode/AccelerometerGraph/Introduction/Intro.html

http://ru.wikipedia.org/wiki/Фильтр_нижних_частот

Page 17: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Геолокация

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

self.manager = [[CLLocationManager alloc] init]; self.manager.delegate = self; self.manager.desiredAccuracy = kCLLocationAccuracyHundredMeters; [self.manager startUpdatingLocation];

@interface MyViewController : UIViewController<CLLocationManagerDelegate>

- (void)locationManager:(CLLocationManager *)m didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { CLLocationCoordinate2D coord = newLocation.coordinate; NSLog(@"%g %g", coord.latitude, coord.longitude); }

Координаты

Центр Москвы: 55.747598, 37.626801

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

Компас

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { NSLog(@"%g", newHeading.magneticHeading); }

self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; [self.locationManager setDelegate:self]; [self.locationManager startUpdatingHeading];

0 - север, 90 - восток, 180 - юг, 270 - запад

Page 20: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Воспроизведение аудио

Page 21: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

AVAudioPlayer

NSString *path = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [player play];

Page 22: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств
Page 23: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlPlay: [self.player play]; break; case UIEventSubtypeRemoteControlPause: [self.player pause]; break; case UIEventSubtypeRemoteControlPreviousTrack: [self prevTrack]; break; case UIEventSubtypeRemoteControlNextTrack: [self nextTrack]; break; default: break; } } }

- (void) viewDidAppear:(BOOL)animated { [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; }

Page 24: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств
Page 25: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств
Page 26: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

- (IBAction)buttonTapped { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; NSURL *url = [[NSBundle mainBundle] URLForResource:@"ddt" withExtension:@"mp3"]; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [self.player play]; }

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

UIImage *img = [UIImage imageNamed:@"ddt"]; MPMediaItemArtwork *art = [[MPMediaItemArtwork alloc] initWithImage:img]; !NSDictionary *dict = @{ MPMediaItemPropertyTitle : @"Свобода", MPMediaItemPropertyAlbumTitle : @"Иначе", MPMediaItemPropertyAlbumTrackNumber : @15, MPMediaItemPropertyAlbumTrackCount : @16, MPMediaItemPropertyArtist : @"ДДТ", MPMediaItemPropertyPlaybackDuration : @125, MPNowPlayingInfoPropertyPlaybackRate : @1, MPMediaItemPropertyGenre : @"Рок", MPMediaItemPropertyArtwork : art }; ![MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = dict;

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

AVQueuePlayer

NSURL *url1 = [[NSBundle mainBundle] URLForResource:@"song1" withExtension:@"mp3"]; NSURL *url2 = [[NSBundle mainBundle] URLForResource:@"song2" withExtension:@"mp3"]; NSURL *url3 = [[NSBundle mainBundle] URLForResource:@"song3" withExtension:@"mp3"]; AVPlayerItem *item1 = [[AVPlayerItem alloc] initWithURL:url1]; AVPlayerItem *item2 = [[AVPlayerItem alloc] initWithURL:url2]; AVPlayerItem *item3 = [[AVPlayerItem alloc] initWithURL:url3]; NSArray *items = @[ item1, item2, item3 ]; self.player = [[AVQueuePlayer alloc] initWithItems:items]; [self.player play];

Page 31: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Воспроизведение видео

Page 32: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств
Page 33: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

- (IBAction)buttonTapped { NSURL *url = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"mp4"]; MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; [self presentMoviePlayerViewControllerAnimated:vc]; }

Page 34: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Фото и видео

Page 35: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств
Page 36: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Фото с камеры

UIImagePickerController *c = [[UIImagePickerController alloc] init]; c.sourceType = UIImagePickerControllerSourceTypeCamera; c.delegate = self; c.mediaTypes = @[ (NSString *)kUTTypeImage ]; ![self presentViewController:c animated:YES completion:nil];

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *img = info[UIImagePickerControllerEditedImage]; NSLog(@"img %@", img); [picker dismissViewControllerAnimated:YES completion:nil]; }

#import <MobileCoreServices/MobileCoreServices.h>

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

Фото из библиотеки

UIImagePickerController *c = [[UIImagePickerController alloc] init]; c.delegate = self; c.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; c.mediaTypes = @[ (NSString *)kUTTypeImage ]; ![self presentViewController:c animated:YES completion:nil];

#import <MobileCoreServices/MobileCoreServices.h>

Page 38: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств
Page 39: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

Видео с камеры

UIImagePickerController *c = [[UIImagePickerController alloc] init]; c.sourceType = UIImagePickerControllerSourceTypeCamera; c.delegate = self; c.mediaTypes = @[ (NSString *)kUTTypeMovie ];

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL]; NSLog(@"%@", videoUrl); [picker dismissViewControllerAnimated:YES completion:nil]; }

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

Работа с микрофоном

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

http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html

SpeakHere

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

iBeacon

http://habrahabr.ru/company/touchinstinct/blog/195104/

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

Уведомления

local notifications

remote notifications

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

Local

+ (void)addNotificationForDate:(NSDate *)date { UILocalNotification *n = [[UILocalNotification alloc] init]; n.fireDate = date; n.timeZone = [NSTimeZone defaultTimeZone]; n.alertBody = @"Уведомление"; n.alertAction = @"Открыть"; n.soundName = UILocalNotificationDefaultSoundName; n.applicationIconBadgeNumber = 1; n.userInfo = @{ @"custom_id" : @12 }; [[UIApplication sharedApplication] scheduleLocalNotification:n]; }

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

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)n { if (application.applicationState == UIApplicationStateActive) return; ! NSNumber *num = n.userInfo[@"custom_id"]; // реагируем на уведомление }

В AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... UILocalNotification *n = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; if (n) { // реагируем на уведомление } ... }

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

Remote

apns-php https://code.google.com/p/apns-php/

ruby apns https://github.com/jpoz/APNS

Как сгенерировать сертификат: https://code.google.com/p/apns-php/wiki/CertificateCreation

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [UIApplication.sharedApplication registerForRemoteNotificationTypes: (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)]; ... }

В AppDelegate:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // отправляем токен на сервер }

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

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // если было активно - ничего не делаем if (application.applicationState == UIApplicationStateActive) { return; } // и тут реагируем на уведомление }

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (userInfo) { // тут реагируем на уведомление } ... }

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

Распознавание жестов

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

UITapGestureRecognizerUITapGestureRecognizer *t = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)]; t.numberOfTapsRequired = 1; t.numberOfTouchesRequired = 1; [self.view addGestureRecognizer:t];

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

UIPanGestureRecognizerUIPanGestureRecognizer *p = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [self.view addGestureRecognizer:p];

- (void)pan:(UIPanGestureRecognizer *)sender { CGPoint t = [sender translationInView:self.view]; CGPoint v = [sender velocityInView:self.view]; NSLog(@"%@", NSStringFromCGPoint(t)); NSLog(@"%@", NSStringFromCGPoint(v)); }

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

UIPinchGestureRecognizerUIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)]; [self.view addGestureRecognizer:pinch];

- (void)pinch:(UIPinchGestureRecognizer *)sender { CGFloat scale = sender.scale; NSLog(@"%g", scale); }

Page 54: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

UIRotationGestureRecognizerUIRotationGestureRecognizer *r = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)]; [self.view addGestureRecognizer:r];

- (void)rotate:(UIRotationGestureRecognizer *)sender { CGFloat r = sender.rotation; NSLog(@"%g", r); }

Page 55: Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности устройств

• UISwipeGestureRecognizer • UILongPressGestureRecognizer

UISwipeGestureRecognizer *s = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; s.direction = UISwipeGestureRecognizerDirectionLeft; [self.view addGestureRecognizer:s];

UILongPressGestureRecognizer *p = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; p.minimumPressDuration = 0.5; [self.view addGestureRecognizer:p];

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

UIGestureRecognizerDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *)otherGestureRecognizer;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

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

UIGestureRecognizerState

typedef enum { UIGestureRecognizerStatePossible, ! UIGestureRecognizerStateBegan, ! UIGestureRecognizerStateChanged, ! UIGestureRecognizerStateEnded, ! UIGestureRecognizerStateCancelled, UIGestureRecognizerStateFailed, UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded } UIGestureRecognizerState;

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

Домашнее задание

• продумать, что из пройденного можно использовать в вашем приложении

• добавить поддержку • если ничего — поиграться в отдельном приложении

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

Всё!

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