'Dev'에 해당되는 글 32건
2011. 10. 20. 13:34
public static Mesh CreatePlaneMesh(string name, int widthSegments, int heightSegments, int width, int height, bool vertical) { int width_segments = Mathf.Clamp(widthSegments, 1, 254); int height_segments = Mathf.Clamp(heightSegments, 1, 254); Mesh m = new Mesh(); m.name = name; int hCount2 = width_segments + 1; int vCount2 = height_segments + 1; int numTriangles = width_segments * height_segments * 6; int numVertices = hCount2 * vCount2; Vector3[] vertices = new Vector3[numVertices]; Vector2[] uvs = new Vector2[numVertices]; Color[] colors = new Color[numVertices]; int[] triangles = new int[numTriangles]; int index = 0; float uvFactorX = 1.0f / width_segments; float uvFactorY = 1.0f / height_segments; float scaleX = width / width_segments; float scaleY = height / height_segments; float halfWidth = width / 2.0f; float halfHeight = height / 2.0f; float realX = -halfWidth; float realY = -halfHeight; for (float y = 0.0f; y < vCount2; y++) { for (float x = 0.0f; x < hCount2; x++) { if (vertical) { vertices[index] = new Vector3(x * scaleX + realX, y * scaleY + realY, 0.0f); } else { vertices[index] = new Vector3(x * scaleX + realX, 0.0f, y * scaleY + realY); } uvs[index++] = new Vector2(x * uvFactorX, y * uvFactorY); } } index = 0; for (int y = 0; y < height_segments; y++) { for (int x = 0; x < width_segments; x++) { triangles[index] = (y * hCount2) + x; triangles[index + 1] = ((y + 1) * hCount2) + x; triangles[index + 2] = (y * hCount2) + x + 1; triangles[index + 3] = ((y + 1) * hCount2) + x; triangles[index + 4] = ((y + 1) * hCount2) + x + 1; triangles[index + 5] = (y * hCount2) + x + 1; index += 6; } } m.vertices = vertices; m.uv = uvs; m.colors = colors; m.triangles = triangles; m.RecalculateNormals(); return m; }
'Dev > Unity3D' 카테고리의 다른 글
Unity, Audio, and Memory (0) | 2012.01.25 |
---|---|
unity3d data path! (0) | 2011.12.14 |
Unity3D Inspector object 선택후 일괄 처리 (0) | 2011.07.02 |
Unity3D 에서 XML Serialize Encrypt/Decrypt. (3) | 2011.04.22 |
FindObjectOfType fail. (0) | 2010.12.14 |
2011. 7. 27. 14:19
Eclipse 에서 Android Library 로 다른 프로젝트 추가해서 사용할 경우
Eclipse 에서 생성한 R.java 와 unity 에서 생성한 R.java 의 id 들이 틀려서 리소스들이 꼬인다..
이럴땐 http://limchaeng.tistory.com/24 에서 merge 한 resource 들을 가지고
Ant 에서 수동으로 R.java(패키지별로) 만들고 그걸 이용해서 Ant 에서 compile 한후 jar 로 묶고
unity 에서 사용하면 된다.
*R.java 만든는 Ant code
<property name="aapt" location="${sdk.dir}/platforms/${target}/tools/aapt.exe" />
<target name="build-aapt" depends="copy-resource">
Eclipse 에서 생성한 R.java 와 unity 에서 생성한 R.java 의 id 들이 틀려서 리소스들이 꼬인다..
이럴땐 http://limchaeng.tistory.com/24 에서 merge 한 resource 들을 가지고
Ant 에서 수동으로 R.java(패키지별로) 만들고 그걸 이용해서 Ant 에서 compile 한후 jar 로 묶고
unity 에서 사용하면 된다.
*R.java 만든는 Ant code
<property name="aapt" location="${sdk.dir}/platforms/${target}/tools/aapt.exe" />
<target name="build-aapt" depends="copy-resource">
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${output.gen.absolute.dir}" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${unity3dresource.absolute.dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
</target>
*compile code
<target name="build-class" depends="build-aapt" >
<echo>Build Classes</echo>
<javac target="1.6" extdirs=""
destdir="${output.classes.absolute.dir}"
bootclasspathref="android.target.classpath"
includeantruntime="false">
<src path="${output.gen.absolute.dir}" />
<src path="${source.absolute.dir}" />
<!-- 링크된 라이브러리들의 소스도 컴파일해준다. -->
<src path="${android.library.reference.1}/src" />
<src path="${android.library.reference.2}/src" />
<src path="${android.library.reference.3}/src" />
<classpath>
<fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
<fileset dir="${twitter.libs.absolute.dir}" includes="*.jar" />
<!-- ************************************************** -->
<!-- 여기에 외부 라이브러리들을 넣어준다. -->
<fileset dir="${unity3dlibrary.absolute.dir}" includes="*.jar" />
<!-- ************************************************** -->
</classpath>
</javac>
</target>
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${output.gen.absolute.dir}" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${unity3dresource.absolute.dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
</target>
*compile code
<target name="build-class" depends="build-aapt" >
<echo>Build Classes</echo>
<javac target="1.6" extdirs=""
destdir="${output.classes.absolute.dir}"
bootclasspathref="android.target.classpath"
includeantruntime="false">
<src path="${output.gen.absolute.dir}" />
<src path="${source.absolute.dir}" />
<!-- 링크된 라이브러리들의 소스도 컴파일해준다. -->
<src path="${android.library.reference.1}/src" />
<src path="${android.library.reference.2}/src" />
<src path="${android.library.reference.3}/src" />
<classpath>
<fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
<fileset dir="${twitter.libs.absolute.dir}" includes="*.jar" />
<!-- ************************************************** -->
<!-- 여기에 외부 라이브러리들을 넣어준다. -->
<fileset dir="${unity3dlibrary.absolute.dir}" includes="*.jar" />
<!-- ************************************************** -->
</classpath>
</javac>
</target>
'Dev > Android' 카테고리의 다른 글
Unity3d Android Plugin Guide - UnityPlayer 상속 받아 사용하기. (0) | 2011.07.19 |
---|---|
Unity3d Android Plugin Guide - Resource Merge (5) | 2011.07.19 |
Unity3d Android Plugin Guide - Main Activity 변경하기. (0) | 2011.07.19 |
2011. 7. 19. 16:19
메인 activity 를 변경해서 사용( http://limchaeng.tistory.com/23 ) 시 UnityPlayer 상속 받아서 사용 할 수 있다.
onPause() 시 OpenGL surface 변경 관련해서 notify 를 받기 위해 사용했다...
public class OverriderUnityPlayer extends UnityPlayer { public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) { // TODO Auto-generated method stub super.onSurfaceCreated(arg0, arg1); } }
'Dev > Android' 카테고리의 다른 글
Unity3d Android Plugin Guide - R.java (1) | 2011.07.27 |
---|---|
Unity3d Android Plugin Guide - Resource Merge (5) | 2011.07.19 |
Unity3d Android Plugin Guide - Main Activity 변경하기. (0) | 2011.07.19 |
2011. 7. 19. 15:29
* jar 안의 resource 접근 안됨.
* jar 안에 res 폴더랑 /Assets/Plugins/Android/res/ 에 같은 resource 있으면 build 할때 에러남.
* /Assets/Plugins/Android/res/ 폴더의 하위폴더들이 android 표준에 맞지 않으면 build 할때 에러남.
1. 모든 resource 는 /Assets/Plugins/Android/res/ 아래에 있어야 함.
2. 외부 리소스 사용시 unity3d 설치폴더/Unity/Editor/Data/PlaybackEngines/androidplayer/res 에 있는 리소드들을 eclipse android project 상의 res 폴더에 포함시킨후 사용해야 함.(이건, eclipse 에서 build 된 resource id 들과 unity3d 에서 build 할때의 resource id 들을 맞춰주기 위함이다.. 이걸 하지 않으면 리소스 접근할때 리스소들이 꼬인다...--; )
3. 공통으로 쓰는 리소스들 (strings.xml, styles.xml, 등등) 은 수동으로 합쳐준다. (unity 설치폴더/Unity/Editor/Data/PlaybackEngines/androidplayer/res/values/ 에 있는 내용도 포함시켜야 한다.)
4. gen 에서 만들어진 파일들도 모두 /Assets/Plugins/Android/gen 폴더에 복사해야 함.(이건 꼭 필요한지 기억이 나지않는데...unity3d packaging 시 사용하는것 같았던 기억이.....필요하니까 추가 했을것이다.ㅋㅋ). <- 이건 없어도 된다는것을 확인했음..
5. res/ 폴더 규칙에 맞지 않는 리소스들은 /Assets/Plugins/Android/assets 폴더에 넣어 두면 사용 가능함.
6. build 시 package 에러 나면 중복된 resource 가 있는지..res 폴더 규칙이 맞는지..등등 검사해야함.
7. 만약 resouece들이 이상하게 나온다면 eclipse 상에서 만들어지 R.java 와 unit3d 에서 만들어지 R.java 를 비교해서 맞는지 검사후 틀리면 리소스들 잘 정리해야 함. --; (unity3d 에서 만들어진 R.java 는 /유니티프로젝트폴더/Temp/StagingArea/gen 폴더에서 확인 할 수 있음.
'Dev > Android' 카테고리의 다른 글
Unity3d Android Plugin Guide - R.java (1) | 2011.07.27 |
---|---|
Unity3d Android Plugin Guide - UnityPlayer 상속 받아 사용하기. (0) | 2011.07.19 |
Unity3d Android Plugin Guide - Main Activity 변경하기. (0) | 2011.07.19 |
2011. 7. 19. 14:44
자신이 만든 activity 를 main 으로 사용하기 위한 작업.
1. Unity\Editor\Data\PlaybackEngines\androidplayer\src\com\unity3d\player\UnityPlayerActivity.java 파일 의 내용을 자신이 사용할 메인 activity 에 복사한다. (unity 엔진 구동을 위한 내용이 들어있다.)
ex) CustomUnityPlayerActivity.java <- UnityPlayerActivity.java 내용 복사
: full name : com.simple.unity.CustomUnityPlayerActivity
2. 새로 만든 activity 를 jar 로 묶은 다음 /Assets/Plugins/Android/ 폴더에 복사하고
2. 새로 만든 activity 의 컴파일이 완료되면 컴파일된 *.class 파일을 jar 로 묶은 다음 /Assets/Plugins/Android/ 폴더에 복사하고.
ex) bin 폴더에 컴파일이 된다면 : bin/com/simple/unity/CustomUnityPlayerActivity.class
: /com/simple/unity/CustomUnityPlayerActivity.class 를 CustomUnityPlayerActivier.jar 로 묶는다.
3. AndroidManifest.xml 의 내용 변경.(이것은 PlayerSetting 에서 셋팅하고 나서 build 를 한번 하면 /프로젝트폴더/Temp/ 폴더 아래에 StagingArea 폴더가 생기는데 그 밑에 보면 PlayerSetting 에서 셋팅한 내용이 적용된 AndroidManifest.xml 을 가져올수 있다.
내용을 복사해서 /Assets/Plugins/Android/AndroidManifest.xml 을 새로 만든후 이 파일에서
<activity android:name="com.unity3d.player.UnityPlayerActivity"
<activity android:name="com.simple.unity.CustomUnityPlayerActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
위와 같이 수정하고 /Assets/Plugins/Android/ 폴더에 3번에서 새로 만든 AndroidManifest.xml 을 넣어 놓으면 자신이 만든 activity 를 메인으로 사용할 수 있다..
1. Unity\Editor\Data\PlaybackEngines\androidplayer\src\com\unity3d\player\UnityPlayerActivity.java 파일 의 내용을 자신이 사용할 메인 activity 에 복사한다. (unity 엔진 구동을 위한 내용이 들어있다.)
ex) CustomUnityPlayerActivity.java <- UnityPlayerActivity.java 내용 복사
: full name : com.simple.unity.CustomUnityPlayerActivity
2. 새로 만든 activity 를 jar 로 묶은 다음 /Assets/Plugins/Android/ 폴더에 복사하고
2. 새로 만든 activity 의 컴파일이 완료되면 컴파일된 *.class 파일을 jar 로 묶은 다음 /Assets/Plugins/Android/ 폴더에 복사하고.
ex) bin 폴더에 컴파일이 된다면 : bin/com/simple/unity/CustomUnityPlayerActivity.class
: /com/simple/unity/CustomUnityPlayerActivity.class 를 CustomUnityPlayerActivier.jar 로 묶는다.
3. AndroidManifest.xml 의 내용 변경.(이것은 PlayerSetting 에서 셋팅하고 나서 build 를 한번 하면 /프로젝트폴더/Temp/ 폴더 아래에 StagingArea 폴더가 생기는데 그 밑에 보면 PlayerSetting 에서 셋팅한 내용이 적용된 AndroidManifest.xml 을 가져올수 있다.
내용을 복사해서 /Assets/Plugins/Android/AndroidManifest.xml 을 새로 만든후 이 파일에서
<activity android:name="com.unity3d.player.UnityPlayerActivity"
<activity android:name="com.simple.unity.CustomUnityPlayerActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
위와 같이 수정하고 /Assets/Plugins/Android/ 폴더에 3번에서 새로 만든 AndroidManifest.xml 을 넣어 놓으면 자신이 만든 activity 를 메인으로 사용할 수 있다..
'Dev > Android' 카테고리의 다른 글
Unity3d Android Plugin Guide - R.java (1) | 2011.07.27 |
---|---|
Unity3d Android Plugin Guide - UnityPlayer 상속 받아 사용하기. (0) | 2011.07.19 |
Unity3d Android Plugin Guide - Resource Merge (5) | 2011.07.19 |
2011. 7. 2. 01:24
아래 코드는 Texture 들을 선택해서 일괄적으로 포멧을 변경하는 코드입니다.
응용하면 다른 타입도 가능합니다.
아래 코드는 Assets/Editor/CusomMenu.cs 에 생성하셔야 합니다.
응용하면 다른 타입도 가능합니다.
아래 코드는 Assets/Editor/CusomMenu.cs 에 생성하셔야 합니다.
using UnityEditor; using UnityEngine; using System.Collections; public class CustomMenu : ScriptableObject { // ---------------------------------------------------------------------------- [MenuItem ("CustomMenu/Texture Format")] static void ChangeTexture() { SeletedChangeTexture(); } static void SeletedChangeTexture() { Object[] textures = GetSelectedTextures(); Selection.objects = new Object[0]; int count = 0; foreach(Texture2D texture in textures) { count++; string path = AssetDatabase.GetAssetPath(texture); TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter; //texture.wrapMode = TextureWrapMode.Clamp; textureImporter.textureType = TextureImporterType.Advanced; textureImporter.mipmapEnabled = false; textureImporter.npotScale = TextureImporterNPOTScale.None; textureImporter.maxTextureSize = 4096; textureImporter.textureFormat = TextureImporterFormat.AutomaticTruecolor; AssetDatabase.ImportAsset(path); Debug.Log(string.Format("[{0}/{1}] ChangeTexture progress : {2}", count, textures.Length, path)); } } static Object[] GetSelectedTextures() { return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets); } }
'Dev > Unity3D' 카테고리의 다른 글
unity3d data path! (0) | 2011.12.14 |
---|---|
Unity3D Mesh Create Code (0) | 2011.10.20 |
Unity3D 에서 XML Serialize Encrypt/Decrypt. (3) | 2011.04.22 |
FindObjectOfType fail. (0) | 2010.12.14 |
Unity Script 와 Obejct-C 연동. (0) | 2010.11.09 |
2011. 4. 22. 22:19
1. Encrypt
//-----------------------------------------------------------------------------
public static void SerializeEncryptObject(string path, object obj, System.Type type, SymmetricAlgorithm key)
{
using(FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
using(CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write))
{
using(StreamWriter sw = new StreamWriter(cs, Encoding.UTF8))
{
try
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(type);
serializer.Serialize(sw, obj, ns);
}
catch (System.Exception ex)
{
Debug.LogWarning(ex.ToString());
}
finally
{
sw.Close();
cs.Close();
fs.Close();
}
}
}
}
}
2. Decrypt
//-----------------------------------------------------------------------------
public static string LoadXmlFromEncryptFile(string _filePath, SymmetricAlgorithm key)
{
if (File.Exists(_filePath) == false)
{
_deserializeErrorString = System.String.Format("File({0}) does not exists", _filePath);
return "";
}
using(FileStream fs = File.Open(_filePath, FileMode.Open))
{
using(CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read))
{
using(StreamReader sr = new StreamReader(cs, Encoding.UTF8))
{
try
{
return sr.ReadToEnd();
}
catch(System.Exception ex)
{
Debug.LogWarning(ex.ToString());
_deserializeErrorString = ex.ToString();
}
finally
{
sr.Close();
cs.Close();
fs.Close();
}
}
}
}
return "";
}
3. Usage
-
private readonly string SECRET_KEY = "12345678"; // must be 64bit, 8bytes
-
private System.Security.Cryptography.DESCryptoServiceProvider mCryptoProvider = null;
-
mCryptoProvider = new System.Security.Cryptography.DESCryptoServiceProvider();
mCryptoProvider.Key = System.Text.ASCIIEncoding.ASCII.GetBytes(SECRET_KEY); mCryptoProvider.IV = System.Text.ASCIIEncoding.ASCII.GetBytes(SECRET_KEY);
-
SerializeEncryptObject("FilePath", Type, mCryptoProvider);
string xmlString = LoadXmlFromEncryptFile("FilePath", mCryptoProvider);
//-----------------------------------------------------------------------------
public static void SerializeEncryptObject(string path, object obj, System.Type type, SymmetricAlgorithm key)
{
using(FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
using(CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write))
{
using(StreamWriter sw = new StreamWriter(cs, Encoding.UTF8))
{
try
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(type);
serializer.Serialize(sw, obj, ns);
}
catch (System.Exception ex)
{
Debug.LogWarning(ex.ToString());
}
finally
{
sw.Close();
cs.Close();
fs.Close();
}
}
}
}
}
2. Decrypt
//-----------------------------------------------------------------------------
public static string LoadXmlFromEncryptFile(string _filePath, SymmetricAlgorithm key)
{
if (File.Exists(_filePath) == false)
{
_deserializeErrorString = System.String.Format("File({0}) does not exists", _filePath);
return "";
}
using(FileStream fs = File.Open(_filePath, FileMode.Open))
{
using(CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read))
{
using(StreamReader sr = new StreamReader(cs, Encoding.UTF8))
{
try
{
return sr.ReadToEnd();
}
catch(System.Exception ex)
{
Debug.LogWarning(ex.ToString());
_deserializeErrorString = ex.ToString();
}
finally
{
sr.Close();
cs.Close();
fs.Close();
}
}
}
}
return "";
}
3. Usage
-
private readonly string SECRET_KEY = "12345678"; // must be 64bit, 8bytes
-
private System.Security.Cryptography.DESCryptoServiceProvider mCryptoProvider = null;
-
mCryptoProvider = new System.Security.Cryptography.DESCryptoServiceProvider();
mCryptoProvider.Key = System.Text.ASCIIEncoding.ASCII.GetBytes(SECRET_KEY); mCryptoProvider.IV = System.Text.ASCIIEncoding.ASCII.GetBytes(SECRET_KEY);
-
SerializeEncryptObject("FilePath", Type, mCryptoProvider);
string xmlString = LoadXmlFromEncryptFile("FilePath", mCryptoProvider);
'Dev > Unity3D' 카테고리의 다른 글
Unity3D Mesh Create Code (0) | 2011.10.20 |
---|---|
Unity3D Inspector object 선택후 일괄 처리 (0) | 2011.07.02 |
FindObjectOfType fail. (0) | 2010.12.14 |
Unity Script 와 Obejct-C 연동. (0) | 2010.11.09 |
Unity3D 3.0 과 OpenFeint 2.7.4 연동 (4) | 2010.11.02 |
2011. 1. 14. 16:37
[Dev/iOS]
잘 되던 놈이 이 에러를 자꾸 내보낸다..
iPhone 에 심어져 있던 app 을 완전 삭제후 다시 설치해서 하니 잘 작동된다.
(provisioning 파일을 갱신해서 그런가~? 흠..)
iPhone 에 심어져 있던 app 을 완전 삭제후 다시 설치해서 하니 잘 작동된다.
(provisioning 파일을 갱신해서 그런가~? 흠..)
'Dev > iOS' 카테고리의 다른 글
iOS Model 정보! (0) | 2012.05.10 |
---|---|
[iOS] Application 디렉토리에 있는 파일을 Documents 디렉토리로 복사하는 예제. (0) | 2011.11.04 |
App 안에 Store Link 달기 (0) | 2011.01.10 |
[Xcode] Build and Archive (1) | 2010.12.22 |
objective C category 내 동일한 함수들 (0) | 2010.12.22 |
2011. 1. 10. 15:03
[Dev/iOS]
Application 안에 특정 Application 에 대한 AppStore 링크를 넣을 필요가 있는 경우가 있습니다.
그래서, 사용자가 프로그램에서 특정 버튼을 터치 하면 응용 프로그램이 종료되면서
iPhone /iPod Touch 안의 AppStore 프로그램이 실행되고, 곧장 정해진 프로그램의 페이지로 이동됩니다.
예를 들어, 가장 쉽게 생각할 수 있는 경우로 Full Version - Lite Version 의 두 가지 버전을 릴리즈해서 운영하는 경우를 생각해 볼 수 있겠습니다.
이
경우, 무료로 배포되는 Lite 버전(즉, Free 버전)안에서 어떤 동작을 하면 유료 버전을 구입할 수 있는 앱스토어 페이지가
나타나도록 하면 좋을 것입니다. 물론, 현재는 무료 버전 안에서도 유료 구매가 가능하도록 '프로그램 안에서 구매' 기능이
허용되고 있지만, 각각의 방식에는 장단점이 있는 듯 합니다. 아직 많은 사람들이 가장 전통적인 방법에 속하는 유료/무료 따로
릴리즈 방식을 사용하고 있습니다.
그렇다면, iPhone 프로그램 안에서 앱스토어 링크를 넣는 방법은? 간단히 하자면, 데스크탑에서 iTunes 를 실행한 후 원하는 프로그램의 링크를 얻어서 붙여 넣으면 됩니다. 이 경우 링크는 다음과 같은 형태가 됩니다.
그래서 이것을 사용해서 다음과 같은 코드를 삽입하겠지요.
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunes.apple.com/kr/app/funny-cartoon-face/id333209093?mt=8"]];
그런데, 이것은 동작은 하지만, 몇 가지 문제가 있습니다.
첫
째로, http 프로토콜을 사용한다는 것입니다. 따라서, iPhone 에서 실제 테스트를 해 보면, 사파리 브라우저가 실행된
다음, 몇 단계의 리다이렉션이 수행되고, 다시 브라우저가 자동 종료되면서 AppStore 가 실행됩니다.
분명 사용자들이 짜증날 것입니다.
두 번째로, 이것은 심각한 문제인데, 바로 주소 안에 '국가 정보'가 들어가 있다는 것입니다. 위에서 예로 들은 URL 안에도 'kr' 이라는 경로명이 있어서, 한국 스토어로 지정되어 있습니다.
그래서, 이 URL은 한국 앱스토어 계정으로 사용하고 있는 사용자들에게는 아무 문제가 없지만, 그 이외의 사용자들은 다른 나라 계정으로 바꾸라는 에러 메시지가 나타나게 됩니다.
하
나의 프로그램으로 전 세계 사람들이 다운로드 받아서 사용하는데, 그 안에 내포된 링크는 특정 국가용 AppStore 링크만 넣을 수
있다는 것은 큰 문제가 됩니다. 사용자의 국가 설정을 일일이 확인해서 적당한 링크로 바꾸자면? 생각만 해도 끔찍하군요.
그러면, 먼저 두 번째 문제의 해결책부터 알아봅시다.
애플에서는 앱스토어 링크를 보다 사람이 기억하기 쉬운 형태의 URL을 사용할 수 있도록 지원하고 있습니다. 예를 들어, 위의 링크는 아래의 링크로 대체할 수 있습니다.
프로그램의 이름만으로 쉽게 기억할 수 있는 URL 입니다. 게다가 더 좋은 점은!! 바로 URL 안에 국가를 지정하는 경로명이 없다는 것입니다. 이 하나의 URL 만으로 각 사용자가 가지고 있는 계정에 따라 해당 국가의 스토어 안에서 프로그램을 찾아가게 됩니다.
이
URL 은 따로 신청해서 만들거나 하는 절차가 필요 없습니다. 앱스토어에 등록된 프로그램은 모두 이같은 형태의 URL을 사용할 수
있습니다. 단, 프로그램의 이름이 영문자가 아닌 한글이나, 특수 문자가 들어간 경우에 대해서는 어떻게 사용하는지 아직 찾지
못했습니다.
첫 번째 문제의 해결책으로 돌아가 보겠습니다.
이것도 간단합니다. iPhone Application 안에서 앱스토어 링크를 사용하는 경우, http 프로토콜을 사용하지 말고 다른 것을 사용하면 됩니다. 바로 http:// 대신에 itms:// 을 사용하는 것입니다. 당연히 iPhone 이나 iPod Touch 같은 실제 디바이스에서만 동작합니다. 시뮬레이터에서는 테스트 해볼 수 없습니다.
그래서 결론적으로 다음과 같은 URL을 사용할 수 있을 것입니다.
itms://itunes.com/app/FunnyCartoonFace
itms:// 을 사용하면 사파리 브라우저를 거치지 않고 곧장 AppStore 가 실행될 것입니다. 깔끔합니다.
'Dev > iOS' 카테고리의 다른 글
[iOS] Application 디렉토리에 있는 파일을 Documents 디렉토리로 복사하는 예제. (0) | 2011.11.04 |
---|---|
In App Purchase : invalidProductIdentifiers (1) | 2011.01.14 |
[Xcode] Build and Archive (1) | 2010.12.22 |
objective C category 내 동일한 함수들 (0) | 2010.12.22 |
xcode weak framework (0) | 2010.12.22 |
2010. 12. 22. 12:30
[Dev/iOS]
http://theeye.pe.kr/entry/how-to-use-build-and-archive-on-new-xcode
unable to copy dsym file into archive
: Try setting 'Generate Debug Symbols' to true in the build settings of the target you're trying to build and archive.
unable to copy dsym file into archive
: Try setting 'Generate Debug Symbols' to true in the build settings of the target you're trying to build and archive.
'Dev > iOS' 카테고리의 다른 글
In App Purchase : invalidProductIdentifiers (1) | 2011.01.14 |
---|---|
App 안에 Store Link 달기 (0) | 2011.01.10 |
objective C category 내 동일한 함수들 (0) | 2010.12.22 |
xcode weak framework (0) | 2010.12.22 |
Uninstalling Xcode Developer Tools (0) | 2010.12.21 |