Slide 1

Slide 1 text

ɹ2017/02/11 #gbfukuoka ߹ಉษڧձ in ෱Ԭ Amazon CognitoͱAmazon S3Λ૊Έ߹Θͤͯ iOS޲͚ͷࣸਅڞ༗αʔϏεΛ࡞ͬͯΈͨ

Slide 2

Slide 2 text

About Me

Slide 3

Slide 3 text

• ాத ޹໌ (Takaaki Tanaka) • Ϋϥεϝιουגࣜձࣾ • iOS ΞϓϦέʔγϣϯΤϯδχΞ • @kongmingtrap • iOS Developer (Swift / Objective-C) • GyazSquare / GitHub

Slide 4

Slide 4 text

What Service

Slide 5

Slide 5 text

IUUQTXXXQSPEVDUIVOUDPN

Slide 6

Slide 6 text

Motivation

Slide 7

Slide 7 text

ϨϙʔτϒϩάΛࣗಈԽ͍ͨ͠

Slide 8

Slide 8 text

ͳΜͰཉ͍͠ͷʁ • ԕํͷษڧձʹࢀՃͨ࣌͠ • ͳΔ΂͘ࢀՃඅΛग़ͯ͠΋Β͏ͨΊʹϨ ϙʔτΛॻ͘໿ଋΛ͢Δ • Ϩϙʔτ࡞੒Λ؆୯ʹ͍ͨ͠ • ҧ͏ηογϣϯΛௌ͍ͨϝϯόʔͱڞ༗ ͍ͨ͠

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

࣮ݱํ๏ݕ౼

Slide 11

Slide 11 text

େମ͜͏͍͏ͷΛ࣮ݱ͍ͨ͠ • Ϣʔβʔೝূ • ೝূͨ͠ϢʔβʔͰࣸਅΛૹ৴ • डߨηογϣϯͷબ୒ • Twitterͷϋογϡλά͔Β·ͱΊΔػೳ

Slide 12

Slide 12 text

ཉ͕͋Ε͹͜͏͍͏ͷΛ࣮ݱ͍ͨ͠ • Ի੠ೖྗ • ࡱӨͨࣸ͠ਅͷࣗಈఴ෇ • ΞοϓϩʔυऴྃΛPushͰ௨஌

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

ଓ͚ΒΕ·͔͢…ʁ • WebAPIͷߏங͕ೖΔͱ࡞ۀ͕࣌ؒ૿େ͢ Δ • ࣌ؒΛ͔͚Ε͹͔͚Δ΄ͲϞνϕʔγϣ ϯ͸Լ͕Δ • ͓͕͔͔ۚΔ͜ͱ͸ϋʔυϧ্͕͕Δ
 ʢࠓ݄ϐϯν͔ͩΒདྷ݄΍Ζ͏ʣ

Slide 15

Slide 15 text

࠷খͷख਺Ͱ࠷େͷޮՌΛಘΔ

Slide 16

Slide 16 text

େମ͜͏͍͏ͷΛ࣮ݱ͍ͨ͠ • Ϣʔβʔೝূ • ೝূͨ͠ϢʔβʔͰࣸਅΛૹ৴ • डߨηογϣϯͷબ୒ • Twitterͷϋογϡλά͔Β·ͱΊΔػೳ

Slide 17

Slide 17 text

Amazon S3 • ΦϒδΣΫτετϨʔδαʔ Ϗε • Ͳ͔͜ΒͰ΋༰ྔʹؔ܎ͳ͘ σʔλΛ֨ೲ͓ΑͼऔಘͰ͖ Δ

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Bucket Policy

Slide 20

Slide 20 text

͕͢͞ʹ୭Ͱ΋ॻ͖ࠐΊΔͷ͸·͍ͣ…

Slide 21

Slide 21 text

ೝূΛ௥Ճ

Slide 22

Slide 22 text

Amazon Cognito • ϢʔβʔͷΞΠσϯςΟςΟ΍ σʔλಉظʹؔ͢ΔػೳΛఏڙ • AWS ͷαʔϏεΛར༻͢Δ
 Ϣʔβʔʹ ҰҙͷΞΠσϯςΟ ςΟ Λ༩͑ΔͨΊͷαʔϏε

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

AWS Mobile SDK ʴ

Slide 25

Slide 25 text

CocoaPods TPVSDFIUUQTHJUIVCDPN$PDPB1PET4QFDTHJU QMBUGPSNJPT XPSLTQBDF3FQPSU$BNFSB YDPEFQSPK3FQPSU$BNFSB VTF@GSBNFXPSLT UBSHFU3FQPSU$BNFSBEP QPE"84$PHOJUP QPE'BCSJD QPE5XJUUFS,JU QPE5XJUUFS$PSF FOE

Slide 26

Slide 26 text

Fabric SDK

Slide 27

Slide 27 text

Fabric SDK DMBTT"QQ%FMFHBUF6*3FTQPOEFS 6*"QQMJDBUJPO%FMFHBUF\ … func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. Fabric.with([AWSCognito.self, Twitter.self]) return true }

Slide 28

Slide 28 text

Fabric

Slide 29

Slide 29 text

Create identity pool

Slide 30

Slide 30 text

Create identity pool

Slide 31

Slide 31 text

IAM • Ϣʔβʔʹରͯ͠ AWS ΁ͷΞ ΫηεΛ҆શʹ੍ޚ͢ΔͨΊͷ ࢓૊Έ • ೝূࡁͷϢʔβʔ͕Bucketʹॻ ͖ࠐΊΔݖݶΛ෇༩͢Δ

Slide 32

Slide 32 text

IAM

Slide 33

Slide 33 text

IAM

Slide 34

Slide 34 text

४උ͸Ͱ͖ͨͷͰΞϓϦଆͷ࣮૷

Slide 35

Slide 35 text

Login Button let logInButton = TWTRLogInButton { (session, error) in if let unwrappedSession = session { let value = unwrappedSession.authToken + ";" + unwrappedSession.authTokenSecret let provider = TwitterProvider(tokens: ["api.twitter.com": value as NSString]) let credentialsProvider = AWSCognitoCredentialsProvider( regionType:.APNortheast1, identityPoolId: "ap-northeast-1:xxxxxxxx-xxxx-xxxx- xxxx-xxxxxxxxxxxx", identityProviderManager: provider) let configuration = AWSServiceConfiguration(region:.APNortheast1, credentialsProvider: credentialsProvider) AWSServiceManager.default().defaultServiceConfiguration = configuration } else { NSLog("Login error: %@", error!.localizedDescription); } }

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

Identities

Slide 39

Slide 39 text

ࣸਅࡱӨϩδοΫͷ࣮૷

Slide 40

Slide 40 text

func captureImage(sampleBuffer: CMSampleBuffer) -> UIImage { let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0)) let baseAddress: UnsafeMutableRawPointer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)! let bytesPerRow: Int = CVPixelBufferGetBytesPerRow(imageBuffer) let width:Int = CVPixelBufferGetWidth(imageBuffer) let height:Int = CVPixelBufferGetHeight(imageBuffer) let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB() let newContext: CGContext = CGContext(data: baseAddress, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue| CGBitmapInfo.byteOrder32Little.rawValue)! let imageRef: CGImage = newContext.makeImage()! let resultImage = UIImage(cgImage: imageRef, scale: 1.0, orientation: UIImageOrientation.right) return resultImage }

Slide 41

Slide 41 text

let request = AWSS3TransferManagerUploadRequest() request?.bucket = "report-camera" request?.key = "images/original/\ (createAt.timeIntervalSince1970)-\(imageURL.lastPathComponent)" request?.body = imageURL return AWSS3TransferManager.default().upload(request!) S3΁ૹ৴

Slide 42

Slide 42 text

S3΁ૹ৴

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

Demo

Slide 45

Slide 45 text

Recap

Slide 46

Slide 46 text

w ҰਓͰ։ൃ͢Δͷ͸ਏ͍ w ͳΔ΂͘खؒΛ͔͚ͳ͍ w ເΛ༩͑͗͢ͳ͍ w ເΛݟա͗ͳ͍ Recap

Slide 47

Slide 47 text

͋Γ͕ͱ͏͍͟͝·ͨ͠