반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

간단하게 Device 분별하는 예제

2012. 12. 13. 06:40 | Posted by 솔웅


반응형
Posted on . Written by



지난주의 튜토리얼을 보셨나요? 보셨다면 Corona 가 다양한 디바이스의 스크린에 어떻게 각각 맞게 object들을 display 하는지 이해하셨을 겁니다. 저희는 이런 다양한 종류의 디바이스에 맞게 작업할 수 있도록 도와주기 위한 technology 를 사용하구 있구요. 또 각 디바이스에 맞는 폰트와 Kindle Fire soft button bar 같이 디바이스 별 특징 적인 부분들도 지원합니다.


Corona는 사용하는 device에 대한 정보를 얻을 수 있도록 하는 API 를 제공합니다. 이 API 를 call 함으로서 꽤많은 정보들을 얻고 그에 따라 어떤 작업을 할 수 있게 되죠. 개발자에게 가장 중요한 가이드 중 하나가 DRY (Don’t Repeat Yourself)죠. 코딩을 중복해서 하지 말라는 얘기 입니다. 아래 예제를 볼까요?


if ( system.getInfo("model") == "iPad" or

system.getInfo("model") == "iPhone" or

system.getInfo("model") == "iPod" ) then


store.init( "apple", transactionCallback )

store.restore()

else

-- IAP isn't yet supported on Amazon or Barnes and Noble so don't start it up.

if ( system.getInfo("model") ~= "Kindle Fire" or system.getInfo("model") ~= "Nook" ) then

store.init( "google", transactionCallback )

store.restore()

end
end

---------- OR ----------

local kindlePadding = 0

if ( system.getInfo("model") == "Kindle Fire" or system.getInfo("model") == "KFJWI" ) then

kindlePadding = 20

end

healthBar.y = healthBar.y - kindlePadding




만약 이 system.getInfo(“model”)을 온 동네에서 다 쓰고 다닌다면 엄청 양이 많은 코딩을 하게 될 겁니다. Amazon 하고 Barnes & Noble 이 새로운 device를 릴리즈 했는데. 그러면 model name들이 증가하겠죠. 현재까지 5개의 다른 Kindle Fire name 들이 있구요 Nook 은 4개가 있습니다.


이런 문제를 해결하기 위해 여러분은 if 문을 써서 간단한 external module 을 만드시면 됩니다.
그러면 위의 코드는 아래처럼 줄어들 수 있겠죠.


if ( device.is_iPad ) then
...
end
 
---------- OR ----------
 
if ( device.isKindleFire ) then
...
end



이렇게 함으로서 여러분은 키보드를 덜 누르고도 코딩을 하실 수 있습니다. 안드로이드 기반의 3가지 다른 플랫폼에 대해 일을 시작하기 전에, 일반 안드로이드 device인지 아니면 Nook이나 Kindle 같은 modified Android platform 인지 먼저 구별하는게 좋을 겁니다.




Assembling the Module


모듈을 하나 만들구요 이 모듈 이름을 device.lua 로 하겠습니다. 구버전에서 사용하던 “module(…, package.seeall)” method를 사용하지 않구요  new module method 를 사용할 겁니다. 아래 처럼 시작하시면 됩니다.




-- Create a table that will contain all of our tests we are setting up.
local M = {}
 
-- Set up some defaults...
M.isApple = false
M.isAndroid = false
M.isGoogle = false
M.isKindleFire = false
M.isNook = false
M.is_iPad = false
M.isTall = false
M.isSimulator = false




이 변수들을 가지고 작업을 하실건데요. 일단 디폴트로 모든 변수들에 false를 대입했습니다. 이제 model name 을 얻고 그것이 device 인지 Corona Simulator 인지를 먼저 구분한다음에 임시로 저장해 두죠.



local model = system.getInfo("model")
 
-- Are we on the Simulator?
if ( "simulator" == system.getInfo("environment") ) then
M.isSimulator = true
end


iPhone 5 가 나왔을 때 주요 이슈는 “tall” device 가 나왔다는 것이었습니다.  일단 이전의 아이폰은  16:9 HDTV shaped screen 이 아니었죠.  그러면 일단 이와 관련해서 16:9 Android devices 에 대한 정보도 같이 retrieve 해야 합니다.  여기서 먼저 전반적인 이해를 하고 넘어가야 할 부분은요. 7인치 tablet 들은 iPhone 4S와 iPhone 5 사이에 있는 디바이스 들입니다. 여기서 일단 우리는 iPhone 3 이나 4 보다 큰 것들을 먼저 추려 낼 겁니다.

320×480 devices 들은 1.5:1 (480/320=1.5) 의 비율을 가지고 있습니다. 그러니까 그것보다 크면 일단 "tall" device" 리스트에 넣겠습니다.



if ( (display.pixelHeight/display.pixelWidth) > 1.5 ) then
M.isTall = true
end
 
-- Now identify the Apple family of devices:
if ( string.sub( model, 1, 2 ) == "iP" ) then
-- We are an iOS device of some sort
M.isApple = true
 
if ( string.sub( model, 1, 4 ) == "iPad" ) then
M.is_iPad = true
end
 
else --...(the rest of the else is below)




그 다음으로는 애플 디바이스를 보겠는데요. 모든 Apple model 들은 iP로 시작합니다. ( iPod, iPad, or iPhone). 그러니까 모델 이름의 첫 두 글자를 보면 됩니다. 만약 iP로 시작하면 이것이 iOS 에서 구동 되는 것이라는 것을 알 수 있죠. 그러면 isApple flag 를 true로 할당합니다.


그리고 그 다음에는 그것이 iPad 인지 아닌지를 알아내야 합니다. 왜냐하면 iPad 와 다른 iOS device 들은 화면 모양에 대한 layout 이 다르게 작업해야 될 수 있거든요.

안드로이드는 저희의 삶을 도전적으로 만들었습니다. 왜냐하면 안드로이드 진영엔 3개의 marketplace 가 있거든요. (Google Play, Amazon, Barnes & Noble). 각각 저마다의 룰이 있어서 그것을 따라야 합니다. Barnes & Noble 같은 경우엔 “no ads” Amazon 같은 경우엔 “no links to Google Play”같은 것들이죠. Google Play 에 맞게만 작업할 수 없는 상황입니다. 그러니까 일단 Google Play 말고 다른 것들을 구별하죠.


위에 언급했듯이 Kindle 과 Nook device 들에는 다양한 모델들이 있습니다. 아래 코드를 계속 보죠.


else
-- Not Apple, so it must be one of the Android devices
M.isAndroid = true
 
-- Let's assume we are on Google Play for the moment
M.isGoogle = true
 
-- All of the Kindles start with "K", although Corona builds before #976 returned
-- "WFJWI" instead of "KFJWI" (this is now fixed, and our clause handles it regardless)
if ( model == "Kindle Fire" or model == "WFJWI" or string.sub( model, 1, 2 ) == "KF" ) then
M.isKindleFire = true
M.isGoogle = false --revert Google Play to false
end
 
-- Are we on a Nook?
if ( string.sub( model, 1 ,4 ) == "Nook") or string.sub( model, 1, 4 ) == "BNRV" ) then
M.isNook = true
M.isGoogle = false --revert Google Play to false
end
 
end


코드를 한번 볼까요? 첫번째 if part 에서는 애플 (Apple) device 일 경우 로직을 만들었습니다. 그러니까 else문 에서는 안드로이드 기기와 관련된 로직을 만들어야 겠죠. 그래서 일단 isGoogle flag를 true로 만들어 놓고 시작했습니다.


그 다음으로는 두 파트에 걸쳐서 나머지 두 marketplace 에 대해 걸러 내겠습니다. 첫번쨰로 Kindle Fire일 경우를 보죠. 이 경우 모델 이름은  KFWFJWI로 시작합니다. 아마존이 4개의 새 Kindle Fire 모델을 릴리즈 했을 때 그 모델 이름들은 KFJWI라고 지었습니다. 처음 Kindle Fire의 모델명은 Kindle Fire였구요. 제 2세대에서는 KFOT로 지었구요. 7인치 HD 모델은 KFTT입니다. 그리고 9인치 모델은 KFJWIKFJWA이구요. (WiFi를 지원하느냐 3G -WAn- 을 지원하느냐에 따라 다릅니다.) 다행스럽게도 모든 모델들에 공통적인 것은 KF or Kindle Fire 입니다.

K로 하면 어떨까 생각 드시나요? 그래도 됩니다. 하지만 안드로이드 디바이스의 수는 질리도록 많습니다. K로만 하면 예외 상황이 발생할 확률이 아주 높습니다.

이제 디바이스가 Kindle Fire 로 확인 되면 isGooglefalse 로 하고  isKindleFire 는  true로 세팅합니다.


이제 Nook 를 체크할 차례죠. 마지막 입니다. 대부분 Barnes & Noble 은 모델 이름이 BRNV 로 시작 됩니다. Nook Color 는 Nook Color를 사용합니다.


여기까지 했으면 다음에 할 일은 앱에 이 정보를 return 하는 것입니다.


-- Return the table "M", providing access to it from where the module is "require"d
return M


Putting it to Work


이것을 앱에서 사용하시려면 프로젝트 시작부분에서 간단하게 그 모듈을 require 하시면 됩니다.


local device = require("device")


그러면 이제 여러분이 필요할 때마다 그것을 불러 와서 사용하시면 됩니다.


if ( device.isApple ) then
store.init( "apple", transactionCallback )
store.restore()
 
elseif ( device.isGoogle ) then
store.init( "google", transactionCallback )
store.restore()
 
end


이렇게 하면 디바이스 체크하는 부분의 코딩이 훨씬 잘 정리가 될 겁니다. 그러면 여러 OS와 여러 Device 에서 구별되서 돌아가도록 앱을 개발할 때 아주 용이하게 사용하실 수 있겠죠. 더군다나 이 device detection 을 external module 로 만들어 놔서 새로운 디바이스가 나왔을 떄 거기에 맞게 수정 작업하는 것도 훨씬 쉬워질 겁니다.

완성된 소스는 아래에 있습니다.



device.lua

이 모듈을 이전 시간에 다뤘던 Ultimate config.lua 와 함께 사용하세요.

현재 market 에 나와있는 모든 디바이스에 맞게 여러분의 앱을 개발하고 빌드할 수 있을겁니다.

그리고 앞으로 새로운 디바이스가 나와도 쉽게 작업을 하실 수가 있을 겁니다.

반응형