블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2737)
Unity3D (817)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
04-25 09:56

(Medium, Marvin Liao)

 

원문 보기

 

내가 이 개념을 처음 들은 것은 2012년 친구 니르 이얄(Nir Eyal)로부터 입니다. 지난 10년 동안 실리콘밸리에서 나온 대부분의 인기 서비스는 이 개념을 핵심 기술로 삼았습니다. 이들은 인간 본성의 깊숙한 면을 자극하고 행동을 유도합니다. 이 개념은 바로 가변적 보상(variable rewards)입니다.

 

이 보상은 B.F 스키너가 1950년대 발견한 것으로 그는 이를 보상의 가변적 일정 변화(variable schedule of rewards)라 불렀습니다. 스키너는 실험실의 쥐가 무작위로 보상이 주어질 때 더 열성적으로 변하는 것을 관찰했습니다. 스키너는 쥐가 레버를 눌렀을때 무작위로 작은 보상과 큰 보상, 또는 아무 보상도 받지 못하는 경우를 경험한 쥐들이 레버를 누를때마다 동일한 보상을 받은 다른 쥐들에 비해 레버를 더 열정적으로 누른다는 사실을 발견했습니다.

 

스키너의 상자 속 쥐처럼, 인간 또한 예측 가능성을 갈구하며 패턴이 존재하지 않는 상황에서도 패턴을 찾기 위해 노력합니다. 가변성은 우리 뇌가 가진 인지적 숙적이며 우리 뇌는 자기 통제나 절제와 같은 능력보다 인과관계의 발견을 더 중요하게 생각합니다.

 

틴더의 CPO인 브라이언 노르가드가 폼프(Pomp) 팟캐스트와 가진 인터뷰에는 그들이 이 가변적 보상을 어떻게 사용하는지가 잘 나타나 있습니다.틴더는 가변적 보상을 서비스에 녹여낸 대표적인 예입니다. 이를 통해 틴더는 데이팅 산업의 대표주자가 되었습니다. 실제로 틴더는 역사상 가장 많은 돈을 번 스마트폰 앱 중의 하나이며, 그들은 이 개념을 컴퓨터 게임에서 가져왔다고 말합니다.

 

니르는 이렇게 썼습니다. “사람들은 방해 요소를 없애고 게임을 계속 할 수 있게만 해준다면 무엇에든 동의할 것이다. 가변적 보상은 머리 속을 지배하며 뇌의 방어기제를 무력화시키고 새로운 습관의 씨앗을 뿌릴 기회를 만들어낸다. 흥미로운 것은, 우리는 이런 무아의 경지를 즐거움으로 인식한다는 것이다. 이는 우리 뇌가 새로운 보상을 끊임없이 찾으며 절대 만족하지 않도록 만들어져있기 때문이다.”

 

사람들은 항상 더 쉬운 길(cheat code)를 찾고 무언가를 달성하는 경험을 원합니다. 틴더에는 이를 위해 슈퍼라이크(superlike)와 부스트(boost)기능이 있습니다. 사람들은 이 기능을 매우 사용하고 싶어 합니다.

 

이 서비스들은 또한 극단적으로 단순하게 만들어져 있습니다. 이는 사람들이 이런 서비스를 이용할때 “아무런 생각없이” 사용하도록 하기 위해서입니다. 이는 이 서비스들을 사람들이 수동적으로 소비하도록 만듭니다. 텔레비전, 인스타그램, 페이스북 등을 우리는 말그대로 아무 생각없이 사용합니다.

 

나는 인스타그램과 페이스북을 결국 스마트폰에서 지웠습니다. 아무리 바짝 정신을 차리고 딱 5분만 하겠다고 앱을 켠다 해도 쉽게 몇 시간을 보내곤 했기 때문입니다. 그 정도로 이들 앱은 사람의 정신을 쏙 빼어놓습니다.

 

가변적 보상은 행동 디자인 기술(Behavioral Design methodology)의 핵심 개념입니다. 오늘날 훌륭한 제품 기획자들은 대부분 이 개념을 알고 있으며, 따라서 가장 인기있는 서비스에 이 개념이 들어가 있는 것은 전혀 놀라운 일이 아닙니다. 나는 다른 모든 기술들 처럼 이 기술 역시 그 자체로는 중립적이며 장단점이 모두 있다고 생각합니다. 이 기술은 선하게 쓰일수도 있고 악하게 쓰일수도 있습니다. 하지만 이 기술에 대한 가치 판단과 무관하게, 투자자, 창업자, 소비자, 사용자로서 우리는 이 기술이 오늘날 점점 더 널리 쓰이고 있다는 사실을 알아야 합니다. 이 기술에 대해 더 깊이 이해할수록, 우리는 이를 더 현명하게 사용할 수 있을 것입니다.

 

“체스 판의 말이 되기보다는 말을 움직이는 사람이 되어라” – 랠프 차렐

 

 

[출처] newspeppermint.com/2020/11/26/m-variable/

 

가변적 보상이 가진 강력한 중독성

(Medium, Marvin Liao) 원문 보기 내가 이 개념을 처음 들은 것은 2012년 친구 니르 이얄(Nir Eyal)로부터 입니다. 지난 10년 동안 실리콘밸리에서 나온 대부분의 인기 서비스는 이 개념을 핵심 기술로 삼았

newspeppermint.com

 

반응형
Posted by blueasa
, |

NSUserTrackingUsageDescriptionとは何よ?

iOS14になったデバイスではじめてアプリをビルドすると、クラッシュしてもうた。。。
Xcodeのログは以下

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSUserTrackingUsageDescription key with a string value explaining to the user how the app uses this data.

どうやらNSUserTrackingUsageDescriptionが必要?らしい。

とりあえず公式のドキュメントを読んでみる。

要はinfo.plistに記載するList Keyのことらしい

そして何が目的なのかと言うと、、、

IDFA (Identifier for Advertisers) は、Appleがユーザーの端末にランダムに割り当てるデバイスIDです。 広告主はこのIDを使ってユーザーの広告エンゲージメント 、アプリ内のユーザー行動を計測することで、カスタマイズした広告を配信することができます。
https://www.adjust.com/ja/glossary/idfa/

と言うことらしいので、「適切な広告配信のために、あなたのデバイスに割り当てられたIDを広告主が使用していいっすか?」的な意味かな??

info.plistに値を追加

こちらを参考に、とりあえずValueの部分に文字を入れてみる。

これでkeyとvalueをセットした

お!これが例のIDFAオプトインダイアログですか!
シュミレーターが英語設定なのでオプトインダイアログも英語になっているが、とりあえず問題なさそう。

参考:iOS14で、IDFAオプトインダイアログを出してみる

オプトインダイアログを日本語にする

こちらを参考に、それっぽい日本語文にして、実機でビルドしてみるとちゃんとオプトインダイアログは日本語になってました。

最後に

アプリに広告を出している人はいずれ対応しないといけないっぽいので、お早めに〜

追記

SKAdNetworkItemsを追加する

ここではGoogleがSKAdNetworkを利用できるようにします。
ユーザにIDFAの取得を拒否された場合でもAppleが提供するSKAdNetworkを利用して広告を配信するために利用するものです。
https://d1v1b.com/posts/update_admob_for_ios_app

Info.plistにSKAdNetworkItemsを追加しておいた方が良さそうなので、入れておく

 

 

[출처] qiita.com/kokogento/items/dd44d3e9894966bcb75e

 

iOS 14で必要な?NSUserTrackingUsageDescriptionの設定方法 - Qiita

NSUserTrackingUsageDescriptionとは何よ? iOS14になったデバイスではじめてアプリをビルドすると、クラッシュしてもうた。。。 Xcodeのログは以下 This app has crashed b...

qiita.com

 

 
반응형
Posted by blueasa
, |

[요약]

1. Alt + Space Bar + M

2. 화살표키(→,←,↑,↓) 아무거나 한 번 클릭

3.(2.에서 화면에 안보이면) 마우스 클릭하지 않고 그냥 움직여보기

 

[링크] sawol-today.tistory.com/445

 

[윈도우10] 모니터 화면 밖으로 사라진 창 화면 안으로 옮기는 방법

요즘은 모니터를 기본 2개 이상씩 사용하는 분들이 많은데요, 그러다 보니 간혹 작업하는 창이 모니터 밖으로 나가는 경우가 발생하는 일이 생깁니다. Alt + Tab 을 눌러서 원하는 창을 선택하지

sawol-today.tistory.com

 

반응형
Posted by blueasa
, |

[iOS14+ 대응 관련 FAN SDK 6.2 적용 시 구현 이슈 2가지]

Audience Network SDK(6.2) 최신 버전은 10월 26일에 릴리스되었습니다. 최신 버전에서 강조할 만한 중요한 요구 사항은 두 가지가 있습니다.

 

1. 미디에이션 사용과 무관하게 ‘setAdvertiserTrackingEnabled’ 플래그를 구현하여 데이터로 개인화된 광고를 게재하는지 알려야 합니다.

2.  추천된 SKAdNetwork ID를 Xcode 프로젝트의 Info.plist에 추가하여 광고주가 광고 캠페인의 성공을 측정하도록 합니다.


iOS14에 대응하기 위해 AN SDK 6.2 이상을 적용해야 되는데, iOS에서 FAN SDK 6.2는 위와 같은 2가지 필수 구현사항을 요구하고 있다.

 

현재 나는 Admob 미디에이션을 사용하고, Admob의 FAN 미디에이션 플러그인을 적용해놨는데,

미디에이션이라 하더라도 위 2가지는 적용해야 된다고 한다.

 

위 2가지를 어떻게 적용했는지 정리해 둔다.

 

(※ iOS 플랫폼 대응이니 Android에서는 작동 안하도록 해두자)

1.   ‘setAdvertiserTrackingEnabled’ (이하 ATE) flag 구현

1.1. 광고 추적 활성화

1.1.1. 미디에이션 미 사용 시(AN SDK 직접 적용)

     [링크] developers.facebook.com/docs/audience-network/guides/advertising-tracking-enabled

1.1.2. 미디에이션 사용 시

1.1.2.1. 미디에이션 사용 시에는 아래와 같이 직접 구현해서 사용하라고 설명이 적혀 있다.

          [참조] 미디에이션을 사용 중인 경우 setAdvertiserTrackingEnabled 플래그를 구현한 다음, 미디에이션 SDK를 초기화해야 Facebook에서 입찰 요청을 통해 이를 수신할 수 있습니다.

          ※ 나는 Unity를 사용하고, Admob 미디에이션(GoogleMobileAds)을 사용하기 때문에 유니티에 적용할 수 있는 방식으로 직접 구현이 필요하다.

1.1.2.2. (직접 구현하는 건 귀찮으니)아래 파일을 다운받고, 패키지를 실행해서 AdSettings.cs 파일만 프로젝트에 추가

          [다운로드] Audience Network SDK for Unity

1.1.2.3. Admob 제어 하는 곳에서 Admob 초기화 전에 아래 소스를 추가해서 셋팅해 주자.

         (1.1.2.2.의 파일을 추가하면 아래 소스 실행이 가능해진다.)

// iOS에서만 실행하도록 한다.
#if UNITY_IPHONE && !UNITY_EDITOR
// Set the flag as true 
AudienceNetwork.AdSettings.SetAdvertiserTrackingEnabled(true);
#endif

 

2.   SKAdNetwork IDs Xcode 프로젝트의 Info.plist 추가

2.1. SKAdNetwork ID를 발급받는다.

     [참조 링크] www.wisetracker.co.kr/wp-content/uploads/2020/09/iOS_14_update_guide.pdf

2.2. ID를 Inpo.plist에 추가한다. (아래 보이는 ID는 예시입니다.)

2.2.1. Inpo.Plist에 직접 추가하는 방법(developer.apple.com/documentation/storekit/skadnetwork/configuring_the_participating_apps)

 

※ 아래 2개 SKAdNetworkID는 페이스북 공용 ID이니, FAN을 붙이는거면 그대로 사용하면 된다.

    [참조링크] developers.facebook.com/docs/audience-network/guides/SKAdNetwork

<key>SKAdNetworkItems</key>
<array>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>v9wttpbfk9.skadnetwork</string>
    </dict>
    <dict>   
         <key>SKAdNetworkIdentifier</key>
         <string>n38lu8286q.skadnetwork</string>
    </dict>
</array>

 

2.2.2. Unity에서 PostProcessor로 추가하는 방법(추천)

namespace blueasa
{
    public class XcodeSettingsPostProcessor
    {

        [PostProcessBuild(444)]
        public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
        {

            /// Stop processing if targe is NOT iOS
            if (buildTarget != BuildTarget.iOS)
                return;

            /// Initialize PbxProject
            var projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
            PBXProject pbxProject = new PBXProject();
            pbxProject.ReadFromFile(projectPath);
            string targetGuid = pbxProject.TargetGuidByName("Unity-iPhone");

            /// Add string setting
            // SKAdNetwork IDs integration(for iOS14+)
            // https://blueasa.tistory.com/2482
            // https://blueasa.tistory.com/2493
            var arraySKAdNetworkItems = plist.root.CreateArray("SKAdNetworkItems");
            // for FAN
            // https://developers.facebook.com/docs/audience-network/guides/SKAdNetwork
            var dictSKAdNetworkIdentifier_FAN_1 = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_FAN_1.SetString("SKAdNetworkIdentifier", "v9wttpbfk9.skadnetwork"); // FAN 1
            var dictSKAdNetworkIdentifier_FAN_2 = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_FAN_2.SetString("SKAdNetworkIdentifier", "n38lu8286q.skadnetwork"); // FAN 2
            
            /// Apply editing settings to Info.plist
            plist.WriteToFile(plistPath);

        }
    }
}

 

 

[참조사이트]

developers.facebook.com/blog/post/2020/10/29/preparing-our-partners-ios-14-latest-guidance-on-skadnetwork/?locale=ko_KR

developers.google.com/admob/ios/mediation/facebook?hl=en#swift

 

[SKAdNetwork IDs 참조]

[Admob] developers.google.com/admob/ios/ios14#skadnetwork

[Unity] unityads.unity3d.com/help/ios/skadnetwork-ids?fbclid=IwAR3T6BWG6-SIdWipZaB-PEtUQhg1DAnU_kQ22iiSv4Z5Q6nItq2edtpIIkM

[Unity.xml] skan.mz.unity3d.com/v2/partner/skadnetworks.plist.xml?_ga=2.140049011.1591405619.1607905486-1813266944.1603773122

[Vungle] support.vungle.com/hc/en-us/articles/360002925791-Integrate-Vungle-SDK-for-iOS#3-add-the-%E2%80%9C-objc%E2%80%9D-linker-flag-0-9

[Vungle.xml] vungle.com/skadnetworkids.xml

[AppsFlyer 제공 리스트] docs.google.com/spreadsheets/d/e/2PACX-1vSqwIBW3FzbrXKqluDQ2hEec7zcvVrxQ02ivWsHnGQTvLMeFmHHjGz1R5TVy6_cqAIVh0pAy4Yud7Qx/pubhtml

반응형
Posted by blueasa
, |

목차

1. 소개

2. minSdkVersion

3. targetSdkVersion

4. maxSdkVersion

 

이 포스팅은 안드로이드 SDK Guides의 내용을 기반으로 작성되었습니다.

1. 소개

이클립스가 기본 IDE 였을 때에는 minSdkVersion, targetSdkVersion는 AndroidManifest.xml에 설정했습니다. 아래가 사용법입니다.

 

<uses-sdk android:minSdkVersion="integer"

         android:targetSdkVersion="integer"

         android:maxSdkVersion="integer" />

 

하지만 Android Studio로 넘어오면서 build.gradle 파일에 옮겨지게 되었습니다.

 

defaultConfig {

  applicationId "com.tistory.kkangeva.materialdesign"

  minSdkVersion 21

  targetSdkVersion 22

  versionCode 1

  versionName "1.0"

}

 

SdkVersion이라는 이름을 가지고 있지만 실제로 기입해야 하는 것은 API Level입니다. Android Platform의 버전도 아니구요. 차이점을 볼까요? 아래는 포스팅을 쓰는 날짜 기준으로 최신의 버전을 기입한 것입니다.

 

 

전혀 연관성이 없습니다. 참고로 API Level은 항상 양의 정수 값입니다.

 

2. minSdkVersion

안드로이드 앱이 실행될 수 있는 최소한의 API 레벨을 의미합니다. 만약에 앱이 선언해 놓은 버전보다 디바이스의 버전이 낮을 경우에는 앱이 인스톨되지 않습니다.

 

앱 개발시 필수적으로 선언해야 하는 필드이며 만약에 선언을 하지 않았을 경우 ‘1’이 디폴트로 선정됩니다.

3. targetSdkVersion

안드로이드 앱의 타겟 API 레벨을 의미합니다. 만약 선언이 되어 있지 않다면 minSdkVersion과 동일한 값으로 간주됩니다. ‘타겟 API’의 개념은 해당 앱이 개발시에 테스트 되어진 API 레벨을 의미합니다. 당연히 targetSdkVersion은 minSdkVersion 보다 같거나 높을 수 밖에 없습니다. 하지만 targetSdkVersion이 높다고 하더라도 앱은 minSdkVersion에서도 인스톨 및 실행할 수 있습니다.

 

그럼 targetSdkVersion은 언제 사용이 될까요?

 

당연하겠지만 안드로이드 API 버전이 올라가면서 플랫폼이 조금씩 바뀌게 됩니다. 아래의 상황을 가정해봅시다.

 

  • App API Level : miSdkVersion : 4 / targetSdkVersion : 7

  • Platform API level : 10

 

이 상황에서는 당연히 앱을 인스톨하고 실행하는데에 전혀 무리가 없습니다. 하지만 만약 안드로이드 API가 7버전에서 10버전으로 오면서 앱 실행과 관련된 API에 변경이 생겼다면 어떻게 될까요? 이 경우 앱의 실행이 개발자의 예상과 달라질 가능성이 있습니다. 때문에 안드로이드 플랫폼에서는 하위 호환성 관련 기능을 활성화를 시키고 앱을 실행시켜야 합니다. 즉, 최초 릴리즈시의 동작성을 최대한 보장하기 위해서 안드로이드 플랫폼에게 정보를 알려주는 역할을 담당하는 필드입니다.

 

앱을 유지보수 하는 입장에 대해서 이야기를 해봅시다. 신규 기능을 추가하지 않는 이상 minSdkVersion이 높아질 가능성은 없습니다. 하지만 버그 수정이나 로직 수정 등의 이유로 앱을 버전업 할 때, targetSdkVersion은 항상 업데이트 하는 게 좋습니다.

4. maxSdkVersion

안드로이드 앱이 실행될 수 있는 최대한의 API Level을 의미합니다. 지금까지의 지식을 바탕으로 앱은 [minSdkVersion ~ maxSdkVersion] 사이의 디바이스에 인스톨 및 실행이 가능하다는 거죠. 조금 더 알아봅시다.

 

아마도 API Level이 높아지면서 기존의 API들이 사라지거나 수정되는 것을 감안한 필드였을 것으로 생각됩니다. 하지만 이 필드는 아래의 문제점 및 제약사항을 가지고 있습니다.

 

  • 향후 API가 어떻게 바뀔지 예측할 수 없으므로 앱을 개발하는 시점에서는 maxSdkVersion을 알 수 없습니다.

  • ‘하위 호환성’은 유지하지 않는다는 주장과 동일합니다.

  • 플랫폼이 안정화가 되면 하위 호환성을 유지하는 형태로 발전합니다. 따라서 이 필드는 일시적으로 사용될 가능성이 높습니다.

 

개발자 문서에서도 더이상 이 필드를 사용하지 말라고 합니다.

 

기존의 안드로이드 버전들에서는 (1.5, 1.6, 2.0, 2.0.1) 이 값을 앱 인스톨시에 사용했다고 합니다. 만약 플랫폼의 API Level이 maxSdkVersion 보다 높을 경우 인스톨이 거부되었습니다. 만약 소프트웨어 업데이트로 플랫폼의 버전을 높일 경우에도 이미 인스톨되어 있던 앱들을 뒤져서 maxSdkVersion이 낮은 앱을 제거 했었습니다. (생각해보면 인스톨 된 앱을 지워버리는 정책은 어이없는 것 같네요. 소프트웨어 업데이트를 했더니 잘 쓰고 있던 SNS가 지워진 상황이라니!)

 

하지만 최신의 안드로이드 버전에서는 (2.0.1 이후) 더이상 maxSdkVersion을 체크하지 않는다고 합니다. 심지어 maxSdkVersion이 설정되어 있으면 컴파일도 실패한다고 하네요. 하지만 이미 포함되어서 앱스토어에 올라가 있는 앱의 경우에는 구글 플레이 앱스토어에서 필터링에 사용된다고 합니다.



출처: https://kkangeva.tistory.com/58 [kkangeva의 IT]

 

minSdkVersion와 targetSdkVersion 정확하게 사용하기

목차 1. 소개 2. minSdkVersion 3. targetSdkVersion 4. maxSdkVersion 이 포스팅은 안드로이드 SDK Guides의 내용을 기반으로 작성되었습니다. 1. 소개 이클립스가 기본 IDE 였을 때에는 minSdkVersion, targetSd..

kkangeva.tistory.com

 

반응형
Posted by blueasa
, |

Error: 

Finally solved the problem. Need to update CocoPods.sudo gem install cocoapods

 

sudo gem install cocoapods

 

 

[출처]

stackoverflow.com/questions/64623288/framework-not-found-usermessagingplatform-xcframework-in-react-native

 

framework not found UserMessagingPlatform.xcframework in react native

I update my react native project after I encountered an error in xcode there is no problem in android Error: My new package.json "@react-native-firebase/admob": "^7.6.10", "@

stackoverflow.com

 

반응형
Posted by blueasa
, |

[링크] https://december.tistory.com/1522

샤오미 미지아 D260 물걸레 청소기 분해 수리

샤오미 미지아 D260 물걸레 청소기 분해 수리 일단 분해하기 위해서는 봉을 분리해 준다. 봉을 빼고 제품을 뒤집어서 분해하면 작업하기가 편하다. 금속 부분을 눌러서 빼준다. 참고로 아래 육각

december.tistory.com

반응형
Posted by blueasa
, |