From 12c3da59b77b889431b1ba8fc00459460d50d47e Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 03:22:50 +0800 Subject: [PATCH 01/24] add translation to english --- README.md | 386 +++++++++++----------- README.zh.md | 900 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1098 insertions(+), 188 deletions(-) create mode 100644 README.zh.md diff --git a/README.md b/README.md index d47839e..d3f7b2f 100644 --- a/README.md +++ b/README.md @@ -1,131 +1,134 @@ -### 从编码到变现:程序员财务自由之路 +## From Coding to Monetization:Programmer's Financial Freedom Approach +[中文版本/Chinese Version](./README.zh.md) -### 目录 +## Content -* [前言](#前言) -* [定位](#定位) -* [基础篇](#基础篇) - * [语言与工具选择](#语言与工具选择) +* [Foreword](#Foreword) +* [Positioning](#Positioning) +* [Getting Started](#Getting-Started) + * [Language and Tools](#Language-and-Tools) * [Hello, World!](#hello-world) - * [单机版APP](#单机版APP) - * [加个广告条](#加个广告条) - * [注册广告账号](#注册广告账号) - * [验证地址和设置收款信息](#验证地址和设置收款信息) - * [发布APP](#发布APP) - * [广告收益的计算](#广告收益的计算) -* [进阶篇](#进阶篇) - * [需求是根本](#需求是根本) - * [用户体验](#用户体验) - * [哪种广告最适合](#哪种广告最适合) - * [哪家广告商最靠谱](#哪家广告商最靠谱) - * [营销你的产品](#营销你的产品) - * [联网版APP](#联网版APP) - * [云服务](#云服务) -* [高级篇](#高级篇) - * [数据分析](#数据分析) - * [广告优化](#广告优化) - * [支付与内购](#支付与内购) - * [社交营销](#社交营销) - * [广告投放](#广告投放) -* [附录](#附录) - * [互联网营销常用术语](#互联网营销常用术语) - * [如何发布 APP 到 Apple AppStore](#如何发布-app-到-apple-appstore) - * [如何发布 APP 到 Google Play Store](#如何发布-app-到-google-play-store) - * [如何发布 APP 到 360 应用商店](#如何发布-app-到-360-应用商店) - * [如何用 Google Analytics 做用户数据分析](#如何用-google-analytics-做用户数据分析) + * [Simple APP](#simple-APP) + * [Add Ad Banner](#add-ad-banner) + * [Register Ad Account](#register-ad-account) + * [Settings for Payment](#settings-for-payment) + * [Publish APP](#publish-app) + * [Calcuate Ad Revenue](#calculate-ad-revenue) +* [Advanced](#advanced) + * [Demand is Fundamental](#demand-is-foundamental) + * [User Experience](#user-experience) + * [What Ad is Best](#what-ad-is-best) + * [Which Ad Network Shall I Choose](#which-ad-netowrk-shall-i-choose) + * [Promote Your APP](#promote-your-app) + * [Online APP](#online-app) + * [Cloud Service](#cloud-service) +* [Expert](#exert) + * [Data Analysis](#data-analysis) + * [Ad Optimization](#ad-optimization) + * [In-App Purchase](#in-app-purchase) + * [Social Marketing](#social-marketing) + * [Advertising](#advertising) +* [Appendix](#appendix) + * [Internet Marketing Terminology](#internet-marketing-terminology) + * [How to Publish APP to Apple AppStore](#how-to-publish-app-to-app-store) + * [How to Publish APP to Google Play Store](#how-to-publish-app-to-google-play-store) + * [How to Google Analytics for Data Analysis](#how-to-use-google-analytics-for-data-analysis) -### 前言 +### Forword -这本书,是写给程序员看的。 +This book, is written for programmer. -这并不是关于一门编程语言,也不是关于一种设计模式,更不是关于如何评估工程量、如何做项目管理。 +It's not about a programming language, not about a design pattern, and not about how to estimate man-hour, or how to manage project. -这本书是关于:变现(monetization),通俗的说,就是赚钱。 +This book is about: monetization. Simply speaking, how to earn money. -作为程序员,你一定花了大量的时间去学习,掌握了若干种编程语言、用过数十种开发工具。为了设计稳定灵活的架构,你也认真学习和掌握了各种设计模式;为了提高工作效率,你也用了各种成熟的框架以及自动化测试的工具;总之,通过学习,你成为了一个牛B的程序员。 +As a programmer, you must have spent much time to learn, mastered several programming lanugages, used dozens of developing tools. In order to design stable and flexible architecture, you may have learned various design patterns. In order to boost working efficiency, you may have used many mature frameworks and automation testing tools. In short, you become an excellent programmer. -甚至,你也积累了管理的经验,主动学习了项目管理的理论知识、各种研发组织模式,也许会进阶到管理岗位,成为研发团队的负责人或者经理人。 +And, you may even accumulate experience in management, take the initiative to learn the theoretical knowledge of project management, mastered a variety of R&D organizating model, become the R&D team leader or manager. -在大部分的情况下,作为程序员或者研发团队,你按照项目经理 或者 产品经理给的需求,进行需求分析、架构设计、模块划分、接口设计、编码实现、测试、提交版本。这些环节,毫无疑问,是做研发的程序员最为熟悉的流程。 +In most cases, as a programmer or R&D team, you work on requirements analysis, architecture design, module demarcation, interface design, coding implementation, testing, and release versions, as required by the project manager or product manager. These tasks, no doubt, are the most familiar routine work for programmers. -不幸的是,你日常所关注的,仅仅只是研发环节。接受需求,交付版本,这就是产品经理或者甲方让你干的事情。很多在研发领域侵淫多年的研发大牛,也往往并不熟悉软件怎样能够直接带来经济回报。绝大多数的开发者,仅仅关注研发这个环节,甚至仅仅关注在编码这个环节,这是非常局限的。 +Unfortunately, for most programmers, your everyday concerns are just development. Accept requirements, deliver versions, that's all the product manager or the client has you to do. Even many excellent programmers or technical guru, they seldom care how software brings revenue directly. Most developers, just focus on R&D technical work, or even just focus on coding work, which is very limited. -事实上,研发环节,再加上销售、收款、推广、用户支持、维护,这才是软件产生经济回报的完整闭环。 +In fact, R&D, plus sales, payment, promotion, customer support, and maintenance, is the complete closed-loop of software's value chain. -然而,软件怎样直接带来经济回报,这方面的技术文章或者书籍并不多见。这也是我为什么会选择这个角度,作为本书下笔的核心内容。 +This book is about how to start from coding, to get paid, and how to get users. Step by step, on every details. -这本书是关于,如何从编码、到如何接受付款,以及如何获取用户。手把手,教你每一个步骤。 +Once you have mastered how to monetize from your software, youo will be more concerned with user feedback, caring about market needs, and the quality of your products. As they will bring you better financial returns. Then it's not far away to achieve financial freedom. -一旦你掌握软件如何变现的能力,你会更加关心用户反馈、关心市场需求、关心产品质量,因为这些都会为你带来更好的经济收益。实现财务自由,也就并不遥远了。 +If you feel that the content of this book is helpful, please give you support, by staring it. -如果你觉得本书的内容有所帮助,请点赞支持。 +### Positioning -### 定位 +Since it is to talk about earning money, we will not discuss the hard way of outsourcing, in which the business model is to sell limited life time as meney. -既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 +Considering factor of limited man power, time and resource, we will not discuss carrier-class, or enterprise-class large-scale systems. As they require large investment and long research cycle for complex requirement, which is beyond congrol of individuals and small teams. -考虑到人力、时间、成本等因素,我们也暂时不讨论运营级、或者企业级的大型系统。研发周期长、投入大、需求复杂,也超过个人和小团队的掌控。 +We focus on individuals or small teams. In the era of mobile internet, we have heard many miracle stories about individuals or small teams earn lots of money or even grow fast to unicorn enterprise. -在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 +Real story 1: +[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) legend, a small mobile game developed by a Vietnam programmer in 2-3 days, swept the globe in just a few weeks, and bring income of $50,000 US dollors each day. This is undoutedly by chance, lucky guy, but at least, there is a probability of occurrence. -例子1: -[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 +Real story 2: +I know a Polish programmer, who uses the technology of a web page to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. -例子2: -我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 +Real story 3: +I have been working in a company that develops insurance software. The business has developed fairly well, and management tried to IPO. However, they have not been able to take off and IPO yet, because the business model is too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. -例子3: -(请自行谷歌、脑补) +You can find other similar stories, about making good money from mobile apps or games. You may heard, or just google the internet. -我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 +In this book, what we want to explore, is to make full use of limited time and resource, focus on a very narrow area of requirement, to develop a very unique mobile app or small game, publish to global app store, acquire users, and make money. -也许你是技术的大牛,掌握了数十种编程语言、设计模式、前端到后端的全栈开发能力。然而,并不是每项技术,都能够实现快速赚钱的。最艰深、最有趣的技术,未必是最容易赚到钱的技术。有时候,我们要做最容易扩展的架构。有时候,我们要选择最快速开发的技术手段。 +Perhaps, you are a technical guru, who masetered dozens of programming languages, design patterns, front-end to back-end full stack development capabilies. However, not every technology can be used to make quick money. The hardest or most intersting technology, may not be the easiest technology to make money. Sometimes, we need most flexible and scalabe architecture. Sometimes, we have to choose the most rapid development methods. -也许你是刚入门的菜鸟,只会做做网页什么的。那也没有关系,赚钱真正需要的编程技术,其实也可以非常简单。只是有一点,需要什么知识,我们就恶补什么知识。由于技术日新月异,程序员必须是最善于学习的群体。 +Maybe, you are a newbie, just getting started, and only know how to write a webpage. It does not matter. The programming skills required to make money, can also be very simple. Just one thing, if any knowledge is required, we have to learn it quickly. We are in a era of fast changing world, programmers must be good at learning new things. -### 基础篇 +## Getting Started -### 语言与工具选择 +### Language and Tools -开发 APP 的语言与工具,通常与平台密切相关。 -* 如果是 iOS,那通常是 Objective C,开发工具是苹果推出的 [Xcode](https://developer.apple.com/xcode/) (开发工具仅运行于 Mac)。 -* 如果是 Android,那通常是 Java,开发工具是 谷歌推出的 [Android Studio](http://developer.android.com/tools/studio/index.html)(开发工具有跨平台版本)。 -* 如果是 Windows Phone,那就是 C#,开发工具是 微软推出的 [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx)(开发工具仅运行于 Windows)。 +The language and tools for developing apps are often tied to the platform. +* If it is iOS, it is usually Objective C, and the development tools are [Xcode] (https://developer.apple.com/xcode/) from Apple (development tools only run on Mac) toolset. +* If it's Android, it's usually Java, and development tools are Google's [Android Studio] (http://developer.android.com/tools/studio/index.html) (a cross-platform development tool) toolset. +* If it is Windows Phone, that is C #, the development tool is Microsoft's [Visual Studio] (https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx) toolset (only run On Windows)。 -除此之外,还有一些跨平台语言与工具,对于开发者更加友善,可以开发一次,多平台打包发布: -* 可以开发游戏与APP的 HTML5,以 javascript 作为主要的开发语言。 -* 用于开发游戏的 [Cocos2d-X](http://www.cocos2d-x.org/),用的是 C++ 作为主要的开发语言。 -* 用于开发游戏的 [Unity3D](http://unity3d.com/) IDE 以及集成的 MonoDevelop,用的是 C# 作为主要的开发语言。 -* 微软收购的 [Xamarin](https://www.xamarin.com/) 以及赞助的开源项目 [Mono](http://www.mono-project.com/),用来开发 APP,以 C# 作为主要的开发语言。 +In addition, there are some cross-platform languages and tools, more friendly to developers. Develope once, package and release on multiple platforms: +* HTML5, can be used to develop apps and games, javascript is the core language. +* [Cocos2d-X](http://www.cocos2d-x.org/) for game development, C++ is the core language. +* [Unity3D](http://unity3d.com/) IDE and integrated MonoDevelop, C# is the core language. +* [Xamarin](https://www.xamarin.com/) acquired by Microsoft, and its sponsored open source project [Mono](http://www.mono-project.com/), used to develop APP, C# is the core language. -在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。实际上,它也是 github 上最为活跃的语言。它可以用来开发: -* 运行于浏览器内的 Web网页; -* 运行与内嵌浏览器的 单页WebApp; -* 基于 [nodejs](https://nodejs.org/) 的命令行工具; -* 基于 nodejs 的网络云服务; -* 基于 [cordova](http://cordova.apache.org/) 技术的,混合(hybrid) APP。 -* 基于 [react-native](http://www.reactnative.com/) 开发 native UI体验的 APP。 -* 甚至,也能够开发出桌面应用,例如 Adobe Brackets 代码编辑器。 +In the tutorial below, we chose the easiest javascript as the main development language for subsequent content. In fact, it is also the most active language on github. It can be used to develop: +* Web pages, running in browser; +* Single-page WebApp, running in browser; +* Command line tools, based on [nodejs] (https://nodejs.org/); +* Network cloud services, based on nodejs; +* Hybrid APP, based on [cordova] (http://cordova.apache.org/) technology; +* APP with native UI experience, based on [react-native] (http://www.reactnative.com/). +* Even desktop applications, such as the Adobe Brackets code editor, also developed with javascript. -因为它可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 +JavaScript can be used to develop front-end and back-end, code logic can be reused, thereby reducing the skill threshold and development costs. The requirements of the development environment is also very low, as long as there is a friendly code editor, a browser for testing and debugging, that's almost enough. -以下是用 javascript 来做开发的所需要的环境和工具: -* Chrome浏览器,自带开发者工具 和 javascript 控制台,用来运行和调试。 -* [Adobe Brackets](http://brackets.io/) 文本编辑器(如果你习惯 [Sublime Text](http://www.sublimetext.com/) 或者 [Atom](https://atom.io/) 或者 [Visual Studio Code](http://code.visualstudio.com/),也没问题) -* iMac台式机,巨大的27寸屏幕,视野不受限制;Mac OS X命令行非常强大方便,通过 [MacPorts](https://www.macports.org/) 或者 [Homebrew](http://brew.sh/),Linux 上有的命令行工具或者 library 都基本支持。 -* Xcode(只有 Mac 版本),要调试 iOS APP,有台 iMac电脑或者 MacBook笔记本电脑,这也是必备的。 -* Android Studio,用来调试 Android APP。 +The following are the the necessary environment and tools for development with javascript: +* Chrome browser, comes with developer tools and javascript console for running and debugging. +* [Adobe Brackets] (http://brackets.io/) text editor (if you're used to [Sublime Text] (http://www.sublimetext.com/) or [Atom] (https://atom.io /) Or [Visual Studio Code] (http://code.visualstudio.com/), no problem) +* iMac, with a huge 27-inch screen, really wide view for many windows, MacBook or Air is also okay; +* Mac OS X command line is very powerful, and convenient to support most LInux tools through [MacPorts] (https://www.macports.org/) or [Homebrew] (http: // brew.sh/). +* Xcode (Mac version only), must-have to build and debug iOS apps. +* Android Studio, used to build and debug Android APP. -如果你习惯了 Windows 也没有一台 Mac,会稍微麻烦一点。不过也是有方法的,有一些专门提供编译、打包的云服务,例如 Adobe PhoneGap Build,或者 Intel XDK,我们后面会介绍如何使用。 +If you get used to Windows and do not have a Mac, it's also okay, you can develop for Android at hand. As to iOS, you may need some online service for apps building and packaging, like Adobe PhoneGap Build, or Intel XDK, etc. You can google how to use them. + +But, a Mac is still recommended, for both Android and iOS development. ### Hello, World! -用 javascript 开发前端,其实需要的是 3 项相关的语言:HTML / javascript / CSS。 -* HTML 负责内容 -* javascript 负责逻辑 -* CSS 负责渲染表现 +To development frond-end app with javascript, in fact, there are three closely related languages: HTML / javascript / CSS. +* HTML is responsible for the content. +* javascript is responsible for logic. +* CSS is responsible for rendering. -以下是一个简单的例子: +Here is a simple example: ```html @@ -162,62 +165,67 @@ h1 { } ``` -用 Chrome 浏览器打开它,于是我们看到如下的展示: -* 上面的浏览器主窗口,显示了 HTML 的内容,并且用 CSS 指定的格式和效果进行了渲染。 -* 下面打开 Chrome 的 console 窗口,则显示了 javascript 调用 console.log() 输出的调试信息。 +Open it with Chrome and we see the following display: +* The main browser window above shows the contents of the HTML and is rendered in the format and effect specified by the CSS. +* Open the Chrome console window, it shows the javascript call console.log () output debugging information. ![HelloWorld](demo/helloworld.png) -用 HTML5 / javascript 做开发,入门就是这么简单。 +Using HTML5 / javascript to do development, getting started is as simple as that. + +If you need to develop high-quality apps, you need to master HTML / CSS and javascript, especially HTML5 / CSS3, master HTML DOM and some javascript libraries, such as [jQuery] (https://jquery.com/), etc. Here are some free tutorials for getting started: +* [HTML series tutorial] (http://www.w3school.com.cn/h.asp) +* [JavaScript Tutorial] (http://www.w3school.com.cn/js/index.asp) +* [JavaScript Advanced Tutorial] (http://www.w3school.com.cn/js/index_pro.asp) + +Through these tutorials, you can learn: +* A simple index.html page; +* A unified main.css file that controls and adjusts the presentation of interface elements +* A set of javascript files that enable dynamic presentation and switching of content through access to the HTML DOM. -如果需要开发出高质量的 APP,需要熟练掌握 HTML/CSS 和 javascript,尤其是 HTML5 / CSS3,掌握 HTML DOM 以及 javascript 的一些常见库,例如 [jQuery](https://jquery.com/),等等。这里有一些免费的入门教程: -* [HTML 系列教程](http://www.w3school.com.cn/h.asp) -* [JavaScript 入门教程](http://www.w3school.com.cn/js/index.asp) -* [JavaScript 高级教程](http://www.w3school.com.cn/js/index_pro.asp) +For you, as a programmer, this is not hard at all. -通过这些教程的学习,你能够做到: -* 一个简单的 index.html 页面; -* 一个统一的 main.css 文件,能够对界面元素的表现加以控制和调整; -* 一组 javascript 文件,能够通过对 HTML DOM 的访问,实现内容的动态展示和切换。 +### Simple APP -对于作为程序员的你,这根本不是什么难的事情。 +Next, we want to turn such a simple web app into a mobile app. To be exact, it should be called Hybrid APP, a hybrid program. Because it's native app, it wraps a webview, which runs the web app we wrote. -### 单机版APP +We need to use a technical framework called Cordova. -下一步,我们要把这样一个简单的网页程序 (web app),变成一个手机上的 APP。准确的说,它应该是叫 Hybrid APP,即混合程序。因为它的外面是 native app 封装了一个 webview,里面运行的是 我们写的 web app。 +Originally a product developed by a small team acquired by Adobe, it was renamed PhoneGap (http://phonegap.com/). Adobe later turned it open source and donated it to the Apache Foundation, then called [Apache Cordova] (https://cordova.apache.org/). -我们需要用到 cordova 技术框架。它原本是 Adobe 公司收购的一个小团队开发的产品,被重新命名为 [PhoneGap](http://phonegap.com/)。后来 Adobe 将其开源,并捐赠给 Apache 基金会,然后被称为 [Apache Cordova](https://cordova.apache.org/),现在已经成为一个非常流行的技术框架,也得到很多商业公司的追捧,除了 Adobe 之外,Intel、微软、IBM 等公司也都推出了支持 Cordova 的产品。 +Now Cordova has become a very popular technical framework, but also sought after by many commercial companies, in addition to Adobe, Intel, Microsoft, IBM and other companies have also introduced support Cordova products. -Cordova 技术框架提供了一个命令行的工具,是用 nodejs 开发的。 +The Cordova technology framework provides a command-line tool developed using nodejs, as well as a variety of plug-ins. -我们首先要装 [nodejs](https://nodejs.org/en/),安装之后,会提供 2 个基本的命令: +We first have to install [nodejs] (https://nodejs.org/en/), after installation, it will provide two basic commands: ```bash $ which node /usr/local/bin/node $ node -v -v4.2.1 +v4.8.4 $ npm -v -2.14.7 +2.15.11 ``` -* node --- 负责 javascript 程序的编译/解释/执行。它是基于谷歌开源的 Chrome V8 引擎的,基于事件驱动、不阻塞 IO模式运行,轻量而高效。 -* npm --- NodeJs Package Manager, 安装包管理器。所有的 nodejs 包都是用 npm 来下载和安装(你也可以用它来发布你自己的包到 npm 库)。 -接下来,用 npm 安装 [cordova](https://cordova.apache.org/): +* node --- the javascript engine, compile / interpret / execute. It is based on Google's open source Chrome V8 engine, event-driven, non-blocking IO mode operation, lightweight and efficient. +* npm --- NodeJs Package Manager, install package manager. All nodejs packages are downloaded and installed using npm (you can also use it to publish your own packages to the npm repository) + +Next, use npm to install [cordova](https://cordova.apache.org/): ```bash $ npm install -g cordova $ which cordova /usr/local/bin/cordova $ cordova -v -5.4.1 +7.1.0 ``` -用 cordova 创建一个项目: +Create a project with Cordova CLI: ```bash -# 格式为:cordova create <目录名> +# Syntax:cordova create $ cordova create temp com.rjfun.demo Demo ``` -然后编译,并在 iOS 模拟器中运行这个项目: +Compile and build, then run the app in iOS emulator: ```bash $ cd temp $ cordova platform add ios @@ -225,20 +233,20 @@ $ cordova build ios $ cordova emulate ios ``` -于是可以看到 iOS 模拟器被启动,然后 APP 运行: +Now we will see the iOS emulator is started, and APP launched: ![Cordova iOS](demo/cordovaios.png) -或者你也可以把 iPhone 用 USB 线连接到 Mac,然后用这个命令安装、启动刚刚编译的 APP: +Or, you can also connect your iPhone device to Mac, the use following command to install and launch the APP: ```bash $ cordova run ios --device ``` -现在运行的是 Cordova 自带的 Demo 工程。打开 Cordova 项目,可以看到这样的目录结构: +Now the running one is Cordova's Demo project. Open Cordova project, you can see this directory structure: ![Cordova Proj](demo/cordovaproj.png) -接下来,删去 www 目录下的内容,用我们前面写的 index.html, main.js, main.css 替换,并略作修改: +Next, delete the contents of the www directory, replace with the index.html, main.js, main.css we wrote earlier and make a few changes: ```html @@ -246,13 +254,13 @@ $ cordova run ios --device - + - + Hello @@ -269,11 +277,11 @@ $ cordova run ios --device // main.js console.log('hello, world!'); -// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in document.addEventListener('deviceready', function(){ console.log('deviceready'); - // TODO: 开始我们 web app 的业务逻辑 + // TODO: Start the business logic of our web app }); ``` @@ -296,116 +304,118 @@ h1 { } ``` -重新运行 cordova 项目(会自动编译、安装、运行): +Rerun the cordova project (it will compile, install, run automatically): ```bash $ cordova emulate ios ``` -于是,可以看到 Web App 在 iOS 模拟器中运行了: +So, you can see that Web App is running in the iOS simulator: ![Hello World Cordova](demo/helloworldcordova.png) -做个最简单的APP,其实也很简单,是不是?! +To write an easiest APP, in fact, is really simple, isn't it? -### 加个广告条 +### Add Ad Banner -作为程序员,我们毫不怀疑,你可以通过掌握的 HTML/CSS 以及 javascript 编程能力,提供一些有趣、有用的功能。 +As a programmer, we have no doubt that you have mastered the HTML / CSS and javascript programming capabilities to provide some interesting and useful features. -接下来,我们要给这个 APP 加上变现(monetization)的功能,即实现赚到真金白银。 +Next, we want to add monetization to the app, which is to make real money. -变现最简单的方法,就是加上广告条,例如谷歌的AdMob。 -* 通过展示广告,用户对有兴趣的广告点击,浏览产品、或者安装其他的 APP。 -* 投放广告的个人/公司(简称广告主,Advertizer)会支付广告费给谷歌。 -* 而谷歌则会将其中的一部分,支付给发布广告的个人/公司(简称发布商, Publisher)。 -* 谷歌在其中扮演的角色,则称之为广告平台(Ad Platform)、或者广告中介(Ad Network)。 +The easiest way to realize is to add an ad banner, such as Google's AdMob. +* By showing ads, users click on interesting ads, browse the product, or install other apps. +* Advertisers / advertisers (advertisers, Advertizer) pay advertising costs to Google. +* Google will pay a portion of it to the person / company (publisher, publisher) who posted the ad. +* Google's role in it is called the Ad Platform, or Ad Network. -Cordova 框架的技术架构,是 Web APP 加上一些通用的插件,提供手机特定功能的访问、与第三方系统的集成。 +The technical architecture of the Cordova framework is a web app with some common plug-ins that provide access to specific functions of the handset and integration with third-party systems. -我们通过插件 cordova-plugin-admobpro 来实现与谷歌 AdMob 的集成。这是基于谷歌 AdMob SDK 开发的一个插件,也是目前变现插件中最流行、最容易使用的。通过它,只需一行 javascript 代码就可以完成对 SDK API 的调用。 +We implemented integration with Google AdMob via the plug-in cordova-plugin-admobpro. This is a plug-in based on the Google AdMob SDK, and is the most popular and easiest to use plug-in for the moment. Through it, just a line of javascript code to complete the SDK API call. -现在让我们往 cordova 项目工程中加入插件。 +Now let's add plugins to the cordova project. ```bash $ cordova plugin add cordova-plugin-admobpro ``` -然后修改 main.js,在 APP 初始化完毕时,我们加几行代码。 +Modify main.js, let's add a few lines into the initialization: ```javascript // main.js console.log('hello, world!'); -// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in document.addEventListener('deviceready', function(){ console.log('deviceready'); - // 在 APP 初始化完毕时,在屏幕下方创建一个广告条 + // When the app is initialized, create an ad banner below the screen if(AdMob) AdMob.createBanner({ - adId: 'ca-app-pub-6869992474017983/4806197152', // 需要到 AdMob 官方网站注册用户,并创建广告单元 Ad Unit Id - position: AdMob.AD_POSITION.BOTTOM_CENTER, // 展示在屏幕下方中央 - overlap: false, // 不要覆盖 Web APP 的内容 - isTesting: true, // 展示测试广告,在正式发布时,去掉这行 - autoShow: true // 广告资源就绪时,自动开始展示 + adId: 'ca-app-pub-6869992474017983/4806197152', // need to register as a user on the AdMob website and create an Ad Unit Id + position: AdMob.AD_POSITION.BOTTOM_CENTER, // show at bottom / center + overlap: false, // no overlap the web app content + isTesting: true, // show testing ad, please remove this line when formal release + autoShow: true // auto show it when ad resource downloaded and ready }); }); ``` -重新运行 cordova 项目(会自动编译、安装、运行): +Rerun the cordova project (it will compile, install, run automatically): ```bash $ cordova emulate ios ``` -于是,可以看到 Web App 在 iOS 模拟器中运行了: +So, you can see that Web App is running in the iOS simulator: ![AdMob Banner](demo/admobbanner.png) -看,屏幕下方的广告条展示出来了。 +Look, at the bottom of the screen, the banner is displayed. -这里只是仅供调试用的测试广告。我们需要到 [AdMob官方网站](https://apps.admob.com/)注册用户,并创建广告单元(Ad Unit Id),并用来替换掉 代码中 adId 后面的这串数字。并在发布的正式版本中,去掉 `isTesting:true` 这行代码。 +This is just a test advertisement for debugging purposes only. -### 注册广告账号 +We need to register the user on [AdMob official website] (https://apps.admob.com/) and create an Ad Unit Id that replaces the string of digits following adId in the code. And in the official version of the release, remove the `isTesting: true` line of code. -下面我们就介绍,如何注册账号,如何创建广告单元,如何设置银行收款信息。 +### Register Ad Account -由于价值观方面的原因,谷歌的网站基本上都是被隔离在中国大陆局域网之外,通常是无法访问的。需要通过 VPN 等科学上网的方式才能够访问。如果你不知道如何科学上网,可以写邮件给我,单独讨论这个问题,这里暂不展开。 +Here we introduce, how to register account, how to create ad unit, how to set bank receipt information. -访问谷歌AdMob官网( https://www.google.com/admob/ ),注册新账号。 +Visit Google's AdMob website (https://www.google.com/admob/) to sign up for a new account. -![AdMob Site](demo/admobsite.png) +! [AdMob Site] (demo / admobsite.png) -注册完成之后,登陆 AdMob 网站( https://apps.admob.com/ ),点击菜单“获利”,点击左上角的红色按钮“+通过新应用获利” 添加新APP: +After registering, visit the AdMob website (https://apps.admob.com/), click on the menu "monetization", click on the red button in the upper left corner "+ monetize new application" to add a new APP: -![AdMob New App](demo/admobnewapp.png) +! [AdMob New App] (demo / admobnewapp.png) -然后创建横幅广告: +Then create banner ads: -![AdMob New Banner](demo/admobnewbanner.png) +! [AdMob New Banner] (demo / admobnewbanner.png) -即可获得广告单元 ID,将其 copy 到源代码中: +You can get the ad unit ID, copy it to the source code: -![AdMob Ad Unit ID](demo/admobadunitid.png) +! [AdMob Ad Unit ID] (demo / admobadunitid.png) -### 验证地址和设置收款信息 +### Set Payment Info -注册账号之后,广告单元进入APP投放实际使用,即可积累广告收益。 +After registering your account, you can accumulate ad revenue by putting the ad unit into the APP for actual usage. -要收到谷歌支付的广告分成,还有 2 个步骤要完成: -* 验证地址。谷歌会生成一个 PIN 码,打印在卡片上,邮寄到你的通信地址。 -* 设置收款信息。可以是 西联汇款 或者 银行账号。 +There are two more steps to complete the Google advertising payment you receive: +* Verify address. Google will generate a PIN code printed on the card, mailed to your mailing address. +* Set up payment information. Can be Western Union or bank account. -不过,刚注册的账号还不允许设置这个信息。只有你的累计广告收入达到基本的门槛(目前是 10美金),谷歌才会允许进入设置支付信息的环节。谷歌通过这个方法,可以过滤掉大量的无效账号。 +However, newly registered account is not allowed to set bank information. Only your cumulative advertising revenue reached the basic threshold (currently 10 US dollars), Google will allow you to set up payment information. Through this method, Google can filter out a large number of non-active accounts. -#### 验证 PIN 码: +#### Verify PIN Code ![Verify PIN](demo/verifypin.png) -点击“立即改正此问题”,进入 PIN 码输入界面。 +Click "Fix It", enter PIN input UI. ![Verify PIN](demo/verifypin2.png) -验证 PIN 码这个过程比较缓慢,通常需要 2-4 周的时间。所以如果显示了最近生成 PIN 码的日期,就耐心等待吧。收到 PIN 码之后,就将其输入上面这个框,提交验证。 +This process of verifying your PIN is slow and typically takes 2-4 weeks. + +So, if the date of the most recent PIN was displayed, wait patiently. After receiving the PIN code, it will be entered in the box above, submitted for verification. -#### 设置收款信息: +#### Set Payment Info ![AdMob Payment](demo/admobpay1.png) @@ -413,38 +423,38 @@ $ cordova emulate ios ![AdMob Payment](demo/admobpay3.png) -等这 2 个步骤设置完成,当产生广告收益的时候,谷歌就会在每个月的月末,计算当月的广告收益,然后在下个月的 20日左右支付给你。 +After the two steps are set up, when the advertising revenue, Google will calculate the advertising revenue of the month at the end of each month, and pay you around the 20th of next month. -### 发布APP +### Publish APP -我们完成的 APP,要被用户安装使用并产生收益,还缺少一个重要的环节:发布 到应用商店。 -* 如果是 Android APP,通常是 Google Play Store。中国大陆用户通常访问不到,则可以选择发布到大陆的一些应用商店,例如 360、豌豆荚 等等。 -* 如果是 iOS APP,则是发布到苹果 AppStore。 +The APP we developed, to be installed by user and generate revenue, needs an important part: released to the app store. +* If Android APP, usually Google Play Store. +* If iOS APP, released to Apple AppStore. -这里我们以苹果 AppStore 为例,来说明如何注册开发者账号,并发布 APP。 +Here we use the Apple AppStore as an example, to illustrate how to register a developer account and publish an app. -访问苹果开发者网站( https://developer.apple.com/ ),并注册登录。要在 苹果AppStore发布应用,需要支付每年 99 美金的年费,对于个人开发者、公司开发者,这个费用都是一样的。 +Visit the Apple Developers Web site (https://developer.apple.com/) and sign up for login. To release an app on the Apple AppStore, you pay an annual fee of $ 99 a year, which is the same for individual developers and corporate developers. ![Apple Developer](demo/appledev.png) -注册成功的开发者,需要下面几个步骤,才能将 APP 发布到 AppStore: -* 生成开发者数字证书,用于安装包的签名。 -* 为你的 APP 创建 APP ID,如果不涉及内购,也可以用 “*” 或者 “com.rjfun.*” 作为一个通用的 APP ID,在多个 APP 中使用。 -* 为你的 APP 生成 Provisioning Profiles,并下载到 本地用 Xcode 打开、管理。 +The following steps are needed to publish APP to the AppStore: +* Generate developer digital certificate for installation package signature. +* Create an APP ID for your APP, or use "*" or "com.rjfun. *" As a generic APP ID for more than one app, if no in-app purchase. +* Generate Provisioning Profiles for your APP, download it locally, open it in Xcode, and manage it. -然后用 Xcode 打开 Cordova 项目里的 XXX.xcodeproj 工程文件,编译并存档(Archive)。成功存档的 APP 包,才能提交到 AppStore 进行审核。 +Then use Xcode to open the XXX.xcodeproj project file in the Cordova project, compile and archive (Archive). Successfully archived APP packages can be submitted to AppStore for review. -APP 提交前,需要到 iTunesConnect ( https://itunesconnect.apple.com/ ),准备、发布和管理你的 APP。 +You need to log into iTunesConnect (https://itunesconnect.apple.com/), to prepare, publish and manage your APP. ![iTunes Connect](demo/itunesconnect.png) -创建新的 APP,加上名字、介绍、图标、定价等信息,并将其设置为准备提交的状态,然后就可以通过 Xcode 中的 Organizer 将成功存档(Archive)的安装包提交到 AppStore 进行审核了。 +Create a new APP, add the name, introduction, icon, pricing and other information, and set it as ready to submit the status, and then you can Organizer Xcode in the successful archive (Archive) installation package submitted to the AppStore for review . ![Xcode Organizer](demo/xcodeorganizer.png) -苹果审核 APP 的流程大约 1 周左右的时间。如果审核通过,就可以在 AppStore 里面看到你发布的 APP 了。 +Usually it will take Apple 2 or 3 days to review your app. If the review passes, you can see your app in the AppStore. -### 广告收益的计算 +### Calculate Ad Revenue 当用户在设备中下载、安装APP并运行的时候,就会从谷歌的广告服务器请求正式的广告内容,并用于展示了。 diff --git a/README.zh.md b/README.zh.md new file mode 100644 index 0000000..bdb4938 --- /dev/null +++ b/README.zh.md @@ -0,0 +1,900 @@ +### 从编码到变现:程序员财务自由之路 +[英文版本/English Version](./README.md) + +### 目录 + +* [前言](#前言) +* [定位](#定位) +* [基础篇](#基础篇) + * [语言与工具选择](#语言与工具选择) + * [Hello, World!](#hello-world) + * [单机版APP](#单机版APP) + * [加个广告条](#加个广告条) + * [注册广告账号](#注册广告账号) + * [验证地址和设置收款信息](#验证地址和设置收款信息) + * [发布APP](#发布APP) + * [广告收益的计算](#广告收益的计算) +* [进阶篇](#进阶篇) + * [需求是根本](#需求是根本) + * [用户体验](#用户体验) + * [哪种广告最适合](#哪种广告最适合) + * [哪家广告商最靠谱](#哪家广告商最靠谱) + * [营销你的产品](#营销你的产品) + * [联网版APP](#联网版APP) + * [云服务](#云服务) +* [高级篇](#高级篇) + * [数据分析](#数据分析) + * [广告优化](#广告优化) + * [支付与内购](#支付与内购) + * [社交营销](#社交营销) + * [广告投放](#广告投放) +* [附录](#附录) + * [互联网营销常用术语](#互联网营销常用术语) + * [如何发布 APP 到 Apple AppStore](#如何发布-app-到-apple-appstore) + * [如何发布 APP 到 Google Play Store](#如何发布-app-到-google-play-store) + * [如何发布 APP 到 360 应用商店](#如何发布-app-到-360-应用商店) + * [如何用 Google Analytics 做用户数据分析](#如何用-google-analytics-做用户数据分析) + +### 前言 + +这本书,是写给程序员看的。 + +这并不是关于一门编程语言,也不是关于一种设计模式,更不是关于如何评估工程量、如何做项目管理。 + +这本书是关于:变现(monetization),通俗的说,就是赚钱。 + +作为程序员,你一定花了大量的时间去学习,掌握了若干种编程语言、用过数十种开发工具。为了设计稳定灵活的架构,你也认真学习和掌握了各种设计模式;为了提高工作效率,你也用了各种成熟的框架以及自动化测试的工具;总之,通过学习,你成为了一个牛B的程序员。 + +甚至,你也积累了管理的经验,主动学习了项目管理的理论知识、各种研发组织模式,也许会进阶到管理岗位,成为研发团队的负责人或者经理人。 + +在大部分的情况下,作为程序员或者研发团队,你按照项目经理 或者 产品经理给的需求,进行需求分析、架构设计、模块划分、接口设计、编码实现、测试、提交版本。这些环节,毫无疑问,是做研发的程序员最为熟悉的流程。 + +不幸的是,你日常所关注的,仅仅只是研发环节。接受需求,交付版本,这就是产品经理或者甲方让你干的事情。很多在研发领域侵淫多年的研发大牛,也往往并不熟悉软件怎样能够直接带来经济回报。绝大多数的开发者,仅仅关注研发这个环节,甚至仅仅关注在编码这个环节,这是非常局限的。 + +事实上,研发环节,再加上销售、收款、推广、用户支持、维护,这才是软件产生经济回报的完整闭环。 + +然而,软件怎样直接带来经济回报,这方面的技术文章或者书籍并不多见。这也是我为什么会选择这个角度,作为本书下笔的核心内容。 + +这本书是关于,如何从编码、到如何接受付款,以及如何获取用户。手把手,教你每一个步骤。 + +一旦你掌握软件如何变现的能力,你会更加关心用户反馈、关心市场需求、关心产品质量,因为这些都会为你带来更好的经济收益。实现财务自由,也就并不遥远了。 + +如果你觉得本书的内容有所帮助,请点赞支持。 + +### 定位 + +既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 + +考虑到人力、时间、成本等因素,我们也暂时不讨论运营级、或者企业级的大型系统。研发周期长、投入大、需求复杂,也超过个人和小团队的掌控。 + +在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 + +例子1: +[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 + +例子2: +我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 + +例子3: +(请自行谷歌、脑补) + +我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 + +也许你是技术的大牛,掌握了数十种编程语言、设计模式、前端到后端的全栈开发能力。然而,并不是每项技术,都能够实现快速赚钱的。最艰深、最有趣的技术,未必是最容易赚到钱的技术。有时候,我们要做最容易扩展的架构。有时候,我们要选择最快速开发的技术手段。 + +也许你是刚入门的菜鸟,只会做做网页什么的。那也没有关系,赚钱真正需要的编程技术,其实也可以非常简单。只是有一点,需要什么知识,我们就恶补什么知识。由于技术日新月异,程序员必须是最善于学习的群体。 + +### 基础篇 + +### 语言与工具选择 + +开发 APP 的语言与工具,通常与平台密切相关。 +* 如果是 iOS,那通常是 Objective C,开发工具是苹果推出的 [Xcode](https://developer.apple.com/xcode/) (开发工具仅运行于 Mac)。 +* 如果是 Android,那通常是 Java,开发工具是 谷歌推出的 [Android Studio](http://developer.android.com/tools/studio/index.html)(开发工具有跨平台版本)。 +* 如果是 Windows Phone,那就是 C#,开发工具是 微软推出的 [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx)(开发工具仅运行于 Windows)。 + +除此之外,还有一些跨平台语言与工具,对于开发者更加友善,可以开发一次,多平台打包发布: +* 可以开发游戏与APP的 HTML5,以 javascript 作为主要的开发语言。 +* 用于开发游戏的 [Cocos2d-X](http://www.cocos2d-x.org/),用的是 C++ 作为主要的开发语言。 +* 用于开发游戏的 [Unity3D](http://unity3d.com/) IDE 以及集成的 MonoDevelop,用的是 C# 作为主要的开发语言。 +* 微软收购的 [Xamarin](https://www.xamarin.com/) 以及赞助的开源项目 [Mono](http://www.mono-project.com/),用来开发 APP,以 C# 作为主要的开发语言。 + +在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。实际上,它也是 github 上最为活跃的语言。它可以用来开发: +* 运行于浏览器内的 Web网页; +* 运行与内嵌浏览器的 单页WebApp; +* 基于 [nodejs](https://nodejs.org/) 的命令行工具; +* 基于 nodejs 的网络云服务; +* 基于 [cordova](http://cordova.apache.org/) 技术的,混合(hybrid) APP。 +* 基于 [react-native](http://www.reactnative.com/) 开发 native UI体验的 APP。 +* 甚至,也能够开发出桌面应用,例如 Adobe Brackets 代码编辑器。 + +因为它可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 + +以下是用 javascript 来做开发的所需要的环境和工具: +* Chrome浏览器,自带开发者工具 和 javascript 控制台,用来运行和调试。 +* [Adobe Brackets](http://brackets.io/) 文本编辑器(如果你习惯 [Sublime Text](http://www.sublimetext.com/) 或者 [Atom](https://atom.io/) 或者 [Visual Studio Code](http://code.visualstudio.com/),也没问题) +* iMac台式机,巨大的27寸屏幕,视野不受限制;Mac OS X命令行非常强大方便,通过 [MacPorts](https://www.macports.org/) 或者 [Homebrew](http://brew.sh/),Linux 上有的命令行工具或者 library 都基本支持。 +* Xcode(只有 Mac 版本),要调试 iOS APP,有台 iMac电脑或者 MacBook笔记本电脑,这也是必备的。 +* Android Studio,用来调试 Android APP。 + +如果你习惯了 Windows 也没有一台 Mac,会稍微麻烦一点。不过也是有方法的,有一些专门提供编译、打包的云服务,例如 Adobe PhoneGap Build,或者 Intel XDK,我们后面会介绍如何使用。 + +### Hello, World! + +用 javascript 开发前端,其实需要的是 3 项相关的语言:HTML / javascript / CSS。 +* HTML 负责内容 +* javascript 负责逻辑 +* CSS 负责渲染表现 + +以下是一个简单的例子: +```html + + + + + +Hello + + + + +

Hello, World!

+ + +``` +```javascript +// main.js +console.log('hello, world!'); +``` +```css +/* main.css */ +body { + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; +} +h1 { + color: blue; + padding: 40px; + margin: 10px; + border: 1px solid gray; + display: inline-block; +} +``` + +用 Chrome 浏览器打开它,于是我们看到如下的展示: +* 上面的浏览器主窗口,显示了 HTML 的内容,并且用 CSS 指定的格式和效果进行了渲染。 +* 下面打开 Chrome 的 console 窗口,则显示了 javascript 调用 console.log() 输出的调试信息。 + +![HelloWorld](demo/helloworld.png) + +用 HTML5 / javascript 做开发,入门就是这么简单。 + +如果需要开发出高质量的 APP,需要熟练掌握 HTML/CSS 和 javascript,尤其是 HTML5 / CSS3,掌握 HTML DOM 以及 javascript 的一些常见库,例如 [jQuery](https://jquery.com/),等等。这里有一些免费的入门教程: +* [HTML 系列教程](http://www.w3school.com.cn/h.asp) +* [JavaScript 入门教程](http://www.w3school.com.cn/js/index.asp) +* [JavaScript 高级教程](http://www.w3school.com.cn/js/index_pro.asp) + +通过这些教程的学习,你能够做到: +* 一个简单的 index.html 页面; +* 一个统一的 main.css 文件,能够对界面元素的表现加以控制和调整; +* 一组 javascript 文件,能够通过对 HTML DOM 的访问,实现内容的动态展示和切换。 + +对于作为程序员的你,这根本不是什么难的事情。 + +### 单机版APP + +下一步,我们要把这样一个简单的网页程序 (web app),变成一个手机上的 APP。准确的说,它应该是叫 Hybrid APP,即混合程序。因为它的外面是 native app 封装了一个 webview,里面运行的是 我们写的 web app。 + +我们需要用到 cordova 技术框架。它原本是 Adobe 公司收购的一个小团队开发的产品,被重新命名为 [PhoneGap](http://phonegap.com/)。后来 Adobe 将其开源,并捐赠给 Apache 基金会,然后被称为 [Apache Cordova](https://cordova.apache.org/),现在已经成为一个非常流行的技术框架,也得到很多商业公司的追捧,除了 Adobe 之外,Intel、微软、IBM 等公司也都推出了支持 Cordova 的产品。 + +Cordova 技术框架提供了一个命令行的工具,是用 nodejs 开发的。 + +我们首先要装 [nodejs](https://nodejs.org/en/),安装之后,会提供 2 个基本的命令: +```bash +$ which node +/usr/local/bin/node +$ node -v +v4.2.1 +$ npm -v +2.14.7 +``` +* node --- 负责 javascript 程序的编译/解释/执行。它是基于谷歌开源的 Chrome V8 引擎的,基于事件驱动、不阻塞 IO模式运行,轻量而高效。 +* npm --- NodeJs Package Manager, 安装包管理器。所有的 nodejs 包都是用 npm 来下载和安装(你也可以用它来发布你自己的包到 npm 库)。 + +接下来,用 npm 安装 [cordova](https://cordova.apache.org/): +```bash +$ npm install -g cordova +$ which cordova +/usr/local/bin/cordova +$ cordova -v +5.4.1 +``` + +用 cordova 创建一个项目: +```bash +# 格式为:cordova create <目录名> +$ cordova create temp com.rjfun.demo Demo +``` + +然后编译,并在 iOS 模拟器中运行这个项目: +```bash +$ cd temp +$ cordova platform add ios +$ cordova build ios +$ cordova emulate ios +``` + +于是可以看到 iOS 模拟器被启动,然后 APP 运行: + +![Cordova iOS](demo/cordovaios.png) + +或者你也可以把 iPhone 用 USB 线连接到 Mac,然后用这个命令安装、启动刚刚编译的 APP: +```bash +$ cordova run ios --device +``` + +现在运行的是 Cordova 自带的 Demo 工程。打开 Cordova 项目,可以看到这样的目录结构: + +![Cordova Proj](demo/cordovaproj.png) + +接下来,删去 www 目录下的内容,用我们前面写的 index.html, main.js, main.css 替换,并略作修改: +```html + + + + + + + + + + + + + + + + Hello + + + + +

Hello, World!

+ + +``` + +```javascript +// main.js +console.log('hello, world!'); + +// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +document.addEventListener('deviceready', function(){ + console.log('deviceready'); + + // TODO: 开始我们 web app 的业务逻辑 +}); +``` + +```css +/* main.css */ +body { + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; + background-color: silver; +} +h1 { + padding: 40px; + margin: 30px; + background-color: yellow; + color: blue; + border: 1px solid gray; + display: inline-block; +} +``` + +重新运行 cordova 项目(会自动编译、安装、运行): +```bash +$ cordova emulate ios +``` + +于是,可以看到 Web App 在 iOS 模拟器中运行了: + +![Hello World Cordova](demo/helloworldcordova.png) + +做个最简单的APP,其实也很简单,是不是?! + +### 加个广告条 + +作为程序员,我们毫不怀疑,你可以通过掌握的 HTML/CSS 以及 javascript 编程能力,提供一些有趣、有用的功能。 + +接下来,我们要给这个 APP 加上变现(monetization)的功能,即实现赚到真金白银。 + +变现最简单的方法,就是加上广告条,例如谷歌的AdMob。 +* 通过展示广告,用户对有兴趣的广告点击,浏览产品、或者安装其他的 APP。 +* 投放广告的个人/公司(简称广告主,Advertizer)会支付广告费给谷歌。 +* 而谷歌则会将其中的一部分,支付给发布广告的个人/公司(简称发布商, Publisher)。 +* 谷歌在其中扮演的角色,则称之为广告平台(Ad Platform)、或者广告中介(Ad Network)。 + +Cordova 框架的技术架构,是 Web APP 加上一些通用的插件,提供手机特定功能的访问、与第三方系统的集成。 + +我们通过插件 cordova-plugin-admobpro 来实现与谷歌 AdMob 的集成。这是基于谷歌 AdMob SDK 开发的一个插件,也是目前变现插件中最流行、最容易使用的。通过它,只需一行 javascript 代码就可以完成对 SDK API 的调用。 + +现在让我们往 cordova 项目工程中加入插件。 + +```bash +$ cordova plugin add cordova-plugin-admobpro +``` + +然后修改 main.js,在 APP 初始化完毕时,我们加几行代码。 + +```javascript +// main.js +console.log('hello, world!'); + +// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +document.addEventListener('deviceready', function(){ + console.log('deviceready'); + + // 在 APP 初始化完毕时,在屏幕下方创建一个广告条 + if(AdMob) AdMob.createBanner({ + adId: 'ca-app-pub-6869992474017983/4806197152', // 需要到 AdMob 官方网站注册用户,并创建广告单元 Ad Unit Id + position: AdMob.AD_POSITION.BOTTOM_CENTER, // 展示在屏幕下方中央 + overlap: false, // 不要覆盖 Web APP 的内容 + isTesting: true, // 展示测试广告,在正式发布时,去掉这行 + autoShow: true // 广告资源就绪时,自动开始展示 + }); +}); +``` + +重新运行 cordova 项目(会自动编译、安装、运行): +```bash +$ cordova emulate ios +``` + +于是,可以看到 Web App 在 iOS 模拟器中运行了: + +![AdMob Banner](demo/admobbanner.png) + +看,屏幕下方的广告条展示出来了。 + +这里只是仅供调试用的测试广告。我们需要到 [AdMob官方网站](https://apps.admob.com/)注册用户,并创建广告单元(Ad Unit Id),并用来替换掉 代码中 adId 后面的这串数字。并在发布的正式版本中,去掉 `isTesting:true` 这行代码。 + +### 注册广告账号 + +下面我们就介绍,如何注册账号,如何创建广告单元,如何设置银行收款信息。 + +由于价值观方面的原因,谷歌的网站基本上都是被隔离在中国大陆局域网之外,通常是无法访问的。需要通过 VPN 等科学上网的方式才能够访问。如果你不知道如何科学上网,可以写邮件给我,单独讨论这个问题,这里暂不展开。 + +访问谷歌AdMob官网( https://www.google.com/admob/ ),注册新账号。 + +![AdMob Site](demo/admobsite.png) + +注册完成之后,登陆 AdMob 网站( https://apps.admob.com/ ),点击菜单“获利”,点击左上角的红色按钮“+通过新应用获利” 添加新APP: + +![AdMob New App](demo/admobnewapp.png) + +然后创建横幅广告: + +![AdMob New Banner](demo/admobnewbanner.png) + +即可获得广告单元 ID,将其 copy 到源代码中: + +![AdMob Ad Unit ID](demo/admobadunitid.png) + +### 验证地址和设置收款信息 + +注册账号之后,广告单元进入APP投放实际使用,即可积累广告收益。 + +要收到谷歌支付的广告分成,还有 2 个步骤要完成: +* 验证地址。谷歌会生成一个 PIN 码,打印在卡片上,邮寄到你的通信地址。 +* 设置收款信息。可以是 西联汇款 或者 银行账号。 + +不过,刚注册的账号还不允许设置这个信息。只有你的累计广告收入达到基本的门槛(目前是 10美金),谷歌才会允许进入设置支付信息的环节。谷歌通过这个方法,可以过滤掉大量的无效账号。 + +#### 验证 PIN 码: + +![Verify PIN](demo/verifypin.png) + +点击“立即改正此问题”,进入 PIN 码输入界面。 + +![Verify PIN](demo/verifypin2.png) + +验证 PIN 码这个过程比较缓慢,通常需要 2-4 周的时间。所以如果显示了最近生成 PIN 码的日期,就耐心等待吧。收到 PIN 码之后,就将其输入上面这个框,提交验证。 + +#### 设置收款信息: + +![AdMob Payment](demo/admobpay1.png) + +![AdMob Payment](demo/admobpay2.png) + +![AdMob Payment](demo/admobpay3.png) + +等这 2 个步骤设置完成,当产生广告收益的时候,谷歌就会在每个月的月末,计算当月的广告收益,然后在下个月的 20日左右支付给你。 + +### 发布APP + +我们完成的 APP,要被用户安装使用并产生收益,还缺少一个重要的环节:发布 到应用商店。 +* 如果是 Android APP,通常是 Google Play Store。中国大陆用户通常访问不到,则可以选择发布到大陆的一些应用商店,例如 360、豌豆荚 等等。 +* 如果是 iOS APP,则是发布到苹果 AppStore。 + +这里我们以苹果 AppStore 为例,来说明如何注册开发者账号,并发布 APP。 + +访问苹果开发者网站( https://developer.apple.com/ ),并注册登录。要在 苹果AppStore发布应用,需要支付每年 99 美金的年费,对于个人开发者、公司开发者,这个费用都是一样的。 + +![Apple Developer](demo/appledev.png) + +注册成功的开发者,需要下面几个步骤,才能将 APP 发布到 AppStore: +* 生成开发者数字证书,用于安装包的签名。 +* 为你的 APP 创建 APP ID,如果不涉及内购,也可以用 “*” 或者 “com.rjfun.*” 作为一个通用的 APP ID,在多个 APP 中使用。 +* 为你的 APP 生成 Provisioning Profiles,并下载到 本地用 Xcode 打开、管理。 + +然后用 Xcode 打开 Cordova 项目里的 XXX.xcodeproj 工程文件,编译并存档(Archive)。成功存档的 APP 包,才能提交到 AppStore 进行审核。 + +APP 提交前,需要到 iTunesConnect ( https://itunesconnect.apple.com/ ),准备、发布和管理你的 APP。 + +![iTunes Connect](demo/itunesconnect.png) + +创建新的 APP,加上名字、介绍、图标、定价等信息,并将其设置为准备提交的状态,然后就可以通过 Xcode 中的 Organizer 将成功存档(Archive)的安装包提交到 AppStore 进行审核了。 + +![Xcode Organizer](demo/xcodeorganizer.png) + +苹果审核 APP 的流程大约 1 周左右的时间。如果审核通过,就可以在 AppStore 里面看到你发布的 APP 了。 + +### 广告收益的计算 + +当用户在设备中下载、安装APP并运行的时候,就会从谷歌的广告服务器请求正式的广告内容,并用于展示了。 + +你可以登陆谷歌 AdMob 网站,查看每天的广告展示量、点击率、以及产生的收益。这个网站也提供了非常强大的报表功能,可以根据国家、广告单元、时间段,显示非常详细的报告。谷歌在 AppStore 上发布有一个 AdSense 的 APP,你可以安装这个 APP,每天查看你的 AdMob 收益。 + +每次用户对感兴趣的广告进行点击,就会产生广告收益。大部分的广告投放,是按照点击次数计算费用的,即所谓的 CPC 广告。 + +在计算广告收益的时候,有几个常见的基本术语: +* CPC(Cost Per Click,每次点击费用),大约是 US$ 0.06 ~ 1.0; +* CTR(Click Through Rate,展示点击率),大量统计的结果大约是 1%; +* CPM (Cost Per Mile, 每千次展示费用),通过 CPC 和 CPR 也能够推算出 CPM,大致范围是 US$ 0.5 ~ 5。 + +每次点击的价格,根据广告投放的价格不同而不同。全球不同国家由于经济水平不同,也存在很大的差异。例如, +* 在美国,一次广告点击可能产生 0.2 美元的收益; +* 在巴西,也许只有 2 美分,相差 10 倍。 +* 而日本,广告点击的收益是相当高的。 + +下面是一组数据的对比: + +美国 | 巴西 +---|--- +![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) +日本 | 德国 +![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) + +如果我们按照 CPM (每千次展示费用)1美元 来估算,每天 10万次广告展示,大约可以产生 $100美元现金收益。按照 6.45 的汇率计算,一个月30天(包括周末和节假日!),大约可以产生的收益是 ¥19,350。 + +而在上海,5年经验的、技术能力还不错的程序员,薪资大约也就 15,000 左右。如果你做的 APP,每天能够有 1万个用户使用,基本上产生的广告收益和现金流,就可以达到一个程序员的工资水平。 + +我认识一个巴西人,他用 HTML5 技术实现的小游戏,简单,但是非常有趣。每天的活跃用户大约是 10万,广告收益已经超过每个月 15万,从而实现了财务自由。 + +### 进阶篇 + +### 需求是根本 + +前面我们介绍了如何为 APP 增加了变现(monetization)的能力。但要真正获得可观的收益,还必须得有足够多的用户。也就是说,你必须开发出足够好的 APP,能够真正解决用户的问题,才会有更多的用户使用、更高频度的使用。 + +如何能够开发出更受用户欢迎的 APP 呢?其实这不是一个编程问题。 + +也许你是一个技术的大牛,但是最艰深、最牛X的技术,开发出来的软件产品未必是受到用户欢迎的产品。有时候,你用了一种其实比较简单的技术,但是真正关注了用户的痛点,解决了用户关心的问题,很可能你的产品就会受到用户的欢迎,创造出口口相传的良好口碑,在社交网络得到自然传播。 + +我推荐一本书,《需求-缔造伟大商业传奇的根本力量》,作者是亚德里安•斯莱沃斯基。 + +以下是某些创业成功者的推荐: + +> 这是一本好书,每个创业者和每个公司管理者都值得一看,甚至公司中的每个人都应该了解和体会其中的概念。书中给出了一些创造需求的模式,这对读者是非常有价值的,我们需要好的理念,但我们更需要可以践行理念的方法。这两点本书都做到了,非常值得一读,特荐之。 +——孙陶然 ,拉卡拉支付有限公司创始人、董事长兼总裁,《创业36条军规》作者 + +> 每一个抱怨的背后都隐藏着一个未被满足的需求,而每一个需求的背后必然隐藏着一个不可忽视的市场。其实任何产品,在一开始满足了用户的功能性需求以后,就应该着手升级到精神层面,用户拒绝麻烦,用户需要安慰,这看起来跟利润无关,但是对不起,它跟你的市场有关。你不去满足,创业者就会自己去进行开拓性满足。那么等待你的,或将是个生死存亡的巨大危机。因此,请一定重视麻烦所带来的希望,而不是去抵触他们的抱怨。这正是《需求》给我们带来的最有价值的东西。 +——杜子建,华艺传媒创始人,社会化媒体营销研究者,畅销书《微力无边》作者 + +### 用户体验 + +为什么苹果手机卖得贵,依然热卖?无疑它是以优秀的用户体验取胜的。如果你看过《乔布斯传》,你可以知道,苹果手机的诞生,其实是解决了传统手机难于使用的痛点。 + +自然我们在手机上开发的 APP 或者 游戏,也必须要高度关注用户体验,并且把它放到战略重点的位置上来。手机 APP,不追求功能的强大、齐全,可以只做一个小小的功能,但是要切实关注用户的需求点、并提供优秀的用户体验。 + +一个相当典型的例子是这款《手电筒》APP,就是打开手机的 LED灯泡,用来临时照亮黑暗。 + +![Torch APP](demo/torchapp.png) + +这款 APP 的用户已经超过好几亿,自然收益也是极其可观。 + +评价的数量超过600万人次,它的用户是这样写的: +* Jennifer Baylis: 易于使用。#1 最棒的手电筒APP!非常容易使用,打开很快! +* Kitty Davis: 我正是需要这样一个手电筒 APP。 +* Dennis Castello: 它正是做到了需要它做的事,而且做的真的很好。 +* Joseph Low: 易于使用。轻松地让它干活!强烈推荐! + +### 哪种广告最适合 + +在移动广告领域,存在多种形式的广告,并且也在不断的发展。 +* banner Ad,横幅广告 +* interstitial Ad,插屏广告 +* native Ad,原生广告 +* reward video Ad,奖励视频广告 +* IAP (in-app purchase) Ad,内购广告 + +哪种广告适合你的 APP,需要很好的权衡用户体验和收益之间的关系。如果广告展示不当,或者展示过于频繁,影响了用户体验甚至招致用户反感,就本末倒置了。 + +横幅广告 | 插屏广告 +---|--- +![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) + +这两种广告是最为基本和经典的,各有千秋。相对来说,横幅广告只占用屏幕下方的一小片空间,可以一直滚动展示,默认的是每 60 秒更换一次广告内容。优点是不太会影响用户界面和体验,缺点则是因为不太起眼,不容易引起用户的注意和点击。 + +插屏广告则是全屏的,在特定的时间弹出,更能够吸引用户的眼球和点击。也正是因为这个原因,插屏广告的点击收益比横幅广告要高 5 倍以上,比较推荐使用。 + +使用插屏广告的时候,要特别注意弹出的时间,千万不要打断用户的连续操作和游戏体验,否则不仅不会引起用户的点击,还会引起用户的反感。最佳做法是将其放在 2个阶段之间的过渡时机,例如游戏的一关刚刚结束,弹出插屏广告,然后再继续下一关。 + +通过插件 cordova-plugin-admobpro,要展示插屏广告也是非常简单的,只需要 2 行 javascript 代码就可以完成了。其中一行代码负责准备广告资源,另一行代码负责展示。示范代码如下: +```javascript +// 在游戏启动时或者进行中,开始准备插屏广告,通过后台线程下载广告资源 +if(AdMob) AdMob.prepareInterstitial({ + adId: "__ad_unit_id_here__", + autoShow: false +}); + +// 在游戏关卡结束时,调用 API 进行插屏广告的展示 +if(AdMob) AdMob.showInterstitial(); +``` + +以上这 2 种广告,是最容易使用的广告形式,集成到 APP 中的工作也最为容易。 + +原生广告(native Ad),就是将广告内容以较为和谐的方式,展示在APP自身的内容之间,不会显得过于突兀和突然,这是对用户体验影响最小的一种广告形式。 Facebook AudienceNetwork 和 Flurry 比较早就推出了原生广告,不过谷歌 AdMob 对此持谨慎态度,仅仅在部分开发者中进行 beta 试用。 + +奖励视频广告(reward video Ad),是谷歌新推出的一种广告。就是鼓励用户看完广告视频,然后开发者在游戏中或者 APP 中给予某种虚拟物品的奖励。在以前的广告推广中,谷歌并不支持在用户接受广告方面给予鼓励的行为,甚至将对点击广告给予奖励的做法定为违规的行为。因为这很可能违背用户本身的兴趣、造成虚假无效点击。新的奖励视频广告方面,谷歌采取了相对灵活和务实的态度。不过这方面的广告视频来源,基本上都是通过广告中介的方式来自于其他的广告网络。 + +内购广告(IAP House Ad)是一种新颖、创新的广告形式,应用内购买广告可让用户直接在应用内购物。因为需要和支付系统、或者谷歌Play Store结合起来,所以仅在 Android 系统支持。通过内购广告,应用开发商可在以下方面获益: +* 通过在同一款应用中实施广告投放和应用内购,可以最大程度地增加您的收入和用户的生命周期价值。 +* Google 会自动帮助您确定哪些用户有可能购买应用内购商品,并向其余用户展示普通的付费广告。 +* 不需要开发自己的应用内购支持系统,也不需要在应用中加入应用内购支持代码。 +* 利用不同的自家内购广告,可以轻松定位用户群体中的各种细分受众群。通过将应用内购广告与 AdMob 受众群体构建工具结合使用,可以向高消费群体投放价格高的应用内购商品,而向其他用户展示价格低的商品。 + +如果要尝试原生广告、奖励视频广告、内购广告,请移步 Google [AdMob 官方文档网站](https://developers.google.com/mobile-ads-sdk/),进行深入研究,学习如何使用。 + +### 哪家广告商最靠谱 + +因为移动广告领域的利润可观,移动广告平台的发展也是非常快的。过去的这些年,也发生了不少并购案。例如 Google先后收购了 DoubleClick 和 AdMob,Flurry 被 Yahoo! 收购,MobFox 被 Matomy 收购,Millennial Media 被 AOL 收购。 + +![Top Ad Networks](demo/topadnetworks.jpg) + +通常广告平台会提供: +* 接入广告系统的 SDK; +* 注册、登录和管理广告的系统; +* 接入指南、例程、FAQ; + +各种移动广告平台的相关介绍,可以通过搜索活着其他不同的渠道去了解(例如 StackOverflow.com),并可以有选择性的进行尝试。 + +以下是我试用过的一些广告平台: +* Google AdMob +* Facebook AudienceNetwork +* Yahoo! Flurry +* MobFox +* Apple iAd +* MoPub +* Millennial Media +* InMobi +* OpenX +* Smart AdServer +* ... ... + +使用下来比较满意的有 AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox。尤其是 AdMob,非常值得推荐。 + +AdMob之所以最值得强烈推荐,主要有这样一些突出的优点: +* 广告填充率高(基本上在 98% 以上,有个别国家略低于90%),因此可以充分利用用户流量。毕竟广告是谷歌公司的主要业务和利润来源,其广告客户遍及全球,这也不足为怪了; +* 付款及时,每个月的月底结算,次月 20日支付; +* SDK 非常稳定,接入文档以及参考代码易于使用,并且有不同语言的文档和系统界面; +* 报表系统功能强大、易于使用,可以通过不同的维度进行数据分析; +* 有专门的 APP 可以用来跟踪收益; +* 有专门的技术支持人员,有官方支持的技术论坛,专门解答 SDK 接入方面的技术问题; +* 定期会组织一些宣讲、培训活动,也定期有线上视频讲座; +* 客户服务非常到位,非常的耐心和友善,我和他们也基本上一直保持联系。 + +由于谷歌在各个领域的卓越创新、一贯的优质服务,在开发者中有良好的口碑。 + +而基于 AdMob SDK 开发的 cordova-plugin-admobpro 这款插件,不仅把 Objective-C / Java / C# 的原生 API 封装为统一的 javascript API,而且更加简单易用,只需 1-2 行代码即可完成广告展示。这款插件在 Cordova 全球社区也广受欢迎,是使用率最高的变现插件。以下是插件的下载趋势曲线图: + +![AdMob Download Trend](demo/admobprodltrend.png) + +Facebook 的 AudienceNetwork 也挺不错。Facebook 不仅仅是最大、最活跃的社交媒体,也提供各种相关 SDK,包括广告用的 AudienceNetwork。其开发者网站为:https://developers.facebook.com/docs/audience-network 。 +* Facebook 的 广告填充率(Fill Rate)没有 AdMOb 那么高,大约在45~75% 之间。 +* Facebook 付款也很及时,也是在每个月的 21日左右支付上个月的广告收益; +* Facebook 的 SDK 更新非常频繁,大约 2 周左右就会发布一个新的版本,因此如果有什么 bug 修复也很快。不过更新的频度实在有点高,有时候有点跟不上的感觉。相对来说,谷歌 AdMob 的 SDK 更加稳定一些; +* 管理界面和报表系统也比较清楚易用,一目了然。报表系统没有 AdMob 的那么强大和灵活,貌似仅有英文界面,看上去是下面这样的。 + +![Facebook AudienceNetwork](demo/fbaudnet.png) + +Flurry 是一家被 Yahoo!收购的移动广告公司,其官方网站是 http://www.flurry.com/ 。其主要的产品有 2 个,一个是数据分析(Flurry Anlytics),一个是广告系统(Flurry Ads)。 +* Flurry SDK 接入也还算比较容易,报表系统中规中矩。就是网站访问稍微有点慢,比较花时间。 +* 付款略慢,在广告收益产生的 60天之后才付款。 +* 值得一提的是,Flurry 是比较早支持原生广告的(Native Ad)的。 + +MobFox 是一家欧洲的移动广告公司,总部位于奥地利。曾经它的 CEO 联系过我,希望能够就某项产品达成合作。后来因为收购事宜暂停,再后来,再后来就知道 MobFox 被 Matomy 收购,项目合作的事情就没有下文了。这家公司还是不错,付款也比较及时。虽然号称是欧洲最大的移动广告公司,并且全球位于 Top 10,但和 Google、Facebook 这样的巨头比起来,在全球范围内的影响力实在有点弱。 + +Apple 的 iAd,只是在 iOS 系统上进行投放。由于 iPhone 的市场定位和定价明显要高于 Android 系统,也就决定了 iOS 用户有较强的购买力,所以 iAd 广告的点击回报比较高,也就不言而喻了。不过如果你开发的 APP 需要同时投放 iOS 和 Android 系统,用 AdMob 管理起来相对容易一点。也可以通过 AdMob 的广告中介(mediation)功能,把部分流量通过 iAd 进行展示,从而使得广告收益的利益最大化。 + +像 OpenX 和 Smart AdServer 仅对欧美的签约客户开放,并不针对全球用户和开发者。只是曾经有美国和欧洲的客户在 GitHub 上看到我的开源项目,特意找到我要求我定制产品,通过项目合作的方式,我才得以了解和熟悉。不过因为不对全球开发者,所以也无法推荐使用。 + +至于 MoPub,它的 SDK 的是在 GitHub 上开源的,这是它与众不同的地方。不过也正是因为这一点,其文档和 SDK 接入就要稍微麻烦一些。必须要把这些 SDK 从源代码编译成 jar 和 framework,然后才能在自己的项目中使用。 + +Millennial Media(简写为 mMeida),其 SDK Demo 的美观度做得不错,不过客服和技术支持的响应实在不敢恭维。曾经碰到过技术问题,通过 Web Form 提交了问题,一直没有得到过答复,所以我后来也就懒得用它了。 + +另外像 Charboost、TapJoy 等等广告平台,也或多或少的接触过。不过精力有限,没有逐一进行具体的试用。Charboost 是 2011 年才创业的广告公司,只专注在移动游戏领域,2014年被 VentureBeat 指数报告定为 Top 10 的移动广告公司。通过 Chartboost 发布的广告,点击收益比较不错,不过反过来说,也就是广告投放、获取用户的成本是比较高的。我所认识的专门做重度游戏、专门投放海外市场的朋友,通过 Facebook 和 Chartboost 投放广告用得比较多。 + +上面介绍了不少移动广告平台,完全是个人经验和主观体会,有兴趣的可以自行尝试。 + +### 营销你的产品 + +(待续) + +### 联网版APP + +### 云服务 + +### 高级篇 + +### 用户数据分析 + +### 广告优化 + +### 支付与内购 + +### 社交营销 + +### 广告投放 + +### 附录 + +#### 互联网营销常用术语 + +Part1 最基本的名词 + +ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) + +Impression:意思是“曝光”,也被称为“展示”或“显示”,是衡量广告被显示的次数,一个广告被显示了多少次,它就计数多少。比如,你打开新浪的一个页面,这上面的所有广告就被“显示”了1次,每个广告增加1个Impression。 + +Click:点击,是指互联网用户点击某个广告的次数。 + +CTR:Click Through Rate,点击率。就是用click除以impression的比例。 + +CPM:Cost Per Mille,这次实际上省略了impression,全文应该是cost per mille impression。Mille是千的意思,在英语中它只跟着per一起用,即per mille,就是汉语的“每千……”的意思。所以CPM是每千次展示的成本。 + +CPC:Cost Per Click,每次点击的成本。 + +Ads:就是广告(名词)的英语复数啦。Ads = Advertisements。如果是“做广告”(动词),应该用Advertising。 + +SEM:Search Engine Marketing的简称。就是搜索引擎营销。不过在中国,SEM其实仅仅指PPC。但是SEM事实上是PPC和SEO的统称。PPC和SEO是什么,下面有解释。 + +PPC:Pay Per Click的简称。一般是特指搜索引擎的付费竞价排名广告推广形式,因为搜索引擎竞价排名只有一种收费方式,即按照点击付费。虽然也有其他广告形式也是按照点击数量来进行收费,一般不被称为PPC,而被称为CPC,即Cost Per Click。为什么?似乎是约定俗成。 + +SEO:Search Engine Optimization的简称。就是搜索引擎优化,特别指搜索引擎搜索结果自然排名的优化。所谓自然排名,就是不通过给搜索引擎付钱就能获得的排名。不花钱就能被搜索引擎排到前面当然是好事,但大家(每个网站)都这么想,所以要出头还挺难的。懂得这个领域的高手过去能挣很多钱,但今天SEO却越来越短时间内就出效果,所以想要通过SEO挣快钱越来越难。 + +Social:社会化,是social marketing(社会化营销)或者social media(社会化媒体)的简称,具体指二者的哪一个要看场合。社会化媒体,在中国过去是人人网、开心网之类,现在是微信、微博、图片分享类网站应用等。 + +WA:Web Analytics的缩写。就是网站分析。 + +DA:Digital Marketing Analytics的缩写。数字营销分析。 + +Part2 数据分析领域 + +Dimension:维度。维度是对一指一个事物的不同的方面、特征或者属性。这么说太抽象。简单说,人可以分成男人和女人,性别就是人的一种维度。或者汽车可以分为白色、黑色、红色等,颜色就是汽车的一种维度。维度是最基本的数据结构,任何一个度量(指标)必须要依附于一个具体的维度才有意义。比如说,我说visit=100,这没有任何意义。我说搜索引擎给我的网站带来的visit=100,就有了意义。搜索引擎流量就是维度(即流量来源)的具体的值(就如同男人是性别这个维度的具体的值)。 + +Metric(常用作复数,即Metrics):通常翻译为度量或者指标,但是因为指标含义更宽泛,例如KPI或者benchmark都可能被称为指标,所以在我的培训中metrics都是用度量来表示,这样更严谨。度量绝大多数都能能用数字表示,比如汽车的速度,速度就是度量。课程中涉及到的度量分为两类,一类是计数度量(比如常见的PV、UV、访次、停留时间等)和复合度量(两个度量四则运算而成,常见的有转化率、跳出率、留存率、活跃率等)。另外有些度量使用布尔量表示,即是或非。度量必须依附于维度才有意义。 + +Unique:Unique是指排重(排除重复)。Unique很少单独用,常用在计数类度量的前面,比如unique visitor,指排除对同一个访问者重复计数之后的访问者数量——同一个人今天到网站一次,明天又来一次,不能就因此变成两个人,unique visitor仍然是1。Unique visitor通常可以简化为visitor,两个可以通用。Unique visitor和unique user是唯一的两个可以加不加unique都算unique的度量。另一个例子是unique impression,即同一个人多次看同一个广告,还是计算为1次。Unique impression和impression是两个不同的度量,因为后者不排重。 + +Benchmark:我在大学的时候这个词被翻译为“定标比超”,真是不明觉厉的感觉呀。Benchmark就是“可以作为对比的参照值”。我的很多客户会问,这个指标在行业中的平均情况是什么样呀?他们的问题可以同样表述为:这个指标在行业中的benchmark是多少? + +Pattern:指某种会重复出现的模式或规律。Pattern常常用于发现用户行为上的某些趋同特征。比如,我们发现用户都喜欢在晚上10点到11点打开某个app应用,这就是一种pattern。如果我说发现了一个pattern,很兴奋,实际上的意思就是说我发现了一个规律。规律这词,几十年前就有了,pattern这洋文多有逼格呢…… + +Random:随机数,或者随机性。但是老外们也用它来形容“混沌”之类的意思。 + +Cohort:很难翻译,也很难形容,我暂且把它翻译成“队列”。跟Segmentation有点类似,但内涵要多一点,多点排队的意思。你懂的,课堂上讲清楚。Cohort一般是一种分析方法,所以一般不单独出来,而是跟analysis在一起,即cohort analysis。 + +Filter:过滤。过滤是指摒弃掉不需要的数据,只留下需要的。过滤都需要遵循一定的规则(这是废话),而且过滤掉的数据往往不能找回。过滤是一种常用的定位某个细分领域的方法,与细分(segmentation)的区别在于,segmentation是把总体分成并列的若干块(segment),而Filter则只保留符合规则的块,而丢弃其他不符合规则的块。 + +Segmentation:细分。这是我们最基本的方法,即把总体按照一定的规则分成并列的若干块。做了segmentation之后,每一个块就是一个segment。所以segmentation和segment不是同义词。Segmentation怎么用?怎么发挥最大价值?课堂上有很多案例。 + +Part3 互联网和互联网营销分析技术领域 + +Cookie:Cookie并没有真正的中文翻译,cookie是在你浏览网页的时候,网站服务器放在你电脑(或移动设备)的浏览器里面的一个小小的TXT文件。这个文件里面存储了一个标识你这个人的匿名的ID,以及一些与你访问的这个网站有关的一些东西,这样当你下一次访问这个网站的时候,cookie就会知道你又来了,并且记住你上次访问时候的一些状态或者设置。Cookie以及与cookie类似的东西是互联网营销的最重要技术之一,几乎所有识别人和标记人的工作都需要cookie及类cookie技术完成。在这次培训中会有详细的说明。 + +Deep link:没有汉语直接对应名词,我觉得直接叫“深链”好了,但不能叫做“内链”,后者是另外一个东西。Deep link历史悠久,过去把能够链接到网站的内页(即非首页的页面)的链接都称为deep link,但此后很快deep link这个词的意义就消失了,因为这样的链接实在太普通,都不需要用一个专用的名词来表述。但随着移动端的app的出现,deep link又“东(si)山(hui)再(fu)起(ran)”,特指那些能够跨过app首屏而直接链接到app的内屏(类似于网站的内页)的链接。嗯?如果这个app还没有安装过怎么办?这两期的公开课会专门讲。 + +Link Tag:Link Tag特指在流量源头的URL后面加上的标记,用来标明流量源头的名称和属性。最典型的link tag是Google Analytics的UTM格式的标记。目前已经成为标明paid media(花钱购买的广告流量)的标准配置。如何用好它,比你想的丰富,课堂上详解。 + +Heat map:热图。在一个图上标明这个图上哪些是获得更多关注的部分。关注可以是眼光,也可以是鼠标点击或者手指的指指点点。热图是做行为统计学研究的好可视化工具。大家都看得懂的东西,但用好则要水平。 + +JavaScript:简称JS,网站页面上的程序,能够让页面除了展示内容之外,还能实现更多的程序运行和功能。网站分析工具监测代码就是JS代码,将JS代码部署在你要监测的网页中,就可以把用户在页面上的互动访问行为不间断的发送到相应数据分析工具的服务器,从而获取想要的用户数据。 + +Attribution:归因。但是实际上这个词被翻译成“归属”更好。归因是指在多种因素共同(或先后)作用造成的某一个结果时,各种因素应该占有造成该结果的多大的作用,即“功劳应该如何分配以及归属于谁”。为解决归因的问题而建立的模型被称为归因模型,即attribution modeling。但我一直可惜这个词没有翻译好,翻译成归属模型或许更容易理解。 + +Path:路径。任何构成先后次序的一系列事件或行为都可以用路径来描述。路径分析(path analysis)也是较为常用的一种分析方法。 + +UID:是User Identification的缩写,即用户ID。 + +Bots:机器人。非人产生的流量,都被称为机器流量,即bots traffic。Bots是互联网虚假流量主要的创造者之一。 + +Spider:常翻译为蜘蛛,蜘蛛是一个自动程序,它的作用是访问收集整理互联网上的网页、图片、视频等内容。比如百度蜘蛛会将互联网的各种内容抓取回来并分门别类建立索引数据库,使用户能在百度搜索引擎中搜索到想要的内容。 + +IP:是Internet Protocol(网络互联协议)的缩写。IP地址就是给每个连接在互联网上的主机分配的一个地址,过去用于判断不同的访问行为属于同一个人(因为都是同一个IP记录产生的访问)。但由于各种动态IP和虚拟IP技术,用它判断用户人数已经很不可行。现在游戏领域也常常说起 IP,不过那是另外一个意思,intellectual property,知识产权,往往指的是著名的小说、影视、游戏等作品的人物故事等等。 + +Tracking:翻译为跟踪,就是数据分析工具跟踪用户各种行为的“跟踪”,用户所有的线上行为都可以被跟踪。监测这个词的“监”这个字,就是tracking。而测,则是measurement。所以监测这个汉语词,最准确的翻译就是tracking and measurement。监测需要用一定的技术手段实现,其中核心技术之一就是监测代码(tracking code),是一串可以发挥监测功能的程序(很多都是脚本语言编写,比如JavaScript语言)。 + +Pixel:本意是像素,但是在监测领域,是tracking code(监测代码)的同义词。 + +VAST:即Digital Video Ad Serving Template。一种实现视频程序化广告的基础性协议。目前是4.0版本。 + +Part4 流量与用户行为领域的名词 + +Bounce Rate:跳出率。会在课堂上简单介绍。 + +Referral:翻译为引荐来源。现实生活中,如果我推荐你使用了某个产品,或者我介绍你加入我们光荣的党,我就是引荐人(referral)。而在数字营销中,referral是指那些给我的网站带来了流量的其他网站,通常这些网站上会有链接到我的网站的链接。如果没有做特殊的标记(如使用link tag标记)或者不是特殊的流量源(比如搜索引擎),那么大部分的流量来源都会被监测工具记录为referral。 + +Retention:指用户的留存。如何让用户能够留存,是一个重要的课题。在这两期公开课培训中会跟大家介绍如何提升retention。 + +Engagement:没有特别合适的中文翻译,这个指标指的是用户在网站或APP上的交互程度或者参与度,可以由多个指标组合而成。比如一个网站有很多交互行为,包括下载文档、观看视频、咨询等,那么会根据每个交互的重要程度给每个交互行为赋值,用户每完成一个交互及赋予相应的数值,这样可以判断不同类别用户的交互程度以及不同页面的交互差异。Engagement和其他一些名词比如effectiveness、performance、acquisition等相似,都是泛指性的名词。 + +Session:session实际上和visit是一回事。本来,各类工具都是将用户的一次访问(网站)称为visit,但是随着app的普及,visit app听起来很别扭(因为我们都是use app),所以app也就不存在visit了,于是就用session代替。为了统一表述visit和session,有些监测工具把visit改称session。 + +Visit:即访问。指对用户对网站的访问,通常以30分钟为区隔。如果超过30分钟在网站上没啥动静,则一次访问结束。 + +Direct:翻译为直接访问,比如用户直接在浏览器输入网址访问,或者用户直接点击收藏夹里的网址进行访问,都会被记为直接访问。除了上述情况,从QQ客户端聊天窗口或微信客户端的链接直接访问网站的也会被记为直接访问。 + +Exit:退出,即用户离开网站或APP的行为,用户离开网站前的最后一个页面称为退出页(exit page),离开APP时所在的最后一个screen叫做exit screen。 + +Part5 策略与运营 + +Acquisition:泛指用户获取。在用户运营中使用的极为广泛,做任何产品的运营的第一步就是获取用户,比如在网页端的推广流量的获取、App推广中用户的下载等。 + +Goal:目标,是想要达到某种效果,每个网站都会有一些作为目标的交互,比如点击下载说明书、登录、注册、提交订单等。那我们就可以将这些设定为目标,那么这里引出另一概念:转化(conversion)。每完成一次上述的目标,就可以认定为完成一次转化。 + +KBR:Key Business Requirement。关键商业需求。是一个企业商业目标中最关键的。KBR决定了一个企业的其他目标,并且也决定了我们应该如何制定digital marketing的目标,以及针对这些目标选用什么样的指标或KPI。 + +KPI:Key Performance Indicator的缩写,译为关键绩效指标,是若干个用于衡量业务表现的最重要的度量。不同的商业目标,不同的业务,所对应的KPI不同。如何设置KPI是一门技术,也是一门科学。在这次的培训中也会做详细介绍。 + +Part6 互联网广告领域的名词 + +Display Ads:展示广告。展示广告主要指静态的图片广告、动画广告,以及富媒体广告(就是能互动一下的flash神马的)。这一广告形式与文字广告(就是文字链)和视频贴片广告形式是并列的不同类广告形式。 + +Banner:广义上是图片或者动画展示类广告的统称。这个词的含义源于上街游行队伍中拉着写有标语的大横幅,后来扩展到互联网广告商,并与display ads同义。 + +Pre-roll:也叫pre-roll ads,即前贴片广告。就是视频播放之前的长达10秒到丧心病狂的120秒的视频广告。 + +Content Feeds:信息流广告。信息流(主要是在社交网站和APP上)是内容并列排列自上而下像瀑布流一般,而在信息流中插入跟信息内容形态一样的广告,这种形式就是信息流广告。课堂上会介绍。 + +Native Ads:原生广告,通俗说是那些看起来就像网站或者app中正常内容一样的广告。原生广告容易和信息流广告混为一谈,但它们并不是一回事。原生广告可以采用信息流来实现,但不仅仅局限于此。 + +Reach:人群触达。如果做互联网广告,能够让广告触达到多少人是广告主关心的。触达实际上等同于unique impression,所以它不是动词,而是一个名词,一个用来记录广告触及到了多少人的计数度量。 + +Coverage:人群覆盖。跟触达非常类似,只是它的含义更模糊一些。往往用百分比来表示,例如,希望reach到的人群是1个亿,而实际reach到的是6000万,那么coverage大约是60%。Coverage不是一个度量,而是一个约定俗成的说法。 + +Viewability:广告可视性。过去统计广告的曝光的时候,不考虑广告是不是真的被人看到了,所以有些广告处在一个很长的页面的第二屏或者更后面的位置,而某个同学只看了第一屏就离开了的情况下,这个广告其实是根本没有处于屏幕中的,这个同学根本看不到这个广告。在不考虑viewability的情况下,这个广告仍然因此而有增加一次曝光(impression),而若考虑viewability,这个广告不增加一次曝光。 + +Pre-click:点击前阶段。指流量入口(尤其是广告)在被用户点击之前(含点击本身)的相关用户行为及对应的营销监测与分析体系。 + +Post-click:点击后阶段。指流量入口在被用户点击之后的相关用户行为即对应的营销监测与分析体系。 + +Fraud:作弊,也有更通俗的写法即cheating,但fraud特别指流量作弊。反作弊是anti-fraud。另一个与fraud类似的反面词汇是spam,即垃圾短信、垃圾邮件之类的骚扰垃圾信息。 + +Campaign:特别难找到准确对应的汉语名词,大意是一次有始有终的营销活动。有始,是指营销活动是从严谨的策划和详细的执行计划开始的,有终,是指营销活动有清晰的执行结束的节点。所以心血来潮的营销“游击战”不能称为campaign,那些几乎永远不停止的营销行为(例如SEM投放)也不能称为campaign。 + +Audience:受众。就是广告的阅览者,普罗大众。受众这个词太书面化了,但是确实没有比这个更明确的词,所以在这两期公开课中都会用这个词。 + +Target Audience:目标受众。任何人都可能看到你的广告,但只有那些合适的人才会购买你的商品。所以,合适的人就是你的目标受众,是你最希望影响到的那群人。 + +Effectiveness:效果。这是广告主评估品牌推广类广告好坏的一个关键指标。效果的含义比较广泛,在不同的campaign目标下可能不尽相同。比如,能够覆盖到的人群情况(coverage)可以作为一种效果;或者,人们是否真正对你的品牌产生了认知(awareness)也被称为一种效果。类似的,人们也用performance来表示营销的好坏,二者是近义词,但又不完全相同。Performance更偏重有实际产出的具体效果,因此常常被翻译为“绩效”,例如campaign产生了多少的click,产生了多少的交易等等。因此,effectiveness较为抽象,几乎只在品牌推广中被提起,而performance较为具体,在效果类推广中更为常见。 + +Efficiency:效率,即达到某种效果所花费的成本(包括金钱与时间)。品牌推广类营销常用,效果推广类很少提及。 + +Branding:品牌推广。 + +Awareness:对品牌或产品的认知。做广告的首要目的,就是让消费者意识到你的品牌或者商品的存在,说白了就是搏存在感。看看近期密集发布的手机在各个新闻app、电商app中频频发力,就知道awareness对广告主有多重要了。 + +Buzz:消费者或网民对于品牌、产品等广告主在乎的事情在网上发出的各种声音。与IWOM是一个意思。Buzz是苍蝇蜜蜂之类的嗡嗡声,无数网民每天在网上发出的各种意见, 在上帝看来就像苍蝇蜜蜂般嗡嗡作响。 + +IWOM:Internet Word of Mouth的简称。即网络口碑。 + +Survey:调研。这个词是一个有意思的词,主要在它的发音。作名词的时候重音在前——[?s??ve?],作动词的时候重音在后——[s??ve?]。 + +ePR:通过互联网进行的PR。 + +IP:Intellectual Property,即知识产权。就是过去说的那些原创的,有知识产权的东西。现在天天出现在各种口语和报道中的这个词指各种在互联网上创作的内容。例如,我的这个公开课也可以称得上是IP。Papi酱的网红视频?当然也是咯!与上篇的IP写法一样,意义完全不同。 + +Minisite/Microsite:没有对应的汉语名词,而且大家也从来不用汉语描述它。就是指为campaign专门定制的campaign网站,这些网站规模都不大,所以被称为mini(迷你)或者micro(微)。 + +Programmatic:程序化(广告)。一种革命性的广告运作方式。在课堂中会有详细的介绍。 + +DSP:Demand Side Platform(需求方平台)。程序化广告的广告投放管理系统平台以及相应的服务提供方。具体解释这里不多说了,到时候课堂上会详细介绍。 + +SSP:Supply Side Platform(供应方平台)。程序化广告的广告资源管理系统平台以及相应的服务提供方。具体课上介绍。 + +RTB:Real Time Bidding(实时竞价广告),这是程序化广告最重要的一种方式,也是理论上最佳的广告资源变现方案。但具体如何实现,优劣问题,以及国内的情况,课上详细讲。 + +Bid/Bidding:竞价。搜索引擎PPC广告,或者RTB广告,都需要竞价。类似于拍卖,但需要在预置条件的前提下通过程序来实现。课堂上详细说。 + +Bidder:Bidder即竞价者,在PPC广告范畴内,bidder就是普通SEM的操作从业者。在程序化广告范畴内,bidder一般就是DSP服务提供商。 + +DMP:Data Management Platform,数据管理平台。程序化广告(programmatic advertising)中为实现定向受众所需要倚仗的数据平台。但它能做的还远远不止这么多。培训课程中会专门涉及。 + +Verification:特指广告的验证。验证有两类,一类是验证广告是否真实被投放出去了,以及投放出去之后广告所处的环境是什么。什么是广告所处的环境?——对于PC web上的广告而言,环境就是这个网站以及具体承载广告的这个页面。另一类是验证广告覆盖的人群的情况是不是跟预想的一样。 + +Part7 效果营销领域的名词 + +Conversion Rate:转化率。是指从流量到实际销售转化的能力。与ROI本质是一样的。只是ROI衡量的是现金(收入)对现金(支出)的对比,而转化率衡量的是销售的数量与进入销售漏斗的人数(或者次数)的比例关系。 + +Churn和Churn Rate:客户流失和客户流失率。所有需要尽可能让用户反复购买(或付费)的生意,都有这个度量。看名字就知道,这个度量用来描述失去客户的情况。具体如何定义,以及如何分析,在课堂上会有详细说明。 + +SERP:Search Engine Result Page。就是搜索引擎的搜索结果页面。 + +Search Query:用户的搜索词。人们在各种搜索框(典型的如搜索引擎的搜索框)内填入的词,这些词可能很不结构化,且非常随意。而keyword,则是使用搜索引擎竞价排名的广告主设定的关键词。 + +Keyword:使用搜索引擎竞价排名的广告主设定的关键词,较为结构化,较规范。这些词不可能穷尽用户的search queries,因此搜索引擎会把用户的search queries转变为与之最相近(不过是否真的是最相近,那就只有搜索引擎知道了)的keywords,然后显示搜索的结果。 + +Organic Search:自然搜索流量源,即用户点击了自然搜索结果产生的流量,而不是点击了竞价排名(PPC)而产生的流量。 + +Affiliate Marketing:有时也就直接简称为Affiliate。这个词在国内没有对应的名词,在台湾被译作“联署营销”,但是这个翻译似乎仍然莫名其妙。Affiliate marketing就是典型的代销模式——你的东西,我帮你卖,卖出多少,你给我按照一定比例提成。在互联网上,affiliate marketing变成了我帮你引流量,我给你的流量如果有转化了,你给我提成。国内的亿起发、领克特等就是做affiliate marketing的专门平台。 + +EDM:Email Direct Marketing(电子直邮营销)的缩写,是利用电子邮件(Email)与受众进行商业交流的一种营销方式,电子邮件营销是网络营销手法中最古老的一种。 + +Performance:绩效,即通过营销之后获得“战果”。ROI就是一种典型的performance,销售额之类的也是。 + +GMV:Gross Merchandise Volume。这是电商经常会用到的词,书面是“毛销售量”,实际就是销售流水。当然,销售流水不等于最后赚到的钱。GMV=1销售额+2取消订单金额+3拒收订单金额+4退货订单金额。GMV是流水,只要你下了订单,生成订单号,就算了GMV。而这个订单转化为平台的实际收入还会有2、3、4这些流失量。下单以后后悔了取消订单,订单送到你面前了后悔了拒收订单,签收订单以后后悔了要退货(这个步骤不同的电商平台计算方法不一样,有的平台是不管退不退货都搜算进销售额中)。总之,人艰不拆,GMV数字大,好看,而且我们监测起来也最容易,所以这是最常用的。 + +AOV:Average Order Value。平均订单价格。 + +Monetization:变现。 + +MRR:Monthly Reoccurring Revenue,直译是每月都会产生的收入,实际就是用户要交的月费。比如我办了一个158元的包月电话套餐,对于电信公司而言,我就给他们贡献了MRR 158元。 + +Part8 移动端常用的 + +Screen:如果说web端用page view来记录页面被浏览的次数,那么screen就是app的页面,screen view就是app的页面浏览的次数。但因为screen没有page这个东西,所以就用screen来表示。我也不知道应该对应什么汉语名词,或者应该用“屏显”?反正相信你懂的。。 + +DAU:Daily Active User(日活跃用户数量)的缩写,通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),是用来衡量产品的用户粘性的重要指标。 + +MAU:Monthly Active User(月活跃用户数量)的缩写,概念与DAU相仿,区别在于时间跨度。MAU除了能衡量用户粘性,还可以分析产品衰退周期。 + +H5:是HTML5的简称。它实现的功能与Flash类似(用于实现动画和各种酷炫的人机交互界面等),但是比Flash具有更强的兼容性,可扩展性,稳定性以及安全性,因为该技术是HTML的延展,而非如同Flash一样是一个单独创立出来的事物。目前各大互联网钜子们——包括Adobe(Flash的所有者)——都已经加入支持H5,H5在移动端几乎已经完全取代了Flash。 + +ASO:App Store Optimization。狭义上指针对苹果应用商店的app排名所做的优化工作。广义则指对所有的应用市场的优化。与SEO类似,都是排名优化,只是优化的对象变成了应用市场。 + +LBS:Location Based Service,基于位置的服务。低逼格的讲就是用手机定位之后,能否关联一些服务或广告的。当然实际的应用比我说的肯定逼格高很多。 + +Part9 企业、组织机构与产品 + +Google Analytics:谷歌分析,简称GA,是全球用户量最大的网站和APP上流量用户行为的监测与分析工具。 + +Universal Analytics:简称UA,是GA在2013年左右做的一次大升级版本,目前无论是免费还是付费版的GA,都是基于Universal Analytics的。GA的付费版叫Google Analytics Premium,简称GAP。 + +GTM:Google Tag Manager,是谷歌公司用于管理网页上各种广告、监测和分析代码的平台型工具。课堂上会简单介绍。 + +DCM:DoubleClick Campaign Manager的简称 (即新版 DoubleClick for Advertisers 7),DCM 是一个管理及投放广告的全面解决方案,覆盖从 广告策划、管理、定位、投放、优化到生成报告等。广告的impression和click等几乎所有的度量,都可以通过它来进行监测。 + +AdWords:全称Google Adwords,是谷歌搜索引擎的关键词竞价系统,按点击收费(CPC)。 + +AdSense:全称Google Adsense,是谷歌推出的针对网站主(简称发布商)联盟的一个互联网广告服务,通过程序来分析网站的内容,并且投放与网站内容相关的广告。 + +DAA:Digital Analytics Association,数据分析协会。美国的互联网营销数据分析行业协会,号称是全球协会,但主要章程和成员都在美国,对其他国家的影响力较小。 + +IAB:Interactive Advertising Bureau,美国的互动广告局,也是类似于DAA的行业协会,主要领域是数字广告。这个协会在美国,但对全球数字广告的影响力巨大,尤其是标准和技术上。 + +#### 如何发布 APP 到 Apple AppStore + +#### 如何发布 APP 到 Google Play Store + +#### 如何发布 APP 到 360 应用商店 + +#### 如何用 Google Analytics 做用户数据分析 + + From a1d27e99e1979089fca790a476b8f27ebeb8bb60 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 03:26:52 +0800 Subject: [PATCH 02/24] add translation to english --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d3f7b2f..71de79e 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Real story 1: [Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) legend, a small mobile game developed by a Vietnam programmer in 2-3 days, swept the globe in just a few weeks, and bring income of $50,000 US dollors each day. This is undoutedly by chance, lucky guy, but at least, there is a probability of occurrence. Real story 2: -I know a Polish programmer, who uses the technology of a web page to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. +I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. Real story 3: I have been working in a company that develops insurance software. The business has developed fairly well, and management tried to IPO. However, they have not been able to take off and IPO yet, because the business model is too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. @@ -88,9 +88,9 @@ Maybe, you are a newbie, just getting started, and only know how to write a webp ### Language and Tools The language and tools for developing apps are often tied to the platform. -* If it is iOS, it is usually Objective C, and the development tools are [Xcode] (https://developer.apple.com/xcode/) from Apple (development tools only run on Mac) toolset. -* If it's Android, it's usually Java, and development tools are Google's [Android Studio] (http://developer.android.com/tools/studio/index.html) (a cross-platform development tool) toolset. -* If it is Windows Phone, that is C #, the development tool is Microsoft's [Visual Studio] (https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx) toolset (only run On Windows)。 +* If it is iOS, it is usually Objective C, and the development tools are [Xcode](https://developer.apple.com/xcode/) from Apple (development tools only run on Mac) toolset. +* If it's Android, it's usually Java, and development tools are Google's [Android Studio](http://developer.android.com/tools/studio/index.html) (a cross-platform development tool) toolset. +* If it is Windows Phone, that is C #, the development tool is Microsoft's [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx) toolset (only run On Windows)。 In addition, there are some cross-platform languages and tools, more friendly to developers. Develope once, package and release on multiple platforms: * HTML5, can be used to develop apps and games, javascript is the core language. @@ -101,19 +101,19 @@ In addition, there are some cross-platform languages and tools, more friendly to In the tutorial below, we chose the easiest javascript as the main development language for subsequent content. In fact, it is also the most active language on github. It can be used to develop: * Web pages, running in browser; * Single-page WebApp, running in browser; -* Command line tools, based on [nodejs] (https://nodejs.org/); +* Command line tools, based on [nodejs](https://nodejs.org/); * Network cloud services, based on nodejs; -* Hybrid APP, based on [cordova] (http://cordova.apache.org/) technology; -* APP with native UI experience, based on [react-native] (http://www.reactnative.com/). +* Hybrid APP, based on [cordova](http://cordova.apache.org/) technology; +* APP with native UI experience, based on [react-native](http://www.reactnative.com/). * Even desktop applications, such as the Adobe Brackets code editor, also developed with javascript. JavaScript can be used to develop front-end and back-end, code logic can be reused, thereby reducing the skill threshold and development costs. The requirements of the development environment is also very low, as long as there is a friendly code editor, a browser for testing and debugging, that's almost enough. The following are the the necessary environment and tools for development with javascript: * Chrome browser, comes with developer tools and javascript console for running and debugging. -* [Adobe Brackets] (http://brackets.io/) text editor (if you're used to [Sublime Text] (http://www.sublimetext.com/) or [Atom] (https://atom.io /) Or [Visual Studio Code] (http://code.visualstudio.com/), no problem) +* [Adobe Brackets](http://brackets.io/) text editor (if you're used to [Sublime Text](http://www.sublimetext.com/) or [Atom](https://atom.io /) Or [Visual Studio Code](http://code.visualstudio.com/), no problem) * iMac, with a huge 27-inch screen, really wide view for many windows, MacBook or Air is also okay; -* Mac OS X command line is very powerful, and convenient to support most LInux tools through [MacPorts] (https://www.macports.org/) or [Homebrew] (http: // brew.sh/). +* Mac OS X command line is very powerful, and convenient to support most LInux tools through [MacPorts](https://www.macports.org/) or [Homebrew](http: // brew.sh/). * Xcode (Mac version only), must-have to build and debug iOS apps. * Android Studio, used to build and debug Android APP. @@ -173,10 +173,10 @@ Open it with Chrome and we see the following display: Using HTML5 / javascript to do development, getting started is as simple as that. -If you need to develop high-quality apps, you need to master HTML / CSS and javascript, especially HTML5 / CSS3, master HTML DOM and some javascript libraries, such as [jQuery] (https://jquery.com/), etc. Here are some free tutorials for getting started: -* [HTML series tutorial] (http://www.w3school.com.cn/h.asp) -* [JavaScript Tutorial] (http://www.w3school.com.cn/js/index.asp) -* [JavaScript Advanced Tutorial] (http://www.w3school.com.cn/js/index_pro.asp) +If you need to develop high-quality apps, you need to master HTML / CSS and javascript, especially HTML5 / CSS3, master HTML DOM and some javascript libraries, such as [jQuery](https://jquery.com/), etc. Here are some free tutorials for getting started: +* [HTML series tutorial](http://www.w3school.com.cn/h.asp) +* [JavaScript Tutorial](http://www.w3school.com.cn/js/index.asp) +* [JavaScript Advanced Tutorial](http://www.w3school.com.cn/js/index_pro.asp) Through these tutorials, you can learn: * A simple index.html page; @@ -191,13 +191,13 @@ Next, we want to turn such a simple web app into a mobile app. To be exact, it s We need to use a technical framework called Cordova. -Originally a product developed by a small team acquired by Adobe, it was renamed PhoneGap (http://phonegap.com/). Adobe later turned it open source and donated it to the Apache Foundation, then called [Apache Cordova] (https://cordova.apache.org/). +Originally a product developed by a small team acquired by Adobe, it was renamed [PhoneGap](http://phonegap.com/). Adobe later turned it open source and donated it to the Apache Foundation, then called [Apache Cordova](https://cordova.apache.org/). Now Cordova has become a very popular technical framework, but also sought after by many commercial companies, in addition to Adobe, Intel, Microsoft, IBM and other companies have also introduced support Cordova products. The Cordova technology framework provides a command-line tool developed using nodejs, as well as a variety of plug-ins. -We first have to install [nodejs] (https://nodejs.org/en/), after installation, it will provide two basic commands: +We first have to install [nodejs](https://nodejs.org/en/), after installation, it will provide two basic commands: ```bash $ which node /usr/local/bin/node From 120cf7bbbc9eed656e975403ce3af09cc24696d3 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 03:30:19 +0800 Subject: [PATCH 03/24] add translation to english --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 71de79e..8c6f9a9 100644 --- a/README.md +++ b/README.md @@ -379,19 +379,19 @@ Here we introduce, how to register account, how to create ad unit, how to set ba Visit Google's AdMob website (https://www.google.com/admob/) to sign up for a new account. -! [AdMob Site] (demo / admobsite.png) +! [AdMob Site] (demo/admobsite.png) After registering, visit the AdMob website (https://apps.admob.com/), click on the menu "monetization", click on the red button in the upper left corner "+ monetize new application" to add a new APP: -! [AdMob New App] (demo / admobnewapp.png) +! [AdMob New App] (demo/admobnewapp.png) Then create banner ads: -! [AdMob New Banner] (demo / admobnewbanner.png) +! [AdMob New Banner] (demo/admobnewbanner.png) You can get the ad unit ID, copy it to the source code: -! [AdMob Ad Unit ID] (demo / admobadunitid.png) +! [AdMob Ad Unit ID] (demo/admobadunitid.png) ### Set Payment Info From 488e43bc9c55c36167b3ad2a32141f58d93b8643 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 03:31:37 +0800 Subject: [PATCH 04/24] add translation to english --- README.md | 2 ++ README.zh.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 8c6f9a9..3667a91 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ ## From Coding to Monetization:Programmer's Financial Freedom Approach + +从编码到变现:程序员财务自由之路 [中文版本/Chinese Version](./README.zh.md) ## Content diff --git a/README.zh.md b/README.zh.md index bdb4938..fb29e1d 100644 --- a/README.zh.md +++ b/README.zh.md @@ -1,4 +1,6 @@ ### 从编码到变现:程序员财务自由之路 + +From Coding to Monetization:Programmer's Financial Freedom Approach [英文版本/English Version](./README.md) ### 目录 From a3d2667eb74be18b698416cb17117e6f1eac4f6e Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 03:33:12 +0800 Subject: [PATCH 05/24] add translation to english --- README.md | 3 ++- README.zh.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3667a91..9ba3903 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ## From Coding to Monetization:Programmer's Financial Freedom Approach -从编码到变现:程序员财务自由之路 +【从编码到变现:程序员财务自由之路】 + [中文版本/Chinese Version](./README.zh.md) ## Content diff --git a/README.zh.md b/README.zh.md index fb29e1d..2ded802 100644 --- a/README.zh.md +++ b/README.zh.md @@ -1,7 +1,8 @@ ### 从编码到变现:程序员财务自由之路 From Coding to Monetization:Programmer's Financial Freedom Approach -[英文版本/English Version](./README.md) + +[英文版本 / English Version](./README.md) ### 目录 From 72eeb3738de19d83a49b7c0aa941ce39f47e9492 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 03:41:50 +0800 Subject: [PATCH 06/24] add translation to english --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9ba3903..5c41106 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ If you feel that the content of this book is helpful, please give you support, b ### Positioning -Since it is to talk about earning money, we will not discuss the hard way of outsourcing, in which the business model is to sell limited life time as meney. +Since it is to talk about earning money, we will not discuss the hard way of outsourcing, in which the business model is to sell limited life time as money. Considering factor of limited man power, time and resource, we will not discuss carrier-class, or enterprise-class large-scale systems. As they require large investment and long research cycle for complex requirement, which is beyond congrol of individuals and small teams. @@ -76,7 +76,7 @@ Real story 2: I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. Real story 3: -I have been working in a company that develops insurance software. The business has developed fairly well, and management tried to IPO. However, they have not been able to take off and IPO yet, because the business model is too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. +I have been working in a company that develops insurance software some years ago. The company had developed fairly well, and the management tried to IPO. However, they have not been able to take off and IPO yet, because the business model was too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. You can find other similar stories, about making good money from mobile apps or games. You may heard, or just google the internet. From b8141361cb8e8fd7ed60c1b7a59c9202aaf6f5e9 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 12:03:23 +0800 Subject: [PATCH 07/24] add translation to english --- README.md | 244 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 125 insertions(+), 119 deletions(-) diff --git a/README.md b/README.md index 5c41106..b1ba9da 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ I know a Polish programmer, who uses the web page technology to make an uncompli Real story 3: I have been working in a company that develops insurance software some years ago. The company had developed fairly well, and the management tried to IPO. However, they have not been able to take off and IPO yet, because the business model was too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. -You can find other similar stories, about making good money from mobile apps or games. You may heard, or just google the internet. +You can find other similar success stories, about making good money from mobile apps or games. You may heard, or just google the internet. In this book, what we want to explore, is to make full use of limited time and resource, focus on a very narrow area of requirement, to develop a very unique mobile app or small game, publish to global app store, acquire users, and make money. @@ -382,29 +382,29 @@ Here we introduce, how to register account, how to create ad unit, how to set ba Visit Google's AdMob website (https://www.google.com/admob/) to sign up for a new account. -! [AdMob Site] (demo/admobsite.png) +![AdMob Site](demo/admobsite.png) After registering, visit the AdMob website (https://apps.admob.com/), click on the menu "monetization", click on the red button in the upper left corner "+ monetize new application" to add a new APP: -! [AdMob New App] (demo/admobnewapp.png) +![AdMob New App](demo/admobnewapp.png) Then create banner ads: -! [AdMob New Banner] (demo/admobnewbanner.png) +![AdMob New Banner](demo/admobnewbanner.png) You can get the ad unit ID, copy it to the source code: -! [AdMob Ad Unit ID] (demo/admobadunitid.png) +![AdMob Ad Unit ID](demo/admobadunitid.png) ### Set Payment Info -After registering your account, you can accumulate ad revenue by putting the ad unit into the APP for actual usage. +After registering your account, you can accumulate ad revenue by putting the ad unit into the APP for user actual usage. There are two more steps to complete the Google advertising payment you receive: -* Verify address. Google will generate a PIN code printed on the card, mailed to your mailing address. +* Verify address. Google will generate a PIN code printed on the card, send to your mailing address. * Set up payment information. Can be Western Union or bank account. -However, newly registered account is not allowed to set bank information. Only your cumulative advertising revenue reached the basic threshold (currently 10 US dollars), Google will allow you to set up payment information. Through this method, Google can filter out a large number of non-active accounts. +However, newly registered account has no access to set bank information. Only your cumulative advertising revenue reached the basic threshold (currently 10 US dollars), Google will allow you to set up payment information. Through this method, Google can filter out a large number of non-active accounts. #### Verify PIN Code @@ -459,135 +459,139 @@ Usually it will take Apple 2 or 3 days to review your app. If the review passes, ### Calculate Ad Revenue -当用户在设备中下载、安装APP并运行的时候,就会从谷歌的广告服务器请求正式的广告内容,并用于展示了。 +When a user downloads, installs and runs an app on his device, he or she requests the official ad content from Google's ad server for display. -你可以登陆谷歌 AdMob 网站,查看每天的广告展示量、点击率、以及产生的收益。这个网站也提供了非常强大的报表功能,可以根据国家、广告单元、时间段,显示非常详细的报告。谷歌在 AppStore 上发布有一个 AdSense 的 APP,你可以安装这个 APP,每天查看你的 AdMob 收益。 +You can visit the Google AdMob website to see daily ad impressions, clickthrough rates, and revenue. This site also offers very powerful reporting capabilities that show very detailed reports based on country, ad unit, time period. Google has an AdSense app on the AppStore, and you can install this app on your phone to see your AdMob earnings daily. -每次用户对感兴趣的广告进行点击,就会产生广告收益。大部分的广告投放,是按照点击次数计算费用的,即所谓的 CPC 广告。 +Each time a user clicks on an ad of interest, it generates advertising revenue. Most of your ad serving is calculated based on the number of clicks, the so-called CPC ads. -在计算广告收益的时候,有几个常见的基本术语: -* CPC(Cost Per Click,每次点击费用),大约是 US$ 0.06 ~ 1.0; -* CTR(Click Through Rate,展示点击率),大量统计的结果大约是 1%; -* CPM (Cost Per Mile, 每千次展示费用),通过 CPC 和 CPR 也能够推算出 CPM,大致范围是 US$ 0.5 ~ 5。 +In calculating advertising revenue, there are several common basic terms: +* CPC (Cost Per Click, cost-per-click) is about US $ 0.06 ~ 1.0; +* CTR (Click Through Rate, show CTR), the result of a large number of statistics is about 1%; +* CPM (Cost Per Mile, CPM), CPM can also be calculated by CPC and CPR, the approximate range is US $ 0.5 ~ 20. -每次点击的价格,根据广告投放的价格不同而不同。全球不同国家由于经济水平不同,也存在很大的差异。例如, -* 在美国,一次广告点击可能产生 0.2 美元的收益; -* 在巴西,也许只有 2 美分,相差 10 倍。 -* 而日本,广告点击的收益是相当高的。 +The price per click varies based on the type of ad, the price that is served, and so on. Since different countries in the world have different economic levels, there are also big differences. -下面是一组数据的对比: +E.g, +* In the United States, an ad click may yield a gain of $0.2; +* In Brazil, maybe only 2 cents, a difference of 10 times. +* In Japan, clicks on advertising revenue is quite high. -美国 | 巴西 +The following is a comparison of a set of data: + +USA | Brazil ---|--- ![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) -日本 | 德国 +Japan | Germany ![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) -如果我们按照 CPM (每千次展示费用)1美元 来估算,每天 10万次广告展示,大约可以产生 $100美元现金收益。按照 6.45 的汇率计算,一个月30天(包括周末和节假日!),大约可以产生的收益是 ¥19,350。 +If we conservatively estimate $1 CPM (cost per thousand impressions), 100,000 ads per day will generate about $100 in cash. Then it will generate $3,000 in a month (including weekends and holidays!). -而在上海,5年经验的、技术能力还不错的程序员,薪资大约也就 15,000 左右。如果你做的 APP,每天能够有 1万个用户使用,基本上产生的广告收益和现金流,就可以达到一个程序员的工资水平。 +Let's compare it with the average programmer's salary. In Shanghai, an experienced programmer with 5 year experience, the salary is about $2,300 or so. If you make such the APP, with 10,000 DAU (daily active user), the revenue generated from advertising can exceed the salaries of a programmer. Or even more, if optimized very well. -我认识一个巴西人,他用 HTML5 技术实现的小游戏,简单,但是非常有趣。每天的活跃用户大约是 10万,广告收益已经超过每个月 15万,从而实现了财务自由。 +I know a Brazilian, develop his game with HTML5 technology, simple, but very interesting. Daily active users is about 100,000, advertising revenue has more than $25,000 per month, so as to achieve the financial freedom. -### 进阶篇 +### Advanced -### 需求是根本 +### Demand is fundamental -前面我们介绍了如何为 APP 增加了变现(monetization)的能力。但要真正获得可观的收益,还必须得有足够多的用户。也就是说,你必须开发出足够好的 APP,能够真正解决用户的问题,才会有更多的用户使用、更高频度的使用。 +Earlier we described how to add monetization to APP. But to really get a decent return, you still have to get enough users. In other words, you have to develop enough good APP, can really solve the user's problem, will have more users, more frequent use. -如何能够开发出更受用户欢迎的 APP 呢?其实这不是一个编程问题。 +How to develop a more popular APP? In fact, this is not a programming problem. -也许你是一个技术的大牛,但是最艰深、最牛X的技术,开发出来的软件产品未必是受到用户欢迎的产品。有时候,你用了一种其实比较简单的技术,但是真正关注了用户的痛点,解决了用户关心的问题,很可能你的产品就会受到用户的欢迎,创造出口口相传的良好口碑,在社交网络得到自然传播。 +Perhaps you are a technical expert, using the most difficult, coolest technology, but the software products developed, may not be welcomed by users of the product. Sometimes, you use a technology that is actually relatively simple, but really pay attention to the user's pain points, to solve the user's concerns, it is possible your product will be welcomed by users, because of good reputation in the social network to get the natural spread. -我推荐一本书,《需求-缔造伟大商业传奇的根本力量》,作者是亚德里安•斯莱沃斯基。 +I recommend a book, "Demand - the Fundamentals of Creating Great Business Legends," by Adrian Silesivski. -以下是某些创业成功者的推荐: +Here are some tips from entrepreneurs: -> 这是一本好书,每个创业者和每个公司管理者都值得一看,甚至公司中的每个人都应该了解和体会其中的概念。书中给出了一些创造需求的模式,这对读者是非常有价值的,我们需要好的理念,但我们更需要可以践行理念的方法。这两点本书都做到了,非常值得一读,特荐之。 -——孙陶然 ,拉卡拉支付有限公司创始人、董事长兼总裁,《创业36条军规》作者 +> This is a good book worth every entrepreneur and every manager of the company to read, and even everyone in the organization should understand the concepts. The book gives some models for creating needs, which are very valuable to readers, we need good ideas, but we need more ways to practice ideas. These two books are done, very worth reading, especially recommended. +- Sun Taoran, founder, chairman and president of La Cara Pay Ltd., author of "Entrepreneurship 36 Military Regulations". -> 每一个抱怨的背后都隐藏着一个未被满足的需求,而每一个需求的背后必然隐藏着一个不可忽视的市场。其实任何产品,在一开始满足了用户的功能性需求以后,就应该着手升级到精神层面,用户拒绝麻烦,用户需要安慰,这看起来跟利润无关,但是对不起,它跟你的市场有关。你不去满足,创业者就会自己去进行开拓性满足。那么等待你的,或将是个生死存亡的巨大危机。因此,请一定重视麻烦所带来的希望,而不是去抵触他们的抱怨。这正是《需求》给我们带来的最有价值的东西。 -——杜子建,华艺传媒创始人,社会化媒体营销研究者,畅销书《微力无边》作者 +> Behind every complaint is hidden an unmet need, and behind every need inevitably hides a market that can not be ignored. In fact, any product that meets the functional needs of the user from the outset should be upgraded to the spirit level, the user refuses to trouble, the user needs comfort, it does not seem to have anything to do with the profit, but I'm sorry, it is related to your market. You do not meet, entrepreneurs will go to their own ground-breaking satisfaction. Then waiting for you, or will be a huge crisis of life and death. Therefore, please pay attention to the hope of trouble, rather than to their complaint. This is exactly the most valuable thing that "demand" brings to us. +- Du Zijian, founder of Huayi Media, social media marketing researcher, bestseller "Boundless" author. -### 用户体验 +### User Experience -为什么苹果手机卖得贵,依然热卖?无疑它是以优秀的用户体验取胜的。如果你看过《乔布斯传》,你可以知道,苹果手机的诞生,其实是解决了传统手机难于使用的痛点。 +Although the sale of Apple mobile phone is very expensive, but still very popular, why? It is undoubtedly the best user experience to win. If you read "Steve Jobs Biography", you can know that the birth of Apple's mobile phone, in fact, is to solve the pain of traditional phones difficult to use. -自然我们在手机上开发的 APP 或者 游戏,也必须要高度关注用户体验,并且把它放到战略重点的位置上来。手机 APP,不追求功能的强大、齐全,可以只做一个小小的功能,但是要切实关注用户的需求点、并提供优秀的用户体验。 +Naturally, the app or game we develop on our mobile phone must also be highly user-focused and put it in a strategic position. Mobile APP, not the pursuit of powerful features, complete, you can only do a small feature, but to effectively focus on the needs of users, and provide excellent user experience. -一个相当典型的例子是这款《手电筒》APP,就是打开手机的 LED灯泡,用来临时照亮黑暗。 +A rather typical example is this "Flashlight" APP, which is to turn on the phone's LED bulb to temporarily light up the darkness. ![Torch APP](demo/torchapp.png) -这款 APP 的用户已经超过好几亿,自然收益也是极其可观。 +This APP has more than hundreds of millions of users, of course, its economic return is also extremely impressive. -评价的数量超过600万人次,它的用户是这样写的: -* Jennifer Baylis: 易于使用。#1 最棒的手电筒APP!非常容易使用,打开很快! -* Kitty Davis: 我正是需要这样一个手电筒 APP。 -* Dennis Castello: 它正是做到了需要它做的事,而且做的真的很好。 -* Joseph Low: 易于使用。轻松地让它干活!强烈推荐! +The number of user comments exceeded 6 million and the users wrote: +* Jennifer Baylis: easy to use. # 1 The best Flashlight APP! Very easy to use, open very fast! +* Kitty Davis: I just need such a flashlight APP. +Dennis Castello: It's exactly what it takes and it's done really well. +* Joseph Low: easy to use. Let it work easily! highly recommended! -### 哪种广告最适合 +### What Ad is Best -在移动广告领域,存在多种形式的广告,并且也在不断的发展。 -* banner Ad,横幅广告 -* interstitial Ad,插屏广告 -* native Ad,原生广告 -* reward video Ad,奖励视频广告 -* IAP (in-app purchase) Ad,内购广告 +In the mobile advertising arena, there are many forms of advertising, and are also constantly evolving. +* banner Ad +* interstitial Ad +* native Ad +* reward video Ad +* IAP (in-app purchase) Ad -哪种广告适合你的 APP,需要很好的权衡用户体验和收益之间的关系。如果广告展示不当,或者展示过于频繁,影响了用户体验甚至招致用户反感,就本末倒置了。 +Which ad is best for your app, depending on the situation. This requires a good balance of user experience and revenue. If the ad is displayed improperly, or show too often, affecting the user experience or even cause the user offensive, it is the cart before the horse. -横幅广告 | 插屏广告 +banner Ad | interstitial Ad ---|--- ![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) -这两种广告是最为基本和经典的,各有千秋。相对来说,横幅广告只占用屏幕下方的一小片空间,可以一直滚动展示,默认的是每 60 秒更换一次广告内容。优点是不太会影响用户界面和体验,缺点则是因为不太起眼,不容易引起用户的注意和点击。 +These two kinds of advertisements are the most basic and classic, each has its pros an cons. Banner ads occupy only a small space at the bottom of the screen, changing the ad content every 60 seconds. The advantage is not too affect the user interface and experience, the disadvantage is because less obtrusive, not easy to arouse the user's attention and clicks. + +Interstitial ad is full-screen, pop-up at a specific time, more able to attract the user's attention and click. Because of this, the interstitial ad has better effects and click revenue is higher than the banner ads more than 5 times, so more recommended. -插屏广告则是全屏的,在特定的时间弹出,更能够吸引用户的眼球和点击。也正是因为这个原因,插屏广告的点击收益比横幅广告要高 5 倍以上,比较推荐使用。 +When using interstitial ad, please pay special attention to the pop-up time, do not interrupt the user's continuous operation and gaming experience, otherwise it will cause the user's strong aversion. Best practice is to put it in transition between the two stages, such as the game is just over, pop-up screen ads, and then continue to the next level. -使用插屏广告的时候,要特别注意弹出的时间,千万不要打断用户的连续操作和游戏体验,否则不仅不会引起用户的点击,还会引起用户的反感。最佳做法是将其放在 2个阶段之间的过渡时机,例如游戏的一关刚刚结束,弹出插屏广告,然后再继续下一关。 +Using cordova-plugin-admobpro to display interstitial ads is also straightforward, requiring just two lines of javascript to complete. One line of code prepares inventory and the other line of code shows ads. -通过插件 cordova-plugin-admobpro,要展示插屏广告也是非常简单的,只需要 2 行 javascript 代码就可以完成了。其中一行代码负责准备广告资源,另一行代码负责展示。示范代码如下: +Here is the example: ```javascript -// 在游戏启动时或者进行中,开始准备插屏广告,通过后台线程下载广告资源 +// When the game starts, it starts to prepare for interstitial ads, and the background thread downloads the inventory if(AdMob) AdMob.prepareInterstitial({ adId: "__ad_unit_id_here__", autoShow: false }); -// 在游戏关卡结束时,调用 API 进行插屏广告的展示 +// At the end of the game level, call API to display the interstitial ad if(AdMob) AdMob.showInterstitial(); ``` -以上这 2 种广告,是最容易使用的广告形式,集成到 APP 中的工作也最为容易。 +The above two kinds of advertisements are the easiest to use forms of advertisement, and the work integrated into the APP is also the easiest. -原生广告(native Ad),就是将广告内容以较为和谐的方式,展示在APP自身的内容之间,不会显得过于突兀和突然,这是对用户体验影响最小的一种广告形式。 Facebook AudienceNetwork 和 Flurry 比较早就推出了原生广告,不过谷歌 AdMob 对此持谨慎态度,仅仅在部分开发者中进行 beta 试用。 +Native Ad is a new way to show your ads in a more harmonious way between their own content. It does not seem obtrusive or abrupt. It's the type of advertising that has the least impact on user experience. Facebook AudienceNetwork and Flurry launched native ads long before, and later Google AdMob also introduced it to developers. -奖励视频广告(reward video Ad),是谷歌新推出的一种广告。就是鼓励用户看完广告视频,然后开发者在游戏中或者 APP 中给予某种虚拟物品的奖励。在以前的广告推广中,谷歌并不支持在用户接受广告方面给予鼓励的行为,甚至将对点击广告给予奖励的做法定为违规的行为。因为这很可能违背用户本身的兴趣、造成虚假无效点击。新的奖励视频广告方面,谷歌采取了相对灵活和务实的态度。不过这方面的广告视频来源,基本上都是通过广告中介的方式来自于其他的广告网络。 +Reward video Ad, a new ad in the mobile advertising industry. It encourages users to watch ad videos and reward them with some kind of virtual item in the game or app. In previous advertising campaigns, Google did not support giving users encouragement, and even made it illegal to give rewards. Because this is likely to violate the user's own interest, resulting in false invalid clicks. For the new rewarded video ad, other advertisers first introduced and succeeded in the market, Google adopted a relatively flexible and pragmatic attitude. However, advertising video sources are not very rich, many are mediation way from other ad networks. -内购广告(IAP House Ad)是一种新颖、创新的广告形式,应用内购买广告可让用户直接在应用内购物。因为需要和支付系统、或者谷歌Play Store结合起来,所以仅在 Android 系统支持。通过内购广告,应用开发商可在以下方面获益: -* 通过在同一款应用中实施广告投放和应用内购,可以最大程度地增加您的收入和用户的生命周期价值。 -* Google 会自动帮助您确定哪些用户有可能购买应用内购商品,并向其余用户展示普通的付费广告。 -* 不需要开发自己的应用内购支持系统,也不需要在应用中加入应用内购支持代码。 -* 利用不同的自家内购广告,可以轻松定位用户群体中的各种细分受众群。通过将应用内购广告与 AdMob 受众群体构建工具结合使用,可以向高消费群体投放价格高的应用内购商品,而向其他用户展示价格低的商品。 +IAP Ad is an innovative form of advertising. IAP Ad allows users to shop directly in-app. Because it needs to be integrated with the payment system or the Google Play Store, it's only supported on the Android system. With in-app advertising, app developers can benefit from: +* Maximize your revenue and user lifecycle value by implementing ad serving and in-app purchases in the same app. +* Google automatically helps you determine which users are likely to purchase in-app purchases and show ordinary paid ads to the remaining users. +* No need to develop your own in-app support system or add in-app support code to your app. +* Easily target various segments of the user community with different in-app purchases. By using In-App Ads with the AdMob Audience Builder, you can serve high-priced, in-app products to high-spending groups while showing them to you at lower prices. -如果要尝试原生广告、奖励视频广告、内购广告,请移步 Google [AdMob 官方文档网站](https://developers.google.com/mobile-ads-sdk/),进行深入研究,学习如何使用。 +If you want to learn more about native ads, rewarded video ad, buy ads, go to Google [AdMob official documentation website](https://developers.google.com/mobile-ads-sdk/) for in-depth research and study how to use. -### 哪家广告商最靠谱 +### Which Ad Most Reliable -因为移动广告领域的利润可观,移动广告平台的发展也是非常快的。过去的这些年,也发生了不少并购案。例如 Google先后收购了 DoubleClick 和 AdMob,Flurry 被 Yahoo! 收购,MobFox 被 Matomy 收购,Millennial Media 被 AOL 收购。 +Because of the profitable mobile advertising sector, the mobile advertising industry is also growing very fast. Over the past few years, there have been many mergers and acquisitions. For example, Google has successively acquired DoubleClick and AdMob, Flurry acquired by Yahoo!, MobFox acquired by Matomy, and Millennial Media acquired by AOL. ![Top Ad Networks](demo/topadnetworks.jpg) -通常广告平台会提供: -* 接入广告系统的 SDK; -* 注册、登录和管理广告的系统; -* 接入指南、例程、FAQ; +Usually the ad platform will provide: +* SDK, providing API for accessing advertising system; +* Register, login and manage advertising system; +* Integration Guide, examples, FAQ; -各种移动广告平台的相关介绍,可以通过搜索活着其他不同的渠道去了解(例如 StackOverflow.com),并可以有选择性的进行尝试。 +Information about the various mobile ad platforms can be found through search or through a number of different sources (eg, StackOverflow.com) and try selectively. -以下是我试用过的一些广告平台: +Here are some of the advertising platforms I've tried: * Google AdMob * Facebook AudienceNetwork * Yahoo! Flurry @@ -600,76 +604,78 @@ if(AdMob) AdMob.showInterstitial(); * Smart AdServer * ... ... -使用下来比较满意的有 AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox。尤其是 AdMob,非常值得推荐。 +By trying to use, I am more satisfied with AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox. Especially AdMob, is highly recommended. -AdMob之所以最值得强烈推荐,主要有这样一些突出的优点: -* 广告填充率高(基本上在 98% 以上,有个别国家略低于90%),因此可以充分利用用户流量。毕竟广告是谷歌公司的主要业务和利润来源,其广告客户遍及全球,这也不足为怪了; -* 付款及时,每个月的月底结算,次月 20日支付; -* SDK 非常稳定,接入文档以及参考代码易于使用,并且有不同语言的文档和系统界面; -* 报表系统功能强大、易于使用,可以通过不同的维度进行数据分析; -* 有专门的 APP 可以用来跟踪收益; -* 有专门的技术支持人员,有官方支持的技术论坛,专门解答 SDK 接入方面的技术问题; -* 定期会组织一些宣讲、培训活动,也定期有线上视频讲座; -* 客户服务非常到位,非常的耐心和友善,我和他们也基本上一直保持联系。 +The reason why AdMob is the most highly recommended, there are some prominent advantages: +* Ad fill rate is high. Basically more than 98%, some countries slightly less than 90%, so you can take full advantage of user traffic. After all, it is no surprise that advertising is a major source of revenue and revenue for Google, with advertisers around the world. +* Payment promptly. The monthly earnings are settled at the end of the month and paid on the 20th of the following month; +* SDK is very stable. Integrated documentation and reference code Easy to use, with documentation and system interfaces in different languages; +* Reporting system powerful and easy to use. Data can be analyzed in different dimensions; +* Easy to use. A dedicated APP can be used to track earnings; +* Support in place. A dedicated technical support staff, technical forums with official support, dedicated to answer the technical aspects of SDK access; +* Regularly organize some preaching and training activities, as well as regular online video lectures; +* Customer service is in place. Very patient and friendly, I keep in touch with them. -由于谷歌在各个领域的卓越创新、一贯的优质服务,在开发者中有良好的口碑。 +Because of Google's excellence in innovation and consistent quality service, it has very high reputation among develoeprs. -而基于 AdMob SDK 开发的 cordova-plugin-admobpro 这款插件,不仅把 Objective-C / Java / C# 的原生 API 封装为统一的 javascript API,而且更加简单易用,只需 1-2 行代码即可完成广告展示。这款插件在 Cordova 全球社区也广受欢迎,是使用率最高的变现插件。以下是插件的下载趋势曲线图: +The cordova-plugin-admobpro plug-in, built on the AdMob SDK, not only encapsulates Objective-C / Java / C # native APIs into a unified javascript API but is also much easier to use. Just 1-2 lines of code to complete the ad display. Popular in Cordova's global community, this plug-in is the most-used monetization plug-in. The following is a plug-in download trend curve: ![AdMob Download Trend](demo/admobprodltrend.png) -Facebook 的 AudienceNetwork 也挺不错。Facebook 不仅仅是最大、最活跃的社交媒体,也提供各种相关 SDK,包括广告用的 AudienceNetwork。其开发者网站为:https://developers.facebook.com/docs/audience-network 。 -* Facebook 的 广告填充率(Fill Rate)没有 AdMOb 那么高,大约在45~75% 之间。 -* Facebook 付款也很及时,也是在每个月的 21日左右支付上个月的广告收益; -* Facebook 的 SDK 更新非常频繁,大约 2 周左右就会发布一个新的版本,因此如果有什么 bug 修复也很快。不过更新的频度实在有点高,有时候有点跟不上的感觉。相对来说,谷歌 AdMob 的 SDK 更加稳定一些; -* 管理界面和报表系统也比较清楚易用,一目了然。报表系统没有 AdMob 的那么强大和灵活,貌似仅有英文界面,看上去是下面这样的。 +Facebook AudienceNetwork is not bad. + +Facebook is not only the largest and most active social media, but also offers a variety of related SDKs, including AudienceNetwork for Advertising. Its developer website is https://developers.facebook.com/docs/audience-network. +* Facebook's Fill Rate is not as high as AdMob, about 45-75%. +* Facebook payment is also timely, but also in the 21st of each month to pay last month's advertising revenue; +Facebook's SDK updates are very frequent. A new version will be released in about two weeks, so if there are any bugs, the fix is fast. However, the update frequency is a bit high, sometimes feeling a little behind. Relatively speaking, Google AdMob SDK more stable; +* Management interface and reporting system is also relatively clear and easy to use. The reporting system is not as strong and flexible as Google Admob, seemingly only English interface, it looks like the following. ![Facebook AudienceNetwork](demo/fbaudnet.png) -Flurry 是一家被 Yahoo!收购的移动广告公司,其官方网站是 http://www.flurry.com/ 。其主要的产品有 2 个,一个是数据分析(Flurry Anlytics),一个是广告系统(Flurry Ads)。 -* Flurry SDK 接入也还算比较容易,报表系统中规中矩。就是网站访问稍微有点慢,比较花时间。 -* 付款略慢,在广告收益产生的 60天之后才付款。 -* 值得一提的是,Flurry 是比较早支持原生广告的(Native Ad)的。 +Flurry is a mobile advertising company that has been acquired by Yahoo, the official site is http://www.flurry.com/. There are 2 main products, one is Flurry Anlytics and one is Flurry Ads. +* Flurry SDK integration is still relatively easy, the reporting system quite satisfactory. Site visit is a bit slow, more time-consuming. +* Payments are slightly slower and are not paid until 60 days after the advertising revenue. +* It is worth mentioning that, Flurry is a relatively early support Native ads (Native Ad). -MobFox 是一家欧洲的移动广告公司,总部位于奥地利。曾经它的 CEO 联系过我,希望能够就某项产品达成合作。后来因为收购事宜暂停,再后来,再后来就知道 MobFox 被 Matomy 收购,项目合作的事情就没有下文了。这家公司还是不错,付款也比较及时。虽然号称是欧洲最大的移动广告公司,并且全球位于 Top 10,但和 Google、Facebook 这样的巨头比起来,在全球范围内的影响力实在有点弱。 +MobFox is a European mobile advertising company headquartered in Austria. I used to contact its CEO, he wants me to develop plug-ins for them. Later, because of the acquisition, then later, we knew that MobFox was acquired by Matomy. This company is still good, payment is more timely. Although known as Europe's largest mobile advertising company, and the world is located in the Top 10, but compared with giants such as Google, Facebook, the global influence is really a bit weak. -Apple 的 iAd,只是在 iOS 系统上进行投放。由于 iPhone 的市场定位和定价明显要高于 Android 系统,也就决定了 iOS 用户有较强的购买力,所以 iAd 广告的点击回报比较高,也就不言而喻了。不过如果你开发的 APP 需要同时投放 iOS 和 Android 系统,用 AdMob 管理起来相对容易一点。也可以通过 AdMob 的广告中介(mediation)功能,把部分流量通过 iAd 进行展示,从而使得广告收益的利益最大化。 +Apple's iAd just launches on iOS. As the iPhone's market positioning and pricing significantly higher than the Android system, it also determines the iOS users have a strong purchasing power, so iAd ad click returns relatively high, it goes without saying. However, if you develop an app that needs to run on iOS and Android at the same time, managing it with AdMob is a bit easier. You can also use AdMob's mediation feature to show some of your traffic through iAd, maximizing the benefits of advertising. Later, Apple adjusted the advertising business and stopped iAd service. -像 OpenX 和 Smart AdServer 仅对欧美的签约客户开放,并不针对全球用户和开发者。只是曾经有美国和欧洲的客户在 GitHub 上看到我的开源项目,特意找到我要求我定制产品,通过项目合作的方式,我才得以了解和熟悉。不过因为不对全球开发者,所以也无法推荐使用。 +Like OpenX and Smart AdServer, open only to European and American business customers, not for global users and individual developers. Formerly, customers in the United States and Europe saw my open source project on GitHub, specifically looking for me to customize the adware plug-in. Through project cooperation, I was able to understand and become familiar with it. However, because it is not for global developers, it is not recommended. -至于 MoPub,它的 SDK 的是在 GitHub 上开源的,这是它与众不同的地方。不过也正是因为这一点,其文档和 SDK 接入就要稍微麻烦一些。必须要把这些 SDK 从源代码编译成 jar 和 framework,然后才能在自己的项目中使用。 +As for MoPub, its SDK is open source on GitHub, and it's something different. Its documentation and SDK was not very mature. For some time, you have to compile these SDKs from source code into a jar and framework before using them in your projects, which is really inconvenient. Recently, they have supported their SDK to be loaded into your project with gradle and cocoapods, a lot easier than before. -Millennial Media(简写为 mMeida),其 SDK Demo 的美观度做得不错,不过客服和技术支持的响应实在不敢恭维。曾经碰到过技术问题,通过 Web Form 提交了问题,一直没有得到过答复,所以我后来也就懒得用它了。 +Millennial Media (abbreviated mMeida), its SDK Demo aesthetics done well, but customer service and technical support response is really flattered. Have encountered technical problems, submit a question through the Web Form, has not been answered, so I am not happy to use it. I heard later they were acquired by AOL. -另外像 Charboost、TapJoy 等等广告平台,也或多或少的接触过。不过精力有限,没有逐一进行具体的试用。Charboost 是 2011 年才创业的广告公司,只专注在移动游戏领域,2014年被 VentureBeat 指数报告定为 Top 10 的移动广告公司。通过 Chartboost 发布的广告,点击收益比较不错,不过反过来说,也就是广告投放、获取用户的成本是比较高的。我所认识的专门做重度游戏、专门投放海外市场的朋友,通过 Facebook 和 Chartboost 投放广告用得比较多。 +In addition, such as Charboost, TapJoy advertising platform, also more or less seen. However, each person's energy is limited, so did not try them one by one. Charboost, an advertising startup that started up in 2011, focuses exclusively on mobile games and was named Top 10 mobile advertising company by the VentureBeat Index in 2014. Advertised by Chartboost, click revenue is relatively good, but conversely, that is, advertising, access to the user's cost is relatively high. Some of my friends I know are specialized in heavy games, devoted to overseas markets and used more ads on Facebook and Chartboost. -上面介绍了不少移动广告平台,完全是个人经验和主观体会,有兴趣的可以自行尝试。 +These mobile advertising platform described above is entirely personal experience and subjective experience. If you are interested, ou can try more by your own. -### 营销你的产品 +### Promote Your App -(待续) +(To be continued) -### 联网版APP +### Online APP -### 云服务 +### Cloud Seervice -### 高级篇 +### Expert Topics -### 用户数据分析 +### User Data Analysis -### 广告优化 +### Ad Optimization -### 支付与内购 +### In-App Purchase -### 社交营销 +### Social Marketing -### 广告投放 +### Cast Advertising -### 附录 +### Appendix -#### 互联网营销常用术语 +#### Popular Mobile Marketing Terms -Part1 最基本的名词 +Part1 Basic Terms ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) From 899eae9e43ae771d8afdb3db3fe82c00edd980d1 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 12:15:41 +0800 Subject: [PATCH 08/24] add translation to english --- README.zh.md | 4 ++++ demo/poor-programmer.jpg | Bin 0 -> 34924 bytes demo/richman.jpg | Bin 0 -> 55834 bytes 3 files changed, 4 insertions(+) create mode 100644 demo/poor-programmer.jpg create mode 100644 demo/richman.jpg diff --git a/README.zh.md b/README.zh.md index 2ded802..5b480fc 100644 --- a/README.zh.md +++ b/README.zh.md @@ -64,6 +64,10 @@ From Coding to Monetization:Programmer's Financial Freedom Approach 如果你觉得本书的内容有所帮助,请点赞支持。 +从屌丝程序猿 | 到财务自由 +---|--- +[屌丝程序猿](demo/poor-programmer.jpg) | [大富豪](demo/richman.jpg) + ### 定位 既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 diff --git a/demo/poor-programmer.jpg b/demo/poor-programmer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b871bd01a676376eeef8d09a4e8cb536855e942 GIT binary patch literal 34924 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 E*}AP|A^-pY literal 0 HcmV?d00001 diff --git a/demo/richman.jpg b/demo/richman.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4632ee58895f3fe3de8d93416c8ee17d77272ae GIT binary patch literal 55834 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 H{{a8l!%CQr literal 0 HcmV?d00001 From e3c27dafb588635ca62d15c0473704129786fbf3 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 12:16:06 +0800 Subject: [PATCH 09/24] add translation to english --- README.zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh.md b/README.zh.md index 5b480fc..053f0b1 100644 --- a/README.zh.md +++ b/README.zh.md @@ -66,7 +66,7 @@ From Coding to Monetization:Programmer's Financial Freedom Approach 从屌丝程序猿 | 到财务自由 ---|--- -[屌丝程序猿](demo/poor-programmer.jpg) | [大富豪](demo/richman.jpg) +![屌丝程序猿](demo/poor-programmer.jpg) | ![大富豪](demo/richman.jpg) ### 定位 From f6b9907c736b776b8039f87958df7026bae25936 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 12:17:01 +0800 Subject: [PATCH 10/24] add translation to english --- README.zh.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.zh.md b/README.zh.md index 053f0b1..5919762 100644 --- a/README.zh.md +++ b/README.zh.md @@ -4,6 +4,10 @@ From Coding to Monetization:Programmer's Financial Freedom Approach [英文版本 / English Version](./README.md) +从屌丝程序猿 | 到财务自由 +---|--- +![屌丝程序猿](demo/poor-programmer.jpg) | ![大富豪](demo/richman.jpg) + ### 目录 * [前言](#前言) @@ -64,10 +68,6 @@ From Coding to Monetization:Programmer's Financial Freedom Approach 如果你觉得本书的内容有所帮助,请点赞支持。 -从屌丝程序猿 | 到财务自由 ----|--- -![屌丝程序猿](demo/poor-programmer.jpg) | ![大富豪](demo/richman.jpg) - ### 定位 既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 From e20eb318d868e69ff35310f6d53ca3ea9f2bd46e Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 12:21:24 +0800 Subject: [PATCH 11/24] add translation to english --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index b1ba9da..24b907e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ [中文版本/Chinese Version](./README.zh.md) +From Coding | To Monetization +---|--- +![poor](demo/poor-programmer.jpg) | ![rich](demo/richman.jpg) + ## Content * [Foreword](#Foreword) From e28e0297dfbc88da2c56ddc457f48b91c00a91f3 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 12:49:04 +0800 Subject: [PATCH 12/24] add translation to english --- demo/poor-programmer.jpg | Bin 34924 -> 35798 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/demo/poor-programmer.jpg b/demo/poor-programmer.jpg index 2b871bd01a676376eeef8d09a4e8cb536855e942..ceffedcc5cbc14903d76f1b575a00effadc5fe20 100644 GIT binary patch literal 35798 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%0AJkKsu93;uZ8) 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 E*}AP|A^-pY From 0df4d82c11b84bde46ef74c8713a79001fb1de80 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 12:50:07 +0800 Subject: [PATCH 13/24] add translation to english --- demo/poor-programmer.jpg | Bin 35798 -> 35274 bytes demo/richman.jpg | Bin 55834 -> 43034 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/demo/poor-programmer.jpg b/demo/poor-programmer.jpg index ceffedcc5cbc14903d76f1b575a00effadc5fe20..18c73799f338e60abf9345d5318d54250ac057ce 100644 GIT binary patch literal 35274 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ð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 literal 35798 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%0AJkKsu93;uZ8) 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 U-iE);3;aLtxBZ+VNe18l*~TUnN&o-= literal 55834 zcmeFa2UJwc5-z;SC`lAh$x)D;qkw>9$w{(=Aq~U8%#bB0q9P!Ql9Pz!Bsqf#5CzE$ z83iQ_AWCLnn76^B_ndq0d+!hHt@W?+4=MwoZP*R2p0iyQ85{LF)?{DS#~jTdGNoa3;+;61OPIy zUt&>laj~a=*@wpiz*E9sV-g5HCHhwxls!5~35fpEoAmFt5qSN}HUhuD+eS$6yN^)9 z-+gnv|Jfa&1?ETg9q0H_{3<|sY>&N~9zcly22dZ@0O#-{Is6208=xd7CqF?>dEx{m zEyYO+T6!8vN*eleXU@={IdhJd^7!~G`&s$-lz@tYf{L2z6gBlJI%;Zax}$`e?q?I) z|0^BfUjnq`z*FEU5dkMaNJ~IOOMssOjXa5eOP~yDNkVXZfC?WSM4-nIlaP{;pEyZD z@b63lfRN}H^AtcpOh80POh`gTN=`yVDFHHRiHJE)i;<`pIh^72xhYOc_b9tUm5ZC+ z_?4rCB;r=T8W~T#$@kAcoRCrs&nhD>TzPEjto}L&C4F|lY!W+=t`ohmLkkcRg4z-v>qJIMB6X|+ zhuCRiPy-*%GbG|SAJH9Y@XEOVy9Br6XT+^|H4}O#q~s4C(jx`PE=au|0F}r&>#S}j zje^YnR^flH0q?(5z>fozM8{*&0?NRay0vtgCu@IeC0cBSl#M#h*X!_oWjygUlMkO= z=283GHftu#k89?yXsq>r`G%!&I)8v&Ebh)5Z;weLydHjneFr+XnC)`CaxeHY18vQl zs)_wLJkZ54@`0)bYoZe6ed(dJ#9(DxHq`GMP8he@Hi!qbQiU%xUTn4@yP(AXz)Rmr z(4mt`@F6Su)L{A6-Gxw(I;gh$IQ1;M>}9Tfb&Jpo>gCc*A)J0Jr35pVKiqC8-JaO= zyfULM-d?-RB7KgTRQGCfRu5ZhX|{Nt*nn+A=dH!8l~t-MSM1F=-gUrkTlF(kE!GFH zJy-6zQXV=Q#{N=?>un*g&XebldDV3;`zBd9Py^_9VT_NfE%LsgKDr@w4aoE)wRH=u z&HP?ecHEWR=D&QI(B+cJ^L$>myfzB4Z%?yy`gAqfuPLk^pp_4JcV+Ovt5Wli{f)fM zJ{LKv6}ypkSGx$_sIl@9SYJ%DVd;EXC^(%pSl02rbwUW)Q$9WS#x}2`&K1Xt2b>0Q zG>aqgDhBwztqaYk`n0A$D}?dKzwN-7L0ql}c`=m~tTE$QCeoTVY|vt`ybc@P1!~6D zXLx{~`$^P;C0;?b<bte`O_PjLWol*wU|<^ zRNSRn;>uo52n4f&?i*}mCY)q~=`4-VVVvpzScb}&E-hDDm~w5{#sfmST;lInq|ipy zkEp2F75vxp7cKArd5O=-)>WOw_~u5D;1uH-WEpf|Op?!@R zbH#~(C!<$&7P;^1#5+IkYt)X{Ho*6zU%m4ahRB#JMU5yYZ6-NI4q1l8J$qHT?M;2F zqho%`U`=9Y;_zhe2AU-!X7a{ljQ0{mgyZ&kQHLIATjJPwO@+5OTeOB|o-neuw(~`3 z=8F@8qpLlWQ~tqhwh5qL6zz6JafN=a$;_n{`C8on@CVcnGswLcwxCti%J&{hfgneP zoLywqJP@$PD$cxjluws3b$WnHlo_GU6oeuLXpw$H3)=k;cw(zu7v$^4@PH?_*x+J0 zl62%-1n*@n^oG^imy#Qq<(gV=AsObKL1T3>L1NleNmko6u_X$N{c84DU2qW%gO}uX zc+&I8zDH5BB(LRSp1o$d4jWqab;g~gU7f&LGqu)T=y;EPiikW+6q0H9`Z2IT{I%_7 z-ZpIN8`ds=&>Y)4d?^Q(LPzkh^R!bo1AJSQ^m@(a_2<9f3lFOuG8DEmUB{^$h zGEI?6F;T$nK{x!6&%))AwDz~>@!E7!5=j0x3f*InhzT`c> zD&?tBU7JZM>$6sP)}b(EEqMrQ%dI=$$4r@daW{k~Q9XZD$a+%cDFB2^0s$9vNHtBC zR!)Brzq46Oq)V-yD&7P5^+|3*2RHR_BVnJS&5M~}S1a1oSE+hJ^|Qa*C$vjZ87 z+X6#C5W{F4JOjGnrhEC}37C;CU+$9;j)d@$IQAHbzqP+DpZCq+%uLDwZSJpe_<{PX1YduG3*?tw3!kHx-Jr&M$z;~cOBM-_+du2pvy0N zLNBlwNDhp*s@F=4pszo=lW1%3z^?SXFxN7TDYk11xh#RK5}$cIh#*OtLCeCWRA$jW%T=$E3Aict0)*R=G zZ5dKjDh|X7{5s4#k?=IuV4J)nx7?1Viz_$1UZ7(AdEI5#=&V`)jrkPn<=rS?)POE<@!vE-QyY z3t>5jE^)iPgB;EYN?$SpX@<*xJQ|j_^_^X?*j^!(6fgC&dnp|UDck-c6*GlZ2;1ff z;#I}Y^ffMWom`(tW2*SZnvvSu55?8u*uINY@S9XWTabzs_Mw7aY3RHRe6x@lQSM+H zZcP<-64`e#GbWKF{A8yrHYT?12Ls(4Yv8(ti|%c$4{^e_4~?l{l4l%WRochKjE%2L zO+B>nZ^ewR4x?cKcpwL-oV~YnaqE&u35!T!n{aDdFhZXe>Q#|iY2T=*p!|AuY;zgM zn5#FXRw&L!xUGZ^F7mP51M zh{?d}goSNB!2@^f<_1GQdW%iP42-i`+ZzfAD%i=?`Fib$9j<}X8RVJm41KoSdz+Cl zv*gA1g4fyAh8#J@`en$b*3MAmWXT0>IR}|STkbCIeEcBIE_(3|Q>n=i#?xX*V8YYe zD}SPCA0^+m@9uql6|qxZ*23Caz6BS*rL3n*tuN8QIexPuYkS$h5A;X{iwMh?-k+k_ zBuz&{ZNDabtN2)!mx^&1lFI#9GmJirEkkCwjNqgsoY9S_@BFrBWXR4G7{QG?z3d1S z#0vwaure=0YC?lWa`whE?As35cGVXfK-X=;Oos}HHwq(v@HdkUe%sfOb3Z-Rn(d|8 zh6gBfQTgvN-ZBku79S|xDCYRSeP;T~L0#C4`HV3hINN3=@3KJYkZ~D}e&b)DfaB*# z5yAttCD){lg0&thYpewjYb`8^P1wzB7?FqgADAlp4>w22%SiX*0oA0ina5!<%aLs6 zh~({t8P5=Us;3VJgj_V1ofa)Bvkd&Pn%Q{Ze#=mZZA~4G!EjGa-*>Cal)26FN{Pb_ zTd_~R4jnL&ZZDW0xKy7Y9__62$H5Mx`*hpemODoTStAA-^O(F3yB>OV)X`VVC73`& zkRH#nZF|P7e@v`c?y=c|H^H@X1xyE4LiSxsD+`p4RsTeE`i3fEYRnU(Hn2n+EJw^zg}C}kZ$&sc7`UPvu>)hT2CaY0a9DAhDU;#D)hvUZib@?LV)-+AUnM1(nZ9L_2&Ho6Zw9wlhJ9kE%t13um~LF|{#ZB4k;W=90u?HFklejYLRlZ&NN!lutW z#Y}9{qU8=nH#}csGluMqqJ^D&UahyRbXMU3!iuGf8_Z!pqPJRW!Mg_xa(kzW_1WSN z?#-N4GUJ9BJ3E51p{q>hoj^Ti|nA{BE2*W{`si zqBCDilvm|Ire|Tu^$Nior*}dG8{x>7wT7&L^9OO(IL1}^2O6vrkaCf#bJ6-$!ema+ z!Hx6@)@CRfe>dfdU4EQWo=|svb*Q&HPJru>;V}f-uT;C`XX~owukoR5MWNDq8?%I@ z=#ggdtiS`Gmz~12acz0&`Ms?bvorQ1p@lc^V#J%#3Or9j*o|1fQ>6E`a?&FU9Ab=bl zIXn3wq)pE-Y$UFPiS*-BZ1^cfmW0d9q_~U(9NmP;va)q+(-#M(M!3qe?vm|bco#&! zvKgV}8EiFg`xxA#)b@%z55sVTb7N@b4l}*&FA($oy|JsEr8(HOk7c=SThtG-V+Y*d zW8kg(5+9dY9bjj^HXM{uT~QuTi=8iR!rD7&@A)rf^TSPwxU~HLzeN|uV93?UaBAk zCMVR;IcUR2P10CN8%Cgsk^uz;o${OiZ*&|D~p@&(? zAG2dk#Hv!1pLeomm{+G%F-Z`!RbkCL2jA{XEFJm}RxG1iOL5LGv2P-`V@#H&Y-D)p z-@*$!J9jW)yG&^ZYX`1{wxKk(@dOrF1Iv#~=WDi@DHIio`yw_49h5L4@P%Pl9L)k0 z$0?b=NStUfyjBvTuuMub{$h&8S%!;cMnAuE!!K;HDKxU!jN~HsWAG+6yu~!?S=d9$ zGP<12f-49>O{v>uluMt|rs2*Eli7@`?S*gk4?|}jGLrRMQW1y6{y4gmY1}sp zMeApN?gA_3W#UK0xYA-G;rLO8SCJ8<2+o+ z%^rRBy7sbFJYbqR5`NV~j_fU+;pnq3H_T54MI(ytBuTT3+c0&8`Pa zXYFw2=PwFkv+b>x4Y04riGFNkx`paSd3B~uTH7&WEvcO*zRlRqd^9f~-fF^hoV9Bc zex%a5Im%ZX@cw)Z`Qo+nxR!_ODvN6bb?2d zZwjLs|H*E@FeG$w^?hiV=Dz;~Yp2*sLn+-QSz4@L>oVJFSpKE}_GE0>9AmdvnjN)> z{&0d=;#8b`NwpSOvU#1EQ$iJ7QP#gkV zRM<~*}gauV*Ca>wZ)sG?A?ix-SrL0y1?z$ zQTrYaU+8yA!v%Tbc)~sl)Cp((&>kFTo@i`Iw60D~A5SrnVVj?xZ`rwq9bL=o!2`MA zN2WR!s8Zqe>!_8O`;(JFit_8iq%U^JvW(htw*17~jI&$|Hm}~+xXIM2IV394r~#`# zKb%^5QFMNtTv_A&)ZUiz25U~En)U3JP&3RF67zM&DkxwpE5-{FT5ix=I8jV6y_#r? zm9dTTgoTbPs~xP(2l)kRxCq-(nKTegyo~WLDjII(uQy?rX--I`;9onX!Ne-4&B*WwOI{ zJN~j2+sfFQiffRqyET<8?nzQ*iurr9Yq?c>!L*g@Hr=`_op)z!4MOzf@5)LxWNB{L ze3`-)epRZ(1-cGTk`5=na>Y$w3dSeq=g_04~Ay4!X}C94;FmyHl%J0EyHP)<(H zPkwnlqj8z#L%ROzcnBNj*?hxT3IpV;Gt+vxQttM(%RWB1`F+1tTyM8(ai7=Co|IWt z?^yovTG`s2W^ZlcKpjQt>ciMc7RDPVR*J@F7aB@;6>KD>6BN5vNe&O@y zlok$CJDh{0>oyaCu- z=1j3IQy!%9J(JntoQvZ2o5~+6ZmekY1sQblzQQsdxUI*2<9XconCHq%-2MQLlv097rwVhab_W?TSfI<#n<)_*+Bh#wyC|fH{CeijW#_~?9!HBTgi}2pA+A*Y)#D& zTtRnqDfoq8wO9G!=`7!xxrx2QjP2q*dkd_vZkCHMz#tVd&`GlCB%37n?J({d%tAT1 z&2r3j9T!beIMM<8u#_U=!o*j5*Ky9uPhm-7mCZdk%QjH97Y|UVvB3*%-TNd+@8mSn zP(gF%ljfY~>|GQ$ThkUF!^|aXR^$Aah!Q?#g$qAhDIRwQ_%B?k4~1Ga_Lj0p)#A)M zF{RC0(&pnA^9#-@qNVE^7I;!VqC(?_HgU?fZBOgM`fNfw8jHYPaGBuDi%V)@Yh~sH zPC?9+Wf`##Ryg~xYj>@&Vz9LA?n7PMnp$Ou$ET0&OAV#(u#Jd92ZF@eNgKUb&mhk{ zOzlk5L`9qXzH9a&6;if^sp#v#K{~U-+Ozy1KgAf4@x_^HtliqvwJ8$k=Xz(!d?qI~-dnq+|-ml7&50yhSN5*je@? zDtZVZ=*ci+Z3Uw`g-Kf+hGu{tLB>N$4qeCEHhr=2;G>l#7x#>viXWO`=!An?G4Aa1 z@on&#`?GRc;qXupk3nP1VR;m!y}i__L~5l38QTQ2u4~&{EyKwi7`qk?g`);DpjIoF z!m38jjf7;DYbgxw;L`F(Jd1j(s{EG_o`*qe^UIr|>GJ-=-A*ZuWf@*lG>@7_Xtja$Ntq%&pRCUG zgTn*eVF#QvXtrYIjmOXHxK6SRdG9FD$v#}D1|98nbJL>LYTL7e-s-TNt;ci1_ip%f zNb0kkxHiD7b`yG&qsRLed4CTwOsdBa87>6(XM4$;Ey3(Bg}pUprE*I-p`rEb?e2uhEOeAfcSwFYOzJS zNrvlLnY=mi&o^VCh>JCmO+~@!w%g`%12f-IP2&^NLH6H26fL#Q4q}E?lAOojrrcg` z!Ed0*V8xo*l`SUl>2MQ$8J3ejTUnxWK3XqGhG{_1lWkIP%tZP7m32-M*q2!SZwxXj z%h#wY52Tr>wb|T@mieJOw3UWC(D{Nq+)X0A2hydc!F+4C*p*9VN}7zUNc|# zWC}tm;v6=$3Ti%~kv8hF(bm?rhrtt@Azg-xI?SO7;I|Y~q2v(7or<)nhZ?%6ul-3Y zK00m3PFPwiX0~fCld>5uubfLxc>;NH%c`fk{+3eW1Z<0~X(LP%0?o;b`A{VJMR7#* zG#0@^(&NtBtN+1iD=rNDQ6m{1$XqfSu#V}~!7O%F%A8eTsTqHzkPZu>d6zxW_Nomh zvMV|9!$1??w^rVXk%O~lltZ}HCay!R!h&7%8JZ63bK?emDhP6h>bNHD-n;nq&R2GZ z#@FHj^l(W@#}M-fTfphLcW!24Yx`=t>Ka|i3`@!%{2pMvuooKx3ro{dhTP$M3XB-gltn1=+xGJ3Bmtu&>j+~5b_b6MqBcfda0?X#gNSArvOzs$6G>$ zo(Wi0ko&#Gq$f))UM2aq-W@d~XT4gxRne7K%+V7yJ-JD3I0hwsouT%R9j*Cwbd~e+ zAy%JiHuk1#;1gbWV7cV5Ja&k`1E$v=styZQw^imzOSaLUTE*0lpyT4AtyvD~+uU6b zth&pK=NG<;4u*GUQixqFo#1CrJgghaSPV^QYuHr&)Hj4ON!r@Ld=-Q?q7B^L9&KZ_ z<4-79r=r<%zu{O7a9(Sh#l2;L(#gu2mqRJWRx#J=D8vvy>ZGa6vE0t4DmbPwm!2fC z2Uz8vGQ09Z+w&=<@83v&vCxf(J-ZrAkrR9#$zm%F10R`nMh+7$X_;|UZOKp+fDgIF ziOyTi{FO>&zA`~c!$^ZdEp`h{^UdvV`#f!`GX|TRW{X=VmDM)CZH4`?9PsSicfH!} zNAAsS;&Yz<$KlC&xfCYlBrJL{v3Iq#WL_?*w%GbQXUFImHS`X;q6gP0h0rYarM}gP zYFhR;Tr5+lz)aPSU*8YyiMPVV<@;|)*S^mJf4Y%meFA}K%>h-(cm(rxzCP4zJee*N ztHnPC`X{MO@BXqrrT=`yS5>97~ekQh=VRA zezGvoe=pdYcgG?&5W-MP)3O37gPo_DI6T9~dstgp34UIK7YlZ^+_z zES9En!b3rk&1lh_&Je?*jOo4FxfCMSozG5VvTAOIsfnB@ zDNQ`9YZ(enfs}yWb+C|+Rn~*!OtA02wcXkmEHHbd(I4QDn$hNm9_HzFSW(Xt7)|~NBVvyB z?1cJB5-Mi|^KUBp$>l7yjX3sA_IDB9Fch!w=%VtQv)$6p=Xlg|`<@?~Wg1+Aw@dkr zM{6C(=_E;~iecgBHj4dfy0_Q7W}fCe8l3Tk#0As_QWKLO>R$9!!UL04VHMXilZGO< z`}R}k8{Xde;tY|MZ&8*B9`iqtSyEoD$-SGAa7ApJ^8Gb6p;0v1$hV0Q`w(z1?l?@s zu_T5`-pMe73TBuNO10nz#oXNvOJ`j@lftfA$GM=sUn5rs~&BLDJ8` zel{>fz~L??5R|XCfun~L$Ru&&aFdB{4f8r`44m}-%?E484OKl+UVrI8>FDe3iE{Tk z?gZqYIF?q^v()`*zrs-$ghF8QFB?z)%|-)nlsnuD3G&Y#Nve6Hynd+-sChafepifL zk$S%?Y6vg2e^tCt|EgSd^hEyV=)0o)epl3Co>zWXz?u73*Q!oX*S}2vIWK^*rm7mK z4G44t0Apu%c4xS+<7N1#qw4XYiSYUlnyTl2%BdopP0hSe8eGPnM_2Rrq3Y?({@>`v zNKe!;-7vuOG6>82>p1BLaYDfnR~%3dM;06_Y3OQ*{N)Enol9`HOR;!r$mrzv#y9u5N#4Q2b(my8V_vS{+2IKXv#EOGo%CKVCT(j(OC74GLz; z;eV|+s$<&Giex>OJpa!+(Z+H8#BmBH1jk+qq7ILalYcD>&|!}?*gB?a0U|CgAjcC- zL3AK^5d1~SPD%Yu5kIC|f$1+9sbk8K=l?}H?sFHc1AsRG;Q#AE1R^5;Pw}bJ=>2O`KlxMmh;qcy z{<*dPpSGXK7vcGjTf_0>|C6GJbp7Y;gVezjW$NJi4=HLVh^MD1Bmkw2)H2n(`fIx) z|3&_X@Ci3KB1py4-SyW@(fl-C>lYcE05WHYi-Yg+_Ibh&fJgH8cnVz+-6 zKVEx$M*{(r;7O?b{kZ&dozWhbK`8dI)Db@Vr$ZAQ*N@}@u6ZyyS}IR}o&=wc7a{u(Kj`8==;A-<;y>u(Kj`8==;A-<;y>u(Kj`8==;A-< z;y>u(Kj`8==;A-<;y>u(Kj`8==;A-<;y>u(Kj`8==;A-<;y>u(Kj`8==;A-<;y>u( zKj`8==;Hqmpo@7x#RVvK&``N)o;#o!qD&y;m;D3rInh=>4lUJP~<%BTplbRkwrM!k3~>WMb6`Bi0s$&4B6G-2nf5B zu!NA4sF)bLw6w68q?EL@m>@eC?onJs6#OqOBqk{@B`q&5!~WO7366$vc9A!}qVd;Q zU`>(pFQfeZ{e}G{gy9HR5i#)hQ;+%(7Z(C0gph$=D2D(cFC^Em9$4VJ$Gck(?NQ~Qb{r-ZtUgvJ$V2~i12Np(3jwJRDjQc|kosv6SL;-aduvcKAB zdm&K{UQUpsHefHp?(WX=GNLk~(pSXf)TPA5q-Dj#WW~i*)YMgEq@*>ZMX$(6{c8IY zC+Xn%e{Wo8CwUh*0_FftxjW3k6(Zu{4RPgU|82YcG2~AV?hFB~I37w~4FLfGm>{Ye zBprnl6%rE@5|cGO3MVQmFCix&Dl0E4`co8a=k5~tUqz21kN!gxbZ%!5sr|nbK3XHk z^Q+~K1i{^be|fP9#OJS)r#t(x56L??9bx1ZIgt*25NFQ6i0=Q7X831^{vf9NKTQ6+ z9Y4j8a2J%n0|KJr3SRwRtJLt9ul;*O)?bP_xjA^bLcr}ogi{2xMC528{WMDC-|ao- z{cX|x5(iiEQStW{qV#L2|H=Q%z@HiTGXsBS;Li;FnSuWw&A`82LLgq?qlG{Cit)EF z>X(n+ZjQsK6B8XBU`k91#``8EBOxXxAtNUxB_kyzKS_Q9JjhR;q&zx)rpLvT~mvcy`5ix>x<5xm4+m9T7hyxFywY zF~pnjJaejiO@pwIaf} z|J$us9?wwAKLjtwH^J*Cq~`Bm5Q+}u+Mpjd(rFJ9c*GNZUtNgA`p%}YLco_CF6ygJ z{J{?%7ms^vzYca%m5#r#?{ir>Jc~|{*HgiPKdlgnLPhQS(hrF3ddqPN^ zC=Y+B;j6k8P0uI1o{yPZs9&0q6)b(nFsu^4L2lb+IcK30-b-J+)*c)AF+!{|!ucUK z@$0?WlBOp_FCV1Dy?K3YWTkB6tFU3^3MQbDwdhSn_dVUHcrL+{E8w(@7FSq=WnDF+ z2=No-z`niLdzPIkypTDTAU|ZCyJ&QaiTBCN3ufuQv4;$MhM!LBh@L{Y`GM^&j5Ig7 zm#`!E(}u_f>W%7otEfNiLe6x0-VA81`)X_bVZ73VQFgONcE?RNPCc6qI#?dJ>eA>f zD!>6ZUH?`{DR0}-e|<#4P>%jNLMB|fQs4RY4bDMp@oN5;;tx$Xxg>7BX!oO2@I2Pg zu^ivG^KG}duHC$m%(#T;;%LM`%9&GUQOlX858p^ODkM*JUZ_#X&R<7gN1nOBnk~XT z(pdi#MRyD(#K_c z+y{dKz9uil!>+zpE4<&BIa+jk`?c!>or?h&Z= zoSaLwnTGbeDXY|U0_%C_Kn~h?3&%3qBKsnD>C~FK;cxLz89U}&%vV%a6P!D^(=IPz zulA2;D6MeR#unJBQ@*FNc(}UuBt~QT*|=Xg`z#3^ipcYQ(aFkL2TJt@AV@^$Cht=$ z;MjeD`9p@ii^2HH(qp@-+t#M@E9Dk-5%e+vwiHK*XTLW2MzF& zD?A2M_MOd$2MaI1o)_~MCy8;Fzb=1IK9;Ms_L8jVZaNLoB%=%E^{%r8J{C37{!RuX zBD{|_7l9Qr7^rlHyRAOBGF~U)F(o7lBi*F*M;|ASi zUzs)M3A!Ab$eUze5ZwHX?>}I4-c?rLGkD3gtr`BB{;a(xKW5*tti1LpD?%n+b9QTY zHsjHZB60{XVtl{(v6uLsdBC=#61PVH?Myp@HX-41;2kOp%o;M+SbLaC=*tfxSDn?a zputu(cEQMc+lY1_)b`oqGp(60QMHKri9 zmEvBqB%-XdTy6D9FUz_XpZ}mRS5x%;(zhhVln=-RT!@NxBl;j}Ov2prvLoE4w&4@v zj(nm5Ja^=lKDJS*0FSJ82hUTOJsKTX4SaKwE3=Fav5)<71<*?fP1x@0BUizscBDPK z)>Y_%HX0jk$9-9UVMg}mZI(kTcevp5E00y~jE15@?LE$tlKU$0)6h!ZGZ%*%Ae0_T zFnjns?s+F~lYsj8x&HpVR4SPzhffy^4G;ScF)S&HsH^jtT%^^PhnRG;;dWb_pUGsT z`wYETeX-e3igg+Pu#frj{l@y@;-f^ zllMPGjgRRwi*wkup1W2n1}>sJevD(O3BAu!lxgOK;X)YF?R@B2V?K{JDTg@<(;eWh>q2JL9rXPG-KvemA1)Zm#ZNNPkn=Tdq3hrmrz6U$_TCi^NyV!i3&!^?sqA0H<73 zh&G)?xWX50v)c9Z{SYbQ`-b-!clKY9Sd{63lLaqmt{+0=y3gETp!ZCoeQT=aW_?|L zwkX-G`R5(xc(MK5EWukMc*7am;l|z^Y;N^E2R=6lCG;yN_ZfyP@XwZ9zk5OSOpoT? z(7gevGX*N|FEf}?bc^V`C}T#>Qe>Uz&`fo@TG8Q^TwHj+=BnAyE1kJPdMCpr8R_x2 z*z}mz+i~Z}gAR!AB8 zbaq{uWM`H1(V9jw!+axUnpxrfrE!H2cmBGP6FHL|9)l-oKMc^*##Q#N_WWjS<&3IC~%u6@Bh(`Tg_Nb7dRbDoAl9S@*e&GS+ys@hgF@l~uGPQHaFs|i!0q9qr) zC7xUkLNLtzC@}d1hTpSCTEpy~D2v@LVu{^#q;wX~!8}@g;QQago_ofAfqHDd8{te8pm;1h z-h1&%a6z%j8~#bOx46v`-aWdhTss2^4UD=-&4_$U&VF|&)jTVAQM$HbLL<@dhiati zN#Lf&%%uScQwz0XOLva$h-AZ~+}lyyIybza4NGVa$_#1OH0DT4M^=yZgt)YF8_akW z7}+fx$N0_oyrojF=yL|0wKutl(U zuDts|n}52wiFy=rh6sizd6Yf8$VgYm=o?#?wCN3#wC1}t@je3GkS_c6!=v)I+Qnil zNC;)+6Td*g-EJ2(`3lVk1N09o9`eoG3>Qzg?qyM1SM!X|H%jK3#p=H6rcb_QB!?o7 zjgVQ1sC!^>siw=FW2kv2hrAR$5IjayzQz?dOe?qR@jl;Cpv^PCL!3DU$aEJdYOuU; zZ9s8PnZevw;r_)bgV?Z7h-*2*P|i#fakrfc+jupNaMP7bLDy@%nLe9;r#DF$krY=T zQ71`x@RDFM{d5w!q0pRN=)udgeO<1uzFUgt#5B`QKcF-X!%_A(1~I;*p${iHwAO?t z-NUj&Bx8iq*-yVUY|$L&-ja(wL4IH8W}#zjVBGiB%L?_8_asew zkGcw*ACfkOuu-w@)`{8D={I}4hnq|* zY)MuMw$PmjoI(%6##%B1x-{{;oA^4alx8l?#+1>Q=z)@U+}G{gy?*aUOIazWYQ3TZ^{t6~6d|K{p%+neI zg(2#i?owJ-R@|CQ`NJQ6-ypi2?=qiXkCkT^&nzH(r4? zJ*w<_y2jY3y1SCipyV^xJL6)(7uLIJP1hAt4FQP@r}BvN>EsYBYWExO(wo%Bd?0=l zq5A%^5?L)#m*KVr)H_$^w5FNIZmB?ms&y`{VE?N#dJ?zqi&{>_0z?gRo&{cJvuw#> zsSIceq1Y-d$$(d<1vPKi!TNwO7x^v44ZSS6cW%;}F7(gX1`34^8(gB#5tPg>y+eP# zHguZs=3Me6X=|_Ps;?q^(=$(7huvATs#KiSi8I#>#=0jNL%Etx=wv3HEMixW(J0`f zLp}Z8(|!5g(*d1aYHjN5cH3jM!RwA;HXD*H2A{SKXUp;E6ov2iv>TkvxC)kP5vUy- z)CXk|->6cN)*KG!x+GU;5BeR}!}DHp=aQJD#bo2RvxN5Mrg$uOXkwm`&8;?_rBH{ zBwqKBoK>AFi?if2JrPL%H71o%{OY_q_v3d%5$}d9UOy2?)xPiFpGB9!)6+8jXxaMx z=~>d#Z&c-wRxHf|$*&b{DlCYBuSeNlqGHPgA64S$$(Zqi>sAZ@=@U zX0c^h>0oeSC?%8iDkd48)SOkacmKc+8gwH`{`trALbJ?9r#uza?AU`L-cesja#s)S z51I#2QV-Tlol|kitkUtL+?L$ zzYer(^}xphJ_o-0Fq`4~Qko6O6VDO{Nm0h|sjyTfa@}ru!t<6M3~s+t=2#y?)rx+w z8_`mEsW8)4yI}9mc*mUjsnQ|MnDuw6^+t`}u+*pMR)~hJEkp6S=)P(i1v~dR)`a;^ zZR2OMHOc<^sC@~7!7)7WsW6Q)D0*z_Qx0t|Ln1V=^d^UT6&Ml~#Lh)$U(>4tF9~7Zorb19{lTXTE&3 z0HVjq(=c!_oR47?{rY&j|;gG6pB=-HW6U;6Hc zL=OT|XyR{F%=b8TGo<>(BE=H@nG&DfoJ!sXuAiEd>Vm499IjLqP=6vpVY8|CRv>t7450rBg4;Y<%{eso{jdr2qP#6lg{-e9nF zVkRjP{L@dt7Q^Ri4hndZS?ZH!;`*p01kPU&W^g(qPUuE+=i0!OKL631plorGj|IMe zH7q?yGAJyKbr#^fYZ&F~-9#P2w8ZTaVM%>{e>$#ep`8YKBA%O8;~tGP5rj@IT0d~| zZt0#t7q9X9UOYu!^$2IEH|cIRDsPE%hj@oY!XdxC^Q>k$w>JIL#qk(_bgEy~vxc_G zlx#B0dQR;`#b={~Dfft14}}4a%tc0q;^#W_!e*%2Lg?8Gc2uJs`#w8tuF~gn#CpoE zhsXnvb1G+hxiR$&FXjsAt7!7 ziYO9DMtu^M&gmlU@><7x5B*)z4jn>W0!`NMcGbxrmhvTBkI75Q>$seXF|#T$Lf37` z?Q=;~tdAAxBxRaZ9CWOId{l(#7TU6Ik`>nL$@>v;$zit-mrI|gCY&lKw}E)!ksm#| zt}GpD7#N{R`k8|xSX8U z&=EZm#&=L83DcO?)S2YIYWs4Z^U2KUyvxHg0=^m9>|6#Ofecb#<`YJ#zszGaG7%ir z*I&x$+#g(s1^fG9FR!#tdOxl3-#-S_qnvd7suO`YzQW;;9xNy1uc3A`**2Qbq|AHfp&Je2F82m z4etf^X5LtX`K5rEyJSf{%~Osl@>vfX6P=F1{p%S zJ4P8=8bLY*q`QVL>6UI#8iwv3X=#|D1_pfR`Jd~YPwyALvadaRt##LL-A!Ui>Jy7{ zC4VA&%227O;u08g)+ic0R~=;o8JhbJZK-4ve}?UfdFbln$D+L@k?C$6u|4S0SGo9W zyi3!K#_`L4O40ww>%W=Q09WKiO`wR?EcdR9?UhYzd-Az(v7R|LQogNXLH@?`A(PWm zGPSbvMy^!5dRV*k$F09;`DWtI={^QP1xaHygK7e%pKZE_QF-RF*m2rOCO zC}9zIj2>ANG+W=96kAmtKzzD$*fM(`$xj_iXeilr#qwJB+%b+$$X_gRgKC!aw*FzH z|HD8eJ<6dv7A)Zp{la23<&I5TM(3OOiJCEEeOnh;B`Tq@oeMXQU*lyo<#Tp9%M}kl zx5tSAk_yc>ol5FiSQ#4HE2~gOqBG%bvI4z9TZrXXK>%s{R0Y z|L7lJ_XrC3Xt$85Uu-3?;n4YgonhJKJI?Q|?!uq!`hv%5{E>g+)YbL5E$a|$JtOfG z@mvAspbeyT??fPvcdj9m4Z+ON7pq$w5(SPZk{p@Td-$+9F_qxnn6;w6$9j|9k^bRpi{IkF6SOtHz~)Nf9%`wu1tYRDxqIc4kjm~Dn1*K- ztP$t>(%>E@y5>t>DEifn5;1tM8plHye~#}ys2{Z2{=+b_wBaGYluPw^;mhe?GuV1Q zBfI*0xcGm%)qhGz<^R5;c^ADZ+aBp}nNn{Ivs-dI>owluao8v=ONmzHf)Zbx(TWU; zf3?^!M>s+fP2v5&_c88F-I&m&WJ4+O3aoEld1&)8dOy+N`&gTf8gf23fVX9G3RhcO zO#M9irQh*T)uUE?#1d=L+(qpBK}&&z%Y{vG%H@M5sT2(cmQZlm?->%GicMLx41->f zAJI?sZ}v364iy6L+0*YS46u-{{&+wcVl0DL0Tq2+89Ai$V1yjn4HaysYLLCQh4z(+ zOun?H{e&uogCV6Vi%M6Ze!8l(P=CSq5wQw1UGQulv**Vv2RjE!Y5Tl;FQRt<(Adw0 zbJk$vtrZZr&_ce%jn1GJG4`j*k)G7A0@wx)jE^p46GLOL)bqc>{D`^EI=VVjje#qJ zXZb)nj=W=+g!S~Dn+G_(VapzGHg{+EPW9(;VKr$pEOII8Xm#{O!^+PH?RL!Kc4K0J z+@0f<{^p0i>(ZsdE%g$!otFfY^gBl1SW;QLKgtP)I0T3yIlAoCBC+i}L?{>-Tui!r z%=8T0-M6;#iElP_2}p`2xf_Dhi0kM<&fhYFCFI^>g7wjhfgU;GFR2C^wZqMzai%FKNznAB}=T33>9&^mhVO`;RrhxEt z3kBoXpIf$?oYEQuKRGu8S-qo8P%W9Cz^drh#6^MV1$EUXPs5$UVo(9S$RdpHn?ZoX zfsZ$0qovID5TG*8BVTU$S~o(F8T6gXvv9XCscR7~{^-JjFpirX2c#!yl-js{$(@u| zE?%FZ`JK@|KyePBBH9^c7BeUbun(MIwQc|Nz>0L3vRSl=YOqOaz*l%1h2BGVrbk+Q z%7M^tYFw*us)=0JH(+>8kAMT~ENZu~Kuzd$hgPikI~|c8Gj)vmKCg?urO@AbhQJLaiz?kW6 z3ktXQS#|w;Ua+J!+$nj_2Cule)ShrB@|CM*a=sIN&j`!+U5X&;ti~M*Cpb{>$hcFi z!FC~L{E+YEAVh>rQ@`NJU7y-gxz2lU%^bBM0tb7pz3v>8+ zFvNf0PT59NICAhCBcBTMCr#)(39;D@w*gtV0ptIvx3i>n>6LD1H)IY3XMJ=9%T1$F ziBeHVfmh<=^#1sqZQ4pC_U`vM%AC{5B@gujtk%+d8pts)%Ym(cv1N?kL5q?2u=Vu04|;8z8tFtx4ib zXk|m@wD!o?!+^y&CNvLjB`kgYI_Ui{D{M-(j$B^%wtHAv??l_KU0lG0- z>FCN|9luhxe=71l!$qDC>F`Jj_=l#=LPdoYZ6TJ{CYaLdL%mAps(^m`ho8ly*;>-? zp%`!RQ0U^R?Cj}nc0@Hd5wH7QVly zUqEtX{IHQ@btkEk9=v*RzS__5LGezaj4WDpUGdg79iGGQE4Q}jxu*hpb%5E3P{dPd zJN6BvE;|iR3i$HqgOr6E(-+DA!ze)^eF2>QoO1#(I-8L5@>`OwmwwK07%Msbg?u$~ z9vM=N+?t$NsX?pWK7QF%PZegHo3}P0B0s2}G8BXx0BrUQzZtCNL0||7AWhOWu1{@| z=S9$7G$d^K#ECSvD(#&g<4n5lGwz>PA`iu%;4A{Qe&sZ-938LG>^RfB9GKoYzk9~M z^q7cXDR(Shev!1USO;gU59t6{VdK21jrxZH?Ad3l?VJpdXh6D@OEb&SaXeOXe+JlOpjj!P@8%C0>(|Di@R?+ z=!79ZRC;(DV;@c`btf@cJ1r4fsH(s;&TL0hFO>r#4y0u7r2d?sIK&=0pHQ6BpF&UP zq9u*mcIQsl?0p*f6=6s41LL!q2Nu6dDAi#H-v0$T|C!ckg?@e$oYRvQi?l-K?GbSd zVD%MdtZd8gZ_Mb7^5Gt0NCdzj#hL_xD`}# z#i0f|vJ-CzmE-qHUxgRaJ=ixQ&LFVi1#r3;q~Lkp?rJ4@69q31wE_uKUHG=Xc&c!yfXA%GE%ssk$Z}M_&5M%3QWhfH^x?;pZLy?*^R_mOs_Qh4K%w zQ}v5$&dqOh)1ZctzCQ93xJk^wjs#EkKmK(x&+)@Rw=^&IPXe8U5=IJB>LE2denw2B zRH9k)tuj8Oc7ZjGkK_dhfr*|yny78K;Iw(&BP2|S5oxU-6MySKVnucs9Q>Myu=}_m z>kXp#r@v_Fy>@WttD(s9`+66H{y;QL@MX=CD69fR@-~jp5n$`svjGvpPt$|%(3^9J zRtvh(gF%2whu*fzcyCZIW? z`&?0MapPs@eK8z6b286)SPBpU*)T%%dkSs%#1XOCX+HB} z$#uEn47HHKYW@pdh+XyBAus~XOROV@kY9JkNt?P1#@;0Lnq8eZ9`D6%ZS8uL{)iY# z^(K6r?EZjd>$ka=hnz6dbFzTfLZ%rli<=e-gjw|&Pa3tp2|b#C)fE-oK)+77{$cP1 ziVOOVTjX0|;DrCx<9@VqOZHNd~}kn|9Q6E=?+W4fk}o zLs3!@Jf;WZqRuUDK$6WkX{Ll<1Tn@kUD7CV%h6ZPymmg#K~+m=_S5Rit)r2{!&UP# zp;wpDu{~ru?K+L2b{;$o5cZBnw@akG5j)Eg7!g?a--U?Rc#PZ9^p@{ZPcsJeabkk^ z^oQR_9~zRbZq>j@J^l+%{2$BJIjX}?4=oR)p?Nj{QeKG!X`uRMe*lUujr138gD#XD zMQ?$Bz?Tc1giW=pjGyx_PqX8{vwA{#iMH7pmq|2W8_EHwXeG&JuZp~7tX@zPED5gi_I-DLz`SsNtQuuO#F^g|3cbMMiVCXp5;X0@)JJrLBj-g?2b++w*f{=l`vHAc` zq>n({fxozm_y}EjuFgnw2cU7F+bB-1LGB|(@u20YNyxbH-HWS;y0|f(Q0w;KpQM-8~0p20< zopz}z{>C$>%-pL}t>#kaTT2AP#@_pxJ^L>L-wF7OUQKd-GWLdQ;7`1D=;aK~2_T2^ zzeNhEi>i>&VwMe5{G|+8I%@uUkeR}zuLAmRQ=}~x$AbyIt^Vi^&=zoGX~GN$0D33| z7kSQo`B6??+P#xAt}v@A%bWxYIN26th?9G!D7ad}^dnFH5j^C(D~=E5VzRjGT8XY! zKGCzXx8-^5A_dsI#h~uUTOOA*w={C~1!nm*?dFX+GXo(Km*$kk34|qwlwY3Ml%Ta` z!W*%?(6kx_T3M3SF$tg7(4G$+C4iqBMJHAhx zt>M^s6hWT^|0#tB|BFgcqp3p6#s8#Hv;nesJ+w!Z`U6p$gnoreQY$${3BUG#OsZ=M z`fB|WktG2n(ppW`T&kh#l2v-Xt(q*4U1&JSUkn#jmOO-DX*eWdy~*&(ygms^x-FuQ zB^2uYJ|L>}r2d&Ou6{&|20Uzo(IF{+J5X6Sae7mUkVJZ(3i;6!`3I-y!AV#4eo@~} zm+vgea!8Q#5;I0`zkRV;DurHPY0UlWqH`aCZmE`7-Ob2b5YtA^N#$a#0FdFW3O8JB z5_M`~?1C;lc9hJ!OeOEt1)8N_Jk9-PMKDt>Bl1{*P-}JNG-(vqan3cw>yhZ$=R;RW z39)8gcHEbZz#XfrAjWP{l25yA{f$yl6yIbx=XjW-&|P05HVe6*1K&S>f^pQ_Q)+*d z0Y4yLkt=GQ96tYtVUgIZkteZRptcJXw5J7S6Z7P_a{*o!+N)zg|Jof>o!dW#egt?1fDSes0ySpx z^c&e7UHg!8{7JF@Fv!&d?q?e0FkT2o4$}Svq=`#NC;?=h}RuttcmBZ1TiB zkMpDb%8rTI9QTSEK$Sr;e@n5Wr`jyyMW-&x$&U=iKAt@D4IsCnR_e_^x8dEO zf4SS5THG3iqpuR3u@a-rypoOir04>iyIk>2l<@hf#wS!XY7muyU><1Bc%o*um!X00 z>u*@eRRgrfCHuqusI;{~-C#i|h|i_u&mUD*po>w6#{QR9zqHBpTmS#U2&X%esGZ9ND z(r_+5DIr!rj524O)7Mv*O`2C^$UjzyI7`CuU)=!=PYydHhk2ouKml8yj~m7aEd52} zXt`E)n(ji%;Qguec2XaNS~t{+si6daAB_ARC~=^v#F`|y`rhL;_Dn;Uj+vJqHsdG@ z>t6bY^w~XLu>fP_?67d49wH#zw^(&2UVrb6A^GApQ-M6~;g^)Rw<#E2r?@M*6e0!s zLL9C(Ivwb^;t9Bcu5>oaC_FK`CEKr#GEUt+7U+B@7LWas9rGTadrRq^G5c-Un1bV- zCC+jZq=ha-HCOpG@*H(Y}^ zVm-QqPsomfvp2NoJ_Q>cz6*%#;IipXz5Al==hZ`9o?r<^q+fev2JV+sGnW!y9f4Fb zg8yOks0L&itfkZ#lP4f=Te*}DUoeA9VTf?D-WxbTE`sLx)Y)<3>K}$@W5{_jC%eyC zhF{_?k;t!w4cn>XCYuZ|be-z2BoQ#ijw?WVc;mq9CcS5$;2#E~`wZOJR#=SbSn^fL zx?*Da`v+0{+Rda!36+T+M3C4*4wG@-ZeHe$(jWH}*~<7zrC0K6kPo@fOqCPw6@d%G znJHe%^1~M{`H!XtX(q~u>1ou(9+;O-1!2KR>yTqz*S-};?)C*scCzV(O+9s{sNt1d zCx$}i0}x6^Ne1cC7zJVN2{p^x$BKDI(U`Bfdl-&BUR7@J6ZM9KEjvjh&Yh~gWys_9 zZW+t$ZrS53nXlfdgAC)_TrPW8f_^yZMzXC%GH1lEunMOakP~JSR1=y7TtB8HCQ~Q= zOr=rMH+Y^OEc}#M)3w(z`cnAOr3bM8s9LWB**nDt)2i-b)JVv*U zjz-j|_Q9TE3>$-1|8HdRKaBr>^w>aj6!65wAQ}xqb&=NKcLA#Q(avPmE+ynmOi~rEg#P2fpo+p}VHl~Mf}6Enkt2=9%DtUe>_Gy30`DwmqT6{cad|>~y_%Fj z^$RUNd&}2R_fs7|A*+V7&*n2EoT@E9bbO2J7@}i5BOTqc6fM}?_=4WjR8a|t#`v$r zAf??;CNgLSek;wGq`}ghS@{nGvwyem9SJSj-XyXwP}1g!k{hQz?>pPzVzqLSh;@=%cc%7kLE{!_2Y*f3>pQ(<;uu2OUdJ;b;r zt@B}LHOG2ug~ED)dyLW(X#BTAZ!CuKnI1NAn^RXkIpQKS!jb`8s4uqM$nMU67p!v; z?8&pvzx?4!cSvha?y4Y4`rzwp7vn#ej=MTGD>c>oxW`uT9R5WPUc5CYqpqp>((zJ`LwxtXx zW-92rv)IQM;&0 zH57;L>Z!*7_}Qa>-~^rhok^kZ9vF%*KX-{AW}7GT9p2Goy$*RTK0*^P44}L$7zmXN zmB3!E@|^y<&95nQ#Ox6n-U;8Vmnk$FuW9)>Rf?|b~phzK4bf3Q$9vDgCYU>FR= zb69Ma%$$H8UBwYpV>~yRIRnMx{gJ&?;mrmwvDz-Dav4hdspG%lu6yMMxIg&J8ikKv zd&1Z4Un;i{G1b58Xm^(K)peB4;EM>K8H8SHzza12>D@ZB68oj=_*wRi1yT9rJS4%2 zIllb4ZHzpZUHmZU&q0C~*9`Iyt$Vs$Bo=cCX*o+?>7mD?=|jdp40rlnO*~rG+SUiFR*-7y(^OIg$)s7eL1TKt5sQfF9`}k>89i!?$C4 z{~dpT?5`%jX@!>CY4Y49o%1TD>`5N-CO$LU{?Qqp+x6wm@h|t9_PA$B*c(DJU6MsI_MYScT1lcLQRRI2~Y5(8}`R|4G{ZFK+w4Kegy+ z?tj_!3iBE)bf|$iswJw?$GmnNh8%|p5!xdhY&3h=+-M{@^$W_bN~$I=QDy-#>Gp@n z+|A6Wrh}h%eD97Uh+pUXtmKaSuT;;-E?m48@caJYi}3X zqsuJ)$ns z^C5gta*Wi%sr#KDdJzY+VI;!=vpLzU|P3X zGlCUz8ryXIJc(zI{Rit-lx{Tz==@%#n+ZgAps>rjw-JP_+ufbJTrd>0ch{=0wF*k2 zAonlWrUKN%6h4-Pd0a~1{%>C7|AMa`bPW3B|Ku6|U$Wh@zUZyQOhTP}@p`;e1&79Z z6#fNtBETYVA}~X2F@v{-vZVN{OOHCiaT)f{*HA24nWgc$XRNK@9dpbFBT7Z(Y!Zz) zfs{TCYD3y>CQ^ve1>_yYky^cUkipE^nM6a?!K2wMdGTJdJL!&`9Uc__`D?}oymI8$ zFc2is@jkbq@ZfH}s9dn7z?pQ1mza=>X&7MVPPK!p1{AKoa+HTYx zA0oqSDdmVMf;21oLtmd4zh#c}KFj)tA>Je6DDk`MZ^(FBg0bPo+RDIFY6d;UVvc+l zO&@}ydegLSAH+n_K&{_UxvGZdB0uKMljnrVw#?(>C#w`ZH7vO@>=Oo`fxfTepyN*t zbhJ6u_rKn5J_${gfH?(DaCyrFazBEEN=bZ7Oi{f(ie_06)*-U9pqn@>!te1WKVr|V z^K>BaFLCN0r7*9;N(0SUg1jAFuNQr|raRxwYa2?^A0%9y=10ZZNn-tJdx^u)G36QH zi~NW2=n{`GnH}>PI7^erM0mTO?)Zzrlyk*rNgLj>y%$+(%|B6HmX#nfpzaS-utzUB zab%v@htG?CUG@@nk=@mT<11qk9=9ngC$bIB5Q31d*nEk_|F)5RXQsci$YAhW8{=%q zFxuBx@Ydfm+|oWZCmD>|)qS(Aw@S-rgp-#2v1lw;XXtz$kYQtevN$!)e~vXeots4|MGh;yQ^}9(r+ia*|s~rN?ueasvrG7dHkl$ z_F|u-$=c-os;gq07j?WgD^|tN`}lt0Us@V-KA_uAV^e;Vjj7jHLY5#drr!=Yj~^Qu^U7~O!ftrkylxqndt5!lQ;-7P9Tuf|D0bA zluN*#grmW=zx8X8>7`DwTL$}Fq6{#@cPHTz$c;Yq6(2u88hRTOasF)~p3GkzKCzx< zv!yfA;8lI4@lDW1+<-H|5-&bg;sTiK_xtnyxE)T~m;u=+&#At^i*aJD4vuOMtbjHn zHePzvQlkp**rZTD3@=uDGt`d;isyHfXqoBF3YSHwAf9PEb0SUPTfgH`Zmb&R%e51} z!I8H+%zPxz>es(My4WKW z_8@<+X6UNz=ZSz;Fg8*a#0Yr(`GwtmBcBXW0GiGPC0w)bh6lM5dM!=%o%eyv-T=L( z=^BBK(AnyIH6qzu(rudVJiCfmc_xwx7?n;yMo=julj^E#99D0-caPq5XXI{&h?`OD zeDOoSntAEOFTAg-$KPSp&6tcoT%xTXjq+4>eKND7nCu~UUHuJW8Mw@B z`9HBNch93t2eOE%US@2Kihh^O+c%iyxdPp1>?JEj9a_basFXD~#kRzFa2W$Bvq$0- zgFGnhKFLl50z0SNHJ}d`W7pOyzVGrsQOTu;27a1Wdy>46q;m$P7a2QFex*T-J`3N@ zI{Gd8?}M4_Jf>l`#-|bVU5$B`UNf3a*tN{NBZ}+B8F^hIdna4K?7S2cGgLMrbrRwp zv3x?=U@LqnnKND>V4yQqA0N7S4Pqq;!*>>bzIK8p{48~AU$0I1R@TlIl`NssH7~0-|6|meEo5~dz{b1| z@<0z8#__I1iaBqK2<8KB+n&6i)YX}}C^f#f3g7_zTe$fY6Ctxd|ah%Wxt79aOB=6}OprV8d&aogcoYRcM65 z7`79(NO@|fk>Wsvtp3pAShB}9{b9u-tEs}kr72ygC1;m??H89{P^F?y?iNNwH`Fc zaP(86NrK3IEmK`*%SuwHv%+DsQ<1RwdkgZXHx5uSv9#A7*o9gX1U3k-XZ!p9MJ6`z z+;ZE}wT-`$x~-7A_mXfe>NH`w_iPl)-WUurfq!7{%%US+e&iA3D*c51uBQ+sKl%>> z45zD}iDa-CIjx1Den;rsSiXoS`ues!YwRk1@@(ASEIa3mZ8;r%!A!o2;$L4a>2sK$ zMgD*s7!1avA|6m1;f7oyy}E?c3GI zFaCy^`0Mn+i=7lGr>@<~|dJEr?*7iC;Vi=|69 zAbxxyvwku1D{>skx;HtZ@wO(uHa}0JZI>mr@>daPUB1-E;JE#9?Qvk ztLatS544q+Pd)teM|(-+H0{+#%>w4?&d~!Vv+q%QN9&+6@tfiExSeI`!0<+}>>*4S zTp8G1VS9J(W#;&A@#gRA0pl-4eo}l?Q@4LuQl)FYnU}@V1E8wmB;^lI##5_`&$oWW z-c^RX>k%?V>k)*bD&l|rS=UU{T<@&w^yDUy$F(Um`M7k+J!|%dkIG;i?Y5+De9lvV zH;3+$wL(BS>IXGvCd#}b+>gVn`Fo>M=s+)TKmNzOJX))Sfifiq%G?i&>o$P|DM`c) z>+)%dqx&~xnA9ynWVO(dKmL-jbvamk2Sm>P^?3tP<9-hj#s5GVo(pcQ|c( zL4axU9YDa5Ze#*2T^pP}0|*8@J)RT9TKYpDp^UaBt}4~+5qLwNW{pxl8ZJY2L>fK$ zJ}@RYukl}v5*P(T>}bsqFG^1Da%+9PCX|vF+fwJ_KP{#L31Xk?r;;>rtF5{Yl}qm9 z(!7~lM+x=6BGxy=dDT_^&fxDaj%zE=_Q8OTO~|9-UQ7A;Z+3pBju6_VX&hL_S6))4 zT+X$eFiMa=7J3bZml1LzvZUGoBobtaQ=YrHX!h{oNpcrZ{trS83MMx;v<|cShoSJc zlBAwngmHrB(l?kzj1%sgA8+o*PM=P9(vA&Kj_6czb8 zr`$NI@&zludOlXi3lczjUKThNO^-A(jMfnM% zmrG}v0!Fo;+gz^q+@g33W9)~V9omI_QjBeXm#bTMiR$<@xR;`>j4OGLrueWAFlk#{ z$@0J&Y4QiMqUg5tDcsMBS_+W@4nryRZt*Lm94hf+MzCl@TaOAKMJJY&_-jlIV892j z@UQhvw1qXR!*z#?cMb#^Z)^&)8+_RkBe4Je9-{NKQiPtEfNYFcM28lVc(rOuHKRx? z2cl{}q4;)&%?Hk5sGWZpd6#(t-Z1s)lj8mAzwM^+dRxDGlSb&>bxZ3i1FPE7N+IK} zdr0t@_H)g?a!>4~5H{LTSd*7#&e!5tHn9+e7jN6^q|NM}5~C z)3YzNza^4~fE!;dGs}i7`gr}((@UtiItax%0_FU!d8A-gFHE(LpG_|K`)evBG%EG# zyI2f^sB%`i1{)K=uJM;Q(_3$U#T~Dm*Bmwq-I}t3B)1jO(4LQasR70T;3HUOw{s(0 z1G0hBWItSzDauPdfLGm4=A>HDPx9>f^2dm%F#F2D3GM(N+qAH0iAt8juBUfy=j$>G zZ3ef2%g;o`pMr?%Wd8Ob;(*zUcjGk~o;zLo3)s2jwLH17%`mbrv@%KsTTRY|?4nPr z+@o#cP2y`WPAIWirx&P2o=eqgfY+P*}{rfrlxt$Cj8+?B8RiB|rcd8cH(3J&oA<#7-x z6M2S(?Y zA-UG58U)j$AwmL^$NXWpdQBm_nJDjh3qA&3jfvGJJb% z7G%3&h4*no-U z347o{?7Mhi)zHv`8Tducm)js)w863}HdwqiEx(i7M=Hxx=*R&H>awHM7RwH&EE_3P zZ`!om(N8tUD2=sGtZ)AA=(K5EYrXO9-la9`y4 zndWT!|Hupu&o_f{DmyxRT{lD;Y*B@)kCm1^id5KHC}G%Wi0qKY_5_VQDR(e^WA)xu z$=D8)oOEh?1J3TMaQ&9(5*kiEMog`zt&SE?g$i|M1ay z)xz2a>Pj8cdIsUtYo*Se-q{=YRj$1OlUNxv2L(@A@az#GE0LVL;Bg`@$)Iw!V7tal z`AR3*uGD34D5T@uDM{hp0>%?5^h+L=F6jsVj9&Y^660mwDr46$gZajrt;?rFOrPB# z@7AfEN^kd6{pAzn-X>C5j32&sqZNHSx-`SHuss{l5m5E^y`Eq4hTSXX>daTK{7V3~ ztM%W6N1g;{mqeEt{fyU)KRgARb;D42^F0KO%IUL9fou|?g{n{!p^!80*{(b z)k?N455X;LgwP|7*p3yaB2FUGphnKUh&N>`SwCriey;Y?Sh$qF?%vAssq0ffgI*%Q zp=cndA&)V@9a%b(_QhN0Q(JrI%nyi&juL`8X>}bW5kK%)89*HW^wuUhZ1uW6!=l;a zCJ$-2B0PsqG5x~`=Q%?A*<}y*N7Me`BZ=GD`P${$lP{Z}+FV!P9^{0hjV6Ty`IeA{ zZd~;q%#)?F?adTi^x#KR`!6T94|biacGC*bYF`~962rZ&+M_fvw>qR9S=0QosMI1~ zq^?0JGgm?2GIfRPd(th+w4Iy1+AR0l8Cqw=!}@%qLgv9j(Qms_3%QoaCv|}1hBqcm z8HCA`V|f$kF*F9h+9$|lZDAABTrx`e90`|k!Cx^hFQC*B7BPTT=i4{pR=3*;?DR+| zvI*I?cQ!%9pU3arzG-4uc-Ix1jTPEeMOurqxOO@|ANN@YL^AVnh?DQS7WOd#N6no= zWl7PuF$(woJk`9utkO~EfgdlTrH!k?@ND}mssutAJ`W24tkq%f^cDOnJ1Tm)j+=I@ z=pE%n+eW7+?|!*&Rr|{md%yd2!4j=3serBNo%RUs04C6__8%&n@DMuz>HkZ(6947!6vtPg1?JMhG8))17nh zPe!)a*#%k3Mi2gCUh4!7GcwAJu4O=i$PxSNw0ChLK}Xd+6E5nX;&zhHt=lzcE#+q| z`F`8g@iW6oUr5mvlvfMg1!nPn8=4K@p*C_!wZGW??;@4Oqc7Vh?R2(kgt{T*ROM?H zT@aRpZt+g|4;~k#~c&BN00qw6YbUrPJvo^P6!)S;?E0 z?@hei1L?XetFox>=OE(99kGpM*O~FBHA5-d{rJy`Geh;|DI&S<=fVcsOLG6-<+hcT z(V8HdL-u^#O=)NKn(w+6U}M)cjV`E-_>UtmhlpJSFSg8FX(-etdOQpM>TDp}PTYbK z>E^oGYtnQKWudKu{lbxWk4Ool&lpM);A10Vg5Wl?>;R`nC2tTS3;G3SbCbC2y)pQX zIrOZ;$uWoNHgm-hT4mMUM|tP?sQ%e};X~{L>%+THiC5v=u)JI=_(t3AC*$o82-1}H zfO4l@THLv6uS{1N53BbXU#%zx<=0$sl$l%74lBQCMq7UcFt!M3;$rP;eQb;t8eCRL zY6Qh9XnjwQFQ$5)xN7>Ea;Eir7r@ACbH2K`{sTL4p#vLHKN>LeSrzZo^3U{MMx@Xp5;b0d24wo$)=xcvrf zU&oT~63p};ZU#N&6)YFm#f!n~eekz9{D+a>MPq>?)c{}eE&>isn%JRpn_vx8Zuc!0 z1MJ`Ib@?tIuLKU8HwlF$hp!g-)E;F?yZcWL9_G|N4-B?c5=q9ssBipBLvAY;(wk}8 zwC>17WO?bM29gpn?)hf$UdQ6<6F|c_#Kr4SxsrJLHM=Kpv|GgXX%9>1*&eU3_x+f` zh6BQCF0Fn39+Bx;rVCz7H2eZ693Wyy#gpgOmaQlj{* zNli`FL(Vr1`&=ZoS!j$r)8R*PUT=o6=1*1Zkrr~2C=vi|hYqHU^XI^$4_u`{%EiO+ zGgOa;14m5uU4jB@`0483gJfKpknUUMTJ%i#YhK}5P_+eX;_=(2V){Fozu~z~cmcyS zU%u+P$IL9Lw|F3+&&Dfp8CpX#n2oSys)}B^`VFwabOU738nfzJj>#&NHZX~t=PYZw z1>yb=qx`MrI?1NWQ$c};6X3$Q#}ATkmn|~!!b_Z`N!o{7AQ+!wVG?;^+{#-1(*!kQ z5zSMIvc3~*$kjV>3Lojz|^z+{y%4k9U`uMHIrs z1qK;FZ}a%a_m)vzOx@t7{k`%h7r`oJ1ff|Kkk=55Y z$s0IfsrF^XbD{CmI}Lf~iXpL86~-q@f9g}r$2jlRl0^6vY>5mmvz{xBee?u)cJUy1 zLeO#=ZwXftGF)#?e?zRX&Txd_?VbH~I!=h2O@c2RJQFap2c!i43Hy zXN|2#x3k9BC;7)2B6U!gpm|{#0dABOXb#qPmXS1NA)bzUtPP3!3UypIDM#xJC&;g5 zc1Z!I-jWliP@RrF#Paf*V3DvetLqHYcf!e)@9%!csJtNiS{==9n*ZpS%*!Cwrr-h^Y z@8FSF>3T{&uhiAxFrm7cI64i3m)7(YW%kBrdy~7V8yU!!0^`5!4TE5{`OV83rxPZ5 zg3{TiKlRs*R7$M3XU^4+8z+HeQb=C}(I{n0(pACEy3E!Fd|OqIZn;Gyd_h-Pn2s_* zfo`?NVRvH9Rns`2sn&2su)0cyZE}V5d1%EQTn z+4#8!`AekxyG^86zcqs586+@`2))x9#eBwmg3A&!Qk+W8%Q+PBGzab+(onj8o^=kSD9$0!@P zI8(kXNKL=Q>TwJ=X~lDtqZANe;`TAHsJrRs&KKkh*abQPkJ?>2-bQYuePT^%-eZ4f`--G(t5(fiXDv{fQ{njfGt) z?`~}tz2K#eg{JJykydge=SQ3N;?VY*QnHd+$6^0uhOHdGW2;C##?7+xUzJaS zrQc(#DpwmR*PVW;;Fu21i#b(O`*Ip3cekTw#~k12IMY4UOyNB4NmLog7`V?+VCt{kAonIa`+kCraVImJ7HE9*1fcyU1U*#DYbw#>+lR-nf>-giG zW!?$~kxowL)@`#>0(GLm=IKE@qJTobF|j2x;x%Y=no#18VTY3zwd9W2K&@=(0ce~t zwA=`{DRjyCJg#H0luNxvTQX5087nvpHIt(~2ph`J+fJSY7aP0U_{furkPH)G?H zS=2+XOjKv6Bw!Qg&+1#z*QWKU$kO?9%srF3Xe@ds2f)+_4a_WcLZ%SOPM0<0LDNvJ zs7bh+ho_i&Ua`H<^>lInOQ|Uz1ER+>Ii?E($KM5bs6watDs?@p*8sE;I-zbOHW-V{ z2`oQy;ZB8=lQ!5c!mKx32#AMR-;`s9V4W|tB~t{yo*k>cqIx>(|B6d)4se+(^?DBpI$Pi7c`)#mW5Vsz@fyxB#m97=P*f7`>--Zpo5M494V?wSxv*DZe& zS@Dv=K1^~g1x61BXNcPe{+qx4wDB!@T{>_NgJ(zMCKFqSySj}bW{0#;^mvSOv)SyN zw(9zmKkqzqQ{14;!cBt@!*eN%h(zr}c1;Yx=i?p4VuAiM^j$J*_SY*WdH2f>P8Laf z;5UMp_CHC_S28{|eLp4QU$uKf!UWkGy$DIPguA*H%_OzIV03~)9~@eh5~FG6F8wLt z>pH0S#T#~CU9Tt=8DBEoa1HXGdS3j)unHe|fAou7!dN5OuS?9>R_skiIkI$)n<99S zo`57-OBv1-G#lt&pJAQmb3W9@h2Y)w+#UPj?}UJgIaaUoiKS?Kb{cI^>JhfZ)vN_K zvM0ycz9{=cU;<y}ez z#${k~GEktiC3E8gonkGGawT3EGpC#YL)+(<>`m=GJ8!ZoY`-pl>^H`p`<^50=F(~f z9D9Kj8D{EcL(dziSMLDcts_14mDNa@!ZdM=%={PRt|e*ekIaWc@eKNPR$7hNPK)L) zS4p+FW%chr)#?4c6s(;jMBijAMtGt355t%~ya?#Su5i%*4})4kfF@+7hYNi}0IF|? zP~%8nSjLb!zr87gB&Kp55G`Qo!R8-lP&N~jxNP?S1(P6b-=4X?$ntlabZ^WZ9^U@j zR<#yq3x>t0c!e^yiR0VHIOHU9u*mcs<3DnM`C(~~a_(ffZxFY*`VZ=W=+J}YlCYTAA1 ziOX|etV=5nq%@Bq-oNBz4u~DOH4RLT#gO@fPt+|Txcai#+*?H(F|wMx--7b^N-KlY z_K|WD#R#4ovfC16@O+!B{{YTiYj%?>`D4lU_BN4R2*#xHENopEjxFfMtQCl%sm+kk zoPEUg`Q`Uqo-$29pOfl#hMrq#LF|94Gzb!of00yt8JhSNy z65qqjlj_-%>E1&(67tESx8F189cw-{u9Dr)B4@FHbfS*pQmem-SXub&yiy(~-ifMqr&s8(3vn!gBkfomNO)RHRy05)1Ops-j! z=My~jcX*I#(!nX7uCm8+s~Z7UED0lHmUy8S`Wx~G@{`VgmYN=^4yA9z>Qh5>BxiSG zBSt}1ry6`)P~h1eG;i!K{^X2s)Qh%!Pulw)RuMejW7-M1o*7xB6 ziVz6!I0#lf=Dj&CY@?ZP1%$TjUMaYT6)VPtHZ9kn$}&RL^1qnv{O4ol3H5C!%yu@` zhDDM@y0w`Zj7MhS5j;-cv}^5{Mg?Qdllgm6^VX;n%qyyCEoT${{@{IXD90YG(aT1w z57}P0-3o3gr7P`J z-A@UXNPb1OEXR7V9Xe!K0`zY*YC2Nb#Mkkq!(FGLJ(P>iJDXSj@gxUsBDEg*E2hfX zfzbS~$*Lx>j>W4imlr=B zc2%`UNWmXI-)9lCXEcA8KPz<266s~Ky`NH%rfDxMrf<2`^fJ04o{`F>Uv9zj(GpN;kXmRq7IH}}O7A?11dk+z zi3)4>YeDyA!Zfd*{{ZJMzb4nto<}}$&}~b3pUUX-OAKrA-08>Sl>qM1{{VP{!}e7tf&RpJ6L6dG5* zj$01qB@!hFBLGvIY<^i$kp(dUKGSuWG|Jt>aWq$ee&%TAb$)%iP!V3B?UYV2kl~Yb zWJBto%a6_puI=>uOMAzMQlwE#JzfCRQKbXym8hxB7Ht86^hn?1&C7;iFRPo{bf3*# zChJ0PK=;pV~y6&k4l`OVWEvRVAE2svF z!(&s|-!t%N0NzbA%m|?Pcg-4M(sfDodl;Hc67EXsE)baFxGnI=Dk(-kYd0f=3JwV8 zy2Gs`X&V--gOD+x;+LF$iZTYK5~#7eT5AH`?5d)5KHtE$)Ay_p?N<_(XX$4T|yg3;=6m5 zc~u``RU`EPsvm`GxA{4TEIdV!493IquRw#)ZBF}9)nvAQcFA#aW3`E?PlDba5rINR z;N_9R0(VL7e<8e&`b_JZQ(kF0*ijremXnk*s+xd^b_2w8I7|ZWg}wZlj_&vLw3p$0 z!lR1$i%t!uYAg@?`_U#Ty~D2gRIwokY2@EAY5I@XEblC}Yx`1D>ygsR?FQ;Zh?Rk; zKWEcg{{S{tV@wY95Bruc_fAXonEvx!-^t$>Se$VdxUs9ZS@TV?)sZX_)T0AoU0RPwa zzNzMUEbdy;9X{=X?e(>RrHkm}n6t`5Aj3Sxs_7F3y3_`y^27^9&_!}4ZBJQmtZCYH>RBkSsi|DF9Kq_MGLCoeR3GbM0#f9P3OdJ>Jm;w?ie<8b z2*(>cG?GICQ@a3zk-;oPbLN6xJ2#a4*RNh(-d$=?L@i!Lv0qG({+Ggdt4gIyRDeIG zV#>lI6U%9}s|_(eyzs*%tz(`|$=aJ_I7=!{e1`hIv0!z-FjgH{l5JI> zCOdFys8uAYmI^#L<T`)ZG=drk&A_K zSC;Nud$bQ|(X%jRezCoN72MF*wo1z@etG`@&Po1DTz*vfv2_awiSmb-8cU5jMFgZ1 z*PNEM{{SSKr}HPs=5!9tAXCBT754|B$%LV})8&ONiVvr3RYo@w7La|Ac<<7KCK!}N zVVOlLPhGqQCz1f&ebwKmZVLb;InvCvX>%wLfKxVL^E8pYw;`nYUWB_V!R)S!jkvHqzc+#_t>??62vg zGY~u%CKy}Pe4GCOI8WtmK1lBT>#WVHI{Zy%V82y_`!tSPL;lBx6xF_n^3Rk!o8&7Y zr}J8gcnKX+iN?Qw$&`|Y`!iL%E{^@0%#3To~QNo z%J|uGMgIVZG{!6-m8W6*F{$Jaa8;;llH+2ApUpaTt8kx`M~^Swm5<@AD^?@E9wc#6 z8NBPHM=HZCk;Lw3qDiCN_UK8$#Jpg!je05Kmr|cbouHof5qoWO3z1V9tF35izB_fu zo!ApxkRDa@W&Q1~+**v%v=9yraVhnTuH7RG#0FwIDBmlTsg!qPesc1+oG-26y7JD4 zZ#Am|w>oz?*t~KcPSe}J6?Z4>lw@VfI@@vNv&)t`JCSSVf6Mr+uhBVjmdQEFSFZ<6 zq^Djate}5AIc4HZViSL;c~{f=*XaE(>UF2+->SFPIQVnr!~LCq$?Jx?tv~G7F0JBXp7s08m{kicjsa*;Qh1?{ZO<<*90paiq438b(2F(KUl z0IYJNQ%D;fYH6&blTs4G>cvREjUj0R6J8+*AP(QhD>CSs4cJ)dSHeREn2|D?a+2Ip zz!j=94abSe!ZAG8l3(VywH+5mlKad0eYMV_7$i2+H=>SDx-V>m$8!@Zc%PX3{{Z>< zpjKdf#f!)Js5 z$mW$;$tu)2KNXZ`63n%a&ij2b-|8M#@@}Pbcc%jqM?4;kaY&s*%)&yG$4Y|Pqj+@N;2z$0q4aM50BH*isV8ihEfNY} zm%3M+ZB}SCOGaA>z9=QQAk$(2Qdor)J{Soo1?zrZ)*C^-he5uZ>u^ezi;){{SwOX#Ga+ay~_Upb#Vw?`6260qv7wF z{9pzqFUvnXc|!ZiUSqxT<@}M{NowcOyM)#$;6Gwi_9LkMlknx3<|H;^#R#D_=~`u~ zg}tB9f!J(FqWsP!3R-N!Sa^e10G3|=06dT=FLeB@{GLzDzaZ;crrV_|(X{!*WbaT~DJZ0m5mw5~B%4UQ&E`q8{XRG> z^a<~^o(xFTB4j?I(Nwb#qJ*8=qZ?!hd9}u+=M6r}U0cm}+GVx9V=?J6TL~@ZSq|wG zjKuO4rBJuNNDx|x1(5kOTeI_avn7U+Y^m-$}VpcWc2O9ij zRiEvj8f8Qh%nD>T`VO6`7}oa2b@bVt9@wmtZhquolU`lx4MKhN2-pscX@OEM7~QPbc0|OL0-#e+;nW5$4LlOVZEFQQ5WTjF2n{hCpCJB*%y( zDyL>N_(T5yz~w{($uz@Z{U7Hip6~Q^?wfO^lO!6pq5Fb4Y&|K#99Rybl*pJBv=#T} z9+_gP<)1ccR=Tuv$cmR%Augp_6U5B|)PrB!QS@U)b}Yk6o69#T8tK}UR|b@hHJMQV z0ITWzJC6!wu^}8GJBgOXkEar&4!aRwm^pCaDv51o8Dci~kfg9M;zI$jJ!#>SltC24 zJbUwx@@Gf${{WZeK3_=S^98plwB~9lW~EvdJvhHlW4=Qe;VU7t;C({M>rcCy%Jvtw zyta|yxPm}K$0TNqq#oerTv#!!USiUS0opOYxj0EsgtwAdBoe~Zarln|^S}yA=zsag zA3u51^8Wx-z4Nw{qF!o#MYMPz^KrI>$qaG1B^)s5=qkW}Eo;{*%s7I>o9-Vpc|-Dt z^SepYbuC*@hW6J`iC;$7AY%o>7aJ&JF@ z$v#xo=Z@<0ONZ-m8pUxMh~!i3S8e<4k>CYYrqJ$|-K{Mz0kvf)){?}f3Xwvm)8I%x z`2zy9muOyDmqwmw?5wTqVv#;8sGXd(O-KmhifivotO`pbwYRjldLyitO}S=p(i-*Z zYnQ|X61P!@QkD)HT=Cn_QCTHJAmiK(#STVsCz6IgaiUC%B=?}+-713!y*{n8Fg5sq z1Rx!#24b9Lm?;P7DSo~BWBfU#{+#LcpH%uDJvvt`@dc*e|I+sLx0JNBb(--FK>Z%)K zUmT>#7Lr^^1W3i9xQ_k6G2XH*&jVfeB!WdckB0yXP){uPT3nFMt*(}CC+pCBAdaKp zLPv=oamj4Qn;(zJ{#{$4J872I#L@2Nwz85qK^?t16D2%kZX@||rKVq^d56e$%(`xw zsKWPv9%xNxBz35#;4tjVge%;6x5|8(8&-fwwdAC=R-I}Bno|m;*S=%&WQ@>V>Xwc{ zqa&Y*NcuMGks{INaFJSjgOb1 zhii-ZCyq0fX0g~)_kw!Uny9q*Ce^tbvw4@Hm1?~u^>H zxOX2C{7aQf9`?#4htQCDw$D)VdDS$9i&B9t{YViHtsJlcQqiB<0DU9&vZ_nT^qz#Jm!$S>kWq#o#wCBzv$!d99ny3^TCeqxO!(kx{wqgq@6=-l1GM|tM1-i5tXn*1*zMe)jYIXFcH z52n8{{{S-~{IBvQ=a{bUPuDJMX{1=Ye)jfv+`Fmh3HYkNWHN>9MXy_iU#?lR1qax$sZu`Dow78_ znHGilm7rhVL!({a+r9j&`-_+uHMGPUQCg%ce~^BRn3V-*0k)_jozJ#SRKBTa>UzG4 zdY&{C`O~Fw;Ekr=|I_!(&m3v$NkFN+Pi%>mD-qT8aeB=Z1dDEuAly-U?b|WsD?uq` zhOwv3IF8-EwHhZ#WJB?HUL=Ak`$P#n06e2TsNE}*w3a<< zs3nESy1P1*#1`h0qwyxa=$O(282rJz*Sz0d8%CB}O(B^Y;nYbO5dq1AaR9d?@a>Hi zEK5<*?7Xj}+uLZ?0_$25t6FLimk$X&T4{JCJ(W#6V?~baukz!{L(7_s-fr_oxc9o% z^lT)AGZb%E?K1(fJ5viLM{ju~8icxzyQ^5srU(B3c_X#p&&%wCBh=S%L)W$orDc|u zmF0CTVmFWliaG(p8q_b${igo_D*z0T+U3>mpQp_}pQlNxTn&YkOo_-JA5hYR+Nawm zKP2*a#<@3<^-IF~y|n&V^D+uq%W)gntaGvAoJt-N{8XUlm`52r*$J>OJ8NEj{I0fx zUGo;Nr)rW)Ocqu#+Z21ACw^&D9@X8|YyMUu3~ea6{NeMTo;2eZmh`330>VxG<=fYX z0YV{40>}AO{ol2d5M^q5Kjx6~ys_AsBG&a53-z{^+{Jbo#eO*yw}0jzD&XOz;(8=s znVNcnn)aD>rO2QeqySyR9Yseo6sI~ZCgseiJ`cK97rA~ z6d6mx#lKJ^Z}#nEbKRzeng3 zI=sY5dv!o0xRrJVi0r?zI%RT|vWR+(r=L8}Zh>QNLY;5|TT(whYC5-{e7iP-tQ0YF z6WYm2JX4_fST}0cjs8wZNsGYzsrirRzsenHtu3WvVkIA2(eDX1k~MzX6(Gjv_FV}2 zaFJ-^x3_*@er|qK`M+KLB$L0EJjBlNPid$yiU*jQ^M>U|rpCPlfeFlcM1=5%uxt91 zS{1d{t2`z>Mr(FkO-2?bDVc>;;~=zRLEqb^F+J>Qg4)=5Z}T5V)O@GrH;Vq={Dt^Q z4kQ$4q+T^-bu4%|8-0^iVluhq(i6WF2df|2 zbMZ0FgdhN5WXE)NXv;fq%z;l5IuDjwSiZ^s0GvMZHl?X~p!wQMH#QntNfnjjrD0pg zUL@4gtcul9{KqIZkRNl}TSaRh6st-}GD!Qg5^704=L|z4QDK+Ee)(b-lU!A8X|-#& zLxEm<=I_hhCjMzPSS+HRSsY1oXD-&Wxc#YCln4B-`4Sk@$MnxHd8|!+acSjC4NB#1 zUA-VFl33W{{TQ)*jii=WfCfuP4_&~gNW*)r;b3Y zF0{I=X zKZaT<4W4!19gwinyVIuir%ZNA7H_L}^u4Rct`AD3x`)+1sW10@`2OdQ9)7Rvarfm+ zgsPQ&r?2&BzPV4Wa9>)TIn#WUZ-tk+d)L2D!z9aeqgwq5^(Xy3^?#`G{{WA!9BJ*( z_+%wjy8`fUG5-L{p#39h`Y-E0TlJUfJb8YP_3Qh;PwPJi9$(4dDPV7-!hGAy{7vRB zul|+&3-yNmGx{rsrS+=(TsiGZR=j>6qb3yJN2h*Nf6ABiq5l91*YuyLIewS^{{Ysf z!^8GDcx7|79%yej{{V~s08h>8{a5O~q<){N=~svCQlAxT*S=E8D7yau2m0sH^**=h zkF0tW^}Sx+pZl}s~TP^ysS${@Q zapS}GepzhNwoDcd2l7l{68{)(huTI2dgzqqH`;qUF1#V;U_ z>NKCy<4;w-vHZTL?R`085zXpGDt>D2JAD$=H(hC|eykqPyUy-qy4@vcl-6%Re@N>h6D{Bk8;dFDT>{+5UI zFZ_0P;px_%k0D=LzYhw1o?HI_vC8*iiPnCx`X+Bv>tEfUQ|guVeQJvOG~fMt?Mww5 zq`p`6KBsy5Z`b;k-&6JJ*ZhyCuWIB)v5nsAKioH|{{SBU0HkT}>T;+22dn=85633h H{{a8l!%CQr From 63f4ba2eeceac4561eca4b40f4f828cf048f0659 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 13:44:04 +0800 Subject: [PATCH 14/24] add translation to english --- README.zh.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.zh.md b/README.zh.md index 5919762..5123270 100644 --- a/README.zh.md +++ b/README.zh.md @@ -76,16 +76,18 @@ From Coding to Monetization:Programmer's Financial Freedom Approach 在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 -例子1: +真实案例 1: [Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 -例子2: +真实案例 2: 我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 -例子3: -(请自行谷歌、脑补) +真实案例 3: +我几年前在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式与外包模式太接近了,而不是产品模型或平台模式。 我以前的两位同事离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。 -我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 +你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 + +在这本书里,我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 也许你是技术的大牛,掌握了数十种编程语言、设计模式、前端到后端的全栈开发能力。然而,并不是每项技术,都能够实现快速赚钱的。最艰深、最有趣的技术,未必是最容易赚到钱的技术。有时候,我们要做最容易扩展的架构。有时候,我们要选择最快速开发的技术手段。 From 748ebed82508f2f41aedacc1971b68efec2076b8 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sat, 18 Nov 2017 13:46:10 +0800 Subject: [PATCH 15/24] add translation to english --- README.zh.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.zh.md b/README.zh.md index 5123270..38c07bb 100644 --- a/README.zh.md +++ b/README.zh.md @@ -77,13 +77,18 @@ From Coding to Monetization:Programmer's Financial Freedom Approach 在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 真实案例 1: + [Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 真实案例 2: + 我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 真实案例 3: -我几年前在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式与外包模式太接近了,而不是产品模型或平台模式。 我以前的两位同事离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。 + +2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式与外包模式太接近了,而不是产品模式或平台模式。 + +我的两位前同事在几年前离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。 你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 From 901196937c4d815370f9321b8a686c35bd14fde9 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Wed, 22 Nov 2017 00:29:00 +0800 Subject: [PATCH 16/24] update --- README.en.md | 920 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 618 +++++++++++++++++----------------- README.zh.md | 914 -------------------------------------------------- 3 files changed, 1224 insertions(+), 1228 deletions(-) create mode 100644 README.en.md delete mode 100644 README.zh.md diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..27016c8 --- /dev/null +++ b/README.en.md @@ -0,0 +1,920 @@ +## From Coding to Monetization:Programmer's Financial Freedom Approach + +【从编码到变现:程序员财务自由之路】 + +[中文版本/Chinese Version](./README.md) + +![rich](demo/richman.jpg) + +## Content + +* [Foreword](#Foreword) +* [Positioning](#Positioning) +* [Getting Started](#Getting-Started) + * [Language and Tools](#Language-and-Tools) + * [Hello, World!](#hello-world) + * [Simple APP](#simple-APP) + * [Add Ad Banner](#add-ad-banner) + * [Register Ad Account](#register-ad-account) + * [Settings for Payment](#settings-for-payment) + * [Publish APP](#publish-app) + * [Calcuate Ad Revenue](#calculate-ad-revenue) +* [Advanced](#advanced) + * [Demand is Fundamental](#demand-is-foundamental) + * [User Experience](#user-experience) + * [What Ad is Best](#what-ad-is-best) + * [Which Ad Network Shall I Choose](#which-ad-netowrk-shall-i-choose) + * [Promote Your APP](#promote-your-app) + * [Online APP](#online-app) + * [Cloud Service](#cloud-service) +* [Expert](#exert) + * [Data Analysis](#data-analysis) + * [Ad Optimization](#ad-optimization) + * [In-App Purchase](#in-app-purchase) + * [Social Marketing](#social-marketing) + * [Advertising](#advertising) +* [Appendix](#appendix) + * [Internet Marketing Terminology](#internet-marketing-terminology) + * [How to Publish APP to Apple AppStore](#how-to-publish-app-to-app-store) + * [How to Publish APP to Google Play Store](#how-to-publish-app-to-google-play-store) + * [How to Google Analytics for Data Analysis](#how-to-use-google-analytics-for-data-analysis) + +### Forword + +This book, is written for programmer. + +It's not about a programming language, not about a design pattern, and not about how to estimate man-hour, or how to manage project. + +This book is about: monetization. Simply speaking, how to earn money. + +As a programmer, you must have spent much time to learn, mastered several programming lanugages, used dozens of developing tools. In order to design stable and flexible architecture, you may have learned various design patterns. In order to boost working efficiency, you may have used many mature frameworks and automation testing tools. In short, you become an excellent programmer. + +And, you may even accumulate experience in management, take the initiative to learn the theoretical knowledge of project management, mastered a variety of R&D organizating model, become the R&D team leader or manager. + +In most cases, as a programmer or R&D team, you work on requirements analysis, architecture design, module demarcation, interface design, coding implementation, testing, and release versions, as required by the project manager or product manager. These tasks, no doubt, are the most familiar routine work for programmers. + +Unfortunately, for most programmers, your everyday concerns are just development. Accept requirements, deliver versions, that's all the product manager or the client has you to do. Even many excellent programmers or technical guru, they seldom care how software brings revenue directly. Most developers, just focus on R&D technical work, or even just focus on coding work, which is very limited. + +In fact, R&D, plus sales, payment, promotion, customer support, and maintenance, is the complete closed-loop of software's value chain. + +This book is about how to start from coding, to get paid, and how to get users. Step by step, on every details. + +Once you have mastered how to monetize from your software, youo will be more concerned with user feedback, caring about market needs, and the quality of your products. As they will bring you better financial returns. Then it's not far away to achieve financial freedom. + +If you feel that the content of this book is helpful, please give you support, by staring it. + +### Positioning + +Since it is to talk about earning money, we will not discuss the hard way of outsourcing, in which the business model is to sell limited life time as money. + +Considering factor of limited man power, time and resource, we will not discuss carrier-class, or enterprise-class large-scale systems. As they require large investment and long research cycle for complex requirement, which is beyond congrol of individuals and small teams. + +We focus on individuals or small teams. In the era of mobile internet, we have heard many miracle stories about individuals or small teams earn lots of money or even grow fast to unicorn enterprise. + +Real story 1: +[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) legend, a small mobile game developed by a Vietnam programmer in 2-3 days, swept the globe in just a few weeks, and bring income of $50,000 US dollors each day. This is undoutedly by chance, lucky guy, but at least, there is a probability of occurrence. + +Real story 2: +I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. + +Real story 3: +I have been working in a company that develops insurance software some years ago. The company had developed fairly well, and the management tried to IPO. However, they have not been able to take off and IPO yet, because the business model was too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. + +You can find other similar success stories, about making good money from mobile apps or games. You may heard, or just google the internet. + +In this book, what we want to explore, is to make full use of limited time and resource, focus on a very narrow area of requirement, to develop a very unique mobile app or small game, publish to global app store, acquire users, and make money. + +Perhaps, you are a technical guru, who masetered dozens of programming languages, design patterns, front-end to back-end full stack development capabilies. However, not every technology can be used to make quick money. The hardest or most intersting technology, may not be the easiest technology to make money. Sometimes, we need most flexible and scalabe architecture. Sometimes, we have to choose the most rapid development methods. + +Maybe, you are a newbie, just getting started, and only know how to write a webpage. It does not matter. The programming skills required to make money, can also be very simple. Just one thing, if any knowledge is required, we have to learn it quickly. We are in a era of fast changing world, programmers must be good at learning new things. + +## Getting Started + +### Language and Tools + +The language and tools for developing apps are often tied to the platform. +* If it is iOS, it is usually Objective C, and the development tools are [Xcode](https://developer.apple.com/xcode/) from Apple (development tools only run on Mac) toolset. +* If it's Android, it's usually Java, and development tools are Google's [Android Studio](http://developer.android.com/tools/studio/index.html) (a cross-platform development tool) toolset. +* If it is Windows Phone, that is C #, the development tool is Microsoft's [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx) toolset (only run On Windows)。 + +In addition, there are some cross-platform languages and tools, more friendly to developers. Develope once, package and release on multiple platforms: +* HTML5, can be used to develop apps and games, javascript is the core language. +* [Cocos2d-X](http://www.cocos2d-x.org/) for game development, C++ is the core language. +* [Unity3D](http://unity3d.com/) IDE and integrated MonoDevelop, C# is the core language. +* [Xamarin](https://www.xamarin.com/) acquired by Microsoft, and its sponsored open source project [Mono](http://www.mono-project.com/), used to develop APP, C# is the core language. + +In the tutorial below, we chose the easiest javascript as the main development language for subsequent content. In fact, it is also the most active language on github. It can be used to develop: +* Web pages, running in browser; +* Single-page WebApp, running in browser; +* Command line tools, based on [nodejs](https://nodejs.org/); +* Network cloud services, based on nodejs; +* Hybrid APP, based on [cordova](http://cordova.apache.org/) technology; +* APP with native UI experience, based on [react-native](http://www.reactnative.com/). +* Even desktop applications, such as the Adobe Brackets code editor, also developed with javascript. + +JavaScript can be used to develop front-end and back-end, code logic can be reused, thereby reducing the skill threshold and development costs. The requirements of the development environment is also very low, as long as there is a friendly code editor, a browser for testing and debugging, that's almost enough. + +The following are the the necessary environment and tools for development with javascript: +* Chrome browser, comes with developer tools and javascript console for running and debugging. +* [Adobe Brackets](http://brackets.io/) text editor (if you're used to [Sublime Text](http://www.sublimetext.com/) or [Atom](https://atom.io /) Or [Visual Studio Code](http://code.visualstudio.com/), no problem) +* iMac, with a huge 27-inch screen, really wide view for many windows, MacBook or Air is also okay; +* Mac OS X command line is very powerful, and convenient to support most LInux tools through [MacPorts](https://www.macports.org/) or [Homebrew](http: // brew.sh/). +* Xcode (Mac version only), must-have to build and debug iOS apps. +* Android Studio, used to build and debug Android APP. + +If you get used to Windows and do not have a Mac, it's also okay, you can develop for Android at hand. As to iOS, you may need some online service for apps building and packaging, like Adobe PhoneGap Build, or Intel XDK, etc. You can google how to use them. + +But, a Mac is still recommended, for both Android and iOS development. + +### Hello, World! + +To development frond-end app with javascript, in fact, there are three closely related languages: HTML / javascript / CSS. +* HTML is responsible for the content. +* javascript is responsible for logic. +* CSS is responsible for rendering. + +Here is a simple example: +```html + + + + + +Hello + + + + +

Hello, World!

+ + +``` +```javascript +// main.js +console.log('hello, world!'); +``` +```css +/* main.css */ +body { + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; +} +h1 { + color: blue; + padding: 40px; + margin: 10px; + border: 1px solid gray; + display: inline-block; +} +``` + +Open it with Chrome and we see the following display: +* The main browser window above shows the contents of the HTML and is rendered in the format and effect specified by the CSS. +* Open the Chrome console window, it shows the javascript call console.log () output debugging information. + +![HelloWorld](demo/helloworld.png) + +Using HTML5 / javascript to do development, getting started is as simple as that. + +If you need to develop high-quality apps, you need to master HTML / CSS and javascript, especially HTML5 / CSS3, master HTML DOM and some javascript libraries, such as [jQuery](https://jquery.com/), etc. Here are some free tutorials for getting started: +* [HTML series tutorial](http://www.w3school.com.cn/h.asp) +* [JavaScript Tutorial](http://www.w3school.com.cn/js/index.asp) +* [JavaScript Advanced Tutorial](http://www.w3school.com.cn/js/index_pro.asp) + +Through these tutorials, you can learn: +* A simple index.html page; +* A unified main.css file that controls and adjusts the presentation of interface elements +* A set of javascript files that enable dynamic presentation and switching of content through access to the HTML DOM. + +For you, as a programmer, this is not hard at all. + +### Simple APP + +Next, we want to turn such a simple web app into a mobile app. To be exact, it should be called Hybrid APP, a hybrid program. Because it's native app, it wraps a webview, which runs the web app we wrote. + +We need to use a technical framework called Cordova. + +Originally a product developed by a small team acquired by Adobe, it was renamed [PhoneGap](http://phonegap.com/). Adobe later turned it open source and donated it to the Apache Foundation, then called [Apache Cordova](https://cordova.apache.org/). + +Now Cordova has become a very popular technical framework, but also sought after by many commercial companies, in addition to Adobe, Intel, Microsoft, IBM and other companies have also introduced support Cordova products. + +The Cordova technology framework provides a command-line tool developed using nodejs, as well as a variety of plug-ins. + +We first have to install [nodejs](https://nodejs.org/en/), after installation, it will provide two basic commands: +```bash +$ which node +/usr/local/bin/node +$ node -v +v4.8.4 +$ npm -v +2.15.11 +``` + +* node --- the javascript engine, compile / interpret / execute. It is based on Google's open source Chrome V8 engine, event-driven, non-blocking IO mode operation, lightweight and efficient. +* npm --- NodeJs Package Manager, install package manager. All nodejs packages are downloaded and installed using npm (you can also use it to publish your own packages to the npm repository) + +Next, use npm to install [cordova](https://cordova.apache.org/): +```bash +$ npm install -g cordova +$ which cordova +/usr/local/bin/cordova +$ cordova -v +7.1.0 +``` + +Create a project with Cordova CLI: +```bash +# Syntax:cordova create +$ cordova create temp com.rjfun.demo Demo +``` + +Compile and build, then run the app in iOS emulator: +```bash +$ cd temp +$ cordova platform add ios +$ cordova build ios +$ cordova emulate ios +``` + +Now we will see the iOS emulator is started, and APP launched: + +![Cordova iOS](demo/cordovaios.png) + +Or, you can also connect your iPhone device to Mac, the use following command to install and launch the APP: +```bash +$ cordova run ios --device +``` + +Now the running one is Cordova's Demo project. Open Cordova project, you can see this directory structure: + +![Cordova Proj](demo/cordovaproj.png) + +Next, delete the contents of the www directory, replace with the index.html, main.js, main.css we wrote earlier and make a few changes: +```html + + + + + + + + + + + + + + + + Hello + + + + +

Hello, World!

+ + +``` + +```javascript +// main.js +console.log('hello, world!'); + +// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in +document.addEventListener('deviceready', function(){ + console.log('deviceready'); + + // TODO: Start the business logic of our web app +}); +``` + +```css +/* main.css */ +body { + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; + background-color: silver; +} +h1 { + padding: 40px; + margin: 30px; + background-color: yellow; + color: blue; + border: 1px solid gray; + display: inline-block; +} +``` + +Rerun the cordova project (it will compile, install, run automatically): +```bash +$ cordova emulate ios +``` + +So, you can see that Web App is running in the iOS simulator: + +![Hello World Cordova](demo/helloworldcordova.png) + +To write an easiest APP, in fact, is really simple, isn't it? + +### Add Ad Banner + +As a programmer, we have no doubt that you have mastered the HTML / CSS and javascript programming capabilities to provide some interesting and useful features. + +Next, we want to add monetization to the app, which is to make real money. + +The easiest way to realize is to add an ad banner, such as Google's AdMob. +* By showing ads, users click on interesting ads, browse the product, or install other apps. +* Advertisers / advertisers (advertisers, Advertizer) pay advertising costs to Google. +* Google will pay a portion of it to the person / company (publisher, publisher) who posted the ad. +* Google's role in it is called the Ad Platform, or Ad Network. + +The technical architecture of the Cordova framework is a web app with some common plug-ins that provide access to specific functions of the handset and integration with third-party systems. + +We implemented integration with Google AdMob via the plug-in cordova-plugin-admobpro. This is a plug-in based on the Google AdMob SDK, and is the most popular and easiest to use plug-in for the moment. Through it, just a line of javascript code to complete the SDK API call. + +Now let's add plugins to the cordova project. + +```bash +$ cordova plugin add cordova-plugin-admobpro +``` + +Modify main.js, let's add a few lines into the initialization: + +```javascript +// main.js +console.log('hello, world!'); + +// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in +document.addEventListener('deviceready', function(){ + console.log('deviceready'); + + // When the app is initialized, create an ad banner below the screen + if(AdMob) AdMob.createBanner({ + adId: 'ca-app-pub-6869992474017983/4806197152', // need to register as a user on the AdMob website and create an Ad Unit Id + position: AdMob.AD_POSITION.BOTTOM_CENTER, // show at bottom / center + overlap: false, // no overlap the web app content + isTesting: true, // show testing ad, please remove this line when formal release + autoShow: true // auto show it when ad resource downloaded and ready + }); +}); +``` + +Rerun the cordova project (it will compile, install, run automatically): +```bash +$ cordova emulate ios +``` + +So, you can see that Web App is running in the iOS simulator: + +![AdMob Banner](demo/admobbanner.png) + +Look, at the bottom of the screen, the banner is displayed. + +This is just a test advertisement for debugging purposes only. + +We need to register the user on [AdMob official website] (https://apps.admob.com/) and create an Ad Unit Id that replaces the string of digits following adId in the code. And in the official version of the release, remove the `isTesting: true` line of code. + +### Register Ad Account + +Here we introduce, how to register account, how to create ad unit, how to set bank receipt information. + +Visit Google's AdMob website (https://www.google.com/admob/) to sign up for a new account. + +![AdMob Site](demo/admobsite.png) + +After registering, visit the AdMob website (https://apps.admob.com/), click on the menu "monetization", click on the red button in the upper left corner "+ monetize new application" to add a new APP: + +![AdMob New App](demo/admobnewapp.png) + +Then create banner ads: + +![AdMob New Banner](demo/admobnewbanner.png) + +You can get the ad unit ID, copy it to the source code: + +![AdMob Ad Unit ID](demo/admobadunitid.png) + +### Set Payment Info + +After registering your account, you can accumulate ad revenue by putting the ad unit into the APP for user actual usage. + +There are two more steps to complete the Google advertising payment you receive: +* Verify address. Google will generate a PIN code printed on the card, send to your mailing address. +* Set up payment information. Can be Western Union or bank account. + +However, newly registered account has no access to set bank information. Only your cumulative advertising revenue reached the basic threshold (currently 10 US dollars), Google will allow you to set up payment information. Through this method, Google can filter out a large number of non-active accounts. + +#### Verify PIN Code + +![Verify PIN](demo/verifypin.png) + +Click "Fix It", enter PIN input UI. + +![Verify PIN](demo/verifypin2.png) + +This process of verifying your PIN is slow and typically takes 2-4 weeks. + +So, if the date of the most recent PIN was displayed, wait patiently. After receiving the PIN code, it will be entered in the box above, submitted for verification. + +#### Set Payment Info + +![AdMob Payment](demo/admobpay1.png) + +![AdMob Payment](demo/admobpay2.png) + +![AdMob Payment](demo/admobpay3.png) + +After the two steps are set up, when the advertising revenue, Google will calculate the advertising revenue of the month at the end of each month, and pay you around the 20th of next month. + +### Publish APP + +The APP we developed, to be installed by user and generate revenue, needs an important part: released to the app store. +* If Android APP, usually Google Play Store. +* If iOS APP, released to Apple AppStore. + +Here we use the Apple AppStore as an example, to illustrate how to register a developer account and publish an app. + +Visit the Apple Developers Web site (https://developer.apple.com/) and sign up for login. To release an app on the Apple AppStore, you pay an annual fee of $ 99 a year, which is the same for individual developers and corporate developers. + +![Apple Developer](demo/appledev.png) + +The following steps are needed to publish APP to the AppStore: +* Generate developer digital certificate for installation package signature. +* Create an APP ID for your APP, or use "*" or "com.rjfun. *" As a generic APP ID for more than one app, if no in-app purchase. +* Generate Provisioning Profiles for your APP, download it locally, open it in Xcode, and manage it. + +Then use Xcode to open the XXX.xcodeproj project file in the Cordova project, compile and archive (Archive). Successfully archived APP packages can be submitted to AppStore for review. + +You need to log into iTunesConnect (https://itunesconnect.apple.com/), to prepare, publish and manage your APP. + +![iTunes Connect](demo/itunesconnect.png) + +Create a new APP, add the name, introduction, icon, pricing and other information, and set it as ready to submit the status, and then you can Organizer Xcode in the successful archive (Archive) installation package submitted to the AppStore for review . + +![Xcode Organizer](demo/xcodeorganizer.png) + +Usually it will take Apple 2 or 3 days to review your app. If the review passes, you can see your app in the AppStore. + +### Calculate Ad Revenue + +When a user downloads, installs and runs an app on his device, he or she requests the official ad content from Google's ad server for display. + +You can visit the Google AdMob website to see daily ad impressions, clickthrough rates, and revenue. This site also offers very powerful reporting capabilities that show very detailed reports based on country, ad unit, time period. Google has an AdSense app on the AppStore, and you can install this app on your phone to see your AdMob earnings daily. + +Each time a user clicks on an ad of interest, it generates advertising revenue. Most of your ad serving is calculated based on the number of clicks, the so-called CPC ads. + +In calculating advertising revenue, there are several common basic terms: +* CPC (Cost Per Click, cost-per-click) is about US $ 0.06 ~ 1.0; +* CTR (Click Through Rate, show CTR), the result of a large number of statistics is about 1%; +* CPM (Cost Per Mile, CPM), CPM can also be calculated by CPC and CPR, the approximate range is US $ 0.5 ~ 20. + +The price per click varies based on the type of ad, the price that is served, and so on. Since different countries in the world have different economic levels, there are also big differences. + +E.g, +* In the United States, an ad click may yield a gain of $0.2; +* In Brazil, maybe only 2 cents, a difference of 10 times. +* In Japan, clicks on advertising revenue is quite high. + +The following is a comparison of a set of data: + +USA | Brazil +---|--- +![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) +Japan | Germany +![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) + +If we conservatively estimate $1 CPM (cost per thousand impressions), 100,000 ads per day will generate about $100 in cash. Then it will generate $3,000 in a month (including weekends and holidays!). + +Let's compare it with the average programmer's salary. In Shanghai, an experienced programmer with 5 year experience, the salary is about $2,300 or so. If you make such the APP, with 10,000 DAU (daily active user), the revenue generated from advertising can exceed the salaries of a programmer. Or even more, if optimized very well. + +I know a Brazilian, develop his game with HTML5 technology, simple, but very interesting. Daily active users is about 100,000, advertising revenue has more than $25,000 per month, so as to achieve the financial freedom. + +### Advanced + +### Demand is fundamental + +Earlier we described how to add monetization to APP. But to really get a decent return, you still have to get enough users. In other words, you have to develop enough good APP, can really solve the user's problem, will have more users, more frequent use. + +How to develop a more popular APP? In fact, this is not a programming problem. + +Perhaps you are a technical expert, using the most difficult, coolest technology, but the software products developed, may not be welcomed by users of the product. Sometimes, you use a technology that is actually relatively simple, but really pay attention to the user's pain points, to solve the user's concerns, it is possible your product will be welcomed by users, because of good reputation in the social network to get the natural spread. + +I recommend a book, "Demand - the Fundamentals of Creating Great Business Legends," by Adrian Silesivski. + +Here are some tips from entrepreneurs: + +> This is a good book worth every entrepreneur and every manager of the company to read, and even everyone in the organization should understand the concepts. The book gives some models for creating needs, which are very valuable to readers, we need good ideas, but we need more ways to practice ideas. These two books are done, very worth reading, especially recommended. +- Sun Taoran, founder, chairman and president of La Cara Pay Ltd., author of "Entrepreneurship 36 Military Regulations". + +> Behind every complaint is hidden an unmet need, and behind every need inevitably hides a market that can not be ignored. In fact, any product that meets the functional needs of the user from the outset should be upgraded to the spirit level, the user refuses to trouble, the user needs comfort, it does not seem to have anything to do with the profit, but I'm sorry, it is related to your market. You do not meet, entrepreneurs will go to their own ground-breaking satisfaction. Then waiting for you, or will be a huge crisis of life and death. Therefore, please pay attention to the hope of trouble, rather than to their complaint. This is exactly the most valuable thing that "demand" brings to us. +- Du Zijian, founder of Huayi Media, social media marketing researcher, bestseller "Boundless" author. + +### User Experience + +Although the sale of Apple mobile phone is very expensive, but still very popular, why? It is undoubtedly the best user experience to win. If you read "Steve Jobs Biography", you can know that the birth of Apple's mobile phone, in fact, is to solve the pain of traditional phones difficult to use. + +Naturally, the app or game we develop on our mobile phone must also be highly user-focused and put it in a strategic position. Mobile APP, not the pursuit of powerful features, complete, you can only do a small feature, but to effectively focus on the needs of users, and provide excellent user experience. + +A rather typical example is this "Flashlight" APP, which is to turn on the phone's LED bulb to temporarily light up the darkness. + +![Torch APP](demo/torchapp.png) + +This APP has more than hundreds of millions of users, of course, its economic return is also extremely impressive. + +The number of user comments exceeded 6 million and the users wrote: +* Jennifer Baylis: easy to use. # 1 The best Flashlight APP! Very easy to use, open very fast! +* Kitty Davis: I just need such a flashlight APP. +Dennis Castello: It's exactly what it takes and it's done really well. +* Joseph Low: easy to use. Let it work easily! highly recommended! + +### What Ad is Best + +In the mobile advertising arena, there are many forms of advertising, and are also constantly evolving. +* banner Ad +* interstitial Ad +* native Ad +* reward video Ad +* IAP (in-app purchase) Ad + +Which ad is best for your app, depending on the situation. This requires a good balance of user experience and revenue. If the ad is displayed improperly, or show too often, affecting the user experience or even cause the user offensive, it is the cart before the horse. + +banner Ad | interstitial Ad +---|--- +![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) + +These two kinds of advertisements are the most basic and classic, each has its pros an cons. Banner ads occupy only a small space at the bottom of the screen, changing the ad content every 60 seconds. The advantage is not too affect the user interface and experience, the disadvantage is because less obtrusive, not easy to arouse the user's attention and clicks. + +Interstitial ad is full-screen, pop-up at a specific time, more able to attract the user's attention and click. Because of this, the interstitial ad has better effects and click revenue is higher than the banner ads more than 5 times, so more recommended. + +When using interstitial ad, please pay special attention to the pop-up time, do not interrupt the user's continuous operation and gaming experience, otherwise it will cause the user's strong aversion. Best practice is to put it in transition between the two stages, such as the game is just over, pop-up screen ads, and then continue to the next level. + +Using cordova-plugin-admobpro to display interstitial ads is also straightforward, requiring just two lines of javascript to complete. One line of code prepares inventory and the other line of code shows ads. + +Here is the example: +```javascript +// When the game starts, it starts to prepare for interstitial ads, and the background thread downloads the inventory +if(AdMob) AdMob.prepareInterstitial({ + adId: "__ad_unit_id_here__", + autoShow: false +}); + +// At the end of the game level, call API to display the interstitial ad +if(AdMob) AdMob.showInterstitial(); +``` + +The above two kinds of advertisements are the easiest to use forms of advertisement, and the work integrated into the APP is also the easiest. + +Native Ad is a new way to show your ads in a more harmonious way between their own content. It does not seem obtrusive or abrupt. It's the type of advertising that has the least impact on user experience. Facebook AudienceNetwork and Flurry launched native ads long before, and later Google AdMob also introduced it to developers. + +Reward video Ad, a new ad in the mobile advertising industry. It encourages users to watch ad videos and reward them with some kind of virtual item in the game or app. In previous advertising campaigns, Google did not support giving users encouragement, and even made it illegal to give rewards. Because this is likely to violate the user's own interest, resulting in false invalid clicks. For the new rewarded video ad, other advertisers first introduced and succeeded in the market, Google adopted a relatively flexible and pragmatic attitude. However, advertising video sources are not very rich, many are mediation way from other ad networks. + +IAP Ad is an innovative form of advertising. IAP Ad allows users to shop directly in-app. Because it needs to be integrated with the payment system or the Google Play Store, it's only supported on the Android system. With in-app advertising, app developers can benefit from: +* Maximize your revenue and user lifecycle value by implementing ad serving and in-app purchases in the same app. +* Google automatically helps you determine which users are likely to purchase in-app purchases and show ordinary paid ads to the remaining users. +* No need to develop your own in-app support system or add in-app support code to your app. +* Easily target various segments of the user community with different in-app purchases. By using In-App Ads with the AdMob Audience Builder, you can serve high-priced, in-app products to high-spending groups while showing them to you at lower prices. + +If you want to learn more about native ads, rewarded video ad, buy ads, go to Google [AdMob official documentation website](https://developers.google.com/mobile-ads-sdk/) for in-depth research and study how to use. + +### Which Ad Most Reliable + +Because of the profitable mobile advertising sector, the mobile advertising industry is also growing very fast. Over the past few years, there have been many mergers and acquisitions. For example, Google has successively acquired DoubleClick and AdMob, Flurry acquired by Yahoo!, MobFox acquired by Matomy, and Millennial Media acquired by AOL. + +![Top Ad Networks](demo/topadnetworks.jpg) + +Usually the ad platform will provide: +* SDK, providing API for accessing advertising system; +* Register, login and manage advertising system; +* Integration Guide, examples, FAQ; + +Information about the various mobile ad platforms can be found through search or through a number of different sources (eg, StackOverflow.com) and try selectively. + +Here are some of the advertising platforms I've tried: +* Google AdMob +* Facebook AudienceNetwork +* Yahoo! Flurry +* MobFox +* Apple iAd +* MoPub +* Millennial Media +* InMobi +* OpenX +* Smart AdServer +* ... ... + +By trying to use, I am more satisfied with AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox. Especially AdMob, is highly recommended. + +The reason why AdMob is the most highly recommended, there are some prominent advantages: +* Ad fill rate is high. Basically more than 98%, some countries slightly less than 90%, so you can take full advantage of user traffic. After all, it is no surprise that advertising is a major source of revenue and revenue for Google, with advertisers around the world. +* Payment promptly. The monthly earnings are settled at the end of the month and paid on the 20th of the following month; +* SDK is very stable. Integrated documentation and reference code Easy to use, with documentation and system interfaces in different languages; +* Reporting system powerful and easy to use. Data can be analyzed in different dimensions; +* Easy to use. A dedicated APP can be used to track earnings; +* Support in place. A dedicated technical support staff, technical forums with official support, dedicated to answer the technical aspects of SDK access; +* Regularly organize some preaching and training activities, as well as regular online video lectures; +* Customer service is in place. Very patient and friendly, I keep in touch with them. + +Because of Google's excellence in innovation and consistent quality service, it has very high reputation among develoeprs. + +The cordova-plugin-admobpro plug-in, built on the AdMob SDK, not only encapsulates Objective-C / Java / C # native APIs into a unified javascript API but is also much easier to use. Just 1-2 lines of code to complete the ad display. Popular in Cordova's global community, this plug-in is the most-used monetization plug-in. The following is a plug-in download trend curve: + +![AdMob Download Trend](demo/admobprodltrend.png) + +Facebook AudienceNetwork is not bad. + +Facebook is not only the largest and most active social media, but also offers a variety of related SDKs, including AudienceNetwork for Advertising. Its developer website is https://developers.facebook.com/docs/audience-network. +* Facebook's Fill Rate is not as high as AdMob, about 45-75%. +* Facebook payment is also timely, but also in the 21st of each month to pay last month's advertising revenue; +Facebook's SDK updates are very frequent. A new version will be released in about two weeks, so if there are any bugs, the fix is fast. However, the update frequency is a bit high, sometimes feeling a little behind. Relatively speaking, Google AdMob SDK more stable; +* Management interface and reporting system is also relatively clear and easy to use. The reporting system is not as strong and flexible as Google Admob, seemingly only English interface, it looks like the following. + +![Facebook AudienceNetwork](demo/fbaudnet.png) + +Flurry is a mobile advertising company that has been acquired by Yahoo, the official site is http://www.flurry.com/. There are 2 main products, one is Flurry Anlytics and one is Flurry Ads. +* Flurry SDK integration is still relatively easy, the reporting system quite satisfactory. Site visit is a bit slow, more time-consuming. +* Payments are slightly slower and are not paid until 60 days after the advertising revenue. +* It is worth mentioning that, Flurry is a relatively early support Native ads (Native Ad). + +MobFox is a European mobile advertising company headquartered in Austria. I used to contact its CEO, he wants me to develop plug-ins for them. Later, because of the acquisition, then later, we knew that MobFox was acquired by Matomy. This company is still good, payment is more timely. Although known as Europe's largest mobile advertising company, and the world is located in the Top 10, but compared with giants such as Google, Facebook, the global influence is really a bit weak. + +Apple's iAd just launches on iOS. As the iPhone's market positioning and pricing significantly higher than the Android system, it also determines the iOS users have a strong purchasing power, so iAd ad click returns relatively high, it goes without saying. However, if you develop an app that needs to run on iOS and Android at the same time, managing it with AdMob is a bit easier. You can also use AdMob's mediation feature to show some of your traffic through iAd, maximizing the benefits of advertising. Later, Apple adjusted the advertising business and stopped iAd service. + +Like OpenX and Smart AdServer, open only to European and American business customers, not for global users and individual developers. Formerly, customers in the United States and Europe saw my open source project on GitHub, specifically looking for me to customize the adware plug-in. Through project cooperation, I was able to understand and become familiar with it. However, because it is not for global developers, it is not recommended. + +As for MoPub, its SDK is open source on GitHub, and it's something different. Its documentation and SDK was not very mature. For some time, you have to compile these SDKs from source code into a jar and framework before using them in your projects, which is really inconvenient. Recently, they have supported their SDK to be loaded into your project with gradle and cocoapods, a lot easier than before. + +Millennial Media (abbreviated mMeida), its SDK Demo aesthetics done well, but customer service and technical support response is really flattered. Have encountered technical problems, submit a question through the Web Form, has not been answered, so I am not happy to use it. I heard later they were acquired by AOL. + +In addition, such as Charboost, TapJoy advertising platform, also more or less seen. However, each person's energy is limited, so did not try them one by one. Charboost, an advertising startup that started up in 2011, focuses exclusively on mobile games and was named Top 10 mobile advertising company by the VentureBeat Index in 2014. Advertised by Chartboost, click revenue is relatively good, but conversely, that is, advertising, access to the user's cost is relatively high. Some of my friends I know are specialized in heavy games, devoted to overseas markets and used more ads on Facebook and Chartboost. + +These mobile advertising platform described above is entirely personal experience and subjective experience. If you are interested, ou can try more by your own. + +### Promote Your App + +(To be continued) + +### Online APP + +### Cloud Seervice + +### Expert Topics + +### User Data Analysis + +### Ad Optimization + +### In-App Purchase + +### Social Marketing + +### Cast Advertising + +### Appendix + +#### Popular Mobile Marketing Terms + +Part1 Basic Terms + +ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) + +Impression:意思是“曝光”,也被称为“展示”或“显示”,是衡量广告被显示的次数,一个广告被显示了多少次,它就计数多少。比如,你打开新浪的一个页面,这上面的所有广告就被“显示”了1次,每个广告增加1个Impression。 + +Click:点击,是指互联网用户点击某个广告的次数。 + +CTR:Click Through Rate,点击率。就是用click除以impression的比例。 + +CPM:Cost Per Mille,这次实际上省略了impression,全文应该是cost per mille impression。Mille是千的意思,在英语中它只跟着per一起用,即per mille,就是汉语的“每千……”的意思。所以CPM是每千次展示的成本。 + +CPC:Cost Per Click,每次点击的成本。 + +Ads:就是广告(名词)的英语复数啦。Ads = Advertisements。如果是“做广告”(动词),应该用Advertising。 + +SEM:Search Engine Marketing的简称。就是搜索引擎营销。不过在中国,SEM其实仅仅指PPC。但是SEM事实上是PPC和SEO的统称。PPC和SEO是什么,下面有解释。 + +PPC:Pay Per Click的简称。一般是特指搜索引擎的付费竞价排名广告推广形式,因为搜索引擎竞价排名只有一种收费方式,即按照点击付费。虽然也有其他广告形式也是按照点击数量来进行收费,一般不被称为PPC,而被称为CPC,即Cost Per Click。为什么?似乎是约定俗成。 + +SEO:Search Engine Optimization的简称。就是搜索引擎优化,特别指搜索引擎搜索结果自然排名的优化。所谓自然排名,就是不通过给搜索引擎付钱就能获得的排名。不花钱就能被搜索引擎排到前面当然是好事,但大家(每个网站)都这么想,所以要出头还挺难的。懂得这个领域的高手过去能挣很多钱,但今天SEO却越来越短时间内就出效果,所以想要通过SEO挣快钱越来越难。 + +Social:社会化,是social marketing(社会化营销)或者social media(社会化媒体)的简称,具体指二者的哪一个要看场合。社会化媒体,在中国过去是人人网、开心网之类,现在是微信、微博、图片分享类网站应用等。 + +WA:Web Analytics的缩写。就是网站分析。 + +DA:Digital Marketing Analytics的缩写。数字营销分析。 + +Part2 数据分析领域 + +Dimension:维度。维度是对一指一个事物的不同的方面、特征或者属性。这么说太抽象。简单说,人可以分成男人和女人,性别就是人的一种维度。或者汽车可以分为白色、黑色、红色等,颜色就是汽车的一种维度。维度是最基本的数据结构,任何一个度量(指标)必须要依附于一个具体的维度才有意义。比如说,我说visit=100,这没有任何意义。我说搜索引擎给我的网站带来的visit=100,就有了意义。搜索引擎流量就是维度(即流量来源)的具体的值(就如同男人是性别这个维度的具体的值)。 + +Metric(常用作复数,即Metrics):通常翻译为度量或者指标,但是因为指标含义更宽泛,例如KPI或者benchmark都可能被称为指标,所以在我的培训中metrics都是用度量来表示,这样更严谨。度量绝大多数都能能用数字表示,比如汽车的速度,速度就是度量。课程中涉及到的度量分为两类,一类是计数度量(比如常见的PV、UV、访次、停留时间等)和复合度量(两个度量四则运算而成,常见的有转化率、跳出率、留存率、活跃率等)。另外有些度量使用布尔量表示,即是或非。度量必须依附于维度才有意义。 + +Unique:Unique是指排重(排除重复)。Unique很少单独用,常用在计数类度量的前面,比如unique visitor,指排除对同一个访问者重复计数之后的访问者数量——同一个人今天到网站一次,明天又来一次,不能就因此变成两个人,unique visitor仍然是1。Unique visitor通常可以简化为visitor,两个可以通用。Unique visitor和unique user是唯一的两个可以加不加unique都算unique的度量。另一个例子是unique impression,即同一个人多次看同一个广告,还是计算为1次。Unique impression和impression是两个不同的度量,因为后者不排重。 + +Benchmark:我在大学的时候这个词被翻译为“定标比超”,真是不明觉厉的感觉呀。Benchmark就是“可以作为对比的参照值”。我的很多客户会问,这个指标在行业中的平均情况是什么样呀?他们的问题可以同样表述为:这个指标在行业中的benchmark是多少? + +Pattern:指某种会重复出现的模式或规律。Pattern常常用于发现用户行为上的某些趋同特征。比如,我们发现用户都喜欢在晚上10点到11点打开某个app应用,这就是一种pattern。如果我说发现了一个pattern,很兴奋,实际上的意思就是说我发现了一个规律。规律这词,几十年前就有了,pattern这洋文多有逼格呢…… + +Random:随机数,或者随机性。但是老外们也用它来形容“混沌”之类的意思。 + +Cohort:很难翻译,也很难形容,我暂且把它翻译成“队列”。跟Segmentation有点类似,但内涵要多一点,多点排队的意思。你懂的,课堂上讲清楚。Cohort一般是一种分析方法,所以一般不单独出来,而是跟analysis在一起,即cohort analysis。 + +Filter:过滤。过滤是指摒弃掉不需要的数据,只留下需要的。过滤都需要遵循一定的规则(这是废话),而且过滤掉的数据往往不能找回。过滤是一种常用的定位某个细分领域的方法,与细分(segmentation)的区别在于,segmentation是把总体分成并列的若干块(segment),而Filter则只保留符合规则的块,而丢弃其他不符合规则的块。 + +Segmentation:细分。这是我们最基本的方法,即把总体按照一定的规则分成并列的若干块。做了segmentation之后,每一个块就是一个segment。所以segmentation和segment不是同义词。Segmentation怎么用?怎么发挥最大价值?课堂上有很多案例。 + +Part3 互联网和互联网营销分析技术领域 + +Cookie:Cookie并没有真正的中文翻译,cookie是在你浏览网页的时候,网站服务器放在你电脑(或移动设备)的浏览器里面的一个小小的TXT文件。这个文件里面存储了一个标识你这个人的匿名的ID,以及一些与你访问的这个网站有关的一些东西,这样当你下一次访问这个网站的时候,cookie就会知道你又来了,并且记住你上次访问时候的一些状态或者设置。Cookie以及与cookie类似的东西是互联网营销的最重要技术之一,几乎所有识别人和标记人的工作都需要cookie及类cookie技术完成。在这次培训中会有详细的说明。 + +Deep link:没有汉语直接对应名词,我觉得直接叫“深链”好了,但不能叫做“内链”,后者是另外一个东西。Deep link历史悠久,过去把能够链接到网站的内页(即非首页的页面)的链接都称为deep link,但此后很快deep link这个词的意义就消失了,因为这样的链接实在太普通,都不需要用一个专用的名词来表述。但随着移动端的app的出现,deep link又“东(si)山(hui)再(fu)起(ran)”,特指那些能够跨过app首屏而直接链接到app的内屏(类似于网站的内页)的链接。嗯?如果这个app还没有安装过怎么办?这两期的公开课会专门讲。 + +Link Tag:Link Tag特指在流量源头的URL后面加上的标记,用来标明流量源头的名称和属性。最典型的link tag是Google Analytics的UTM格式的标记。目前已经成为标明paid media(花钱购买的广告流量)的标准配置。如何用好它,比你想的丰富,课堂上详解。 + +Heat map:热图。在一个图上标明这个图上哪些是获得更多关注的部分。关注可以是眼光,也可以是鼠标点击或者手指的指指点点。热图是做行为统计学研究的好可视化工具。大家都看得懂的东西,但用好则要水平。 + +JavaScript:简称JS,网站页面上的程序,能够让页面除了展示内容之外,还能实现更多的程序运行和功能。网站分析工具监测代码就是JS代码,将JS代码部署在你要监测的网页中,就可以把用户在页面上的互动访问行为不间断的发送到相应数据分析工具的服务器,从而获取想要的用户数据。 + +Attribution:归因。但是实际上这个词被翻译成“归属”更好。归因是指在多种因素共同(或先后)作用造成的某一个结果时,各种因素应该占有造成该结果的多大的作用,即“功劳应该如何分配以及归属于谁”。为解决归因的问题而建立的模型被称为归因模型,即attribution modeling。但我一直可惜这个词没有翻译好,翻译成归属模型或许更容易理解。 + +Path:路径。任何构成先后次序的一系列事件或行为都可以用路径来描述。路径分析(path analysis)也是较为常用的一种分析方法。 + +UID:是User Identification的缩写,即用户ID。 + +Bots:机器人。非人产生的流量,都被称为机器流量,即bots traffic。Bots是互联网虚假流量主要的创造者之一。 + +Spider:常翻译为蜘蛛,蜘蛛是一个自动程序,它的作用是访问收集整理互联网上的网页、图片、视频等内容。比如百度蜘蛛会将互联网的各种内容抓取回来并分门别类建立索引数据库,使用户能在百度搜索引擎中搜索到想要的内容。 + +IP:是Internet Protocol(网络互联协议)的缩写。IP地址就是给每个连接在互联网上的主机分配的一个地址,过去用于判断不同的访问行为属于同一个人(因为都是同一个IP记录产生的访问)。但由于各种动态IP和虚拟IP技术,用它判断用户人数已经很不可行。现在游戏领域也常常说起 IP,不过那是另外一个意思,intellectual property,知识产权,往往指的是著名的小说、影视、游戏等作品的人物故事等等。 + +Tracking:翻译为跟踪,就是数据分析工具跟踪用户各种行为的“跟踪”,用户所有的线上行为都可以被跟踪。监测这个词的“监”这个字,就是tracking。而测,则是measurement。所以监测这个汉语词,最准确的翻译就是tracking and measurement。监测需要用一定的技术手段实现,其中核心技术之一就是监测代码(tracking code),是一串可以发挥监测功能的程序(很多都是脚本语言编写,比如JavaScript语言)。 + +Pixel:本意是像素,但是在监测领域,是tracking code(监测代码)的同义词。 + +VAST:即Digital Video Ad Serving Template。一种实现视频程序化广告的基础性协议。目前是4.0版本。 + +Part4 流量与用户行为领域的名词 + +Bounce Rate:跳出率。会在课堂上简单介绍。 + +Referral:翻译为引荐来源。现实生活中,如果我推荐你使用了某个产品,或者我介绍你加入我们光荣的党,我就是引荐人(referral)。而在数字营销中,referral是指那些给我的网站带来了流量的其他网站,通常这些网站上会有链接到我的网站的链接。如果没有做特殊的标记(如使用link tag标记)或者不是特殊的流量源(比如搜索引擎),那么大部分的流量来源都会被监测工具记录为referral。 + +Retention:指用户的留存。如何让用户能够留存,是一个重要的课题。在这两期公开课培训中会跟大家介绍如何提升retention。 + +Engagement:没有特别合适的中文翻译,这个指标指的是用户在网站或APP上的交互程度或者参与度,可以由多个指标组合而成。比如一个网站有很多交互行为,包括下载文档、观看视频、咨询等,那么会根据每个交互的重要程度给每个交互行为赋值,用户每完成一个交互及赋予相应的数值,这样可以判断不同类别用户的交互程度以及不同页面的交互差异。Engagement和其他一些名词比如effectiveness、performance、acquisition等相似,都是泛指性的名词。 + +Session:session实际上和visit是一回事。本来,各类工具都是将用户的一次访问(网站)称为visit,但是随着app的普及,visit app听起来很别扭(因为我们都是use app),所以app也就不存在visit了,于是就用session代替。为了统一表述visit和session,有些监测工具把visit改称session。 + +Visit:即访问。指对用户对网站的访问,通常以30分钟为区隔。如果超过30分钟在网站上没啥动静,则一次访问结束。 + +Direct:翻译为直接访问,比如用户直接在浏览器输入网址访问,或者用户直接点击收藏夹里的网址进行访问,都会被记为直接访问。除了上述情况,从QQ客户端聊天窗口或微信客户端的链接直接访问网站的也会被记为直接访问。 + +Exit:退出,即用户离开网站或APP的行为,用户离开网站前的最后一个页面称为退出页(exit page),离开APP时所在的最后一个screen叫做exit screen。 + +Part5 策略与运营 + +Acquisition:泛指用户获取。在用户运营中使用的极为广泛,做任何产品的运营的第一步就是获取用户,比如在网页端的推广流量的获取、App推广中用户的下载等。 + +Goal:目标,是想要达到某种效果,每个网站都会有一些作为目标的交互,比如点击下载说明书、登录、注册、提交订单等。那我们就可以将这些设定为目标,那么这里引出另一概念:转化(conversion)。每完成一次上述的目标,就可以认定为完成一次转化。 + +KBR:Key Business Requirement。关键商业需求。是一个企业商业目标中最关键的。KBR决定了一个企业的其他目标,并且也决定了我们应该如何制定digital marketing的目标,以及针对这些目标选用什么样的指标或KPI。 + +KPI:Key Performance Indicator的缩写,译为关键绩效指标,是若干个用于衡量业务表现的最重要的度量。不同的商业目标,不同的业务,所对应的KPI不同。如何设置KPI是一门技术,也是一门科学。在这次的培训中也会做详细介绍。 + +Part6 互联网广告领域的名词 + +Display Ads:展示广告。展示广告主要指静态的图片广告、动画广告,以及富媒体广告(就是能互动一下的flash神马的)。这一广告形式与文字广告(就是文字链)和视频贴片广告形式是并列的不同类广告形式。 + +Banner:广义上是图片或者动画展示类广告的统称。这个词的含义源于上街游行队伍中拉着写有标语的大横幅,后来扩展到互联网广告商,并与display ads同义。 + +Pre-roll:也叫pre-roll ads,即前贴片广告。就是视频播放之前的长达10秒到丧心病狂的120秒的视频广告。 + +Content Feeds:信息流广告。信息流(主要是在社交网站和APP上)是内容并列排列自上而下像瀑布流一般,而在信息流中插入跟信息内容形态一样的广告,这种形式就是信息流广告。课堂上会介绍。 + +Native Ads:原生广告,通俗说是那些看起来就像网站或者app中正常内容一样的广告。原生广告容易和信息流广告混为一谈,但它们并不是一回事。原生广告可以采用信息流来实现,但不仅仅局限于此。 + +Reach:人群触达。如果做互联网广告,能够让广告触达到多少人是广告主关心的。触达实际上等同于unique impression,所以它不是动词,而是一个名词,一个用来记录广告触及到了多少人的计数度量。 + +Coverage:人群覆盖。跟触达非常类似,只是它的含义更模糊一些。往往用百分比来表示,例如,希望reach到的人群是1个亿,而实际reach到的是6000万,那么coverage大约是60%。Coverage不是一个度量,而是一个约定俗成的说法。 + +Viewability:广告可视性。过去统计广告的曝光的时候,不考虑广告是不是真的被人看到了,所以有些广告处在一个很长的页面的第二屏或者更后面的位置,而某个同学只看了第一屏就离开了的情况下,这个广告其实是根本没有处于屏幕中的,这个同学根本看不到这个广告。在不考虑viewability的情况下,这个广告仍然因此而有增加一次曝光(impression),而若考虑viewability,这个广告不增加一次曝光。 + +Pre-click:点击前阶段。指流量入口(尤其是广告)在被用户点击之前(含点击本身)的相关用户行为及对应的营销监测与分析体系。 + +Post-click:点击后阶段。指流量入口在被用户点击之后的相关用户行为即对应的营销监测与分析体系。 + +Fraud:作弊,也有更通俗的写法即cheating,但fraud特别指流量作弊。反作弊是anti-fraud。另一个与fraud类似的反面词汇是spam,即垃圾短信、垃圾邮件之类的骚扰垃圾信息。 + +Campaign:特别难找到准确对应的汉语名词,大意是一次有始有终的营销活动。有始,是指营销活动是从严谨的策划和详细的执行计划开始的,有终,是指营销活动有清晰的执行结束的节点。所以心血来潮的营销“游击战”不能称为campaign,那些几乎永远不停止的营销行为(例如SEM投放)也不能称为campaign。 + +Audience:受众。就是广告的阅览者,普罗大众。受众这个词太书面化了,但是确实没有比这个更明确的词,所以在这两期公开课中都会用这个词。 + +Target Audience:目标受众。任何人都可能看到你的广告,但只有那些合适的人才会购买你的商品。所以,合适的人就是你的目标受众,是你最希望影响到的那群人。 + +Effectiveness:效果。这是广告主评估品牌推广类广告好坏的一个关键指标。效果的含义比较广泛,在不同的campaign目标下可能不尽相同。比如,能够覆盖到的人群情况(coverage)可以作为一种效果;或者,人们是否真正对你的品牌产生了认知(awareness)也被称为一种效果。类似的,人们也用performance来表示营销的好坏,二者是近义词,但又不完全相同。Performance更偏重有实际产出的具体效果,因此常常被翻译为“绩效”,例如campaign产生了多少的click,产生了多少的交易等等。因此,effectiveness较为抽象,几乎只在品牌推广中被提起,而performance较为具体,在效果类推广中更为常见。 + +Efficiency:效率,即达到某种效果所花费的成本(包括金钱与时间)。品牌推广类营销常用,效果推广类很少提及。 + +Branding:品牌推广。 + +Awareness:对品牌或产品的认知。做广告的首要目的,就是让消费者意识到你的品牌或者商品的存在,说白了就是搏存在感。看看近期密集发布的手机在各个新闻app、电商app中频频发力,就知道awareness对广告主有多重要了。 + +Buzz:消费者或网民对于品牌、产品等广告主在乎的事情在网上发出的各种声音。与IWOM是一个意思。Buzz是苍蝇蜜蜂之类的嗡嗡声,无数网民每天在网上发出的各种意见, 在上帝看来就像苍蝇蜜蜂般嗡嗡作响。 + +IWOM:Internet Word of Mouth的简称。即网络口碑。 + +Survey:调研。这个词是一个有意思的词,主要在它的发音。作名词的时候重音在前——[?s??ve?],作动词的时候重音在后——[s??ve?]。 + +ePR:通过互联网进行的PR。 + +IP:Intellectual Property,即知识产权。就是过去说的那些原创的,有知识产权的东西。现在天天出现在各种口语和报道中的这个词指各种在互联网上创作的内容。例如,我的这个公开课也可以称得上是IP。Papi酱的网红视频?当然也是咯!与上篇的IP写法一样,意义完全不同。 + +Minisite/Microsite:没有对应的汉语名词,而且大家也从来不用汉语描述它。就是指为campaign专门定制的campaign网站,这些网站规模都不大,所以被称为mini(迷你)或者micro(微)。 + +Programmatic:程序化(广告)。一种革命性的广告运作方式。在课堂中会有详细的介绍。 + +DSP:Demand Side Platform(需求方平台)。程序化广告的广告投放管理系统平台以及相应的服务提供方。具体解释这里不多说了,到时候课堂上会详细介绍。 + +SSP:Supply Side Platform(供应方平台)。程序化广告的广告资源管理系统平台以及相应的服务提供方。具体课上介绍。 + +RTB:Real Time Bidding(实时竞价广告),这是程序化广告最重要的一种方式,也是理论上最佳的广告资源变现方案。但具体如何实现,优劣问题,以及国内的情况,课上详细讲。 + +Bid/Bidding:竞价。搜索引擎PPC广告,或者RTB广告,都需要竞价。类似于拍卖,但需要在预置条件的前提下通过程序来实现。课堂上详细说。 + +Bidder:Bidder即竞价者,在PPC广告范畴内,bidder就是普通SEM的操作从业者。在程序化广告范畴内,bidder一般就是DSP服务提供商。 + +DMP:Data Management Platform,数据管理平台。程序化广告(programmatic advertising)中为实现定向受众所需要倚仗的数据平台。但它能做的还远远不止这么多。培训课程中会专门涉及。 + +Verification:特指广告的验证。验证有两类,一类是验证广告是否真实被投放出去了,以及投放出去之后广告所处的环境是什么。什么是广告所处的环境?——对于PC web上的广告而言,环境就是这个网站以及具体承载广告的这个页面。另一类是验证广告覆盖的人群的情况是不是跟预想的一样。 + +Part7 效果营销领域的名词 + +Conversion Rate:转化率。是指从流量到实际销售转化的能力。与ROI本质是一样的。只是ROI衡量的是现金(收入)对现金(支出)的对比,而转化率衡量的是销售的数量与进入销售漏斗的人数(或者次数)的比例关系。 + +Churn和Churn Rate:客户流失和客户流失率。所有需要尽可能让用户反复购买(或付费)的生意,都有这个度量。看名字就知道,这个度量用来描述失去客户的情况。具体如何定义,以及如何分析,在课堂上会有详细说明。 + +SERP:Search Engine Result Page。就是搜索引擎的搜索结果页面。 + +Search Query:用户的搜索词。人们在各种搜索框(典型的如搜索引擎的搜索框)内填入的词,这些词可能很不结构化,且非常随意。而keyword,则是使用搜索引擎竞价排名的广告主设定的关键词。 + +Keyword:使用搜索引擎竞价排名的广告主设定的关键词,较为结构化,较规范。这些词不可能穷尽用户的search queries,因此搜索引擎会把用户的search queries转变为与之最相近(不过是否真的是最相近,那就只有搜索引擎知道了)的keywords,然后显示搜索的结果。 + +Organic Search:自然搜索流量源,即用户点击了自然搜索结果产生的流量,而不是点击了竞价排名(PPC)而产生的流量。 + +Affiliate Marketing:有时也就直接简称为Affiliate。这个词在国内没有对应的名词,在台湾被译作“联署营销”,但是这个翻译似乎仍然莫名其妙。Affiliate marketing就是典型的代销模式——你的东西,我帮你卖,卖出多少,你给我按照一定比例提成。在互联网上,affiliate marketing变成了我帮你引流量,我给你的流量如果有转化了,你给我提成。国内的亿起发、领克特等就是做affiliate marketing的专门平台。 + +EDM:Email Direct Marketing(电子直邮营销)的缩写,是利用电子邮件(Email)与受众进行商业交流的一种营销方式,电子邮件营销是网络营销手法中最古老的一种。 + +Performance:绩效,即通过营销之后获得“战果”。ROI就是一种典型的performance,销售额之类的也是。 + +GMV:Gross Merchandise Volume。这是电商经常会用到的词,书面是“毛销售量”,实际就是销售流水。当然,销售流水不等于最后赚到的钱。GMV=1销售额+2取消订单金额+3拒收订单金额+4退货订单金额。GMV是流水,只要你下了订单,生成订单号,就算了GMV。而这个订单转化为平台的实际收入还会有2、3、4这些流失量。下单以后后悔了取消订单,订单送到你面前了后悔了拒收订单,签收订单以后后悔了要退货(这个步骤不同的电商平台计算方法不一样,有的平台是不管退不退货都搜算进销售额中)。总之,人艰不拆,GMV数字大,好看,而且我们监测起来也最容易,所以这是最常用的。 + +AOV:Average Order Value。平均订单价格。 + +Monetization:变现。 + +MRR:Monthly Reoccurring Revenue,直译是每月都会产生的收入,实际就是用户要交的月费。比如我办了一个158元的包月电话套餐,对于电信公司而言,我就给他们贡献了MRR 158元。 + +Part8 移动端常用的 + +Screen:如果说web端用page view来记录页面被浏览的次数,那么screen就是app的页面,screen view就是app的页面浏览的次数。但因为screen没有page这个东西,所以就用screen来表示。我也不知道应该对应什么汉语名词,或者应该用“屏显”?反正相信你懂的。。 + +DAU:Daily Active User(日活跃用户数量)的缩写,通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),是用来衡量产品的用户粘性的重要指标。 + +MAU:Monthly Active User(月活跃用户数量)的缩写,概念与DAU相仿,区别在于时间跨度。MAU除了能衡量用户粘性,还可以分析产品衰退周期。 + +H5:是HTML5的简称。它实现的功能与Flash类似(用于实现动画和各种酷炫的人机交互界面等),但是比Flash具有更强的兼容性,可扩展性,稳定性以及安全性,因为该技术是HTML的延展,而非如同Flash一样是一个单独创立出来的事物。目前各大互联网钜子们——包括Adobe(Flash的所有者)——都已经加入支持H5,H5在移动端几乎已经完全取代了Flash。 + +ASO:App Store Optimization。狭义上指针对苹果应用商店的app排名所做的优化工作。广义则指对所有的应用市场的优化。与SEO类似,都是排名优化,只是优化的对象变成了应用市场。 + +LBS:Location Based Service,基于位置的服务。低逼格的讲就是用手机定位之后,能否关联一些服务或广告的。当然实际的应用比我说的肯定逼格高很多。 + +Part9 企业、组织机构与产品 + +Google Analytics:谷歌分析,简称GA,是全球用户量最大的网站和APP上流量用户行为的监测与分析工具。 + +Universal Analytics:简称UA,是GA在2013年左右做的一次大升级版本,目前无论是免费还是付费版的GA,都是基于Universal Analytics的。GA的付费版叫Google Analytics Premium,简称GAP。 + +GTM:Google Tag Manager,是谷歌公司用于管理网页上各种广告、监测和分析代码的平台型工具。课堂上会简单介绍。 + +DCM:DoubleClick Campaign Manager的简称 (即新版 DoubleClick for Advertisers 7),DCM 是一个管理及投放广告的全面解决方案,覆盖从 广告策划、管理、定位、投放、优化到生成报告等。广告的impression和click等几乎所有的度量,都可以通过它来进行监测。 + +AdWords:全称Google Adwords,是谷歌搜索引擎的关键词竞价系统,按点击收费(CPC)。 + +AdSense:全称Google Adsense,是谷歌推出的针对网站主(简称发布商)联盟的一个互联网广告服务,通过程序来分析网站的内容,并且投放与网站内容相关的广告。 + +DAA:Digital Analytics Association,数据分析协会。美国的互联网营销数据分析行业协会,号称是全球协会,但主要章程和成员都在美国,对其他国家的影响力较小。 + +IAB:Interactive Advertising Bureau,美国的互动广告局,也是类似于DAA的行业协会,主要领域是数字广告。这个协会在美国,但对全球数字广告的影响力巨大,尤其是标准和技术上。 + +#### 如何发布 APP 到 Apple AppStore + +#### 如何发布 APP 到 Google Play Store + +#### 如何发布 APP 到 360 应用商店 + +#### 如何用 Google Analytics 做用户数据分析 + + diff --git a/README.md b/README.md index 24b907e..82f75db 100644 --- a/README.md +++ b/README.md @@ -1,141 +1,144 @@ -## From Coding to Monetization:Programmer's Financial Freedom Approach +### 从编码到变现:程序员财务自由之路 -【从编码到变现:程序员财务自由之路】 +From Coding to Monetization:Programmer's Financial Freedom Approach -[中文版本/Chinese Version](./README.zh.md) +[英文版本 / English Version](./README.en.md) -From Coding | To Monetization ----|--- -![poor](demo/poor-programmer.jpg) | ![rich](demo/richman.jpg) +![大富豪](demo/richman.jpg) -## Content +### 目录 -* [Foreword](#Foreword) -* [Positioning](#Positioning) -* [Getting Started](#Getting-Started) - * [Language and Tools](#Language-and-Tools) +* [前言](#前言) +* [定位](#定位) +* [基础篇](#基础篇) + * [语言与工具选择](#语言与工具选择) * [Hello, World!](#hello-world) - * [Simple APP](#simple-APP) - * [Add Ad Banner](#add-ad-banner) - * [Register Ad Account](#register-ad-account) - * [Settings for Payment](#settings-for-payment) - * [Publish APP](#publish-app) - * [Calcuate Ad Revenue](#calculate-ad-revenue) -* [Advanced](#advanced) - * [Demand is Fundamental](#demand-is-foundamental) - * [User Experience](#user-experience) - * [What Ad is Best](#what-ad-is-best) - * [Which Ad Network Shall I Choose](#which-ad-netowrk-shall-i-choose) - * [Promote Your APP](#promote-your-app) - * [Online APP](#online-app) - * [Cloud Service](#cloud-service) -* [Expert](#exert) - * [Data Analysis](#data-analysis) - * [Ad Optimization](#ad-optimization) - * [In-App Purchase](#in-app-purchase) - * [Social Marketing](#social-marketing) - * [Advertising](#advertising) -* [Appendix](#appendix) - * [Internet Marketing Terminology](#internet-marketing-terminology) - * [How to Publish APP to Apple AppStore](#how-to-publish-app-to-app-store) - * [How to Publish APP to Google Play Store](#how-to-publish-app-to-google-play-store) - * [How to Google Analytics for Data Analysis](#how-to-use-google-analytics-for-data-analysis) + * [单机版APP](#单机版APP) + * [加个广告条](#加个广告条) + * [注册广告账号](#注册广告账号) + * [验证地址和设置收款信息](#验证地址和设置收款信息) + * [发布APP](#发布APP) + * [广告收益的计算](#广告收益的计算) +* [进阶篇](#进阶篇) + * [需求是根本](#需求是根本) + * [用户体验](#用户体验) + * [哪种广告最适合](#哪种广告最适合) + * [哪家广告商最靠谱](#哪家广告商最靠谱) + * [营销你的产品](#营销你的产品) + * [联网版APP](#联网版APP) + * [云服务](#云服务) +* [高级篇](#高级篇) + * [数据分析](#数据分析) + * [广告优化](#广告优化) + * [支付与内购](#支付与内购) + * [社交营销](#社交营销) + * [广告投放](#广告投放) +* [附录](#附录) + * [互联网营销常用术语](#互联网营销常用术语) + * [如何发布 APP 到 Apple AppStore](#如何发布-app-到-apple-appstore) + * [如何发布 APP 到 Google Play Store](#如何发布-app-到-google-play-store) + * [如何发布 APP 到 360 应用商店](#如何发布-app-到-360-应用商店) + * [如何用 Google Analytics 做用户数据分析](#如何用-google-analytics-做用户数据分析) + +### 前言 + +这本书,是写给程序员看的。 -### Forword +这并不是关于一门编程语言,也不是关于一种设计模式,更不是关于如何评估工程量、如何做项目管理。 -This book, is written for programmer. +这本书是关于:变现(monetization),通俗的说,就是赚钱。 -It's not about a programming language, not about a design pattern, and not about how to estimate man-hour, or how to manage project. +作为程序员,你一定花了大量的时间去学习,掌握了若干种编程语言、用过数十种开发工具。为了设计稳定灵活的架构,你也认真学习和掌握了各种设计模式;为了提高工作效率,你也用了各种成熟的框架以及自动化测试的工具;总之,通过学习,你成为了一个牛B的程序员。 -This book is about: monetization. Simply speaking, how to earn money. +甚至,你也积累了管理的经验,主动学习了项目管理的理论知识、各种研发组织模式,也许会进阶到管理岗位,成为研发团队的负责人或者经理人。 -As a programmer, you must have spent much time to learn, mastered several programming lanugages, used dozens of developing tools. In order to design stable and flexible architecture, you may have learned various design patterns. In order to boost working efficiency, you may have used many mature frameworks and automation testing tools. In short, you become an excellent programmer. +在大部分的情况下,作为程序员或者研发团队,你按照项目经理 或者 产品经理给的需求,进行需求分析、架构设计、模块划分、接口设计、编码实现、测试、提交版本。这些环节,毫无疑问,是做研发的程序员最为熟悉的流程。 -And, you may even accumulate experience in management, take the initiative to learn the theoretical knowledge of project management, mastered a variety of R&D organizating model, become the R&D team leader or manager. +不幸的是,你日常所关注的,仅仅只是研发环节。接受需求,交付版本,这就是产品经理或者甲方让你干的事情。很多在研发领域侵淫多年的研发大牛,也往往并不熟悉软件怎样能够直接带来经济回报。绝大多数的开发者,仅仅关注研发这个环节,甚至仅仅关注在编码这个环节,这是非常局限的。 -In most cases, as a programmer or R&D team, you work on requirements analysis, architecture design, module demarcation, interface design, coding implementation, testing, and release versions, as required by the project manager or product manager. These tasks, no doubt, are the most familiar routine work for programmers. +事实上,研发环节,再加上销售、收款、推广、用户支持、维护,这才是软件产生经济回报的完整闭环。 -Unfortunately, for most programmers, your everyday concerns are just development. Accept requirements, deliver versions, that's all the product manager or the client has you to do. Even many excellent programmers or technical guru, they seldom care how software brings revenue directly. Most developers, just focus on R&D technical work, or even just focus on coding work, which is very limited. +然而,软件怎样直接带来经济回报,这方面的技术文章或者书籍并不多见。这也是我为什么会选择这个角度,作为本书下笔的核心内容。 -In fact, R&D, plus sales, payment, promotion, customer support, and maintenance, is the complete closed-loop of software's value chain. +这本书是关于,如何从编码、到如何接受付款,以及如何获取用户。手把手,教你每一个步骤。 -This book is about how to start from coding, to get paid, and how to get users. Step by step, on every details. +一旦你掌握软件如何变现的能力,你会更加关心用户反馈、关心市场需求、关心产品质量,因为这些都会为你带来更好的经济收益。实现财务自由,也就并不遥远了。 -Once you have mastered how to monetize from your software, youo will be more concerned with user feedback, caring about market needs, and the quality of your products. As they will bring you better financial returns. Then it's not far away to achieve financial freedom. +如果你觉得本书的内容有所帮助,请点赞支持。 -If you feel that the content of this book is helpful, please give you support, by staring it. +### 定位 -### Positioning +既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 -Since it is to talk about earning money, we will not discuss the hard way of outsourcing, in which the business model is to sell limited life time as money. +考虑到人力、时间、成本等因素,我们也暂时不讨论运营级、或者企业级的大型系统。研发周期长、投入大、需求复杂,也超过个人和小团队的掌控。 -Considering factor of limited man power, time and resource, we will not discuss carrier-class, or enterprise-class large-scale systems. As they require large investment and long research cycle for complex requirement, which is beyond congrol of individuals and small teams. +在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 -We focus on individuals or small teams. In the era of mobile internet, we have heard many miracle stories about individuals or small teams earn lots of money or even grow fast to unicorn enterprise. +真实案例 1: -Real story 1: -[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) legend, a small mobile game developed by a Vietnam programmer in 2-3 days, swept the globe in just a few weeks, and bring income of $50,000 US dollors each day. This is undoutedly by chance, lucky guy, but at least, there is a probability of occurrence. +[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 -Real story 2: -I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. +真实案例 2: -Real story 3: -I have been working in a company that develops insurance software some years ago. The company had developed fairly well, and the management tried to IPO. However, they have not been able to take off and IPO yet, because the business model was too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. +我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 -You can find other similar success stories, about making good money from mobile apps or games. You may heard, or just google the internet. +真实案例 3: -In this book, what we want to explore, is to make full use of limited time and resource, focus on a very narrow area of requirement, to develop a very unique mobile app or small game, publish to global app store, acquire users, and make money. +2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式与外包模式太接近了,而不是产品模式或平台模式。 -Perhaps, you are a technical guru, who masetered dozens of programming languages, design patterns, front-end to back-end full stack development capabilies. However, not every technology can be used to make quick money. The hardest or most intersting technology, may not be the easiest technology to make money. Sometimes, we need most flexible and scalabe architecture. Sometimes, we have to choose the most rapid development methods. +我的两位前同事在几年前离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。 -Maybe, you are a newbie, just getting started, and only know how to write a webpage. It does not matter. The programming skills required to make money, can also be very simple. Just one thing, if any knowledge is required, we have to learn it quickly. We are in a era of fast changing world, programmers must be good at learning new things. +你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 -## Getting Started +在这本书里,我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 -### Language and Tools +也许你是技术的大牛,掌握了数十种编程语言、设计模式、前端到后端的全栈开发能力。然而,并不是每项技术,都能够实现快速赚钱的。最艰深、最有趣的技术,未必是最容易赚到钱的技术。有时候,我们要做最容易扩展的架构。有时候,我们要选择最快速开发的技术手段。 -The language and tools for developing apps are often tied to the platform. -* If it is iOS, it is usually Objective C, and the development tools are [Xcode](https://developer.apple.com/xcode/) from Apple (development tools only run on Mac) toolset. -* If it's Android, it's usually Java, and development tools are Google's [Android Studio](http://developer.android.com/tools/studio/index.html) (a cross-platform development tool) toolset. -* If it is Windows Phone, that is C #, the development tool is Microsoft's [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx) toolset (only run On Windows)。 +也许你是刚入门的菜鸟,只会做做网页什么的。那也没有关系,赚钱真正需要的编程技术,其实也可以非常简单。只是有一点,需要什么知识,我们就恶补什么知识。由于技术日新月异,程序员必须是最善于学习的群体。 -In addition, there are some cross-platform languages and tools, more friendly to developers. Develope once, package and release on multiple platforms: -* HTML5, can be used to develop apps and games, javascript is the core language. -* [Cocos2d-X](http://www.cocos2d-x.org/) for game development, C++ is the core language. -* [Unity3D](http://unity3d.com/) IDE and integrated MonoDevelop, C# is the core language. -* [Xamarin](https://www.xamarin.com/) acquired by Microsoft, and its sponsored open source project [Mono](http://www.mono-project.com/), used to develop APP, C# is the core language. +### 基础篇 -In the tutorial below, we chose the easiest javascript as the main development language for subsequent content. In fact, it is also the most active language on github. It can be used to develop: -* Web pages, running in browser; -* Single-page WebApp, running in browser; -* Command line tools, based on [nodejs](https://nodejs.org/); -* Network cloud services, based on nodejs; -* Hybrid APP, based on [cordova](http://cordova.apache.org/) technology; -* APP with native UI experience, based on [react-native](http://www.reactnative.com/). -* Even desktop applications, such as the Adobe Brackets code editor, also developed with javascript. +### 语言与工具选择 -JavaScript can be used to develop front-end and back-end, code logic can be reused, thereby reducing the skill threshold and development costs. The requirements of the development environment is also very low, as long as there is a friendly code editor, a browser for testing and debugging, that's almost enough. +开发 APP 的语言与工具,通常与平台密切相关。 +* 如果是 iOS,那通常是 Objective C,开发工具是苹果推出的 [Xcode](https://developer.apple.com/xcode/) (开发工具仅运行于 Mac)。 +* 如果是 Android,那通常是 Java,开发工具是 谷歌推出的 [Android Studio](http://developer.android.com/tools/studio/index.html)(开发工具有跨平台版本)。 +* 如果是 Windows Phone,那就是 C#,开发工具是 微软推出的 [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx)(开发工具仅运行于 Windows)。 -The following are the the necessary environment and tools for development with javascript: -* Chrome browser, comes with developer tools and javascript console for running and debugging. -* [Adobe Brackets](http://brackets.io/) text editor (if you're used to [Sublime Text](http://www.sublimetext.com/) or [Atom](https://atom.io /) Or [Visual Studio Code](http://code.visualstudio.com/), no problem) -* iMac, with a huge 27-inch screen, really wide view for many windows, MacBook or Air is also okay; -* Mac OS X command line is very powerful, and convenient to support most LInux tools through [MacPorts](https://www.macports.org/) or [Homebrew](http: // brew.sh/). -* Xcode (Mac version only), must-have to build and debug iOS apps. -* Android Studio, used to build and debug Android APP. +除此之外,还有一些跨平台语言与工具,对于开发者更加友善,可以开发一次,多平台打包发布: +* 可以开发游戏与APP的 HTML5,以 javascript 作为主要的开发语言。 +* 用于开发游戏的 [Cocos2d-X](http://www.cocos2d-x.org/),用的是 C++ 作为主要的开发语言。 +* 用于开发游戏的 [Unity3D](http://unity3d.com/) IDE 以及集成的 MonoDevelop,用的是 C# 作为主要的开发语言。 +* 微软收购的 [Xamarin](https://www.xamarin.com/) 以及赞助的开源项目 [Mono](http://www.mono-project.com/),用来开发 APP,以 C# 作为主要的开发语言。 -If you get used to Windows and do not have a Mac, it's also okay, you can develop for Android at hand. As to iOS, you may need some online service for apps building and packaging, like Adobe PhoneGap Build, or Intel XDK, etc. You can google how to use them. +在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。实际上,它也是 github 上最为活跃的语言。它可以用来开发: +* 运行于浏览器内的 Web网页; +* 运行与内嵌浏览器的 单页WebApp; +* 基于 [nodejs](https://nodejs.org/) 的命令行工具; +* 基于 nodejs 的网络云服务; +* 基于 [cordova](http://cordova.apache.org/) 技术的,混合(hybrid) APP。 +* 基于 [react-native](http://www.reactnative.com/) 开发 native UI体验的 APP。 +* 甚至,也能够开发出桌面应用,例如 Adobe Brackets 代码编辑器。 -But, a Mac is still recommended, for both Android and iOS development. +因为它可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 + +以下是用 javascript 来做开发的所需要的环境和工具: +* Chrome浏览器,自带开发者工具 和 javascript 控制台,用来运行和调试。 +* [Adobe Brackets](http://brackets.io/) 文本编辑器(如果你习惯 [Sublime Text](http://www.sublimetext.com/) 或者 [Atom](https://atom.io/) 或者 [Visual Studio Code](http://code.visualstudio.com/),也没问题) +* iMac台式机,巨大的27寸屏幕,视野不受限制;Mac OS X命令行非常强大方便,通过 [MacPorts](https://www.macports.org/) 或者 [Homebrew](http://brew.sh/),Linux 上有的命令行工具或者 library 都基本支持。 +* Xcode(只有 Mac 版本),要调试 iOS APP,有台 iMac电脑或者 MacBook笔记本电脑,这也是必备的。 +* Android Studio,用来调试 Android APP。 + +如果你习惯了 Windows 也没有一台 Mac,会稍微麻烦一点。不过也是有方法的,有一些专门提供编译、打包的云服务,例如 Adobe PhoneGap Build,或者 Intel XDK,我们后面会介绍如何使用。 ### Hello, World! -To development frond-end app with javascript, in fact, there are three closely related languages: HTML / javascript / CSS. -* HTML is responsible for the content. -* javascript is responsible for logic. -* CSS is responsible for rendering. +用 javascript 开发前端,其实需要的是 3 项相关的语言:HTML / javascript / CSS。 +* HTML 负责内容 +* javascript 负责逻辑 +* CSS 负责渲染表现 -Here is a simple example: +以下是一个简单的例子: ```html @@ -172,67 +175,62 @@ h1 { } ``` -Open it with Chrome and we see the following display: -* The main browser window above shows the contents of the HTML and is rendered in the format and effect specified by the CSS. -* Open the Chrome console window, it shows the javascript call console.log () output debugging information. +用 Chrome 浏览器打开它,于是我们看到如下的展示: +* 上面的浏览器主窗口,显示了 HTML 的内容,并且用 CSS 指定的格式和效果进行了渲染。 +* 下面打开 Chrome 的 console 窗口,则显示了 javascript 调用 console.log() 输出的调试信息。 ![HelloWorld](demo/helloworld.png) -Using HTML5 / javascript to do development, getting started is as simple as that. - -If you need to develop high-quality apps, you need to master HTML / CSS and javascript, especially HTML5 / CSS3, master HTML DOM and some javascript libraries, such as [jQuery](https://jquery.com/), etc. Here are some free tutorials for getting started: -* [HTML series tutorial](http://www.w3school.com.cn/h.asp) -* [JavaScript Tutorial](http://www.w3school.com.cn/js/index.asp) -* [JavaScript Advanced Tutorial](http://www.w3school.com.cn/js/index_pro.asp) +用 HTML5 / javascript 做开发,入门就是这么简单。 -Through these tutorials, you can learn: -* A simple index.html page; -* A unified main.css file that controls and adjusts the presentation of interface elements -* A set of javascript files that enable dynamic presentation and switching of content through access to the HTML DOM. +如果需要开发出高质量的 APP,需要熟练掌握 HTML/CSS 和 javascript,尤其是 HTML5 / CSS3,掌握 HTML DOM 以及 javascript 的一些常见库,例如 [jQuery](https://jquery.com/),等等。这里有一些免费的入门教程: +* [HTML 系列教程](http://www.w3school.com.cn/h.asp) +* [JavaScript 入门教程](http://www.w3school.com.cn/js/index.asp) +* [JavaScript 高级教程](http://www.w3school.com.cn/js/index_pro.asp) -For you, as a programmer, this is not hard at all. +通过这些教程的学习,你能够做到: +* 一个简单的 index.html 页面; +* 一个统一的 main.css 文件,能够对界面元素的表现加以控制和调整; +* 一组 javascript 文件,能够通过对 HTML DOM 的访问,实现内容的动态展示和切换。 -### Simple APP +对于作为程序员的你,这根本不是什么难的事情。 -Next, we want to turn such a simple web app into a mobile app. To be exact, it should be called Hybrid APP, a hybrid program. Because it's native app, it wraps a webview, which runs the web app we wrote. +### 单机版APP -We need to use a technical framework called Cordova. +下一步,我们要把这样一个简单的网页程序 (web app),变成一个手机上的 APP。准确的说,它应该是叫 Hybrid APP,即混合程序。因为它的外面是 native app 封装了一个 webview,里面运行的是 我们写的 web app。 -Originally a product developed by a small team acquired by Adobe, it was renamed [PhoneGap](http://phonegap.com/). Adobe later turned it open source and donated it to the Apache Foundation, then called [Apache Cordova](https://cordova.apache.org/). +我们需要用到 cordova 技术框架。它原本是 Adobe 公司收购的一个小团队开发的产品,被重新命名为 [PhoneGap](http://phonegap.com/)。后来 Adobe 将其开源,并捐赠给 Apache 基金会,然后被称为 [Apache Cordova](https://cordova.apache.org/),现在已经成为一个非常流行的技术框架,也得到很多商业公司的追捧,除了 Adobe 之外,Intel、微软、IBM 等公司也都推出了支持 Cordova 的产品。 -Now Cordova has become a very popular technical framework, but also sought after by many commercial companies, in addition to Adobe, Intel, Microsoft, IBM and other companies have also introduced support Cordova products. +Cordova 技术框架提供了一个命令行的工具,是用 nodejs 开发的。 -The Cordova technology framework provides a command-line tool developed using nodejs, as well as a variety of plug-ins. - -We first have to install [nodejs](https://nodejs.org/en/), after installation, it will provide two basic commands: +我们首先要装 [nodejs](https://nodejs.org/en/),安装之后,会提供 2 个基本的命令: ```bash $ which node /usr/local/bin/node $ node -v -v4.8.4 +v4.2.1 $ npm -v -2.15.11 +2.14.7 ``` +* node --- 负责 javascript 程序的编译/解释/执行。它是基于谷歌开源的 Chrome V8 引擎的,基于事件驱动、不阻塞 IO模式运行,轻量而高效。 +* npm --- NodeJs Package Manager, 安装包管理器。所有的 nodejs 包都是用 npm 来下载和安装(你也可以用它来发布你自己的包到 npm 库)。 -* node --- the javascript engine, compile / interpret / execute. It is based on Google's open source Chrome V8 engine, event-driven, non-blocking IO mode operation, lightweight and efficient. -* npm --- NodeJs Package Manager, install package manager. All nodejs packages are downloaded and installed using npm (you can also use it to publish your own packages to the npm repository) - -Next, use npm to install [cordova](https://cordova.apache.org/): +接下来,用 npm 安装 [cordova](https://cordova.apache.org/): ```bash $ npm install -g cordova $ which cordova /usr/local/bin/cordova $ cordova -v -7.1.0 +5.4.1 ``` -Create a project with Cordova CLI: +用 cordova 创建一个项目: ```bash -# Syntax:cordova create +# 格式为:cordova create <目录名> $ cordova create temp com.rjfun.demo Demo ``` -Compile and build, then run the app in iOS emulator: +然后编译,并在 iOS 模拟器中运行这个项目: ```bash $ cd temp $ cordova platform add ios @@ -240,20 +238,20 @@ $ cordova build ios $ cordova emulate ios ``` -Now we will see the iOS emulator is started, and APP launched: +于是可以看到 iOS 模拟器被启动,然后 APP 运行: ![Cordova iOS](demo/cordovaios.png) -Or, you can also connect your iPhone device to Mac, the use following command to install and launch the APP: +或者你也可以把 iPhone 用 USB 线连接到 Mac,然后用这个命令安装、启动刚刚编译的 APP: ```bash $ cordova run ios --device ``` -Now the running one is Cordova's Demo project. Open Cordova project, you can see this directory structure: +现在运行的是 Cordova 自带的 Demo 工程。打开 Cordova 项目,可以看到这样的目录结构: ![Cordova Proj](demo/cordovaproj.png) -Next, delete the contents of the www directory, replace with the index.html, main.js, main.css we wrote earlier and make a few changes: +接下来,删去 www 目录下的内容,用我们前面写的 index.html, main.js, main.css 替换,并略作修改: ```html @@ -261,13 +259,13 @@ Next, delete the contents of the www directory, replace with the index.html, mai - + - + Hello @@ -284,11 +282,11 @@ Next, delete the contents of the www directory, replace with the index.html, mai // main.js console.log('hello, world!'); -// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in +// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 document.addEventListener('deviceready', function(){ console.log('deviceready'); - // TODO: Start the business logic of our web app + // TODO: 开始我们 web app 的业务逻辑 }); ``` @@ -311,118 +309,116 @@ h1 { } ``` -Rerun the cordova project (it will compile, install, run automatically): +重新运行 cordova 项目(会自动编译、安装、运行): ```bash $ cordova emulate ios ``` -So, you can see that Web App is running in the iOS simulator: +于是,可以看到 Web App 在 iOS 模拟器中运行了: ![Hello World Cordova](demo/helloworldcordova.png) -To write an easiest APP, in fact, is really simple, isn't it? +做个最简单的APP,其实也很简单,是不是?! -### Add Ad Banner +### 加个广告条 -As a programmer, we have no doubt that you have mastered the HTML / CSS and javascript programming capabilities to provide some interesting and useful features. +作为程序员,我们毫不怀疑,你可以通过掌握的 HTML/CSS 以及 javascript 编程能力,提供一些有趣、有用的功能。 -Next, we want to add monetization to the app, which is to make real money. +接下来,我们要给这个 APP 加上变现(monetization)的功能,即实现赚到真金白银。 -The easiest way to realize is to add an ad banner, such as Google's AdMob. -* By showing ads, users click on interesting ads, browse the product, or install other apps. -* Advertisers / advertisers (advertisers, Advertizer) pay advertising costs to Google. -* Google will pay a portion of it to the person / company (publisher, publisher) who posted the ad. -* Google's role in it is called the Ad Platform, or Ad Network. +变现最简单的方法,就是加上广告条,例如谷歌的AdMob。 +* 通过展示广告,用户对有兴趣的广告点击,浏览产品、或者安装其他的 APP。 +* 投放广告的个人/公司(简称广告主,Advertizer)会支付广告费给谷歌。 +* 而谷歌则会将其中的一部分,支付给发布广告的个人/公司(简称发布商, Publisher)。 +* 谷歌在其中扮演的角色,则称之为广告平台(Ad Platform)、或者广告中介(Ad Network)。 -The technical architecture of the Cordova framework is a web app with some common plug-ins that provide access to specific functions of the handset and integration with third-party systems. +Cordova 框架的技术架构,是 Web APP 加上一些通用的插件,提供手机特定功能的访问、与第三方系统的集成。 -We implemented integration with Google AdMob via the plug-in cordova-plugin-admobpro. This is a plug-in based on the Google AdMob SDK, and is the most popular and easiest to use plug-in for the moment. Through it, just a line of javascript code to complete the SDK API call. +我们通过插件 cordova-plugin-admobpro 来实现与谷歌 AdMob 的集成。这是基于谷歌 AdMob SDK 开发的一个插件,也是目前变现插件中最流行、最容易使用的。通过它,只需一行 javascript 代码就可以完成对 SDK API 的调用。 -Now let's add plugins to the cordova project. +现在让我们往 cordova 项目工程中加入插件。 ```bash $ cordova plugin add cordova-plugin-admobpro ``` -Modify main.js, let's add a few lines into the initialization: +然后修改 main.js,在 APP 初始化完毕时,我们加几行代码。 ```javascript // main.js console.log('hello, world!'); -// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in +// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 document.addEventListener('deviceready', function(){ console.log('deviceready'); - // When the app is initialized, create an ad banner below the screen + // 在 APP 初始化完毕时,在屏幕下方创建一个广告条 if(AdMob) AdMob.createBanner({ - adId: 'ca-app-pub-6869992474017983/4806197152', // need to register as a user on the AdMob website and create an Ad Unit Id - position: AdMob.AD_POSITION.BOTTOM_CENTER, // show at bottom / center - overlap: false, // no overlap the web app content - isTesting: true, // show testing ad, please remove this line when formal release - autoShow: true // auto show it when ad resource downloaded and ready + adId: 'ca-app-pub-6869992474017983/4806197152', // 需要到 AdMob 官方网站注册用户,并创建广告单元 Ad Unit Id + position: AdMob.AD_POSITION.BOTTOM_CENTER, // 展示在屏幕下方中央 + overlap: false, // 不要覆盖 Web APP 的内容 + isTesting: true, // 展示测试广告,在正式发布时,去掉这行 + autoShow: true // 广告资源就绪时,自动开始展示 }); }); ``` -Rerun the cordova project (it will compile, install, run automatically): +重新运行 cordova 项目(会自动编译、安装、运行): ```bash $ cordova emulate ios ``` -So, you can see that Web App is running in the iOS simulator: +于是,可以看到 Web App 在 iOS 模拟器中运行了: ![AdMob Banner](demo/admobbanner.png) -Look, at the bottom of the screen, the banner is displayed. +看,屏幕下方的广告条展示出来了。 -This is just a test advertisement for debugging purposes only. +这里只是仅供调试用的测试广告。我们需要到 [AdMob官方网站](https://apps.admob.com/)注册用户,并创建广告单元(Ad Unit Id),并用来替换掉 代码中 adId 后面的这串数字。并在发布的正式版本中,去掉 `isTesting:true` 这行代码。 -We need to register the user on [AdMob official website] (https://apps.admob.com/) and create an Ad Unit Id that replaces the string of digits following adId in the code. And in the official version of the release, remove the `isTesting: true` line of code. +### 注册广告账号 -### Register Ad Account +下面我们就介绍,如何注册账号,如何创建广告单元,如何设置银行收款信息。 -Here we introduce, how to register account, how to create ad unit, how to set bank receipt information. +由于价值观方面的原因,谷歌的网站基本上都是被隔离在中国大陆局域网之外,通常是无法访问的。需要通过 VPN 等科学上网的方式才能够访问。如果你不知道如何科学上网,可以写邮件给我,单独讨论这个问题,这里暂不展开。 -Visit Google's AdMob website (https://www.google.com/admob/) to sign up for a new account. +访问谷歌AdMob官网( https://www.google.com/admob/ ),注册新账号。 ![AdMob Site](demo/admobsite.png) -After registering, visit the AdMob website (https://apps.admob.com/), click on the menu "monetization", click on the red button in the upper left corner "+ monetize new application" to add a new APP: +注册完成之后,登陆 AdMob 网站( https://apps.admob.com/ ),点击菜单“获利”,点击左上角的红色按钮“+通过新应用获利” 添加新APP: ![AdMob New App](demo/admobnewapp.png) -Then create banner ads: +然后创建横幅广告: ![AdMob New Banner](demo/admobnewbanner.png) -You can get the ad unit ID, copy it to the source code: +即可获得广告单元 ID,将其 copy 到源代码中: ![AdMob Ad Unit ID](demo/admobadunitid.png) -### Set Payment Info +### 验证地址和设置收款信息 -After registering your account, you can accumulate ad revenue by putting the ad unit into the APP for user actual usage. +注册账号之后,广告单元进入APP投放实际使用,即可积累广告收益。 -There are two more steps to complete the Google advertising payment you receive: -* Verify address. Google will generate a PIN code printed on the card, send to your mailing address. -* Set up payment information. Can be Western Union or bank account. +要收到谷歌支付的广告分成,还有 2 个步骤要完成: +* 验证地址。谷歌会生成一个 PIN 码,打印在卡片上,邮寄到你的通信地址。 +* 设置收款信息。可以是 西联汇款 或者 银行账号。 -However, newly registered account has no access to set bank information. Only your cumulative advertising revenue reached the basic threshold (currently 10 US dollars), Google will allow you to set up payment information. Through this method, Google can filter out a large number of non-active accounts. +不过,刚注册的账号还不允许设置这个信息。只有你的累计广告收入达到基本的门槛(目前是 10美金),谷歌才会允许进入设置支付信息的环节。谷歌通过这个方法,可以过滤掉大量的无效账号。 -#### Verify PIN Code +#### 验证 PIN 码: ![Verify PIN](demo/verifypin.png) -Click "Fix It", enter PIN input UI. +点击“立即改正此问题”,进入 PIN 码输入界面。 ![Verify PIN](demo/verifypin2.png) -This process of verifying your PIN is slow and typically takes 2-4 weeks. - -So, if the date of the most recent PIN was displayed, wait patiently. After receiving the PIN code, it will be entered in the box above, submitted for verification. +验证 PIN 码这个过程比较缓慢,通常需要 2-4 周的时间。所以如果显示了最近生成 PIN 码的日期,就耐心等待吧。收到 PIN 码之后,就将其输入上面这个框,提交验证。 -#### Set Payment Info +#### 设置收款信息: ![AdMob Payment](demo/admobpay1.png) @@ -430,172 +426,168 @@ So, if the date of the most recent PIN was displayed, wait patiently. After rece ![AdMob Payment](demo/admobpay3.png) -After the two steps are set up, when the advertising revenue, Google will calculate the advertising revenue of the month at the end of each month, and pay you around the 20th of next month. +等这 2 个步骤设置完成,当产生广告收益的时候,谷歌就会在每个月的月末,计算当月的广告收益,然后在下个月的 20日左右支付给你。 -### Publish APP +### 发布APP -The APP we developed, to be installed by user and generate revenue, needs an important part: released to the app store. -* If Android APP, usually Google Play Store. -* If iOS APP, released to Apple AppStore. +我们完成的 APP,要被用户安装使用并产生收益,还缺少一个重要的环节:发布 到应用商店。 +* 如果是 Android APP,通常是 Google Play Store。中国大陆用户通常访问不到,则可以选择发布到大陆的一些应用商店,例如 360、豌豆荚 等等。 +* 如果是 iOS APP,则是发布到苹果 AppStore。 -Here we use the Apple AppStore as an example, to illustrate how to register a developer account and publish an app. +这里我们以苹果 AppStore 为例,来说明如何注册开发者账号,并发布 APP。 -Visit the Apple Developers Web site (https://developer.apple.com/) and sign up for login. To release an app on the Apple AppStore, you pay an annual fee of $ 99 a year, which is the same for individual developers and corporate developers. +访问苹果开发者网站( https://developer.apple.com/ ),并注册登录。要在 苹果AppStore发布应用,需要支付每年 99 美金的年费,对于个人开发者、公司开发者,这个费用都是一样的。 ![Apple Developer](demo/appledev.png) -The following steps are needed to publish APP to the AppStore: -* Generate developer digital certificate for installation package signature. -* Create an APP ID for your APP, or use "*" or "com.rjfun. *" As a generic APP ID for more than one app, if no in-app purchase. -* Generate Provisioning Profiles for your APP, download it locally, open it in Xcode, and manage it. +注册成功的开发者,需要下面几个步骤,才能将 APP 发布到 AppStore: +* 生成开发者数字证书,用于安装包的签名。 +* 为你的 APP 创建 APP ID,如果不涉及内购,也可以用 “*” 或者 “com.rjfun.*” 作为一个通用的 APP ID,在多个 APP 中使用。 +* 为你的 APP 生成 Provisioning Profiles,并下载到 本地用 Xcode 打开、管理。 -Then use Xcode to open the XXX.xcodeproj project file in the Cordova project, compile and archive (Archive). Successfully archived APP packages can be submitted to AppStore for review. +然后用 Xcode 打开 Cordova 项目里的 XXX.xcodeproj 工程文件,编译并存档(Archive)。成功存档的 APP 包,才能提交到 AppStore 进行审核。 -You need to log into iTunesConnect (https://itunesconnect.apple.com/), to prepare, publish and manage your APP. +APP 提交前,需要到 iTunesConnect ( https://itunesconnect.apple.com/ ),准备、发布和管理你的 APP。 ![iTunes Connect](demo/itunesconnect.png) -Create a new APP, add the name, introduction, icon, pricing and other information, and set it as ready to submit the status, and then you can Organizer Xcode in the successful archive (Archive) installation package submitted to the AppStore for review . +创建新的 APP,加上名字、介绍、图标、定价等信息,并将其设置为准备提交的状态,然后就可以通过 Xcode 中的 Organizer 将成功存档(Archive)的安装包提交到 AppStore 进行审核了。 ![Xcode Organizer](demo/xcodeorganizer.png) -Usually it will take Apple 2 or 3 days to review your app. If the review passes, you can see your app in the AppStore. +苹果审核 APP 的流程大约 1 周左右的时间。如果审核通过,就可以在 AppStore 里面看到你发布的 APP 了。 -### Calculate Ad Revenue +### 广告收益的计算 -When a user downloads, installs and runs an app on his device, he or she requests the official ad content from Google's ad server for display. +当用户在设备中下载、安装APP并运行的时候,就会从谷歌的广告服务器请求正式的广告内容,并用于展示了。 -You can visit the Google AdMob website to see daily ad impressions, clickthrough rates, and revenue. This site also offers very powerful reporting capabilities that show very detailed reports based on country, ad unit, time period. Google has an AdSense app on the AppStore, and you can install this app on your phone to see your AdMob earnings daily. +你可以登陆谷歌 AdMob 网站,查看每天的广告展示量、点击率、以及产生的收益。这个网站也提供了非常强大的报表功能,可以根据国家、广告单元、时间段,显示非常详细的报告。谷歌在 AppStore 上发布有一个 AdSense 的 APP,你可以安装这个 APP,每天查看你的 AdMob 收益。 -Each time a user clicks on an ad of interest, it generates advertising revenue. Most of your ad serving is calculated based on the number of clicks, the so-called CPC ads. +每次用户对感兴趣的广告进行点击,就会产生广告收益。大部分的广告投放,是按照点击次数计算费用的,即所谓的 CPC 广告。 -In calculating advertising revenue, there are several common basic terms: -* CPC (Cost Per Click, cost-per-click) is about US $ 0.06 ~ 1.0; -* CTR (Click Through Rate, show CTR), the result of a large number of statistics is about 1%; -* CPM (Cost Per Mile, CPM), CPM can also be calculated by CPC and CPR, the approximate range is US $ 0.5 ~ 20. +在计算广告收益的时候,有几个常见的基本术语: +* CPC(Cost Per Click,每次点击费用),大约是 US$ 0.06 ~ 1.0; +* CTR(Click Through Rate,展示点击率),大量统计的结果大约是 1%; +* CPM (Cost Per Mile, 每千次展示费用),通过 CPC 和 CPR 也能够推算出 CPM,大致范围是 US$ 0.5 ~ 5。 -The price per click varies based on the type of ad, the price that is served, and so on. Since different countries in the world have different economic levels, there are also big differences. +每次点击的价格,根据广告投放的价格不同而不同。全球不同国家由于经济水平不同,也存在很大的差异。例如, +* 在美国,一次广告点击可能产生 0.2 美元的收益; +* 在巴西,也许只有 2 美分,相差 10 倍。 +* 而日本,广告点击的收益是相当高的。 -E.g, -* In the United States, an ad click may yield a gain of $0.2; -* In Brazil, maybe only 2 cents, a difference of 10 times. -* In Japan, clicks on advertising revenue is quite high. +下面是一组数据的对比: -The following is a comparison of a set of data: - -USA | Brazil +美国 | 巴西 ---|--- ![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) -Japan | Germany +日本 | 德国 ![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) -If we conservatively estimate $1 CPM (cost per thousand impressions), 100,000 ads per day will generate about $100 in cash. Then it will generate $3,000 in a month (including weekends and holidays!). +如果我们按照 CPM (每千次展示费用)1美元 来估算,每天 10万次广告展示,大约可以产生 $100美元现金收益。按照 6.45 的汇率计算,一个月30天(包括周末和节假日!),大约可以产生的收益是 ¥19,350。 -Let's compare it with the average programmer's salary. In Shanghai, an experienced programmer with 5 year experience, the salary is about $2,300 or so. If you make such the APP, with 10,000 DAU (daily active user), the revenue generated from advertising can exceed the salaries of a programmer. Or even more, if optimized very well. +而在上海,5年经验的、技术能力还不错的程序员,薪资大约也就 15,000 左右。如果你做的 APP,每天能够有 1万个用户使用,基本上产生的广告收益和现金流,就可以达到一个程序员的工资水平。 -I know a Brazilian, develop his game with HTML5 technology, simple, but very interesting. Daily active users is about 100,000, advertising revenue has more than $25,000 per month, so as to achieve the financial freedom. +我认识一个巴西人,他用 HTML5 技术实现的小游戏,简单,但是非常有趣。每天的活跃用户大约是 10万,广告收益已经超过每个月 15万,从而实现了财务自由。 -### Advanced +### 进阶篇 -### Demand is fundamental +### 需求是根本 -Earlier we described how to add monetization to APP. But to really get a decent return, you still have to get enough users. In other words, you have to develop enough good APP, can really solve the user's problem, will have more users, more frequent use. +前面我们介绍了如何为 APP 增加了变现(monetization)的能力。但要真正获得可观的收益,还必须得有足够多的用户。也就是说,你必须开发出足够好的 APP,能够真正解决用户的问题,才会有更多的用户使用、更高频度的使用。 -How to develop a more popular APP? In fact, this is not a programming problem. +如何能够开发出更受用户欢迎的 APP 呢?其实这不是一个编程问题。 -Perhaps you are a technical expert, using the most difficult, coolest technology, but the software products developed, may not be welcomed by users of the product. Sometimes, you use a technology that is actually relatively simple, but really pay attention to the user's pain points, to solve the user's concerns, it is possible your product will be welcomed by users, because of good reputation in the social network to get the natural spread. +也许你是一个技术的大牛,但是最艰深、最牛X的技术,开发出来的软件产品未必是受到用户欢迎的产品。有时候,你用了一种其实比较简单的技术,但是真正关注了用户的痛点,解决了用户关心的问题,很可能你的产品就会受到用户的欢迎,创造出口口相传的良好口碑,在社交网络得到自然传播。 -I recommend a book, "Demand - the Fundamentals of Creating Great Business Legends," by Adrian Silesivski. +我推荐一本书,《需求-缔造伟大商业传奇的根本力量》,作者是亚德里安•斯莱沃斯基。 -Here are some tips from entrepreneurs: +以下是某些创业成功者的推荐: -> This is a good book worth every entrepreneur and every manager of the company to read, and even everyone in the organization should understand the concepts. The book gives some models for creating needs, which are very valuable to readers, we need good ideas, but we need more ways to practice ideas. These two books are done, very worth reading, especially recommended. -- Sun Taoran, founder, chairman and president of La Cara Pay Ltd., author of "Entrepreneurship 36 Military Regulations". +> 这是一本好书,每个创业者和每个公司管理者都值得一看,甚至公司中的每个人都应该了解和体会其中的概念。书中给出了一些创造需求的模式,这对读者是非常有价值的,我们需要好的理念,但我们更需要可以践行理念的方法。这两点本书都做到了,非常值得一读,特荐之。 +——孙陶然 ,拉卡拉支付有限公司创始人、董事长兼总裁,《创业36条军规》作者 -> Behind every complaint is hidden an unmet need, and behind every need inevitably hides a market that can not be ignored. In fact, any product that meets the functional needs of the user from the outset should be upgraded to the spirit level, the user refuses to trouble, the user needs comfort, it does not seem to have anything to do with the profit, but I'm sorry, it is related to your market. You do not meet, entrepreneurs will go to their own ground-breaking satisfaction. Then waiting for you, or will be a huge crisis of life and death. Therefore, please pay attention to the hope of trouble, rather than to their complaint. This is exactly the most valuable thing that "demand" brings to us. -- Du Zijian, founder of Huayi Media, social media marketing researcher, bestseller "Boundless" author. +> 每一个抱怨的背后都隐藏着一个未被满足的需求,而每一个需求的背后必然隐藏着一个不可忽视的市场。其实任何产品,在一开始满足了用户的功能性需求以后,就应该着手升级到精神层面,用户拒绝麻烦,用户需要安慰,这看起来跟利润无关,但是对不起,它跟你的市场有关。你不去满足,创业者就会自己去进行开拓性满足。那么等待你的,或将是个生死存亡的巨大危机。因此,请一定重视麻烦所带来的希望,而不是去抵触他们的抱怨。这正是《需求》给我们带来的最有价值的东西。 +——杜子建,华艺传媒创始人,社会化媒体营销研究者,畅销书《微力无边》作者 -### User Experience +### 用户体验 -Although the sale of Apple mobile phone is very expensive, but still very popular, why? It is undoubtedly the best user experience to win. If you read "Steve Jobs Biography", you can know that the birth of Apple's mobile phone, in fact, is to solve the pain of traditional phones difficult to use. +为什么苹果手机卖得贵,依然热卖?无疑它是以优秀的用户体验取胜的。如果你看过《乔布斯传》,你可以知道,苹果手机的诞生,其实是解决了传统手机难于使用的痛点。 -Naturally, the app or game we develop on our mobile phone must also be highly user-focused and put it in a strategic position. Mobile APP, not the pursuit of powerful features, complete, you can only do a small feature, but to effectively focus on the needs of users, and provide excellent user experience. +自然我们在手机上开发的 APP 或者 游戏,也必须要高度关注用户体验,并且把它放到战略重点的位置上来。手机 APP,不追求功能的强大、齐全,可以只做一个小小的功能,但是要切实关注用户的需求点、并提供优秀的用户体验。 -A rather typical example is this "Flashlight" APP, which is to turn on the phone's LED bulb to temporarily light up the darkness. +一个相当典型的例子是这款《手电筒》APP,就是打开手机的 LED灯泡,用来临时照亮黑暗。 ![Torch APP](demo/torchapp.png) -This APP has more than hundreds of millions of users, of course, its economic return is also extremely impressive. +这款 APP 的用户已经超过好几亿,自然收益也是极其可观。 -The number of user comments exceeded 6 million and the users wrote: -* Jennifer Baylis: easy to use. # 1 The best Flashlight APP! Very easy to use, open very fast! -* Kitty Davis: I just need such a flashlight APP. -Dennis Castello: It's exactly what it takes and it's done really well. -* Joseph Low: easy to use. Let it work easily! highly recommended! +评价的数量超过600万人次,它的用户是这样写的: +* Jennifer Baylis: 易于使用。#1 最棒的手电筒APP!非常容易使用,打开很快! +* Kitty Davis: 我正是需要这样一个手电筒 APP。 +* Dennis Castello: 它正是做到了需要它做的事,而且做的真的很好。 +* Joseph Low: 易于使用。轻松地让它干活!强烈推荐! -### What Ad is Best +### 哪种广告最适合 -In the mobile advertising arena, there are many forms of advertising, and are also constantly evolving. -* banner Ad -* interstitial Ad -* native Ad -* reward video Ad -* IAP (in-app purchase) Ad +在移动广告领域,存在多种形式的广告,并且也在不断的发展。 +* banner Ad,横幅广告 +* interstitial Ad,插屏广告 +* native Ad,原生广告 +* reward video Ad,奖励视频广告 +* IAP (in-app purchase) Ad,内购广告 -Which ad is best for your app, depending on the situation. This requires a good balance of user experience and revenue. If the ad is displayed improperly, or show too often, affecting the user experience or even cause the user offensive, it is the cart before the horse. +哪种广告适合你的 APP,需要很好的权衡用户体验和收益之间的关系。如果广告展示不当,或者展示过于频繁,影响了用户体验甚至招致用户反感,就本末倒置了。 -banner Ad | interstitial Ad +横幅广告 | 插屏广告 ---|--- ![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) -These two kinds of advertisements are the most basic and classic, each has its pros an cons. Banner ads occupy only a small space at the bottom of the screen, changing the ad content every 60 seconds. The advantage is not too affect the user interface and experience, the disadvantage is because less obtrusive, not easy to arouse the user's attention and clicks. - -Interstitial ad is full-screen, pop-up at a specific time, more able to attract the user's attention and click. Because of this, the interstitial ad has better effects and click revenue is higher than the banner ads more than 5 times, so more recommended. +这两种广告是最为基本和经典的,各有千秋。相对来说,横幅广告只占用屏幕下方的一小片空间,可以一直滚动展示,默认的是每 60 秒更换一次广告内容。优点是不太会影响用户界面和体验,缺点则是因为不太起眼,不容易引起用户的注意和点击。 -When using interstitial ad, please pay special attention to the pop-up time, do not interrupt the user's continuous operation and gaming experience, otherwise it will cause the user's strong aversion. Best practice is to put it in transition between the two stages, such as the game is just over, pop-up screen ads, and then continue to the next level. +插屏广告则是全屏的,在特定的时间弹出,更能够吸引用户的眼球和点击。也正是因为这个原因,插屏广告的点击收益比横幅广告要高 5 倍以上,比较推荐使用。 -Using cordova-plugin-admobpro to display interstitial ads is also straightforward, requiring just two lines of javascript to complete. One line of code prepares inventory and the other line of code shows ads. +使用插屏广告的时候,要特别注意弹出的时间,千万不要打断用户的连续操作和游戏体验,否则不仅不会引起用户的点击,还会引起用户的反感。最佳做法是将其放在 2个阶段之间的过渡时机,例如游戏的一关刚刚结束,弹出插屏广告,然后再继续下一关。 -Here is the example: +通过插件 cordova-plugin-admobpro,要展示插屏广告也是非常简单的,只需要 2 行 javascript 代码就可以完成了。其中一行代码负责准备广告资源,另一行代码负责展示。示范代码如下: ```javascript -// When the game starts, it starts to prepare for interstitial ads, and the background thread downloads the inventory +// 在游戏启动时或者进行中,开始准备插屏广告,通过后台线程下载广告资源 if(AdMob) AdMob.prepareInterstitial({ adId: "__ad_unit_id_here__", autoShow: false }); -// At the end of the game level, call API to display the interstitial ad +// 在游戏关卡结束时,调用 API 进行插屏广告的展示 if(AdMob) AdMob.showInterstitial(); ``` -The above two kinds of advertisements are the easiest to use forms of advertisement, and the work integrated into the APP is also the easiest. +以上这 2 种广告,是最容易使用的广告形式,集成到 APP 中的工作也最为容易。 -Native Ad is a new way to show your ads in a more harmonious way between their own content. It does not seem obtrusive or abrupt. It's the type of advertising that has the least impact on user experience. Facebook AudienceNetwork and Flurry launched native ads long before, and later Google AdMob also introduced it to developers. +原生广告(native Ad),就是将广告内容以较为和谐的方式,展示在APP自身的内容之间,不会显得过于突兀和突然,这是对用户体验影响最小的一种广告形式。 Facebook AudienceNetwork 和 Flurry 比较早就推出了原生广告,不过谷歌 AdMob 对此持谨慎态度,仅仅在部分开发者中进行 beta 试用。 -Reward video Ad, a new ad in the mobile advertising industry. It encourages users to watch ad videos and reward them with some kind of virtual item in the game or app. In previous advertising campaigns, Google did not support giving users encouragement, and even made it illegal to give rewards. Because this is likely to violate the user's own interest, resulting in false invalid clicks. For the new rewarded video ad, other advertisers first introduced and succeeded in the market, Google adopted a relatively flexible and pragmatic attitude. However, advertising video sources are not very rich, many are mediation way from other ad networks. +奖励视频广告(reward video Ad),是谷歌新推出的一种广告。就是鼓励用户看完广告视频,然后开发者在游戏中或者 APP 中给予某种虚拟物品的奖励。在以前的广告推广中,谷歌并不支持在用户接受广告方面给予鼓励的行为,甚至将对点击广告给予奖励的做法定为违规的行为。因为这很可能违背用户本身的兴趣、造成虚假无效点击。新的奖励视频广告方面,谷歌采取了相对灵活和务实的态度。不过这方面的广告视频来源,基本上都是通过广告中介的方式来自于其他的广告网络。 -IAP Ad is an innovative form of advertising. IAP Ad allows users to shop directly in-app. Because it needs to be integrated with the payment system or the Google Play Store, it's only supported on the Android system. With in-app advertising, app developers can benefit from: -* Maximize your revenue and user lifecycle value by implementing ad serving and in-app purchases in the same app. -* Google automatically helps you determine which users are likely to purchase in-app purchases and show ordinary paid ads to the remaining users. -* No need to develop your own in-app support system or add in-app support code to your app. -* Easily target various segments of the user community with different in-app purchases. By using In-App Ads with the AdMob Audience Builder, you can serve high-priced, in-app products to high-spending groups while showing them to you at lower prices. +内购广告(IAP House Ad)是一种新颖、创新的广告形式,应用内购买广告可让用户直接在应用内购物。因为需要和支付系统、或者谷歌Play Store结合起来,所以仅在 Android 系统支持。通过内购广告,应用开发商可在以下方面获益: +* 通过在同一款应用中实施广告投放和应用内购,可以最大程度地增加您的收入和用户的生命周期价值。 +* Google 会自动帮助您确定哪些用户有可能购买应用内购商品,并向其余用户展示普通的付费广告。 +* 不需要开发自己的应用内购支持系统,也不需要在应用中加入应用内购支持代码。 +* 利用不同的自家内购广告,可以轻松定位用户群体中的各种细分受众群。通过将应用内购广告与 AdMob 受众群体构建工具结合使用,可以向高消费群体投放价格高的应用内购商品,而向其他用户展示价格低的商品。 -If you want to learn more about native ads, rewarded video ad, buy ads, go to Google [AdMob official documentation website](https://developers.google.com/mobile-ads-sdk/) for in-depth research and study how to use. +如果要尝试原生广告、奖励视频广告、内购广告,请移步 Google [AdMob 官方文档网站](https://developers.google.com/mobile-ads-sdk/),进行深入研究,学习如何使用。 -### Which Ad Most Reliable +### 哪家广告商最靠谱 -Because of the profitable mobile advertising sector, the mobile advertising industry is also growing very fast. Over the past few years, there have been many mergers and acquisitions. For example, Google has successively acquired DoubleClick and AdMob, Flurry acquired by Yahoo!, MobFox acquired by Matomy, and Millennial Media acquired by AOL. +因为移动广告领域的利润可观,移动广告平台的发展也是非常快的。过去的这些年,也发生了不少并购案。例如 Google先后收购了 DoubleClick 和 AdMob,Flurry 被 Yahoo! 收购,MobFox 被 Matomy 收购,Millennial Media 被 AOL 收购。 ![Top Ad Networks](demo/topadnetworks.jpg) -Usually the ad platform will provide: -* SDK, providing API for accessing advertising system; -* Register, login and manage advertising system; -* Integration Guide, examples, FAQ; +通常广告平台会提供: +* 接入广告系统的 SDK; +* 注册、登录和管理广告的系统; +* 接入指南、例程、FAQ; -Information about the various mobile ad platforms can be found through search or through a number of different sources (eg, StackOverflow.com) and try selectively. +各种移动广告平台的相关介绍,可以通过搜索活着其他不同的渠道去了解(例如 StackOverflow.com),并可以有选择性的进行尝试。 -Here are some of the advertising platforms I've tried: +以下是我试用过的一些广告平台: * Google AdMob * Facebook AudienceNetwork * Yahoo! Flurry @@ -608,78 +600,76 @@ Here are some of the advertising platforms I've tried: * Smart AdServer * ... ... -By trying to use, I am more satisfied with AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox. Especially AdMob, is highly recommended. +使用下来比较满意的有 AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox。尤其是 AdMob,非常值得推荐。 -The reason why AdMob is the most highly recommended, there are some prominent advantages: -* Ad fill rate is high. Basically more than 98%, some countries slightly less than 90%, so you can take full advantage of user traffic. After all, it is no surprise that advertising is a major source of revenue and revenue for Google, with advertisers around the world. -* Payment promptly. The monthly earnings are settled at the end of the month and paid on the 20th of the following month; -* SDK is very stable. Integrated documentation and reference code Easy to use, with documentation and system interfaces in different languages; -* Reporting system powerful and easy to use. Data can be analyzed in different dimensions; -* Easy to use. A dedicated APP can be used to track earnings; -* Support in place. A dedicated technical support staff, technical forums with official support, dedicated to answer the technical aspects of SDK access; -* Regularly organize some preaching and training activities, as well as regular online video lectures; -* Customer service is in place. Very patient and friendly, I keep in touch with them. +AdMob之所以最值得强烈推荐,主要有这样一些突出的优点: +* 广告填充率高(基本上在 98% 以上,有个别国家略低于90%),因此可以充分利用用户流量。毕竟广告是谷歌公司的主要业务和利润来源,其广告客户遍及全球,这也不足为怪了; +* 付款及时,每个月的月底结算,次月 20日支付; +* SDK 非常稳定,接入文档以及参考代码易于使用,并且有不同语言的文档和系统界面; +* 报表系统功能强大、易于使用,可以通过不同的维度进行数据分析; +* 有专门的 APP 可以用来跟踪收益; +* 有专门的技术支持人员,有官方支持的技术论坛,专门解答 SDK 接入方面的技术问题; +* 定期会组织一些宣讲、培训活动,也定期有线上视频讲座; +* 客户服务非常到位,非常的耐心和友善,我和他们也基本上一直保持联系。 -Because of Google's excellence in innovation and consistent quality service, it has very high reputation among develoeprs. +由于谷歌在各个领域的卓越创新、一贯的优质服务,在开发者中有良好的口碑。 -The cordova-plugin-admobpro plug-in, built on the AdMob SDK, not only encapsulates Objective-C / Java / C # native APIs into a unified javascript API but is also much easier to use. Just 1-2 lines of code to complete the ad display. Popular in Cordova's global community, this plug-in is the most-used monetization plug-in. The following is a plug-in download trend curve: +而基于 AdMob SDK 开发的 cordova-plugin-admobpro 这款插件,不仅把 Objective-C / Java / C# 的原生 API 封装为统一的 javascript API,而且更加简单易用,只需 1-2 行代码即可完成广告展示。这款插件在 Cordova 全球社区也广受欢迎,是使用率最高的变现插件。以下是插件的下载趋势曲线图: ![AdMob Download Trend](demo/admobprodltrend.png) -Facebook AudienceNetwork is not bad. - -Facebook is not only the largest and most active social media, but also offers a variety of related SDKs, including AudienceNetwork for Advertising. Its developer website is https://developers.facebook.com/docs/audience-network. -* Facebook's Fill Rate is not as high as AdMob, about 45-75%. -* Facebook payment is also timely, but also in the 21st of each month to pay last month's advertising revenue; -Facebook's SDK updates are very frequent. A new version will be released in about two weeks, so if there are any bugs, the fix is fast. However, the update frequency is a bit high, sometimes feeling a little behind. Relatively speaking, Google AdMob SDK more stable; -* Management interface and reporting system is also relatively clear and easy to use. The reporting system is not as strong and flexible as Google Admob, seemingly only English interface, it looks like the following. +Facebook 的 AudienceNetwork 也挺不错。Facebook 不仅仅是最大、最活跃的社交媒体,也提供各种相关 SDK,包括广告用的 AudienceNetwork。其开发者网站为:https://developers.facebook.com/docs/audience-network 。 +* Facebook 的 广告填充率(Fill Rate)没有 AdMOb 那么高,大约在45~75% 之间。 +* Facebook 付款也很及时,也是在每个月的 21日左右支付上个月的广告收益; +* Facebook 的 SDK 更新非常频繁,大约 2 周左右就会发布一个新的版本,因此如果有什么 bug 修复也很快。不过更新的频度实在有点高,有时候有点跟不上的感觉。相对来说,谷歌 AdMob 的 SDK 更加稳定一些; +* 管理界面和报表系统也比较清楚易用,一目了然。报表系统没有 AdMob 的那么强大和灵活,貌似仅有英文界面,看上去是下面这样的。 ![Facebook AudienceNetwork](demo/fbaudnet.png) -Flurry is a mobile advertising company that has been acquired by Yahoo, the official site is http://www.flurry.com/. There are 2 main products, one is Flurry Anlytics and one is Flurry Ads. -* Flurry SDK integration is still relatively easy, the reporting system quite satisfactory. Site visit is a bit slow, more time-consuming. -* Payments are slightly slower and are not paid until 60 days after the advertising revenue. -* It is worth mentioning that, Flurry is a relatively early support Native ads (Native Ad). +Flurry 是一家被 Yahoo!收购的移动广告公司,其官方网站是 http://www.flurry.com/ 。其主要的产品有 2 个,一个是数据分析(Flurry Anlytics),一个是广告系统(Flurry Ads)。 +* Flurry SDK 接入也还算比较容易,报表系统中规中矩。就是网站访问稍微有点慢,比较花时间。 +* 付款略慢,在广告收益产生的 60天之后才付款。 +* 值得一提的是,Flurry 是比较早支持原生广告的(Native Ad)的。 -MobFox is a European mobile advertising company headquartered in Austria. I used to contact its CEO, he wants me to develop plug-ins for them. Later, because of the acquisition, then later, we knew that MobFox was acquired by Matomy. This company is still good, payment is more timely. Although known as Europe's largest mobile advertising company, and the world is located in the Top 10, but compared with giants such as Google, Facebook, the global influence is really a bit weak. +MobFox 是一家欧洲的移动广告公司,总部位于奥地利。曾经它的 CEO 联系过我,希望能够就某项产品达成合作。后来因为收购事宜暂停,再后来,再后来就知道 MobFox 被 Matomy 收购,项目合作的事情就没有下文了。这家公司还是不错,付款也比较及时。虽然号称是欧洲最大的移动广告公司,并且全球位于 Top 10,但和 Google、Facebook 这样的巨头比起来,在全球范围内的影响力实在有点弱。 -Apple's iAd just launches on iOS. As the iPhone's market positioning and pricing significantly higher than the Android system, it also determines the iOS users have a strong purchasing power, so iAd ad click returns relatively high, it goes without saying. However, if you develop an app that needs to run on iOS and Android at the same time, managing it with AdMob is a bit easier. You can also use AdMob's mediation feature to show some of your traffic through iAd, maximizing the benefits of advertising. Later, Apple adjusted the advertising business and stopped iAd service. +Apple 的 iAd,只是在 iOS 系统上进行投放。由于 iPhone 的市场定位和定价明显要高于 Android 系统,也就决定了 iOS 用户有较强的购买力,所以 iAd 广告的点击回报比较高,也就不言而喻了。不过如果你开发的 APP 需要同时投放 iOS 和 Android 系统,用 AdMob 管理起来相对容易一点。也可以通过 AdMob 的广告中介(mediation)功能,把部分流量通过 iAd 进行展示,从而使得广告收益的利益最大化。 -Like OpenX and Smart AdServer, open only to European and American business customers, not for global users and individual developers. Formerly, customers in the United States and Europe saw my open source project on GitHub, specifically looking for me to customize the adware plug-in. Through project cooperation, I was able to understand and become familiar with it. However, because it is not for global developers, it is not recommended. +像 OpenX 和 Smart AdServer 仅对欧美的签约客户开放,并不针对全球用户和开发者。只是曾经有美国和欧洲的客户在 GitHub 上看到我的开源项目,特意找到我要求我定制产品,通过项目合作的方式,我才得以了解和熟悉。不过因为不对全球开发者,所以也无法推荐使用。 -As for MoPub, its SDK is open source on GitHub, and it's something different. Its documentation and SDK was not very mature. For some time, you have to compile these SDKs from source code into a jar and framework before using them in your projects, which is really inconvenient. Recently, they have supported their SDK to be loaded into your project with gradle and cocoapods, a lot easier than before. +至于 MoPub,它的 SDK 的是在 GitHub 上开源的,这是它与众不同的地方。不过也正是因为这一点,其文档和 SDK 接入就要稍微麻烦一些。必须要把这些 SDK 从源代码编译成 jar 和 framework,然后才能在自己的项目中使用。 -Millennial Media (abbreviated mMeida), its SDK Demo aesthetics done well, but customer service and technical support response is really flattered. Have encountered technical problems, submit a question through the Web Form, has not been answered, so I am not happy to use it. I heard later they were acquired by AOL. +Millennial Media(简写为 mMeida),其 SDK Demo 的美观度做得不错,不过客服和技术支持的响应实在不敢恭维。曾经碰到过技术问题,通过 Web Form 提交了问题,一直没有得到过答复,所以我后来也就懒得用它了。 -In addition, such as Charboost, TapJoy advertising platform, also more or less seen. However, each person's energy is limited, so did not try them one by one. Charboost, an advertising startup that started up in 2011, focuses exclusively on mobile games and was named Top 10 mobile advertising company by the VentureBeat Index in 2014. Advertised by Chartboost, click revenue is relatively good, but conversely, that is, advertising, access to the user's cost is relatively high. Some of my friends I know are specialized in heavy games, devoted to overseas markets and used more ads on Facebook and Chartboost. +另外像 Charboost、TapJoy 等等广告平台,也或多或少的接触过。不过精力有限,没有逐一进行具体的试用。Charboost 是 2011 年才创业的广告公司,只专注在移动游戏领域,2014年被 VentureBeat 指数报告定为 Top 10 的移动广告公司。通过 Chartboost 发布的广告,点击收益比较不错,不过反过来说,也就是广告投放、获取用户的成本是比较高的。我所认识的专门做重度游戏、专门投放海外市场的朋友,通过 Facebook 和 Chartboost 投放广告用得比较多。 -These mobile advertising platform described above is entirely personal experience and subjective experience. If you are interested, ou can try more by your own. +上面介绍了不少移动广告平台,完全是个人经验和主观体会,有兴趣的可以自行尝试。 -### Promote Your App +### 营销你的产品 -(To be continued) +(待续) -### Online APP +### 联网版APP -### Cloud Seervice +### 云服务 -### Expert Topics +### 高级篇 -### User Data Analysis +### 用户数据分析 -### Ad Optimization +### 广告优化 -### In-App Purchase +### 支付与内购 -### Social Marketing +### 社交营销 -### Cast Advertising +### 广告投放 -### Appendix +### 附录 -#### Popular Mobile Marketing Terms +#### 互联网营销常用术语 -Part1 Basic Terms +Part1 最基本的名词 ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) diff --git a/README.zh.md b/README.zh.md deleted file mode 100644 index 38c07bb..0000000 --- a/README.zh.md +++ /dev/null @@ -1,914 +0,0 @@ -### 从编码到变现:程序员财务自由之路 - -From Coding to Monetization:Programmer's Financial Freedom Approach - -[英文版本 / English Version](./README.md) - -从屌丝程序猿 | 到财务自由 ----|--- -![屌丝程序猿](demo/poor-programmer.jpg) | ![大富豪](demo/richman.jpg) - -### 目录 - -* [前言](#前言) -* [定位](#定位) -* [基础篇](#基础篇) - * [语言与工具选择](#语言与工具选择) - * [Hello, World!](#hello-world) - * [单机版APP](#单机版APP) - * [加个广告条](#加个广告条) - * [注册广告账号](#注册广告账号) - * [验证地址和设置收款信息](#验证地址和设置收款信息) - * [发布APP](#发布APP) - * [广告收益的计算](#广告收益的计算) -* [进阶篇](#进阶篇) - * [需求是根本](#需求是根本) - * [用户体验](#用户体验) - * [哪种广告最适合](#哪种广告最适合) - * [哪家广告商最靠谱](#哪家广告商最靠谱) - * [营销你的产品](#营销你的产品) - * [联网版APP](#联网版APP) - * [云服务](#云服务) -* [高级篇](#高级篇) - * [数据分析](#数据分析) - * [广告优化](#广告优化) - * [支付与内购](#支付与内购) - * [社交营销](#社交营销) - * [广告投放](#广告投放) -* [附录](#附录) - * [互联网营销常用术语](#互联网营销常用术语) - * [如何发布 APP 到 Apple AppStore](#如何发布-app-到-apple-appstore) - * [如何发布 APP 到 Google Play Store](#如何发布-app-到-google-play-store) - * [如何发布 APP 到 360 应用商店](#如何发布-app-到-360-应用商店) - * [如何用 Google Analytics 做用户数据分析](#如何用-google-analytics-做用户数据分析) - -### 前言 - -这本书,是写给程序员看的。 - -这并不是关于一门编程语言,也不是关于一种设计模式,更不是关于如何评估工程量、如何做项目管理。 - -这本书是关于:变现(monetization),通俗的说,就是赚钱。 - -作为程序员,你一定花了大量的时间去学习,掌握了若干种编程语言、用过数十种开发工具。为了设计稳定灵活的架构,你也认真学习和掌握了各种设计模式;为了提高工作效率,你也用了各种成熟的框架以及自动化测试的工具;总之,通过学习,你成为了一个牛B的程序员。 - -甚至,你也积累了管理的经验,主动学习了项目管理的理论知识、各种研发组织模式,也许会进阶到管理岗位,成为研发团队的负责人或者经理人。 - -在大部分的情况下,作为程序员或者研发团队,你按照项目经理 或者 产品经理给的需求,进行需求分析、架构设计、模块划分、接口设计、编码实现、测试、提交版本。这些环节,毫无疑问,是做研发的程序员最为熟悉的流程。 - -不幸的是,你日常所关注的,仅仅只是研发环节。接受需求,交付版本,这就是产品经理或者甲方让你干的事情。很多在研发领域侵淫多年的研发大牛,也往往并不熟悉软件怎样能够直接带来经济回报。绝大多数的开发者,仅仅关注研发这个环节,甚至仅仅关注在编码这个环节,这是非常局限的。 - -事实上,研发环节,再加上销售、收款、推广、用户支持、维护,这才是软件产生经济回报的完整闭环。 - -然而,软件怎样直接带来经济回报,这方面的技术文章或者书籍并不多见。这也是我为什么会选择这个角度,作为本书下笔的核心内容。 - -这本书是关于,如何从编码、到如何接受付款,以及如何获取用户。手把手,教你每一个步骤。 - -一旦你掌握软件如何变现的能力,你会更加关心用户反馈、关心市场需求、关心产品质量,因为这些都会为你带来更好的经济收益。实现财务自由,也就并不遥远了。 - -如果你觉得本书的内容有所帮助,请点赞支持。 - -### 定位 - -既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 - -考虑到人力、时间、成本等因素,我们也暂时不讨论运营级、或者企业级的大型系统。研发周期长、投入大、需求复杂,也超过个人和小团队的掌控。 - -在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 - -真实案例 1: - -[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 - -真实案例 2: - -我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 - -真实案例 3: - -2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式与外包模式太接近了,而不是产品模式或平台模式。 - -我的两位前同事在几年前离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。 - -你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 - -在这本书里,我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 - -也许你是技术的大牛,掌握了数十种编程语言、设计模式、前端到后端的全栈开发能力。然而,并不是每项技术,都能够实现快速赚钱的。最艰深、最有趣的技术,未必是最容易赚到钱的技术。有时候,我们要做最容易扩展的架构。有时候,我们要选择最快速开发的技术手段。 - -也许你是刚入门的菜鸟,只会做做网页什么的。那也没有关系,赚钱真正需要的编程技术,其实也可以非常简单。只是有一点,需要什么知识,我们就恶补什么知识。由于技术日新月异,程序员必须是最善于学习的群体。 - -### 基础篇 - -### 语言与工具选择 - -开发 APP 的语言与工具,通常与平台密切相关。 -* 如果是 iOS,那通常是 Objective C,开发工具是苹果推出的 [Xcode](https://developer.apple.com/xcode/) (开发工具仅运行于 Mac)。 -* 如果是 Android,那通常是 Java,开发工具是 谷歌推出的 [Android Studio](http://developer.android.com/tools/studio/index.html)(开发工具有跨平台版本)。 -* 如果是 Windows Phone,那就是 C#,开发工具是 微软推出的 [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx)(开发工具仅运行于 Windows)。 - -除此之外,还有一些跨平台语言与工具,对于开发者更加友善,可以开发一次,多平台打包发布: -* 可以开发游戏与APP的 HTML5,以 javascript 作为主要的开发语言。 -* 用于开发游戏的 [Cocos2d-X](http://www.cocos2d-x.org/),用的是 C++ 作为主要的开发语言。 -* 用于开发游戏的 [Unity3D](http://unity3d.com/) IDE 以及集成的 MonoDevelop,用的是 C# 作为主要的开发语言。 -* 微软收购的 [Xamarin](https://www.xamarin.com/) 以及赞助的开源项目 [Mono](http://www.mono-project.com/),用来开发 APP,以 C# 作为主要的开发语言。 - -在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。实际上,它也是 github 上最为活跃的语言。它可以用来开发: -* 运行于浏览器内的 Web网页; -* 运行与内嵌浏览器的 单页WebApp; -* 基于 [nodejs](https://nodejs.org/) 的命令行工具; -* 基于 nodejs 的网络云服务; -* 基于 [cordova](http://cordova.apache.org/) 技术的,混合(hybrid) APP。 -* 基于 [react-native](http://www.reactnative.com/) 开发 native UI体验的 APP。 -* 甚至,也能够开发出桌面应用,例如 Adobe Brackets 代码编辑器。 - -因为它可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 - -以下是用 javascript 来做开发的所需要的环境和工具: -* Chrome浏览器,自带开发者工具 和 javascript 控制台,用来运行和调试。 -* [Adobe Brackets](http://brackets.io/) 文本编辑器(如果你习惯 [Sublime Text](http://www.sublimetext.com/) 或者 [Atom](https://atom.io/) 或者 [Visual Studio Code](http://code.visualstudio.com/),也没问题) -* iMac台式机,巨大的27寸屏幕,视野不受限制;Mac OS X命令行非常强大方便,通过 [MacPorts](https://www.macports.org/) 或者 [Homebrew](http://brew.sh/),Linux 上有的命令行工具或者 library 都基本支持。 -* Xcode(只有 Mac 版本),要调试 iOS APP,有台 iMac电脑或者 MacBook笔记本电脑,这也是必备的。 -* Android Studio,用来调试 Android APP。 - -如果你习惯了 Windows 也没有一台 Mac,会稍微麻烦一点。不过也是有方法的,有一些专门提供编译、打包的云服务,例如 Adobe PhoneGap Build,或者 Intel XDK,我们后面会介绍如何使用。 - -### Hello, World! - -用 javascript 开发前端,其实需要的是 3 项相关的语言:HTML / javascript / CSS。 -* HTML 负责内容 -* javascript 负责逻辑 -* CSS 负责渲染表现 - -以下是一个简单的例子: -```html - - - - - -Hello - - - - -

Hello, World!

- - -``` -```javascript -// main.js -console.log('hello, world!'); -``` -```css -/* main.css */ -body { - width: 100%; - height: 100%; - padding: 0px; - margin: 0px; -} -h1 { - color: blue; - padding: 40px; - margin: 10px; - border: 1px solid gray; - display: inline-block; -} -``` - -用 Chrome 浏览器打开它,于是我们看到如下的展示: -* 上面的浏览器主窗口,显示了 HTML 的内容,并且用 CSS 指定的格式和效果进行了渲染。 -* 下面打开 Chrome 的 console 窗口,则显示了 javascript 调用 console.log() 输出的调试信息。 - -![HelloWorld](demo/helloworld.png) - -用 HTML5 / javascript 做开发,入门就是这么简单。 - -如果需要开发出高质量的 APP,需要熟练掌握 HTML/CSS 和 javascript,尤其是 HTML5 / CSS3,掌握 HTML DOM 以及 javascript 的一些常见库,例如 [jQuery](https://jquery.com/),等等。这里有一些免费的入门教程: -* [HTML 系列教程](http://www.w3school.com.cn/h.asp) -* [JavaScript 入门教程](http://www.w3school.com.cn/js/index.asp) -* [JavaScript 高级教程](http://www.w3school.com.cn/js/index_pro.asp) - -通过这些教程的学习,你能够做到: -* 一个简单的 index.html 页面; -* 一个统一的 main.css 文件,能够对界面元素的表现加以控制和调整; -* 一组 javascript 文件,能够通过对 HTML DOM 的访问,实现内容的动态展示和切换。 - -对于作为程序员的你,这根本不是什么难的事情。 - -### 单机版APP - -下一步,我们要把这样一个简单的网页程序 (web app),变成一个手机上的 APP。准确的说,它应该是叫 Hybrid APP,即混合程序。因为它的外面是 native app 封装了一个 webview,里面运行的是 我们写的 web app。 - -我们需要用到 cordova 技术框架。它原本是 Adobe 公司收购的一个小团队开发的产品,被重新命名为 [PhoneGap](http://phonegap.com/)。后来 Adobe 将其开源,并捐赠给 Apache 基金会,然后被称为 [Apache Cordova](https://cordova.apache.org/),现在已经成为一个非常流行的技术框架,也得到很多商业公司的追捧,除了 Adobe 之外,Intel、微软、IBM 等公司也都推出了支持 Cordova 的产品。 - -Cordova 技术框架提供了一个命令行的工具,是用 nodejs 开发的。 - -我们首先要装 [nodejs](https://nodejs.org/en/),安装之后,会提供 2 个基本的命令: -```bash -$ which node -/usr/local/bin/node -$ node -v -v4.2.1 -$ npm -v -2.14.7 -``` -* node --- 负责 javascript 程序的编译/解释/执行。它是基于谷歌开源的 Chrome V8 引擎的,基于事件驱动、不阻塞 IO模式运行,轻量而高效。 -* npm --- NodeJs Package Manager, 安装包管理器。所有的 nodejs 包都是用 npm 来下载和安装(你也可以用它来发布你自己的包到 npm 库)。 - -接下来,用 npm 安装 [cordova](https://cordova.apache.org/): -```bash -$ npm install -g cordova -$ which cordova -/usr/local/bin/cordova -$ cordova -v -5.4.1 -``` - -用 cordova 创建一个项目: -```bash -# 格式为:cordova create <目录名> -$ cordova create temp com.rjfun.demo Demo -``` - -然后编译,并在 iOS 模拟器中运行这个项目: -```bash -$ cd temp -$ cordova platform add ios -$ cordova build ios -$ cordova emulate ios -``` - -于是可以看到 iOS 模拟器被启动,然后 APP 运行: - -![Cordova iOS](demo/cordovaios.png) - -或者你也可以把 iPhone 用 USB 线连接到 Mac,然后用这个命令安装、启动刚刚编译的 APP: -```bash -$ cordova run ios --device -``` - -现在运行的是 Cordova 自带的 Demo 工程。打开 Cordova 项目,可以看到这样的目录结构: - -![Cordova Proj](demo/cordovaproj.png) - -接下来,删去 www 目录下的内容,用我们前面写的 index.html, main.js, main.css 替换,并略作修改: -```html - - - - - - - - - - - - - - - - Hello - - - - -

Hello, World!

- - -``` - -```javascript -// main.js -console.log('hello, world!'); - -// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 -document.addEventListener('deviceready', function(){ - console.log('deviceready'); - - // TODO: 开始我们 web app 的业务逻辑 -}); -``` - -```css -/* main.css */ -body { - width: 100%; - height: 100%; - padding: 0px; - margin: 0px; - background-color: silver; -} -h1 { - padding: 40px; - margin: 30px; - background-color: yellow; - color: blue; - border: 1px solid gray; - display: inline-block; -} -``` - -重新运行 cordova 项目(会自动编译、安装、运行): -```bash -$ cordova emulate ios -``` - -于是,可以看到 Web App 在 iOS 模拟器中运行了: - -![Hello World Cordova](demo/helloworldcordova.png) - -做个最简单的APP,其实也很简单,是不是?! - -### 加个广告条 - -作为程序员,我们毫不怀疑,你可以通过掌握的 HTML/CSS 以及 javascript 编程能力,提供一些有趣、有用的功能。 - -接下来,我们要给这个 APP 加上变现(monetization)的功能,即实现赚到真金白银。 - -变现最简单的方法,就是加上广告条,例如谷歌的AdMob。 -* 通过展示广告,用户对有兴趣的广告点击,浏览产品、或者安装其他的 APP。 -* 投放广告的个人/公司(简称广告主,Advertizer)会支付广告费给谷歌。 -* 而谷歌则会将其中的一部分,支付给发布广告的个人/公司(简称发布商, Publisher)。 -* 谷歌在其中扮演的角色,则称之为广告平台(Ad Platform)、或者广告中介(Ad Network)。 - -Cordova 框架的技术架构,是 Web APP 加上一些通用的插件,提供手机特定功能的访问、与第三方系统的集成。 - -我们通过插件 cordova-plugin-admobpro 来实现与谷歌 AdMob 的集成。这是基于谷歌 AdMob SDK 开发的一个插件,也是目前变现插件中最流行、最容易使用的。通过它,只需一行 javascript 代码就可以完成对 SDK API 的调用。 - -现在让我们往 cordova 项目工程中加入插件。 - -```bash -$ cordova plugin add cordova-plugin-admobpro -``` - -然后修改 main.js,在 APP 初始化完毕时,我们加几行代码。 - -```javascript -// main.js -console.log('hello, world!'); - -// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 -document.addEventListener('deviceready', function(){ - console.log('deviceready'); - - // 在 APP 初始化完毕时,在屏幕下方创建一个广告条 - if(AdMob) AdMob.createBanner({ - adId: 'ca-app-pub-6869992474017983/4806197152', // 需要到 AdMob 官方网站注册用户,并创建广告单元 Ad Unit Id - position: AdMob.AD_POSITION.BOTTOM_CENTER, // 展示在屏幕下方中央 - overlap: false, // 不要覆盖 Web APP 的内容 - isTesting: true, // 展示测试广告,在正式发布时,去掉这行 - autoShow: true // 广告资源就绪时,自动开始展示 - }); -}); -``` - -重新运行 cordova 项目(会自动编译、安装、运行): -```bash -$ cordova emulate ios -``` - -于是,可以看到 Web App 在 iOS 模拟器中运行了: - -![AdMob Banner](demo/admobbanner.png) - -看,屏幕下方的广告条展示出来了。 - -这里只是仅供调试用的测试广告。我们需要到 [AdMob官方网站](https://apps.admob.com/)注册用户,并创建广告单元(Ad Unit Id),并用来替换掉 代码中 adId 后面的这串数字。并在发布的正式版本中,去掉 `isTesting:true` 这行代码。 - -### 注册广告账号 - -下面我们就介绍,如何注册账号,如何创建广告单元,如何设置银行收款信息。 - -由于价值观方面的原因,谷歌的网站基本上都是被隔离在中国大陆局域网之外,通常是无法访问的。需要通过 VPN 等科学上网的方式才能够访问。如果你不知道如何科学上网,可以写邮件给我,单独讨论这个问题,这里暂不展开。 - -访问谷歌AdMob官网( https://www.google.com/admob/ ),注册新账号。 - -![AdMob Site](demo/admobsite.png) - -注册完成之后,登陆 AdMob 网站( https://apps.admob.com/ ),点击菜单“获利”,点击左上角的红色按钮“+通过新应用获利” 添加新APP: - -![AdMob New App](demo/admobnewapp.png) - -然后创建横幅广告: - -![AdMob New Banner](demo/admobnewbanner.png) - -即可获得广告单元 ID,将其 copy 到源代码中: - -![AdMob Ad Unit ID](demo/admobadunitid.png) - -### 验证地址和设置收款信息 - -注册账号之后,广告单元进入APP投放实际使用,即可积累广告收益。 - -要收到谷歌支付的广告分成,还有 2 个步骤要完成: -* 验证地址。谷歌会生成一个 PIN 码,打印在卡片上,邮寄到你的通信地址。 -* 设置收款信息。可以是 西联汇款 或者 银行账号。 - -不过,刚注册的账号还不允许设置这个信息。只有你的累计广告收入达到基本的门槛(目前是 10美金),谷歌才会允许进入设置支付信息的环节。谷歌通过这个方法,可以过滤掉大量的无效账号。 - -#### 验证 PIN 码: - -![Verify PIN](demo/verifypin.png) - -点击“立即改正此问题”,进入 PIN 码输入界面。 - -![Verify PIN](demo/verifypin2.png) - -验证 PIN 码这个过程比较缓慢,通常需要 2-4 周的时间。所以如果显示了最近生成 PIN 码的日期,就耐心等待吧。收到 PIN 码之后,就将其输入上面这个框,提交验证。 - -#### 设置收款信息: - -![AdMob Payment](demo/admobpay1.png) - -![AdMob Payment](demo/admobpay2.png) - -![AdMob Payment](demo/admobpay3.png) - -等这 2 个步骤设置完成,当产生广告收益的时候,谷歌就会在每个月的月末,计算当月的广告收益,然后在下个月的 20日左右支付给你。 - -### 发布APP - -我们完成的 APP,要被用户安装使用并产生收益,还缺少一个重要的环节:发布 到应用商店。 -* 如果是 Android APP,通常是 Google Play Store。中国大陆用户通常访问不到,则可以选择发布到大陆的一些应用商店,例如 360、豌豆荚 等等。 -* 如果是 iOS APP,则是发布到苹果 AppStore。 - -这里我们以苹果 AppStore 为例,来说明如何注册开发者账号,并发布 APP。 - -访问苹果开发者网站( https://developer.apple.com/ ),并注册登录。要在 苹果AppStore发布应用,需要支付每年 99 美金的年费,对于个人开发者、公司开发者,这个费用都是一样的。 - -![Apple Developer](demo/appledev.png) - -注册成功的开发者,需要下面几个步骤,才能将 APP 发布到 AppStore: -* 生成开发者数字证书,用于安装包的签名。 -* 为你的 APP 创建 APP ID,如果不涉及内购,也可以用 “*” 或者 “com.rjfun.*” 作为一个通用的 APP ID,在多个 APP 中使用。 -* 为你的 APP 生成 Provisioning Profiles,并下载到 本地用 Xcode 打开、管理。 - -然后用 Xcode 打开 Cordova 项目里的 XXX.xcodeproj 工程文件,编译并存档(Archive)。成功存档的 APP 包,才能提交到 AppStore 进行审核。 - -APP 提交前,需要到 iTunesConnect ( https://itunesconnect.apple.com/ ),准备、发布和管理你的 APP。 - -![iTunes Connect](demo/itunesconnect.png) - -创建新的 APP,加上名字、介绍、图标、定价等信息,并将其设置为准备提交的状态,然后就可以通过 Xcode 中的 Organizer 将成功存档(Archive)的安装包提交到 AppStore 进行审核了。 - -![Xcode Organizer](demo/xcodeorganizer.png) - -苹果审核 APP 的流程大约 1 周左右的时间。如果审核通过,就可以在 AppStore 里面看到你发布的 APP 了。 - -### 广告收益的计算 - -当用户在设备中下载、安装APP并运行的时候,就会从谷歌的广告服务器请求正式的广告内容,并用于展示了。 - -你可以登陆谷歌 AdMob 网站,查看每天的广告展示量、点击率、以及产生的收益。这个网站也提供了非常强大的报表功能,可以根据国家、广告单元、时间段,显示非常详细的报告。谷歌在 AppStore 上发布有一个 AdSense 的 APP,你可以安装这个 APP,每天查看你的 AdMob 收益。 - -每次用户对感兴趣的广告进行点击,就会产生广告收益。大部分的广告投放,是按照点击次数计算费用的,即所谓的 CPC 广告。 - -在计算广告收益的时候,有几个常见的基本术语: -* CPC(Cost Per Click,每次点击费用),大约是 US$ 0.06 ~ 1.0; -* CTR(Click Through Rate,展示点击率),大量统计的结果大约是 1%; -* CPM (Cost Per Mile, 每千次展示费用),通过 CPC 和 CPR 也能够推算出 CPM,大致范围是 US$ 0.5 ~ 5。 - -每次点击的价格,根据广告投放的价格不同而不同。全球不同国家由于经济水平不同,也存在很大的差异。例如, -* 在美国,一次广告点击可能产生 0.2 美元的收益; -* 在巴西,也许只有 2 美分,相差 10 倍。 -* 而日本,广告点击的收益是相当高的。 - -下面是一组数据的对比: - -美国 | 巴西 ----|--- -![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) -日本 | 德国 -![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) - -如果我们按照 CPM (每千次展示费用)1美元 来估算,每天 10万次广告展示,大约可以产生 $100美元现金收益。按照 6.45 的汇率计算,一个月30天(包括周末和节假日!),大约可以产生的收益是 ¥19,350。 - -而在上海,5年经验的、技术能力还不错的程序员,薪资大约也就 15,000 左右。如果你做的 APP,每天能够有 1万个用户使用,基本上产生的广告收益和现金流,就可以达到一个程序员的工资水平。 - -我认识一个巴西人,他用 HTML5 技术实现的小游戏,简单,但是非常有趣。每天的活跃用户大约是 10万,广告收益已经超过每个月 15万,从而实现了财务自由。 - -### 进阶篇 - -### 需求是根本 - -前面我们介绍了如何为 APP 增加了变现(monetization)的能力。但要真正获得可观的收益,还必须得有足够多的用户。也就是说,你必须开发出足够好的 APP,能够真正解决用户的问题,才会有更多的用户使用、更高频度的使用。 - -如何能够开发出更受用户欢迎的 APP 呢?其实这不是一个编程问题。 - -也许你是一个技术的大牛,但是最艰深、最牛X的技术,开发出来的软件产品未必是受到用户欢迎的产品。有时候,你用了一种其实比较简单的技术,但是真正关注了用户的痛点,解决了用户关心的问题,很可能你的产品就会受到用户的欢迎,创造出口口相传的良好口碑,在社交网络得到自然传播。 - -我推荐一本书,《需求-缔造伟大商业传奇的根本力量》,作者是亚德里安•斯莱沃斯基。 - -以下是某些创业成功者的推荐: - -> 这是一本好书,每个创业者和每个公司管理者都值得一看,甚至公司中的每个人都应该了解和体会其中的概念。书中给出了一些创造需求的模式,这对读者是非常有价值的,我们需要好的理念,但我们更需要可以践行理念的方法。这两点本书都做到了,非常值得一读,特荐之。 -——孙陶然 ,拉卡拉支付有限公司创始人、董事长兼总裁,《创业36条军规》作者 - -> 每一个抱怨的背后都隐藏着一个未被满足的需求,而每一个需求的背后必然隐藏着一个不可忽视的市场。其实任何产品,在一开始满足了用户的功能性需求以后,就应该着手升级到精神层面,用户拒绝麻烦,用户需要安慰,这看起来跟利润无关,但是对不起,它跟你的市场有关。你不去满足,创业者就会自己去进行开拓性满足。那么等待你的,或将是个生死存亡的巨大危机。因此,请一定重视麻烦所带来的希望,而不是去抵触他们的抱怨。这正是《需求》给我们带来的最有价值的东西。 -——杜子建,华艺传媒创始人,社会化媒体营销研究者,畅销书《微力无边》作者 - -### 用户体验 - -为什么苹果手机卖得贵,依然热卖?无疑它是以优秀的用户体验取胜的。如果你看过《乔布斯传》,你可以知道,苹果手机的诞生,其实是解决了传统手机难于使用的痛点。 - -自然我们在手机上开发的 APP 或者 游戏,也必须要高度关注用户体验,并且把它放到战略重点的位置上来。手机 APP,不追求功能的强大、齐全,可以只做一个小小的功能,但是要切实关注用户的需求点、并提供优秀的用户体验。 - -一个相当典型的例子是这款《手电筒》APP,就是打开手机的 LED灯泡,用来临时照亮黑暗。 - -![Torch APP](demo/torchapp.png) - -这款 APP 的用户已经超过好几亿,自然收益也是极其可观。 - -评价的数量超过600万人次,它的用户是这样写的: -* Jennifer Baylis: 易于使用。#1 最棒的手电筒APP!非常容易使用,打开很快! -* Kitty Davis: 我正是需要这样一个手电筒 APP。 -* Dennis Castello: 它正是做到了需要它做的事,而且做的真的很好。 -* Joseph Low: 易于使用。轻松地让它干活!强烈推荐! - -### 哪种广告最适合 - -在移动广告领域,存在多种形式的广告,并且也在不断的发展。 -* banner Ad,横幅广告 -* interstitial Ad,插屏广告 -* native Ad,原生广告 -* reward video Ad,奖励视频广告 -* IAP (in-app purchase) Ad,内购广告 - -哪种广告适合你的 APP,需要很好的权衡用户体验和收益之间的关系。如果广告展示不当,或者展示过于频繁,影响了用户体验甚至招致用户反感,就本末倒置了。 - -横幅广告 | 插屏广告 ----|--- -![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) - -这两种广告是最为基本和经典的,各有千秋。相对来说,横幅广告只占用屏幕下方的一小片空间,可以一直滚动展示,默认的是每 60 秒更换一次广告内容。优点是不太会影响用户界面和体验,缺点则是因为不太起眼,不容易引起用户的注意和点击。 - -插屏广告则是全屏的,在特定的时间弹出,更能够吸引用户的眼球和点击。也正是因为这个原因,插屏广告的点击收益比横幅广告要高 5 倍以上,比较推荐使用。 - -使用插屏广告的时候,要特别注意弹出的时间,千万不要打断用户的连续操作和游戏体验,否则不仅不会引起用户的点击,还会引起用户的反感。最佳做法是将其放在 2个阶段之间的过渡时机,例如游戏的一关刚刚结束,弹出插屏广告,然后再继续下一关。 - -通过插件 cordova-plugin-admobpro,要展示插屏广告也是非常简单的,只需要 2 行 javascript 代码就可以完成了。其中一行代码负责准备广告资源,另一行代码负责展示。示范代码如下: -```javascript -// 在游戏启动时或者进行中,开始准备插屏广告,通过后台线程下载广告资源 -if(AdMob) AdMob.prepareInterstitial({ - adId: "__ad_unit_id_here__", - autoShow: false -}); - -// 在游戏关卡结束时,调用 API 进行插屏广告的展示 -if(AdMob) AdMob.showInterstitial(); -``` - -以上这 2 种广告,是最容易使用的广告形式,集成到 APP 中的工作也最为容易。 - -原生广告(native Ad),就是将广告内容以较为和谐的方式,展示在APP自身的内容之间,不会显得过于突兀和突然,这是对用户体验影响最小的一种广告形式。 Facebook AudienceNetwork 和 Flurry 比较早就推出了原生广告,不过谷歌 AdMob 对此持谨慎态度,仅仅在部分开发者中进行 beta 试用。 - -奖励视频广告(reward video Ad),是谷歌新推出的一种广告。就是鼓励用户看完广告视频,然后开发者在游戏中或者 APP 中给予某种虚拟物品的奖励。在以前的广告推广中,谷歌并不支持在用户接受广告方面给予鼓励的行为,甚至将对点击广告给予奖励的做法定为违规的行为。因为这很可能违背用户本身的兴趣、造成虚假无效点击。新的奖励视频广告方面,谷歌采取了相对灵活和务实的态度。不过这方面的广告视频来源,基本上都是通过广告中介的方式来自于其他的广告网络。 - -内购广告(IAP House Ad)是一种新颖、创新的广告形式,应用内购买广告可让用户直接在应用内购物。因为需要和支付系统、或者谷歌Play Store结合起来,所以仅在 Android 系统支持。通过内购广告,应用开发商可在以下方面获益: -* 通过在同一款应用中实施广告投放和应用内购,可以最大程度地增加您的收入和用户的生命周期价值。 -* Google 会自动帮助您确定哪些用户有可能购买应用内购商品,并向其余用户展示普通的付费广告。 -* 不需要开发自己的应用内购支持系统,也不需要在应用中加入应用内购支持代码。 -* 利用不同的自家内购广告,可以轻松定位用户群体中的各种细分受众群。通过将应用内购广告与 AdMob 受众群体构建工具结合使用,可以向高消费群体投放价格高的应用内购商品,而向其他用户展示价格低的商品。 - -如果要尝试原生广告、奖励视频广告、内购广告,请移步 Google [AdMob 官方文档网站](https://developers.google.com/mobile-ads-sdk/),进行深入研究,学习如何使用。 - -### 哪家广告商最靠谱 - -因为移动广告领域的利润可观,移动广告平台的发展也是非常快的。过去的这些年,也发生了不少并购案。例如 Google先后收购了 DoubleClick 和 AdMob,Flurry 被 Yahoo! 收购,MobFox 被 Matomy 收购,Millennial Media 被 AOL 收购。 - -![Top Ad Networks](demo/topadnetworks.jpg) - -通常广告平台会提供: -* 接入广告系统的 SDK; -* 注册、登录和管理广告的系统; -* 接入指南、例程、FAQ; - -各种移动广告平台的相关介绍,可以通过搜索活着其他不同的渠道去了解(例如 StackOverflow.com),并可以有选择性的进行尝试。 - -以下是我试用过的一些广告平台: -* Google AdMob -* Facebook AudienceNetwork -* Yahoo! Flurry -* MobFox -* Apple iAd -* MoPub -* Millennial Media -* InMobi -* OpenX -* Smart AdServer -* ... ... - -使用下来比较满意的有 AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox。尤其是 AdMob,非常值得推荐。 - -AdMob之所以最值得强烈推荐,主要有这样一些突出的优点: -* 广告填充率高(基本上在 98% 以上,有个别国家略低于90%),因此可以充分利用用户流量。毕竟广告是谷歌公司的主要业务和利润来源,其广告客户遍及全球,这也不足为怪了; -* 付款及时,每个月的月底结算,次月 20日支付; -* SDK 非常稳定,接入文档以及参考代码易于使用,并且有不同语言的文档和系统界面; -* 报表系统功能强大、易于使用,可以通过不同的维度进行数据分析; -* 有专门的 APP 可以用来跟踪收益; -* 有专门的技术支持人员,有官方支持的技术论坛,专门解答 SDK 接入方面的技术问题; -* 定期会组织一些宣讲、培训活动,也定期有线上视频讲座; -* 客户服务非常到位,非常的耐心和友善,我和他们也基本上一直保持联系。 - -由于谷歌在各个领域的卓越创新、一贯的优质服务,在开发者中有良好的口碑。 - -而基于 AdMob SDK 开发的 cordova-plugin-admobpro 这款插件,不仅把 Objective-C / Java / C# 的原生 API 封装为统一的 javascript API,而且更加简单易用,只需 1-2 行代码即可完成广告展示。这款插件在 Cordova 全球社区也广受欢迎,是使用率最高的变现插件。以下是插件的下载趋势曲线图: - -![AdMob Download Trend](demo/admobprodltrend.png) - -Facebook 的 AudienceNetwork 也挺不错。Facebook 不仅仅是最大、最活跃的社交媒体,也提供各种相关 SDK,包括广告用的 AudienceNetwork。其开发者网站为:https://developers.facebook.com/docs/audience-network 。 -* Facebook 的 广告填充率(Fill Rate)没有 AdMOb 那么高,大约在45~75% 之间。 -* Facebook 付款也很及时,也是在每个月的 21日左右支付上个月的广告收益; -* Facebook 的 SDK 更新非常频繁,大约 2 周左右就会发布一个新的版本,因此如果有什么 bug 修复也很快。不过更新的频度实在有点高,有时候有点跟不上的感觉。相对来说,谷歌 AdMob 的 SDK 更加稳定一些; -* 管理界面和报表系统也比较清楚易用,一目了然。报表系统没有 AdMob 的那么强大和灵活,貌似仅有英文界面,看上去是下面这样的。 - -![Facebook AudienceNetwork](demo/fbaudnet.png) - -Flurry 是一家被 Yahoo!收购的移动广告公司,其官方网站是 http://www.flurry.com/ 。其主要的产品有 2 个,一个是数据分析(Flurry Anlytics),一个是广告系统(Flurry Ads)。 -* Flurry SDK 接入也还算比较容易,报表系统中规中矩。就是网站访问稍微有点慢,比较花时间。 -* 付款略慢,在广告收益产生的 60天之后才付款。 -* 值得一提的是,Flurry 是比较早支持原生广告的(Native Ad)的。 - -MobFox 是一家欧洲的移动广告公司,总部位于奥地利。曾经它的 CEO 联系过我,希望能够就某项产品达成合作。后来因为收购事宜暂停,再后来,再后来就知道 MobFox 被 Matomy 收购,项目合作的事情就没有下文了。这家公司还是不错,付款也比较及时。虽然号称是欧洲最大的移动广告公司,并且全球位于 Top 10,但和 Google、Facebook 这样的巨头比起来,在全球范围内的影响力实在有点弱。 - -Apple 的 iAd,只是在 iOS 系统上进行投放。由于 iPhone 的市场定位和定价明显要高于 Android 系统,也就决定了 iOS 用户有较强的购买力,所以 iAd 广告的点击回报比较高,也就不言而喻了。不过如果你开发的 APP 需要同时投放 iOS 和 Android 系统,用 AdMob 管理起来相对容易一点。也可以通过 AdMob 的广告中介(mediation)功能,把部分流量通过 iAd 进行展示,从而使得广告收益的利益最大化。 - -像 OpenX 和 Smart AdServer 仅对欧美的签约客户开放,并不针对全球用户和开发者。只是曾经有美国和欧洲的客户在 GitHub 上看到我的开源项目,特意找到我要求我定制产品,通过项目合作的方式,我才得以了解和熟悉。不过因为不对全球开发者,所以也无法推荐使用。 - -至于 MoPub,它的 SDK 的是在 GitHub 上开源的,这是它与众不同的地方。不过也正是因为这一点,其文档和 SDK 接入就要稍微麻烦一些。必须要把这些 SDK 从源代码编译成 jar 和 framework,然后才能在自己的项目中使用。 - -Millennial Media(简写为 mMeida),其 SDK Demo 的美观度做得不错,不过客服和技术支持的响应实在不敢恭维。曾经碰到过技术问题,通过 Web Form 提交了问题,一直没有得到过答复,所以我后来也就懒得用它了。 - -另外像 Charboost、TapJoy 等等广告平台,也或多或少的接触过。不过精力有限,没有逐一进行具体的试用。Charboost 是 2011 年才创业的广告公司,只专注在移动游戏领域,2014年被 VentureBeat 指数报告定为 Top 10 的移动广告公司。通过 Chartboost 发布的广告,点击收益比较不错,不过反过来说,也就是广告投放、获取用户的成本是比较高的。我所认识的专门做重度游戏、专门投放海外市场的朋友,通过 Facebook 和 Chartboost 投放广告用得比较多。 - -上面介绍了不少移动广告平台,完全是个人经验和主观体会,有兴趣的可以自行尝试。 - -### 营销你的产品 - -(待续) - -### 联网版APP - -### 云服务 - -### 高级篇 - -### 用户数据分析 - -### 广告优化 - -### 支付与内购 - -### 社交营销 - -### 广告投放 - -### 附录 - -#### 互联网营销常用术语 - -Part1 最基本的名词 - -ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) - -Impression:意思是“曝光”,也被称为“展示”或“显示”,是衡量广告被显示的次数,一个广告被显示了多少次,它就计数多少。比如,你打开新浪的一个页面,这上面的所有广告就被“显示”了1次,每个广告增加1个Impression。 - -Click:点击,是指互联网用户点击某个广告的次数。 - -CTR:Click Through Rate,点击率。就是用click除以impression的比例。 - -CPM:Cost Per Mille,这次实际上省略了impression,全文应该是cost per mille impression。Mille是千的意思,在英语中它只跟着per一起用,即per mille,就是汉语的“每千……”的意思。所以CPM是每千次展示的成本。 - -CPC:Cost Per Click,每次点击的成本。 - -Ads:就是广告(名词)的英语复数啦。Ads = Advertisements。如果是“做广告”(动词),应该用Advertising。 - -SEM:Search Engine Marketing的简称。就是搜索引擎营销。不过在中国,SEM其实仅仅指PPC。但是SEM事实上是PPC和SEO的统称。PPC和SEO是什么,下面有解释。 - -PPC:Pay Per Click的简称。一般是特指搜索引擎的付费竞价排名广告推广形式,因为搜索引擎竞价排名只有一种收费方式,即按照点击付费。虽然也有其他广告形式也是按照点击数量来进行收费,一般不被称为PPC,而被称为CPC,即Cost Per Click。为什么?似乎是约定俗成。 - -SEO:Search Engine Optimization的简称。就是搜索引擎优化,特别指搜索引擎搜索结果自然排名的优化。所谓自然排名,就是不通过给搜索引擎付钱就能获得的排名。不花钱就能被搜索引擎排到前面当然是好事,但大家(每个网站)都这么想,所以要出头还挺难的。懂得这个领域的高手过去能挣很多钱,但今天SEO却越来越短时间内就出效果,所以想要通过SEO挣快钱越来越难。 - -Social:社会化,是social marketing(社会化营销)或者social media(社会化媒体)的简称,具体指二者的哪一个要看场合。社会化媒体,在中国过去是人人网、开心网之类,现在是微信、微博、图片分享类网站应用等。 - -WA:Web Analytics的缩写。就是网站分析。 - -DA:Digital Marketing Analytics的缩写。数字营销分析。 - -Part2 数据分析领域 - -Dimension:维度。维度是对一指一个事物的不同的方面、特征或者属性。这么说太抽象。简单说,人可以分成男人和女人,性别就是人的一种维度。或者汽车可以分为白色、黑色、红色等,颜色就是汽车的一种维度。维度是最基本的数据结构,任何一个度量(指标)必须要依附于一个具体的维度才有意义。比如说,我说visit=100,这没有任何意义。我说搜索引擎给我的网站带来的visit=100,就有了意义。搜索引擎流量就是维度(即流量来源)的具体的值(就如同男人是性别这个维度的具体的值)。 - -Metric(常用作复数,即Metrics):通常翻译为度量或者指标,但是因为指标含义更宽泛,例如KPI或者benchmark都可能被称为指标,所以在我的培训中metrics都是用度量来表示,这样更严谨。度量绝大多数都能能用数字表示,比如汽车的速度,速度就是度量。课程中涉及到的度量分为两类,一类是计数度量(比如常见的PV、UV、访次、停留时间等)和复合度量(两个度量四则运算而成,常见的有转化率、跳出率、留存率、活跃率等)。另外有些度量使用布尔量表示,即是或非。度量必须依附于维度才有意义。 - -Unique:Unique是指排重(排除重复)。Unique很少单独用,常用在计数类度量的前面,比如unique visitor,指排除对同一个访问者重复计数之后的访问者数量——同一个人今天到网站一次,明天又来一次,不能就因此变成两个人,unique visitor仍然是1。Unique visitor通常可以简化为visitor,两个可以通用。Unique visitor和unique user是唯一的两个可以加不加unique都算unique的度量。另一个例子是unique impression,即同一个人多次看同一个广告,还是计算为1次。Unique impression和impression是两个不同的度量,因为后者不排重。 - -Benchmark:我在大学的时候这个词被翻译为“定标比超”,真是不明觉厉的感觉呀。Benchmark就是“可以作为对比的参照值”。我的很多客户会问,这个指标在行业中的平均情况是什么样呀?他们的问题可以同样表述为:这个指标在行业中的benchmark是多少? - -Pattern:指某种会重复出现的模式或规律。Pattern常常用于发现用户行为上的某些趋同特征。比如,我们发现用户都喜欢在晚上10点到11点打开某个app应用,这就是一种pattern。如果我说发现了一个pattern,很兴奋,实际上的意思就是说我发现了一个规律。规律这词,几十年前就有了,pattern这洋文多有逼格呢…… - -Random:随机数,或者随机性。但是老外们也用它来形容“混沌”之类的意思。 - -Cohort:很难翻译,也很难形容,我暂且把它翻译成“队列”。跟Segmentation有点类似,但内涵要多一点,多点排队的意思。你懂的,课堂上讲清楚。Cohort一般是一种分析方法,所以一般不单独出来,而是跟analysis在一起,即cohort analysis。 - -Filter:过滤。过滤是指摒弃掉不需要的数据,只留下需要的。过滤都需要遵循一定的规则(这是废话),而且过滤掉的数据往往不能找回。过滤是一种常用的定位某个细分领域的方法,与细分(segmentation)的区别在于,segmentation是把总体分成并列的若干块(segment),而Filter则只保留符合规则的块,而丢弃其他不符合规则的块。 - -Segmentation:细分。这是我们最基本的方法,即把总体按照一定的规则分成并列的若干块。做了segmentation之后,每一个块就是一个segment。所以segmentation和segment不是同义词。Segmentation怎么用?怎么发挥最大价值?课堂上有很多案例。 - -Part3 互联网和互联网营销分析技术领域 - -Cookie:Cookie并没有真正的中文翻译,cookie是在你浏览网页的时候,网站服务器放在你电脑(或移动设备)的浏览器里面的一个小小的TXT文件。这个文件里面存储了一个标识你这个人的匿名的ID,以及一些与你访问的这个网站有关的一些东西,这样当你下一次访问这个网站的时候,cookie就会知道你又来了,并且记住你上次访问时候的一些状态或者设置。Cookie以及与cookie类似的东西是互联网营销的最重要技术之一,几乎所有识别人和标记人的工作都需要cookie及类cookie技术完成。在这次培训中会有详细的说明。 - -Deep link:没有汉语直接对应名词,我觉得直接叫“深链”好了,但不能叫做“内链”,后者是另外一个东西。Deep link历史悠久,过去把能够链接到网站的内页(即非首页的页面)的链接都称为deep link,但此后很快deep link这个词的意义就消失了,因为这样的链接实在太普通,都不需要用一个专用的名词来表述。但随着移动端的app的出现,deep link又“东(si)山(hui)再(fu)起(ran)”,特指那些能够跨过app首屏而直接链接到app的内屏(类似于网站的内页)的链接。嗯?如果这个app还没有安装过怎么办?这两期的公开课会专门讲。 - -Link Tag:Link Tag特指在流量源头的URL后面加上的标记,用来标明流量源头的名称和属性。最典型的link tag是Google Analytics的UTM格式的标记。目前已经成为标明paid media(花钱购买的广告流量)的标准配置。如何用好它,比你想的丰富,课堂上详解。 - -Heat map:热图。在一个图上标明这个图上哪些是获得更多关注的部分。关注可以是眼光,也可以是鼠标点击或者手指的指指点点。热图是做行为统计学研究的好可视化工具。大家都看得懂的东西,但用好则要水平。 - -JavaScript:简称JS,网站页面上的程序,能够让页面除了展示内容之外,还能实现更多的程序运行和功能。网站分析工具监测代码就是JS代码,将JS代码部署在你要监测的网页中,就可以把用户在页面上的互动访问行为不间断的发送到相应数据分析工具的服务器,从而获取想要的用户数据。 - -Attribution:归因。但是实际上这个词被翻译成“归属”更好。归因是指在多种因素共同(或先后)作用造成的某一个结果时,各种因素应该占有造成该结果的多大的作用,即“功劳应该如何分配以及归属于谁”。为解决归因的问题而建立的模型被称为归因模型,即attribution modeling。但我一直可惜这个词没有翻译好,翻译成归属模型或许更容易理解。 - -Path:路径。任何构成先后次序的一系列事件或行为都可以用路径来描述。路径分析(path analysis)也是较为常用的一种分析方法。 - -UID:是User Identification的缩写,即用户ID。 - -Bots:机器人。非人产生的流量,都被称为机器流量,即bots traffic。Bots是互联网虚假流量主要的创造者之一。 - -Spider:常翻译为蜘蛛,蜘蛛是一个自动程序,它的作用是访问收集整理互联网上的网页、图片、视频等内容。比如百度蜘蛛会将互联网的各种内容抓取回来并分门别类建立索引数据库,使用户能在百度搜索引擎中搜索到想要的内容。 - -IP:是Internet Protocol(网络互联协议)的缩写。IP地址就是给每个连接在互联网上的主机分配的一个地址,过去用于判断不同的访问行为属于同一个人(因为都是同一个IP记录产生的访问)。但由于各种动态IP和虚拟IP技术,用它判断用户人数已经很不可行。现在游戏领域也常常说起 IP,不过那是另外一个意思,intellectual property,知识产权,往往指的是著名的小说、影视、游戏等作品的人物故事等等。 - -Tracking:翻译为跟踪,就是数据分析工具跟踪用户各种行为的“跟踪”,用户所有的线上行为都可以被跟踪。监测这个词的“监”这个字,就是tracking。而测,则是measurement。所以监测这个汉语词,最准确的翻译就是tracking and measurement。监测需要用一定的技术手段实现,其中核心技术之一就是监测代码(tracking code),是一串可以发挥监测功能的程序(很多都是脚本语言编写,比如JavaScript语言)。 - -Pixel:本意是像素,但是在监测领域,是tracking code(监测代码)的同义词。 - -VAST:即Digital Video Ad Serving Template。一种实现视频程序化广告的基础性协议。目前是4.0版本。 - -Part4 流量与用户行为领域的名词 - -Bounce Rate:跳出率。会在课堂上简单介绍。 - -Referral:翻译为引荐来源。现实生活中,如果我推荐你使用了某个产品,或者我介绍你加入我们光荣的党,我就是引荐人(referral)。而在数字营销中,referral是指那些给我的网站带来了流量的其他网站,通常这些网站上会有链接到我的网站的链接。如果没有做特殊的标记(如使用link tag标记)或者不是特殊的流量源(比如搜索引擎),那么大部分的流量来源都会被监测工具记录为referral。 - -Retention:指用户的留存。如何让用户能够留存,是一个重要的课题。在这两期公开课培训中会跟大家介绍如何提升retention。 - -Engagement:没有特别合适的中文翻译,这个指标指的是用户在网站或APP上的交互程度或者参与度,可以由多个指标组合而成。比如一个网站有很多交互行为,包括下载文档、观看视频、咨询等,那么会根据每个交互的重要程度给每个交互行为赋值,用户每完成一个交互及赋予相应的数值,这样可以判断不同类别用户的交互程度以及不同页面的交互差异。Engagement和其他一些名词比如effectiveness、performance、acquisition等相似,都是泛指性的名词。 - -Session:session实际上和visit是一回事。本来,各类工具都是将用户的一次访问(网站)称为visit,但是随着app的普及,visit app听起来很别扭(因为我们都是use app),所以app也就不存在visit了,于是就用session代替。为了统一表述visit和session,有些监测工具把visit改称session。 - -Visit:即访问。指对用户对网站的访问,通常以30分钟为区隔。如果超过30分钟在网站上没啥动静,则一次访问结束。 - -Direct:翻译为直接访问,比如用户直接在浏览器输入网址访问,或者用户直接点击收藏夹里的网址进行访问,都会被记为直接访问。除了上述情况,从QQ客户端聊天窗口或微信客户端的链接直接访问网站的也会被记为直接访问。 - -Exit:退出,即用户离开网站或APP的行为,用户离开网站前的最后一个页面称为退出页(exit page),离开APP时所在的最后一个screen叫做exit screen。 - -Part5 策略与运营 - -Acquisition:泛指用户获取。在用户运营中使用的极为广泛,做任何产品的运营的第一步就是获取用户,比如在网页端的推广流量的获取、App推广中用户的下载等。 - -Goal:目标,是想要达到某种效果,每个网站都会有一些作为目标的交互,比如点击下载说明书、登录、注册、提交订单等。那我们就可以将这些设定为目标,那么这里引出另一概念:转化(conversion)。每完成一次上述的目标,就可以认定为完成一次转化。 - -KBR:Key Business Requirement。关键商业需求。是一个企业商业目标中最关键的。KBR决定了一个企业的其他目标,并且也决定了我们应该如何制定digital marketing的目标,以及针对这些目标选用什么样的指标或KPI。 - -KPI:Key Performance Indicator的缩写,译为关键绩效指标,是若干个用于衡量业务表现的最重要的度量。不同的商业目标,不同的业务,所对应的KPI不同。如何设置KPI是一门技术,也是一门科学。在这次的培训中也会做详细介绍。 - -Part6 互联网广告领域的名词 - -Display Ads:展示广告。展示广告主要指静态的图片广告、动画广告,以及富媒体广告(就是能互动一下的flash神马的)。这一广告形式与文字广告(就是文字链)和视频贴片广告形式是并列的不同类广告形式。 - -Banner:广义上是图片或者动画展示类广告的统称。这个词的含义源于上街游行队伍中拉着写有标语的大横幅,后来扩展到互联网广告商,并与display ads同义。 - -Pre-roll:也叫pre-roll ads,即前贴片广告。就是视频播放之前的长达10秒到丧心病狂的120秒的视频广告。 - -Content Feeds:信息流广告。信息流(主要是在社交网站和APP上)是内容并列排列自上而下像瀑布流一般,而在信息流中插入跟信息内容形态一样的广告,这种形式就是信息流广告。课堂上会介绍。 - -Native Ads:原生广告,通俗说是那些看起来就像网站或者app中正常内容一样的广告。原生广告容易和信息流广告混为一谈,但它们并不是一回事。原生广告可以采用信息流来实现,但不仅仅局限于此。 - -Reach:人群触达。如果做互联网广告,能够让广告触达到多少人是广告主关心的。触达实际上等同于unique impression,所以它不是动词,而是一个名词,一个用来记录广告触及到了多少人的计数度量。 - -Coverage:人群覆盖。跟触达非常类似,只是它的含义更模糊一些。往往用百分比来表示,例如,希望reach到的人群是1个亿,而实际reach到的是6000万,那么coverage大约是60%。Coverage不是一个度量,而是一个约定俗成的说法。 - -Viewability:广告可视性。过去统计广告的曝光的时候,不考虑广告是不是真的被人看到了,所以有些广告处在一个很长的页面的第二屏或者更后面的位置,而某个同学只看了第一屏就离开了的情况下,这个广告其实是根本没有处于屏幕中的,这个同学根本看不到这个广告。在不考虑viewability的情况下,这个广告仍然因此而有增加一次曝光(impression),而若考虑viewability,这个广告不增加一次曝光。 - -Pre-click:点击前阶段。指流量入口(尤其是广告)在被用户点击之前(含点击本身)的相关用户行为及对应的营销监测与分析体系。 - -Post-click:点击后阶段。指流量入口在被用户点击之后的相关用户行为即对应的营销监测与分析体系。 - -Fraud:作弊,也有更通俗的写法即cheating,但fraud特别指流量作弊。反作弊是anti-fraud。另一个与fraud类似的反面词汇是spam,即垃圾短信、垃圾邮件之类的骚扰垃圾信息。 - -Campaign:特别难找到准确对应的汉语名词,大意是一次有始有终的营销活动。有始,是指营销活动是从严谨的策划和详细的执行计划开始的,有终,是指营销活动有清晰的执行结束的节点。所以心血来潮的营销“游击战”不能称为campaign,那些几乎永远不停止的营销行为(例如SEM投放)也不能称为campaign。 - -Audience:受众。就是广告的阅览者,普罗大众。受众这个词太书面化了,但是确实没有比这个更明确的词,所以在这两期公开课中都会用这个词。 - -Target Audience:目标受众。任何人都可能看到你的广告,但只有那些合适的人才会购买你的商品。所以,合适的人就是你的目标受众,是你最希望影响到的那群人。 - -Effectiveness:效果。这是广告主评估品牌推广类广告好坏的一个关键指标。效果的含义比较广泛,在不同的campaign目标下可能不尽相同。比如,能够覆盖到的人群情况(coverage)可以作为一种效果;或者,人们是否真正对你的品牌产生了认知(awareness)也被称为一种效果。类似的,人们也用performance来表示营销的好坏,二者是近义词,但又不完全相同。Performance更偏重有实际产出的具体效果,因此常常被翻译为“绩效”,例如campaign产生了多少的click,产生了多少的交易等等。因此,effectiveness较为抽象,几乎只在品牌推广中被提起,而performance较为具体,在效果类推广中更为常见。 - -Efficiency:效率,即达到某种效果所花费的成本(包括金钱与时间)。品牌推广类营销常用,效果推广类很少提及。 - -Branding:品牌推广。 - -Awareness:对品牌或产品的认知。做广告的首要目的,就是让消费者意识到你的品牌或者商品的存在,说白了就是搏存在感。看看近期密集发布的手机在各个新闻app、电商app中频频发力,就知道awareness对广告主有多重要了。 - -Buzz:消费者或网民对于品牌、产品等广告主在乎的事情在网上发出的各种声音。与IWOM是一个意思。Buzz是苍蝇蜜蜂之类的嗡嗡声,无数网民每天在网上发出的各种意见, 在上帝看来就像苍蝇蜜蜂般嗡嗡作响。 - -IWOM:Internet Word of Mouth的简称。即网络口碑。 - -Survey:调研。这个词是一个有意思的词,主要在它的发音。作名词的时候重音在前——[?s??ve?],作动词的时候重音在后——[s??ve?]。 - -ePR:通过互联网进行的PR。 - -IP:Intellectual Property,即知识产权。就是过去说的那些原创的,有知识产权的东西。现在天天出现在各种口语和报道中的这个词指各种在互联网上创作的内容。例如,我的这个公开课也可以称得上是IP。Papi酱的网红视频?当然也是咯!与上篇的IP写法一样,意义完全不同。 - -Minisite/Microsite:没有对应的汉语名词,而且大家也从来不用汉语描述它。就是指为campaign专门定制的campaign网站,这些网站规模都不大,所以被称为mini(迷你)或者micro(微)。 - -Programmatic:程序化(广告)。一种革命性的广告运作方式。在课堂中会有详细的介绍。 - -DSP:Demand Side Platform(需求方平台)。程序化广告的广告投放管理系统平台以及相应的服务提供方。具体解释这里不多说了,到时候课堂上会详细介绍。 - -SSP:Supply Side Platform(供应方平台)。程序化广告的广告资源管理系统平台以及相应的服务提供方。具体课上介绍。 - -RTB:Real Time Bidding(实时竞价广告),这是程序化广告最重要的一种方式,也是理论上最佳的广告资源变现方案。但具体如何实现,优劣问题,以及国内的情况,课上详细讲。 - -Bid/Bidding:竞价。搜索引擎PPC广告,或者RTB广告,都需要竞价。类似于拍卖,但需要在预置条件的前提下通过程序来实现。课堂上详细说。 - -Bidder:Bidder即竞价者,在PPC广告范畴内,bidder就是普通SEM的操作从业者。在程序化广告范畴内,bidder一般就是DSP服务提供商。 - -DMP:Data Management Platform,数据管理平台。程序化广告(programmatic advertising)中为实现定向受众所需要倚仗的数据平台。但它能做的还远远不止这么多。培训课程中会专门涉及。 - -Verification:特指广告的验证。验证有两类,一类是验证广告是否真实被投放出去了,以及投放出去之后广告所处的环境是什么。什么是广告所处的环境?——对于PC web上的广告而言,环境就是这个网站以及具体承载广告的这个页面。另一类是验证广告覆盖的人群的情况是不是跟预想的一样。 - -Part7 效果营销领域的名词 - -Conversion Rate:转化率。是指从流量到实际销售转化的能力。与ROI本质是一样的。只是ROI衡量的是现金(收入)对现金(支出)的对比,而转化率衡量的是销售的数量与进入销售漏斗的人数(或者次数)的比例关系。 - -Churn和Churn Rate:客户流失和客户流失率。所有需要尽可能让用户反复购买(或付费)的生意,都有这个度量。看名字就知道,这个度量用来描述失去客户的情况。具体如何定义,以及如何分析,在课堂上会有详细说明。 - -SERP:Search Engine Result Page。就是搜索引擎的搜索结果页面。 - -Search Query:用户的搜索词。人们在各种搜索框(典型的如搜索引擎的搜索框)内填入的词,这些词可能很不结构化,且非常随意。而keyword,则是使用搜索引擎竞价排名的广告主设定的关键词。 - -Keyword:使用搜索引擎竞价排名的广告主设定的关键词,较为结构化,较规范。这些词不可能穷尽用户的search queries,因此搜索引擎会把用户的search queries转变为与之最相近(不过是否真的是最相近,那就只有搜索引擎知道了)的keywords,然后显示搜索的结果。 - -Organic Search:自然搜索流量源,即用户点击了自然搜索结果产生的流量,而不是点击了竞价排名(PPC)而产生的流量。 - -Affiliate Marketing:有时也就直接简称为Affiliate。这个词在国内没有对应的名词,在台湾被译作“联署营销”,但是这个翻译似乎仍然莫名其妙。Affiliate marketing就是典型的代销模式——你的东西,我帮你卖,卖出多少,你给我按照一定比例提成。在互联网上,affiliate marketing变成了我帮你引流量,我给你的流量如果有转化了,你给我提成。国内的亿起发、领克特等就是做affiliate marketing的专门平台。 - -EDM:Email Direct Marketing(电子直邮营销)的缩写,是利用电子邮件(Email)与受众进行商业交流的一种营销方式,电子邮件营销是网络营销手法中最古老的一种。 - -Performance:绩效,即通过营销之后获得“战果”。ROI就是一种典型的performance,销售额之类的也是。 - -GMV:Gross Merchandise Volume。这是电商经常会用到的词,书面是“毛销售量”,实际就是销售流水。当然,销售流水不等于最后赚到的钱。GMV=1销售额+2取消订单金额+3拒收订单金额+4退货订单金额。GMV是流水,只要你下了订单,生成订单号,就算了GMV。而这个订单转化为平台的实际收入还会有2、3、4这些流失量。下单以后后悔了取消订单,订单送到你面前了后悔了拒收订单,签收订单以后后悔了要退货(这个步骤不同的电商平台计算方法不一样,有的平台是不管退不退货都搜算进销售额中)。总之,人艰不拆,GMV数字大,好看,而且我们监测起来也最容易,所以这是最常用的。 - -AOV:Average Order Value。平均订单价格。 - -Monetization:变现。 - -MRR:Monthly Reoccurring Revenue,直译是每月都会产生的收入,实际就是用户要交的月费。比如我办了一个158元的包月电话套餐,对于电信公司而言,我就给他们贡献了MRR 158元。 - -Part8 移动端常用的 - -Screen:如果说web端用page view来记录页面被浏览的次数,那么screen就是app的页面,screen view就是app的页面浏览的次数。但因为screen没有page这个东西,所以就用screen来表示。我也不知道应该对应什么汉语名词,或者应该用“屏显”?反正相信你懂的。。 - -DAU:Daily Active User(日活跃用户数量)的缩写,通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),是用来衡量产品的用户粘性的重要指标。 - -MAU:Monthly Active User(月活跃用户数量)的缩写,概念与DAU相仿,区别在于时间跨度。MAU除了能衡量用户粘性,还可以分析产品衰退周期。 - -H5:是HTML5的简称。它实现的功能与Flash类似(用于实现动画和各种酷炫的人机交互界面等),但是比Flash具有更强的兼容性,可扩展性,稳定性以及安全性,因为该技术是HTML的延展,而非如同Flash一样是一个单独创立出来的事物。目前各大互联网钜子们——包括Adobe(Flash的所有者)——都已经加入支持H5,H5在移动端几乎已经完全取代了Flash。 - -ASO:App Store Optimization。狭义上指针对苹果应用商店的app排名所做的优化工作。广义则指对所有的应用市场的优化。与SEO类似,都是排名优化,只是优化的对象变成了应用市场。 - -LBS:Location Based Service,基于位置的服务。低逼格的讲就是用手机定位之后,能否关联一些服务或广告的。当然实际的应用比我说的肯定逼格高很多。 - -Part9 企业、组织机构与产品 - -Google Analytics:谷歌分析,简称GA,是全球用户量最大的网站和APP上流量用户行为的监测与分析工具。 - -Universal Analytics:简称UA,是GA在2013年左右做的一次大升级版本,目前无论是免费还是付费版的GA,都是基于Universal Analytics的。GA的付费版叫Google Analytics Premium,简称GAP。 - -GTM:Google Tag Manager,是谷歌公司用于管理网页上各种广告、监测和分析代码的平台型工具。课堂上会简单介绍。 - -DCM:DoubleClick Campaign Manager的简称 (即新版 DoubleClick for Advertisers 7),DCM 是一个管理及投放广告的全面解决方案,覆盖从 广告策划、管理、定位、投放、优化到生成报告等。广告的impression和click等几乎所有的度量,都可以通过它来进行监测。 - -AdWords:全称Google Adwords,是谷歌搜索引擎的关键词竞价系统,按点击收费(CPC)。 - -AdSense:全称Google Adsense,是谷歌推出的针对网站主(简称发布商)联盟的一个互联网广告服务,通过程序来分析网站的内容,并且投放与网站内容相关的广告。 - -DAA:Digital Analytics Association,数据分析协会。美国的互联网营销数据分析行业协会,号称是全球协会,但主要章程和成员都在美国,对其他国家的影响力较小。 - -IAB:Interactive Advertising Bureau,美国的互动广告局,也是类似于DAA的行业协会,主要领域是数字广告。这个协会在美国,但对全球数字广告的影响力巨大,尤其是标准和技术上。 - -#### 如何发布 APP 到 Apple AppStore - -#### 如何发布 APP 到 Google Play Store - -#### 如何发布 APP 到 360 应用商店 - -#### 如何用 Google Analytics 做用户数据分析 - - From 4f8a4b3f7d0d85e0345689195a03cc0591f23158 Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Wed, 22 Nov 2017 00:29:45 +0800 Subject: [PATCH 17/24] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82f75db..2e0dafb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -### 从编码到变现:程序员财务自由之路 +## 从编码到变现:程序员财务自由之路 From Coding to Monetization:Programmer's Financial Freedom Approach From eb96c1c31dcab3e29be179f20ddfe78e3900897a Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Wed, 22 Nov 2017 00:30:12 +0800 Subject: [PATCH 18/24] update --- README.en.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.en.md b/README.en.md index 27016c8..342951f 100644 --- a/README.en.md +++ b/README.en.md @@ -1,4 +1,4 @@ -## From Coding to Monetization:Programmer's Financial Freedom Approach +# From Coding to Monetization:Programmer's Financial Freedom Approach 【从编码到变现:程序员财务自由之路】 diff --git a/README.md b/README.md index 2e0dafb..a2c00b7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## 从编码到变现:程序员财务自由之路 +# 从编码到变现:程序员财务自由之路 From Coding to Monetization:Programmer's Financial Freedom Approach From 0a646500fae42a1e5719acdcd0f8a5f3740a300e Mon Sep 17 00:00:00 2001 From: Raymond Xie Date: Mon, 27 Sep 2021 20:00:33 +0800 Subject: [PATCH 19/24] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a2c00b7..00698e2 100644 --- a/README.md +++ b/README.md @@ -84,9 +84,9 @@ From Coding to Monetization:Programmer's Financial Freedom Approach 真实案例 3: -2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式与外包模式太接近了,而不是产品模式或平台模式。 +2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式有太多的定制开发,与外包模式太接近了,而不是产品模式或平台模式,难以规模化扩张。 -我的两位前同事在几年前离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。 +我的两位前同事阳陆育与朱骏,在2014年离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。作为国内用户,也许你不一定熟悉它,但是你一定知道它后来的名字,Tiktok,对,就是那个超越了 Facebook 排在第一名的 APP。 你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 From fd6090ba26ab0dd71862d91125478eb0987ffa95 Mon Sep 17 00:00:00 2001 From: Raymond Xie Date: Mon, 27 Sep 2021 20:02:32 +0800 Subject: [PATCH 20/24] Update README.en.md --- README.en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.en.md b/README.en.md index 342951f..190350f 100644 --- a/README.en.md +++ b/README.en.md @@ -78,7 +78,7 @@ Real story 2: I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. Real story 3: -I have been working in a company that develops insurance software some years ago. The company had developed fairly well, and the management tried to IPO. However, they have not been able to take off and IPO yet, because the business model was too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores. +I had been working in a company that develops insurance software some years ago. The company had developed fairly well, and the management tried to IPO. However, they have not been able to take off and IPO yet, because the business model was too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company in 2014 and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores, later it's renamed to Tiktok after ackquired by Bytedance. You can find other similar success stories, about making good money from mobile apps or games. You may heard, or just google the internet. From d1165173a58ad0747aec88d564c7edff53b966fb Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Fri, 17 Dec 2021 15:33:19 +0800 Subject: [PATCH 21/24] update docs --- README.en.md | 6 +++++- README.md | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.en.md b/README.en.md index 190350f..356156a 100644 --- a/README.en.md +++ b/README.en.md @@ -78,7 +78,11 @@ Real story 2: I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. Real story 3: -I had been working in a company that develops insurance software some years ago. The company had developed fairly well, and the management tried to IPO. However, they have not been able to take off and IPO yet, because the business model was too close to the outsourcing model, rather than the product model or platform model. Two of my former colleagues left this company in 2014 and set up a start-up, developing a short video APP on a mobile phone, and successfully becoming a short video community platform. A few days ago, after three years of hard work, they were acquired for $1 billion US dollars. Yes, their name is Musical.ly, you can find it in the top list of app stores, later it's renamed to Tiktok after ackquired by Bytedance. +Around 2010, I worked for a company that developed insurance software. The company has developed quite well. It was founded in 2000 and has grown to a scale of 1,000 people after 10 years. The management tried to go public. However, it was not smooth, and after many years, it has not yet been able to IPO. I personally think that it is a business model problem. There are too many customized developments around the needs of large insurance company customers. This is too close to the outsourcing model, not the product model or the platform model, and it is difficult to scale expansion. + +When I worked in this company, I had two colleagues Yang Luyu and Zhu Jun. They left the company in 2014 and established a start-up company to develop a short video app on mobile phones and become a short video community platform. The team was only 6 people, but they have developed a small product that has brought explosive growth. After 3 years of innovation and hard work, in 2017, they were acquired by Bytedance for $1 billion. + +The initial name of the APP was Musical.ly. You may not be familiar with it, but you must know its later very famous name, Tiktok. Yes, it is the app that surpasses Facebook and often ranks first in the app store. Its influence in the world is so great that even Trump threatened for sanctions. You can find other similar success stories, about making good money from mobile apps or games. You may heard, or just google the internet. diff --git a/README.md b/README.md index 00698e2..3f6906b 100644 --- a/README.md +++ b/README.md @@ -84,9 +84,11 @@ From Coding to Monetization:Programmer's Financial Freedom Approach 真实案例 3: -2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,管理层试图上市。 然而,直到今天,它们还没有能够起飞和上市,因为商业模式有太多的定制开发,与外包模式太接近了,而不是产品模式或平台模式,难以规模化扩张。 +在2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,2000年创立,经过10年发展到1000人的规模,管理层试图上市。 然而并不顺利,又过了许多年,它还没有能够IPO。我个人以为,是商业模式的问题,围绕着大保险公司客户的需求,有太多的定制开发。这与外包模式太接近了,而不是产品模式或平台模式,难以规模化扩张。 -我的两位前同事阳陆育与朱骏,在2014年离开了这家公司,成立了一家初创公司,在手机上开发一个短视频APP,成为一个短视频社区平台。 前几天,在经过三年的创新和努力之后,他们以10亿美元的估值被今日头条收购了。他们的名字叫Musical.ly,你可以在应用程序商店的顶部列表中找到它。作为国内用户,也许你不一定熟悉它,但是你一定知道它后来的名字,Tiktok,对,就是那个超越了 Facebook 排在第一名的 APP。 +我在这家公司工作的时候,有两位同事阳陆育与朱骏。他们在2014年离开了这家公司,成立了一家初创公司,开发一个手机上的短视频APP,成为一个短视频社区平台。团队仅仅6个人,他们开发出的一个小小的产品,却带来了爆炸式的增长。在经过3年的创新和努力之后,也就是2017年,他们被今日头条以10亿美元的估值收购了。 + +最初APP的名字叫Musical.ly,也许你不一定熟悉它,但是你一定知道后来它的鼎鼎大名,Tiktok。对,就是那个超越了 Facebook、经常排在应用商店第一名的APP。它在全世界的影响力,甚至大到曾经被特朗普威胁要制裁。 你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 From cda0a576ca29a85164db321b6e27a57f6da278dc Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Sun, 26 Dec 2021 18:46:50 +0800 Subject: [PATCH 22/24] update content --- README.en.md | 49 ++++++++++++++++++++++++++++++------------------- README.md | 24 ++++++++++++++++++------ 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/README.en.md b/README.en.md index 356156a..491ff32 100644 --- a/README.en.md +++ b/README.en.md @@ -107,26 +107,37 @@ In addition, there are some cross-platform languages and tools, more friendly to * [Unity3D](http://unity3d.com/) IDE and integrated MonoDevelop, C# is the core language. * [Xamarin](https://www.xamarin.com/) acquired by Microsoft, and its sponsored open source project [Mono](http://www.mono-project.com/), used to develop APP, C# is the core language. -In the tutorial below, we chose the easiest javascript as the main development language for subsequent content. In fact, it is also the most active language on github. It can be used to develop: -* Web pages, running in browser; -* Single-page WebApp, running in browser; -* Command line tools, based on [nodejs](https://nodejs.org/); -* Network cloud services, based on nodejs; -* Hybrid APP, based on [cordova](http://cordova.apache.org/) technology; -* APP with native UI experience, based on [react-native](http://www.reactnative.com/). -* Even desktop applications, such as the Adobe Brackets code editor, also developed with javascript. - -JavaScript can be used to develop front-end and back-end, code logic can be reused, thereby reducing the skill threshold and development costs. The requirements of the development environment is also very low, as long as there is a friendly code editor, a browser for testing and debugging, that's almost enough. - -The following are the the necessary environment and tools for development with javascript: -* Chrome browser, comes with developer tools and javascript console for running and debugging. -* [Adobe Brackets](http://brackets.io/) text editor (if you're used to [Sublime Text](http://www.sublimetext.com/) or [Atom](https://atom.io /) Or [Visual Studio Code](http://code.visualstudio.com/), no problem) -* iMac, with a huge 27-inch screen, really wide view for many windows, MacBook or Air is also okay; -* Mac OS X command line is very powerful, and convenient to support most LInux tools through [MacPorts](https://www.macports.org/) or [Homebrew](http: // brew.sh/). -* Xcode (Mac version only), must-have to build and debug iOS apps. -* Android Studio, used to build and debug Android APP. +In the following tutorials, we choose the simplest javascript as the main development language for the follow-up introduction. + +Notice: +Don't have a stereotype about javascript and think that it is just a simple script program for making web pages. + +In fact, it is an extremely versatile language for programming and the most active language on github. It can be used to develop: +* Web pages running in the browser; +* Single-page WebApp running and embedded browser; +* Command line tools based on [nodejs](https://nodejs.org/), such as Cordova CLI command line tools; +* Network cloud services based on nodejs, such as Amazon's Bluestacks cloud service; +* Based on [cordova](http://cordova.apache.org/) technology, hybrid APP. +* Based on [react-native](http://www.reactnative.com/) to develop apps with native UI experience. +* Even, you can use [Electron](https://www.electronjs.org/) to develop desktop applications, such as Atom, Visual Studio Code code editor. -If you get used to Windows and do not have a Mac, it's also okay, you can develop for Android at hand. As to iOS, you may need some online service for apps building and packaging, like Adobe PhoneGap Build, or Intel XDK, etc. You can google how to use them. +Because javascript can be used to develop front-end and back-end at the same time, code logic can also be used for front-end and back-end reuse, thereby reducing skill thresholds and development costs. The development environment required for getting started is also very low, as long as there is a friendly code editor and a browser for running and debugging. + +The following are the environment and tools needed for development with javascript: +* Chrome browser, comes with developer tools and javascript console for running and debugging. +* [Adobe Brackets](http://brackets.io/) text editor (if you are used to [Sublime Text](http://www.sublimetext.com/) or [Atom](https://atom.io /) Or [Visual Studio Code](http://code.visualstudio.com/), no problem) +* iMac desktop, huge 27-inch screen, unrestricted view; Mac OS X command line is very powerful and convenient, through [MacPorts](https://www.macports.org/) or [Homebrew](http:// brew.sh/), command line tools or libraries on Linux basically support it. +* Xcode (Mac version only), to debug the iOS APP, an iMac computer or MacBook laptop is also necessary. +* Android Studio, used to debug Android APP. + +If you are used to Windows and don't have a Mac, it will be a little troublesome. Although there are also methods, there are some cloud services that provide compilation and packaging, but these services are often due to commercial interests and will adjust their strategies to terminate the services. +For example: +* Adobe PhoneGap Build +Out-dated. Since 2020.10.1, Adobe has stopped serving the cloud build service. +* Intel XDK +Out-dated. XDK has been re-used by Intel for IoT development, and core mobile development functions have been deprecated by Intel and are no longer supported. The accompanying cross-platform Cordova cloud construction service has been offline. It is not recommended to use XDK for new mobile/tablet application development projects. +* [Ionic AppLow](https://ionic.io/appflow) +Appflow is the continuous integration (CI) and continuous deployment (CD) platform of the Ionic development team. It claims that Ionic Appflow can deploy builds to destinations, such as the Apple App Store and Google Play Store, completely in the cloud. But, a Mac is still recommended, for both Android and iOS development. diff --git a/README.md b/README.md index 3f6906b..d8778a7 100644 --- a/README.md +++ b/README.md @@ -113,16 +113,21 @@ From Coding to Monetization:Programmer's Financial Freedom Approach * 用于开发游戏的 [Unity3D](http://unity3d.com/) IDE 以及集成的 MonoDevelop,用的是 C# 作为主要的开发语言。 * 微软收购的 [Xamarin](https://www.xamarin.com/) 以及赞助的开源项目 [Mono](http://www.mono-project.com/),用来开发 APP,以 C# 作为主要的开发语言。 -在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。实际上,它也是 github 上最为活跃的语言。它可以用来开发: +在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。 + +注意: +千万不要对 javascript 有刻板印象,而认为它仅仅是做网页的简单脚本程序。 + +实际上,它是编程用途极为广泛的语言,也是 github 上最为活跃的语言。它可以用来开发: * 运行于浏览器内的 Web网页; * 运行与内嵌浏览器的 单页WebApp; -* 基于 [nodejs](https://nodejs.org/) 的命令行工具; -* 基于 nodejs 的网络云服务; +* 基于 [nodejs](https://nodejs.org/) 的命令行工具,例如 Cordova CLI 命令行工具; +* 基于 nodejs 的网络云服务,例如 亚马逊 的 Bluestacks 云服务; * 基于 [cordova](http://cordova.apache.org/) 技术的,混合(hybrid) APP。 * 基于 [react-native](http://www.reactnative.com/) 开发 native UI体验的 APP。 -* 甚至,也能够开发出桌面应用,例如 Adobe Brackets 代码编辑器。 +* 甚至,也能够使用[Electron](https://www.electronjs.org/)开发出桌面应用,例如 Atom,Visual Studio Code 代码编辑器。 -因为它可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 +因为使用 javascript 可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。入门所需要的开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 以下是用 javascript 来做开发的所需要的环境和工具: * Chrome浏览器,自带开发者工具 和 javascript 控制台,用来运行和调试。 @@ -131,7 +136,14 @@ From Coding to Monetization:Programmer's Financial Freedom Approach * Xcode(只有 Mac 版本),要调试 iOS APP,有台 iMac电脑或者 MacBook笔记本电脑,这也是必备的。 * Android Studio,用来调试 Android APP。 -如果你习惯了 Windows 也没有一台 Mac,会稍微麻烦一点。不过也是有方法的,有一些专门提供编译、打包的云服务,例如 Adobe PhoneGap Build,或者 Intel XDK,我们后面会介绍如何使用。 +如果你习惯了 Windows 也没有一台 Mac,那就会稍微麻烦一点。虽然也是有方法的,有一些专门提供编译、打包的云服务,但是这些服务往往出于商业利益的关系,会调整策略终止服务。 +例如: +* Adobe PhoneGap Build +已失效。从 2020.10.1 之后,Adobe 已经停止服务 该云服务。 +* Intel XDK +已失效。XDK 已被英特尔重新用于物联网开发,核心移动开发功能已被英特尔弃用且不再受支持。 随附的跨平台 Cordova 云构建服务已下线。 不建议将 XDK 用于新的手机/平板应用程序开发项目。 +* [Ionic AppLow](https://ionic.io/appflow) +Appflow 是 Ionic 开发团队的持续集成 (CI) 和持续部署 (CD) 平台。它声称 Ionic Appflow 可以将构建部署到目的地,例如 Apple App Store 和 Google Play Store,完全在云中。 ### Hello, World! From 9864b7f91241e403d69dcdba3245a3e65eedf4dc Mon Sep 17 00:00:00 2001 From: Liming Xie Date: Thu, 13 Jul 2023 11:18:20 +0800 Subject: [PATCH 23/24] make English version as default --- README.en.md | 935 --------------------------------------------------- README.md | 633 +++++++++++++++++----------------- README.zh.md | 926 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1247 insertions(+), 1247 deletions(-) delete mode 100644 README.en.md create mode 100644 README.zh.md diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 491ff32..0000000 --- a/README.en.md +++ /dev/null @@ -1,935 +0,0 @@ -# From Coding to Monetization:Programmer's Financial Freedom Approach - -【从编码到变现:程序员财务自由之路】 - -[中文版本/Chinese Version](./README.md) - -![rich](demo/richman.jpg) - -## Content - -* [Foreword](#Foreword) -* [Positioning](#Positioning) -* [Getting Started](#Getting-Started) - * [Language and Tools](#Language-and-Tools) - * [Hello, World!](#hello-world) - * [Simple APP](#simple-APP) - * [Add Ad Banner](#add-ad-banner) - * [Register Ad Account](#register-ad-account) - * [Settings for Payment](#settings-for-payment) - * [Publish APP](#publish-app) - * [Calcuate Ad Revenue](#calculate-ad-revenue) -* [Advanced](#advanced) - * [Demand is Fundamental](#demand-is-foundamental) - * [User Experience](#user-experience) - * [What Ad is Best](#what-ad-is-best) - * [Which Ad Network Shall I Choose](#which-ad-netowrk-shall-i-choose) - * [Promote Your APP](#promote-your-app) - * [Online APP](#online-app) - * [Cloud Service](#cloud-service) -* [Expert](#exert) - * [Data Analysis](#data-analysis) - * [Ad Optimization](#ad-optimization) - * [In-App Purchase](#in-app-purchase) - * [Social Marketing](#social-marketing) - * [Advertising](#advertising) -* [Appendix](#appendix) - * [Internet Marketing Terminology](#internet-marketing-terminology) - * [How to Publish APP to Apple AppStore](#how-to-publish-app-to-app-store) - * [How to Publish APP to Google Play Store](#how-to-publish-app-to-google-play-store) - * [How to Google Analytics for Data Analysis](#how-to-use-google-analytics-for-data-analysis) - -### Forword - -This book, is written for programmer. - -It's not about a programming language, not about a design pattern, and not about how to estimate man-hour, or how to manage project. - -This book is about: monetization. Simply speaking, how to earn money. - -As a programmer, you must have spent much time to learn, mastered several programming lanugages, used dozens of developing tools. In order to design stable and flexible architecture, you may have learned various design patterns. In order to boost working efficiency, you may have used many mature frameworks and automation testing tools. In short, you become an excellent programmer. - -And, you may even accumulate experience in management, take the initiative to learn the theoretical knowledge of project management, mastered a variety of R&D organizating model, become the R&D team leader or manager. - -In most cases, as a programmer or R&D team, you work on requirements analysis, architecture design, module demarcation, interface design, coding implementation, testing, and release versions, as required by the project manager or product manager. These tasks, no doubt, are the most familiar routine work for programmers. - -Unfortunately, for most programmers, your everyday concerns are just development. Accept requirements, deliver versions, that's all the product manager or the client has you to do. Even many excellent programmers or technical guru, they seldom care how software brings revenue directly. Most developers, just focus on R&D technical work, or even just focus on coding work, which is very limited. - -In fact, R&D, plus sales, payment, promotion, customer support, and maintenance, is the complete closed-loop of software's value chain. - -This book is about how to start from coding, to get paid, and how to get users. Step by step, on every details. - -Once you have mastered how to monetize from your software, youo will be more concerned with user feedback, caring about market needs, and the quality of your products. As they will bring you better financial returns. Then it's not far away to achieve financial freedom. - -If you feel that the content of this book is helpful, please give you support, by staring it. - -### Positioning - -Since it is to talk about earning money, we will not discuss the hard way of outsourcing, in which the business model is to sell limited life time as money. - -Considering factor of limited man power, time and resource, we will not discuss carrier-class, or enterprise-class large-scale systems. As they require large investment and long research cycle for complex requirement, which is beyond congrol of individuals and small teams. - -We focus on individuals or small teams. In the era of mobile internet, we have heard many miracle stories about individuals or small teams earn lots of money or even grow fast to unicorn enterprise. - -Real story 1: -[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) legend, a small mobile game developed by a Vietnam programmer in 2-3 days, swept the globe in just a few weeks, and bring income of $50,000 US dollors each day. This is undoutedly by chance, lucky guy, but at least, there is a probability of occurrence. - -Real story 2: -I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. - -Real story 3: -Around 2010, I worked for a company that developed insurance software. The company has developed quite well. It was founded in 2000 and has grown to a scale of 1,000 people after 10 years. The management tried to go public. However, it was not smooth, and after many years, it has not yet been able to IPO. I personally think that it is a business model problem. There are too many customized developments around the needs of large insurance company customers. This is too close to the outsourcing model, not the product model or the platform model, and it is difficult to scale expansion. - -When I worked in this company, I had two colleagues Yang Luyu and Zhu Jun. They left the company in 2014 and established a start-up company to develop a short video app on mobile phones and become a short video community platform. The team was only 6 people, but they have developed a small product that has brought explosive growth. After 3 years of innovation and hard work, in 2017, they were acquired by Bytedance for $1 billion. - -The initial name of the APP was Musical.ly. You may not be familiar with it, but you must know its later very famous name, Tiktok. Yes, it is the app that surpasses Facebook and often ranks first in the app store. Its influence in the world is so great that even Trump threatened for sanctions. - -You can find other similar success stories, about making good money from mobile apps or games. You may heard, or just google the internet. - -In this book, what we want to explore, is to make full use of limited time and resource, focus on a very narrow area of requirement, to develop a very unique mobile app or small game, publish to global app store, acquire users, and make money. - -Perhaps, you are a technical guru, who masetered dozens of programming languages, design patterns, front-end to back-end full stack development capabilies. However, not every technology can be used to make quick money. The hardest or most intersting technology, may not be the easiest technology to make money. Sometimes, we need most flexible and scalabe architecture. Sometimes, we have to choose the most rapid development methods. - -Maybe, you are a newbie, just getting started, and only know how to write a webpage. It does not matter. The programming skills required to make money, can also be very simple. Just one thing, if any knowledge is required, we have to learn it quickly. We are in a era of fast changing world, programmers must be good at learning new things. - -## Getting Started - -### Language and Tools - -The language and tools for developing apps are often tied to the platform. -* If it is iOS, it is usually Objective C, and the development tools are [Xcode](https://developer.apple.com/xcode/) from Apple (development tools only run on Mac) toolset. -* If it's Android, it's usually Java, and development tools are Google's [Android Studio](http://developer.android.com/tools/studio/index.html) (a cross-platform development tool) toolset. -* If it is Windows Phone, that is C #, the development tool is Microsoft's [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx) toolset (only run On Windows)。 - -In addition, there are some cross-platform languages and tools, more friendly to developers. Develope once, package and release on multiple platforms: -* HTML5, can be used to develop apps and games, javascript is the core language. -* [Cocos2d-X](http://www.cocos2d-x.org/) for game development, C++ is the core language. -* [Unity3D](http://unity3d.com/) IDE and integrated MonoDevelop, C# is the core language. -* [Xamarin](https://www.xamarin.com/) acquired by Microsoft, and its sponsored open source project [Mono](http://www.mono-project.com/), used to develop APP, C# is the core language. - -In the following tutorials, we choose the simplest javascript as the main development language for the follow-up introduction. - -Notice: -Don't have a stereotype about javascript and think that it is just a simple script program for making web pages. - -In fact, it is an extremely versatile language for programming and the most active language on github. It can be used to develop: -* Web pages running in the browser; -* Single-page WebApp running and embedded browser; -* Command line tools based on [nodejs](https://nodejs.org/), such as Cordova CLI command line tools; -* Network cloud services based on nodejs, such as Amazon's Bluestacks cloud service; -* Based on [cordova](http://cordova.apache.org/) technology, hybrid APP. -* Based on [react-native](http://www.reactnative.com/) to develop apps with native UI experience. -* Even, you can use [Electron](https://www.electronjs.org/) to develop desktop applications, such as Atom, Visual Studio Code code editor. - -Because javascript can be used to develop front-end and back-end at the same time, code logic can also be used for front-end and back-end reuse, thereby reducing skill thresholds and development costs. The development environment required for getting started is also very low, as long as there is a friendly code editor and a browser for running and debugging. - -The following are the environment and tools needed for development with javascript: -* Chrome browser, comes with developer tools and javascript console for running and debugging. -* [Adobe Brackets](http://brackets.io/) text editor (if you are used to [Sublime Text](http://www.sublimetext.com/) or [Atom](https://atom.io /) Or [Visual Studio Code](http://code.visualstudio.com/), no problem) -* iMac desktop, huge 27-inch screen, unrestricted view; Mac OS X command line is very powerful and convenient, through [MacPorts](https://www.macports.org/) or [Homebrew](http:// brew.sh/), command line tools or libraries on Linux basically support it. -* Xcode (Mac version only), to debug the iOS APP, an iMac computer or MacBook laptop is also necessary. -* Android Studio, used to debug Android APP. - -If you are used to Windows and don't have a Mac, it will be a little troublesome. Although there are also methods, there are some cloud services that provide compilation and packaging, but these services are often due to commercial interests and will adjust their strategies to terminate the services. -For example: -* Adobe PhoneGap Build -Out-dated. Since 2020.10.1, Adobe has stopped serving the cloud build service. -* Intel XDK -Out-dated. XDK has been re-used by Intel for IoT development, and core mobile development functions have been deprecated by Intel and are no longer supported. The accompanying cross-platform Cordova cloud construction service has been offline. It is not recommended to use XDK for new mobile/tablet application development projects. -* [Ionic AppLow](https://ionic.io/appflow) -Appflow is the continuous integration (CI) and continuous deployment (CD) platform of the Ionic development team. It claims that Ionic Appflow can deploy builds to destinations, such as the Apple App Store and Google Play Store, completely in the cloud. - -But, a Mac is still recommended, for both Android and iOS development. - -### Hello, World! - -To development frond-end app with javascript, in fact, there are three closely related languages: HTML / javascript / CSS. -* HTML is responsible for the content. -* javascript is responsible for logic. -* CSS is responsible for rendering. - -Here is a simple example: -```html - - - - - -Hello - - - - -

Hello, World!

- - -``` -```javascript -// main.js -console.log('hello, world!'); -``` -```css -/* main.css */ -body { - width: 100%; - height: 100%; - padding: 0px; - margin: 0px; -} -h1 { - color: blue; - padding: 40px; - margin: 10px; - border: 1px solid gray; - display: inline-block; -} -``` - -Open it with Chrome and we see the following display: -* The main browser window above shows the contents of the HTML and is rendered in the format and effect specified by the CSS. -* Open the Chrome console window, it shows the javascript call console.log () output debugging information. - -![HelloWorld](demo/helloworld.png) - -Using HTML5 / javascript to do development, getting started is as simple as that. - -If you need to develop high-quality apps, you need to master HTML / CSS and javascript, especially HTML5 / CSS3, master HTML DOM and some javascript libraries, such as [jQuery](https://jquery.com/), etc. Here are some free tutorials for getting started: -* [HTML series tutorial](http://www.w3school.com.cn/h.asp) -* [JavaScript Tutorial](http://www.w3school.com.cn/js/index.asp) -* [JavaScript Advanced Tutorial](http://www.w3school.com.cn/js/index_pro.asp) - -Through these tutorials, you can learn: -* A simple index.html page; -* A unified main.css file that controls and adjusts the presentation of interface elements -* A set of javascript files that enable dynamic presentation and switching of content through access to the HTML DOM. - -For you, as a programmer, this is not hard at all. - -### Simple APP - -Next, we want to turn such a simple web app into a mobile app. To be exact, it should be called Hybrid APP, a hybrid program. Because it's native app, it wraps a webview, which runs the web app we wrote. - -We need to use a technical framework called Cordova. - -Originally a product developed by a small team acquired by Adobe, it was renamed [PhoneGap](http://phonegap.com/). Adobe later turned it open source and donated it to the Apache Foundation, then called [Apache Cordova](https://cordova.apache.org/). - -Now Cordova has become a very popular technical framework, but also sought after by many commercial companies, in addition to Adobe, Intel, Microsoft, IBM and other companies have also introduced support Cordova products. - -The Cordova technology framework provides a command-line tool developed using nodejs, as well as a variety of plug-ins. - -We first have to install [nodejs](https://nodejs.org/en/), after installation, it will provide two basic commands: -```bash -$ which node -/usr/local/bin/node -$ node -v -v4.8.4 -$ npm -v -2.15.11 -``` - -* node --- the javascript engine, compile / interpret / execute. It is based on Google's open source Chrome V8 engine, event-driven, non-blocking IO mode operation, lightweight and efficient. -* npm --- NodeJs Package Manager, install package manager. All nodejs packages are downloaded and installed using npm (you can also use it to publish your own packages to the npm repository) - -Next, use npm to install [cordova](https://cordova.apache.org/): -```bash -$ npm install -g cordova -$ which cordova -/usr/local/bin/cordova -$ cordova -v -7.1.0 -``` - -Create a project with Cordova CLI: -```bash -# Syntax:cordova create -$ cordova create temp com.rjfun.demo Demo -``` - -Compile and build, then run the app in iOS emulator: -```bash -$ cd temp -$ cordova platform add ios -$ cordova build ios -$ cordova emulate ios -``` - -Now we will see the iOS emulator is started, and APP launched: - -![Cordova iOS](demo/cordovaios.png) - -Or, you can also connect your iPhone device to Mac, the use following command to install and launch the APP: -```bash -$ cordova run ios --device -``` - -Now the running one is Cordova's Demo project. Open Cordova project, you can see this directory structure: - -![Cordova Proj](demo/cordovaproj.png) - -Next, delete the contents of the www directory, replace with the index.html, main.js, main.css we wrote earlier and make a few changes: -```html - - - - - - - - - - - - - - - - Hello - - - - -

Hello, World!

- - -``` - -```javascript -// main.js -console.log('hello, world!'); - -// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in -document.addEventListener('deviceready', function(){ - console.log('deviceready'); - - // TODO: Start the business logic of our web app -}); -``` - -```css -/* main.css */ -body { - width: 100%; - height: 100%; - padding: 0px; - margin: 0px; - background-color: silver; -} -h1 { - padding: 40px; - margin: 30px; - background-color: yellow; - color: blue; - border: 1px solid gray; - display: inline-block; -} -``` - -Rerun the cordova project (it will compile, install, run automatically): -```bash -$ cordova emulate ios -``` - -So, you can see that Web App is running in the iOS simulator: - -![Hello World Cordova](demo/helloworldcordova.png) - -To write an easiest APP, in fact, is really simple, isn't it? - -### Add Ad Banner - -As a programmer, we have no doubt that you have mastered the HTML / CSS and javascript programming capabilities to provide some interesting and useful features. - -Next, we want to add monetization to the app, which is to make real money. - -The easiest way to realize is to add an ad banner, such as Google's AdMob. -* By showing ads, users click on interesting ads, browse the product, or install other apps. -* Advertisers / advertisers (advertisers, Advertizer) pay advertising costs to Google. -* Google will pay a portion of it to the person / company (publisher, publisher) who posted the ad. -* Google's role in it is called the Ad Platform, or Ad Network. - -The technical architecture of the Cordova framework is a web app with some common plug-ins that provide access to specific functions of the handset and integration with third-party systems. - -We implemented integration with Google AdMob via the plug-in cordova-plugin-admobpro. This is a plug-in based on the Google AdMob SDK, and is the most popular and easiest to use plug-in for the moment. Through it, just a line of javascript code to complete the SDK API call. - -Now let's add plugins to the cordova project. - -```bash -$ cordova plugin add cordova-plugin-admobpro -``` - -Modify main.js, let's add a few lines into the initialization: - -```javascript -// main.js -console.log('hello, world!'); - -// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in -document.addEventListener('deviceready', function(){ - console.log('deviceready'); - - // When the app is initialized, create an ad banner below the screen - if(AdMob) AdMob.createBanner({ - adId: 'ca-app-pub-6869992474017983/4806197152', // need to register as a user on the AdMob website and create an Ad Unit Id - position: AdMob.AD_POSITION.BOTTOM_CENTER, // show at bottom / center - overlap: false, // no overlap the web app content - isTesting: true, // show testing ad, please remove this line when formal release - autoShow: true // auto show it when ad resource downloaded and ready - }); -}); -``` - -Rerun the cordova project (it will compile, install, run automatically): -```bash -$ cordova emulate ios -``` - -So, you can see that Web App is running in the iOS simulator: - -![AdMob Banner](demo/admobbanner.png) - -Look, at the bottom of the screen, the banner is displayed. - -This is just a test advertisement for debugging purposes only. - -We need to register the user on [AdMob official website] (https://apps.admob.com/) and create an Ad Unit Id that replaces the string of digits following adId in the code. And in the official version of the release, remove the `isTesting: true` line of code. - -### Register Ad Account - -Here we introduce, how to register account, how to create ad unit, how to set bank receipt information. - -Visit Google's AdMob website (https://www.google.com/admob/) to sign up for a new account. - -![AdMob Site](demo/admobsite.png) - -After registering, visit the AdMob website (https://apps.admob.com/), click on the menu "monetization", click on the red button in the upper left corner "+ monetize new application" to add a new APP: - -![AdMob New App](demo/admobnewapp.png) - -Then create banner ads: - -![AdMob New Banner](demo/admobnewbanner.png) - -You can get the ad unit ID, copy it to the source code: - -![AdMob Ad Unit ID](demo/admobadunitid.png) - -### Set Payment Info - -After registering your account, you can accumulate ad revenue by putting the ad unit into the APP for user actual usage. - -There are two more steps to complete the Google advertising payment you receive: -* Verify address. Google will generate a PIN code printed on the card, send to your mailing address. -* Set up payment information. Can be Western Union or bank account. - -However, newly registered account has no access to set bank information. Only your cumulative advertising revenue reached the basic threshold (currently 10 US dollars), Google will allow you to set up payment information. Through this method, Google can filter out a large number of non-active accounts. - -#### Verify PIN Code - -![Verify PIN](demo/verifypin.png) - -Click "Fix It", enter PIN input UI. - -![Verify PIN](demo/verifypin2.png) - -This process of verifying your PIN is slow and typically takes 2-4 weeks. - -So, if the date of the most recent PIN was displayed, wait patiently. After receiving the PIN code, it will be entered in the box above, submitted for verification. - -#### Set Payment Info - -![AdMob Payment](demo/admobpay1.png) - -![AdMob Payment](demo/admobpay2.png) - -![AdMob Payment](demo/admobpay3.png) - -After the two steps are set up, when the advertising revenue, Google will calculate the advertising revenue of the month at the end of each month, and pay you around the 20th of next month. - -### Publish APP - -The APP we developed, to be installed by user and generate revenue, needs an important part: released to the app store. -* If Android APP, usually Google Play Store. -* If iOS APP, released to Apple AppStore. - -Here we use the Apple AppStore as an example, to illustrate how to register a developer account and publish an app. - -Visit the Apple Developers Web site (https://developer.apple.com/) and sign up for login. To release an app on the Apple AppStore, you pay an annual fee of $ 99 a year, which is the same for individual developers and corporate developers. - -![Apple Developer](demo/appledev.png) - -The following steps are needed to publish APP to the AppStore: -* Generate developer digital certificate for installation package signature. -* Create an APP ID for your APP, or use "*" or "com.rjfun. *" As a generic APP ID for more than one app, if no in-app purchase. -* Generate Provisioning Profiles for your APP, download it locally, open it in Xcode, and manage it. - -Then use Xcode to open the XXX.xcodeproj project file in the Cordova project, compile and archive (Archive). Successfully archived APP packages can be submitted to AppStore for review. - -You need to log into iTunesConnect (https://itunesconnect.apple.com/), to prepare, publish and manage your APP. - -![iTunes Connect](demo/itunesconnect.png) - -Create a new APP, add the name, introduction, icon, pricing and other information, and set it as ready to submit the status, and then you can Organizer Xcode in the successful archive (Archive) installation package submitted to the AppStore for review . - -![Xcode Organizer](demo/xcodeorganizer.png) - -Usually it will take Apple 2 or 3 days to review your app. If the review passes, you can see your app in the AppStore. - -### Calculate Ad Revenue - -When a user downloads, installs and runs an app on his device, he or she requests the official ad content from Google's ad server for display. - -You can visit the Google AdMob website to see daily ad impressions, clickthrough rates, and revenue. This site also offers very powerful reporting capabilities that show very detailed reports based on country, ad unit, time period. Google has an AdSense app on the AppStore, and you can install this app on your phone to see your AdMob earnings daily. - -Each time a user clicks on an ad of interest, it generates advertising revenue. Most of your ad serving is calculated based on the number of clicks, the so-called CPC ads. - -In calculating advertising revenue, there are several common basic terms: -* CPC (Cost Per Click, cost-per-click) is about US $ 0.06 ~ 1.0; -* CTR (Click Through Rate, show CTR), the result of a large number of statistics is about 1%; -* CPM (Cost Per Mile, CPM), CPM can also be calculated by CPC and CPR, the approximate range is US $ 0.5 ~ 20. - -The price per click varies based on the type of ad, the price that is served, and so on. Since different countries in the world have different economic levels, there are also big differences. - -E.g, -* In the United States, an ad click may yield a gain of $0.2; -* In Brazil, maybe only 2 cents, a difference of 10 times. -* In Japan, clicks on advertising revenue is quite high. - -The following is a comparison of a set of data: - -USA | Brazil ----|--- -![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) -Japan | Germany -![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) - -If we conservatively estimate $1 CPM (cost per thousand impressions), 100,000 ads per day will generate about $100 in cash. Then it will generate $3,000 in a month (including weekends and holidays!). - -Let's compare it with the average programmer's salary. In Shanghai, an experienced programmer with 5 year experience, the salary is about $2,300 or so. If you make such the APP, with 10,000 DAU (daily active user), the revenue generated from advertising can exceed the salaries of a programmer. Or even more, if optimized very well. - -I know a Brazilian, develop his game with HTML5 technology, simple, but very interesting. Daily active users is about 100,000, advertising revenue has more than $25,000 per month, so as to achieve the financial freedom. - -### Advanced - -### Demand is fundamental - -Earlier we described how to add monetization to APP. But to really get a decent return, you still have to get enough users. In other words, you have to develop enough good APP, can really solve the user's problem, will have more users, more frequent use. - -How to develop a more popular APP? In fact, this is not a programming problem. - -Perhaps you are a technical expert, using the most difficult, coolest technology, but the software products developed, may not be welcomed by users of the product. Sometimes, you use a technology that is actually relatively simple, but really pay attention to the user's pain points, to solve the user's concerns, it is possible your product will be welcomed by users, because of good reputation in the social network to get the natural spread. - -I recommend a book, "Demand - the Fundamentals of Creating Great Business Legends," by Adrian Silesivski. - -Here are some tips from entrepreneurs: - -> This is a good book worth every entrepreneur and every manager of the company to read, and even everyone in the organization should understand the concepts. The book gives some models for creating needs, which are very valuable to readers, we need good ideas, but we need more ways to practice ideas. These two books are done, very worth reading, especially recommended. -- Sun Taoran, founder, chairman and president of La Cara Pay Ltd., author of "Entrepreneurship 36 Military Regulations". - -> Behind every complaint is hidden an unmet need, and behind every need inevitably hides a market that can not be ignored. In fact, any product that meets the functional needs of the user from the outset should be upgraded to the spirit level, the user refuses to trouble, the user needs comfort, it does not seem to have anything to do with the profit, but I'm sorry, it is related to your market. You do not meet, entrepreneurs will go to their own ground-breaking satisfaction. Then waiting for you, or will be a huge crisis of life and death. Therefore, please pay attention to the hope of trouble, rather than to their complaint. This is exactly the most valuable thing that "demand" brings to us. -- Du Zijian, founder of Huayi Media, social media marketing researcher, bestseller "Boundless" author. - -### User Experience - -Although the sale of Apple mobile phone is very expensive, but still very popular, why? It is undoubtedly the best user experience to win. If you read "Steve Jobs Biography", you can know that the birth of Apple's mobile phone, in fact, is to solve the pain of traditional phones difficult to use. - -Naturally, the app or game we develop on our mobile phone must also be highly user-focused and put it in a strategic position. Mobile APP, not the pursuit of powerful features, complete, you can only do a small feature, but to effectively focus on the needs of users, and provide excellent user experience. - -A rather typical example is this "Flashlight" APP, which is to turn on the phone's LED bulb to temporarily light up the darkness. - -![Torch APP](demo/torchapp.png) - -This APP has more than hundreds of millions of users, of course, its economic return is also extremely impressive. - -The number of user comments exceeded 6 million and the users wrote: -* Jennifer Baylis: easy to use. # 1 The best Flashlight APP! Very easy to use, open very fast! -* Kitty Davis: I just need such a flashlight APP. -Dennis Castello: It's exactly what it takes and it's done really well. -* Joseph Low: easy to use. Let it work easily! highly recommended! - -### What Ad is Best - -In the mobile advertising arena, there are many forms of advertising, and are also constantly evolving. -* banner Ad -* interstitial Ad -* native Ad -* reward video Ad -* IAP (in-app purchase) Ad - -Which ad is best for your app, depending on the situation. This requires a good balance of user experience and revenue. If the ad is displayed improperly, or show too often, affecting the user experience or even cause the user offensive, it is the cart before the horse. - -banner Ad | interstitial Ad ----|--- -![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) - -These two kinds of advertisements are the most basic and classic, each has its pros an cons. Banner ads occupy only a small space at the bottom of the screen, changing the ad content every 60 seconds. The advantage is not too affect the user interface and experience, the disadvantage is because less obtrusive, not easy to arouse the user's attention and clicks. - -Interstitial ad is full-screen, pop-up at a specific time, more able to attract the user's attention and click. Because of this, the interstitial ad has better effects and click revenue is higher than the banner ads more than 5 times, so more recommended. - -When using interstitial ad, please pay special attention to the pop-up time, do not interrupt the user's continuous operation and gaming experience, otherwise it will cause the user's strong aversion. Best practice is to put it in transition between the two stages, such as the game is just over, pop-up screen ads, and then continue to the next level. - -Using cordova-plugin-admobpro to display interstitial ads is also straightforward, requiring just two lines of javascript to complete. One line of code prepares inventory and the other line of code shows ads. - -Here is the example: -```javascript -// When the game starts, it starts to prepare for interstitial ads, and the background thread downloads the inventory -if(AdMob) AdMob.prepareInterstitial({ - adId: "__ad_unit_id_here__", - autoShow: false -}); - -// At the end of the game level, call API to display the interstitial ad -if(AdMob) AdMob.showInterstitial(); -``` - -The above two kinds of advertisements are the easiest to use forms of advertisement, and the work integrated into the APP is also the easiest. - -Native Ad is a new way to show your ads in a more harmonious way between their own content. It does not seem obtrusive or abrupt. It's the type of advertising that has the least impact on user experience. Facebook AudienceNetwork and Flurry launched native ads long before, and later Google AdMob also introduced it to developers. - -Reward video Ad, a new ad in the mobile advertising industry. It encourages users to watch ad videos and reward them with some kind of virtual item in the game or app. In previous advertising campaigns, Google did not support giving users encouragement, and even made it illegal to give rewards. Because this is likely to violate the user's own interest, resulting in false invalid clicks. For the new rewarded video ad, other advertisers first introduced and succeeded in the market, Google adopted a relatively flexible and pragmatic attitude. However, advertising video sources are not very rich, many are mediation way from other ad networks. - -IAP Ad is an innovative form of advertising. IAP Ad allows users to shop directly in-app. Because it needs to be integrated with the payment system or the Google Play Store, it's only supported on the Android system. With in-app advertising, app developers can benefit from: -* Maximize your revenue and user lifecycle value by implementing ad serving and in-app purchases in the same app. -* Google automatically helps you determine which users are likely to purchase in-app purchases and show ordinary paid ads to the remaining users. -* No need to develop your own in-app support system or add in-app support code to your app. -* Easily target various segments of the user community with different in-app purchases. By using In-App Ads with the AdMob Audience Builder, you can serve high-priced, in-app products to high-spending groups while showing them to you at lower prices. - -If you want to learn more about native ads, rewarded video ad, buy ads, go to Google [AdMob official documentation website](https://developers.google.com/mobile-ads-sdk/) for in-depth research and study how to use. - -### Which Ad Most Reliable - -Because of the profitable mobile advertising sector, the mobile advertising industry is also growing very fast. Over the past few years, there have been many mergers and acquisitions. For example, Google has successively acquired DoubleClick and AdMob, Flurry acquired by Yahoo!, MobFox acquired by Matomy, and Millennial Media acquired by AOL. - -![Top Ad Networks](demo/topadnetworks.jpg) - -Usually the ad platform will provide: -* SDK, providing API for accessing advertising system; -* Register, login and manage advertising system; -* Integration Guide, examples, FAQ; - -Information about the various mobile ad platforms can be found through search or through a number of different sources (eg, StackOverflow.com) and try selectively. - -Here are some of the advertising platforms I've tried: -* Google AdMob -* Facebook AudienceNetwork -* Yahoo! Flurry -* MobFox -* Apple iAd -* MoPub -* Millennial Media -* InMobi -* OpenX -* Smart AdServer -* ... ... - -By trying to use, I am more satisfied with AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox. Especially AdMob, is highly recommended. - -The reason why AdMob is the most highly recommended, there are some prominent advantages: -* Ad fill rate is high. Basically more than 98%, some countries slightly less than 90%, so you can take full advantage of user traffic. After all, it is no surprise that advertising is a major source of revenue and revenue for Google, with advertisers around the world. -* Payment promptly. The monthly earnings are settled at the end of the month and paid on the 20th of the following month; -* SDK is very stable. Integrated documentation and reference code Easy to use, with documentation and system interfaces in different languages; -* Reporting system powerful and easy to use. Data can be analyzed in different dimensions; -* Easy to use. A dedicated APP can be used to track earnings; -* Support in place. A dedicated technical support staff, technical forums with official support, dedicated to answer the technical aspects of SDK access; -* Regularly organize some preaching and training activities, as well as regular online video lectures; -* Customer service is in place. Very patient and friendly, I keep in touch with them. - -Because of Google's excellence in innovation and consistent quality service, it has very high reputation among develoeprs. - -The cordova-plugin-admobpro plug-in, built on the AdMob SDK, not only encapsulates Objective-C / Java / C # native APIs into a unified javascript API but is also much easier to use. Just 1-2 lines of code to complete the ad display. Popular in Cordova's global community, this plug-in is the most-used monetization plug-in. The following is a plug-in download trend curve: - -![AdMob Download Trend](demo/admobprodltrend.png) - -Facebook AudienceNetwork is not bad. - -Facebook is not only the largest and most active social media, but also offers a variety of related SDKs, including AudienceNetwork for Advertising. Its developer website is https://developers.facebook.com/docs/audience-network. -* Facebook's Fill Rate is not as high as AdMob, about 45-75%. -* Facebook payment is also timely, but also in the 21st of each month to pay last month's advertising revenue; -Facebook's SDK updates are very frequent. A new version will be released in about two weeks, so if there are any bugs, the fix is fast. However, the update frequency is a bit high, sometimes feeling a little behind. Relatively speaking, Google AdMob SDK more stable; -* Management interface and reporting system is also relatively clear and easy to use. The reporting system is not as strong and flexible as Google Admob, seemingly only English interface, it looks like the following. - -![Facebook AudienceNetwork](demo/fbaudnet.png) - -Flurry is a mobile advertising company that has been acquired by Yahoo, the official site is http://www.flurry.com/. There are 2 main products, one is Flurry Anlytics and one is Flurry Ads. -* Flurry SDK integration is still relatively easy, the reporting system quite satisfactory. Site visit is a bit slow, more time-consuming. -* Payments are slightly slower and are not paid until 60 days after the advertising revenue. -* It is worth mentioning that, Flurry is a relatively early support Native ads (Native Ad). - -MobFox is a European mobile advertising company headquartered in Austria. I used to contact its CEO, he wants me to develop plug-ins for them. Later, because of the acquisition, then later, we knew that MobFox was acquired by Matomy. This company is still good, payment is more timely. Although known as Europe's largest mobile advertising company, and the world is located in the Top 10, but compared with giants such as Google, Facebook, the global influence is really a bit weak. - -Apple's iAd just launches on iOS. As the iPhone's market positioning and pricing significantly higher than the Android system, it also determines the iOS users have a strong purchasing power, so iAd ad click returns relatively high, it goes without saying. However, if you develop an app that needs to run on iOS and Android at the same time, managing it with AdMob is a bit easier. You can also use AdMob's mediation feature to show some of your traffic through iAd, maximizing the benefits of advertising. Later, Apple adjusted the advertising business and stopped iAd service. - -Like OpenX and Smart AdServer, open only to European and American business customers, not for global users and individual developers. Formerly, customers in the United States and Europe saw my open source project on GitHub, specifically looking for me to customize the adware plug-in. Through project cooperation, I was able to understand and become familiar with it. However, because it is not for global developers, it is not recommended. - -As for MoPub, its SDK is open source on GitHub, and it's something different. Its documentation and SDK was not very mature. For some time, you have to compile these SDKs from source code into a jar and framework before using them in your projects, which is really inconvenient. Recently, they have supported their SDK to be loaded into your project with gradle and cocoapods, a lot easier than before. - -Millennial Media (abbreviated mMeida), its SDK Demo aesthetics done well, but customer service and technical support response is really flattered. Have encountered technical problems, submit a question through the Web Form, has not been answered, so I am not happy to use it. I heard later they were acquired by AOL. - -In addition, such as Charboost, TapJoy advertising platform, also more or less seen. However, each person's energy is limited, so did not try them one by one. Charboost, an advertising startup that started up in 2011, focuses exclusively on mobile games and was named Top 10 mobile advertising company by the VentureBeat Index in 2014. Advertised by Chartboost, click revenue is relatively good, but conversely, that is, advertising, access to the user's cost is relatively high. Some of my friends I know are specialized in heavy games, devoted to overseas markets and used more ads on Facebook and Chartboost. - -These mobile advertising platform described above is entirely personal experience and subjective experience. If you are interested, ou can try more by your own. - -### Promote Your App - -(To be continued) - -### Online APP - -### Cloud Seervice - -### Expert Topics - -### User Data Analysis - -### Ad Optimization - -### In-App Purchase - -### Social Marketing - -### Cast Advertising - -### Appendix - -#### Popular Mobile Marketing Terms - -Part1 Basic Terms - -ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) - -Impression:意思是“曝光”,也被称为“展示”或“显示”,是衡量广告被显示的次数,一个广告被显示了多少次,它就计数多少。比如,你打开新浪的一个页面,这上面的所有广告就被“显示”了1次,每个广告增加1个Impression。 - -Click:点击,是指互联网用户点击某个广告的次数。 - -CTR:Click Through Rate,点击率。就是用click除以impression的比例。 - -CPM:Cost Per Mille,这次实际上省略了impression,全文应该是cost per mille impression。Mille是千的意思,在英语中它只跟着per一起用,即per mille,就是汉语的“每千……”的意思。所以CPM是每千次展示的成本。 - -CPC:Cost Per Click,每次点击的成本。 - -Ads:就是广告(名词)的英语复数啦。Ads = Advertisements。如果是“做广告”(动词),应该用Advertising。 - -SEM:Search Engine Marketing的简称。就是搜索引擎营销。不过在中国,SEM其实仅仅指PPC。但是SEM事实上是PPC和SEO的统称。PPC和SEO是什么,下面有解释。 - -PPC:Pay Per Click的简称。一般是特指搜索引擎的付费竞价排名广告推广形式,因为搜索引擎竞价排名只有一种收费方式,即按照点击付费。虽然也有其他广告形式也是按照点击数量来进行收费,一般不被称为PPC,而被称为CPC,即Cost Per Click。为什么?似乎是约定俗成。 - -SEO:Search Engine Optimization的简称。就是搜索引擎优化,特别指搜索引擎搜索结果自然排名的优化。所谓自然排名,就是不通过给搜索引擎付钱就能获得的排名。不花钱就能被搜索引擎排到前面当然是好事,但大家(每个网站)都这么想,所以要出头还挺难的。懂得这个领域的高手过去能挣很多钱,但今天SEO却越来越短时间内就出效果,所以想要通过SEO挣快钱越来越难。 - -Social:社会化,是social marketing(社会化营销)或者social media(社会化媒体)的简称,具体指二者的哪一个要看场合。社会化媒体,在中国过去是人人网、开心网之类,现在是微信、微博、图片分享类网站应用等。 - -WA:Web Analytics的缩写。就是网站分析。 - -DA:Digital Marketing Analytics的缩写。数字营销分析。 - -Part2 数据分析领域 - -Dimension:维度。维度是对一指一个事物的不同的方面、特征或者属性。这么说太抽象。简单说,人可以分成男人和女人,性别就是人的一种维度。或者汽车可以分为白色、黑色、红色等,颜色就是汽车的一种维度。维度是最基本的数据结构,任何一个度量(指标)必须要依附于一个具体的维度才有意义。比如说,我说visit=100,这没有任何意义。我说搜索引擎给我的网站带来的visit=100,就有了意义。搜索引擎流量就是维度(即流量来源)的具体的值(就如同男人是性别这个维度的具体的值)。 - -Metric(常用作复数,即Metrics):通常翻译为度量或者指标,但是因为指标含义更宽泛,例如KPI或者benchmark都可能被称为指标,所以在我的培训中metrics都是用度量来表示,这样更严谨。度量绝大多数都能能用数字表示,比如汽车的速度,速度就是度量。课程中涉及到的度量分为两类,一类是计数度量(比如常见的PV、UV、访次、停留时间等)和复合度量(两个度量四则运算而成,常见的有转化率、跳出率、留存率、活跃率等)。另外有些度量使用布尔量表示,即是或非。度量必须依附于维度才有意义。 - -Unique:Unique是指排重(排除重复)。Unique很少单独用,常用在计数类度量的前面,比如unique visitor,指排除对同一个访问者重复计数之后的访问者数量——同一个人今天到网站一次,明天又来一次,不能就因此变成两个人,unique visitor仍然是1。Unique visitor通常可以简化为visitor,两个可以通用。Unique visitor和unique user是唯一的两个可以加不加unique都算unique的度量。另一个例子是unique impression,即同一个人多次看同一个广告,还是计算为1次。Unique impression和impression是两个不同的度量,因为后者不排重。 - -Benchmark:我在大学的时候这个词被翻译为“定标比超”,真是不明觉厉的感觉呀。Benchmark就是“可以作为对比的参照值”。我的很多客户会问,这个指标在行业中的平均情况是什么样呀?他们的问题可以同样表述为:这个指标在行业中的benchmark是多少? - -Pattern:指某种会重复出现的模式或规律。Pattern常常用于发现用户行为上的某些趋同特征。比如,我们发现用户都喜欢在晚上10点到11点打开某个app应用,这就是一种pattern。如果我说发现了一个pattern,很兴奋,实际上的意思就是说我发现了一个规律。规律这词,几十年前就有了,pattern这洋文多有逼格呢…… - -Random:随机数,或者随机性。但是老外们也用它来形容“混沌”之类的意思。 - -Cohort:很难翻译,也很难形容,我暂且把它翻译成“队列”。跟Segmentation有点类似,但内涵要多一点,多点排队的意思。你懂的,课堂上讲清楚。Cohort一般是一种分析方法,所以一般不单独出来,而是跟analysis在一起,即cohort analysis。 - -Filter:过滤。过滤是指摒弃掉不需要的数据,只留下需要的。过滤都需要遵循一定的规则(这是废话),而且过滤掉的数据往往不能找回。过滤是一种常用的定位某个细分领域的方法,与细分(segmentation)的区别在于,segmentation是把总体分成并列的若干块(segment),而Filter则只保留符合规则的块,而丢弃其他不符合规则的块。 - -Segmentation:细分。这是我们最基本的方法,即把总体按照一定的规则分成并列的若干块。做了segmentation之后,每一个块就是一个segment。所以segmentation和segment不是同义词。Segmentation怎么用?怎么发挥最大价值?课堂上有很多案例。 - -Part3 互联网和互联网营销分析技术领域 - -Cookie:Cookie并没有真正的中文翻译,cookie是在你浏览网页的时候,网站服务器放在你电脑(或移动设备)的浏览器里面的一个小小的TXT文件。这个文件里面存储了一个标识你这个人的匿名的ID,以及一些与你访问的这个网站有关的一些东西,这样当你下一次访问这个网站的时候,cookie就会知道你又来了,并且记住你上次访问时候的一些状态或者设置。Cookie以及与cookie类似的东西是互联网营销的最重要技术之一,几乎所有识别人和标记人的工作都需要cookie及类cookie技术完成。在这次培训中会有详细的说明。 - -Deep link:没有汉语直接对应名词,我觉得直接叫“深链”好了,但不能叫做“内链”,后者是另外一个东西。Deep link历史悠久,过去把能够链接到网站的内页(即非首页的页面)的链接都称为deep link,但此后很快deep link这个词的意义就消失了,因为这样的链接实在太普通,都不需要用一个专用的名词来表述。但随着移动端的app的出现,deep link又“东(si)山(hui)再(fu)起(ran)”,特指那些能够跨过app首屏而直接链接到app的内屏(类似于网站的内页)的链接。嗯?如果这个app还没有安装过怎么办?这两期的公开课会专门讲。 - -Link Tag:Link Tag特指在流量源头的URL后面加上的标记,用来标明流量源头的名称和属性。最典型的link tag是Google Analytics的UTM格式的标记。目前已经成为标明paid media(花钱购买的广告流量)的标准配置。如何用好它,比你想的丰富,课堂上详解。 - -Heat map:热图。在一个图上标明这个图上哪些是获得更多关注的部分。关注可以是眼光,也可以是鼠标点击或者手指的指指点点。热图是做行为统计学研究的好可视化工具。大家都看得懂的东西,但用好则要水平。 - -JavaScript:简称JS,网站页面上的程序,能够让页面除了展示内容之外,还能实现更多的程序运行和功能。网站分析工具监测代码就是JS代码,将JS代码部署在你要监测的网页中,就可以把用户在页面上的互动访问行为不间断的发送到相应数据分析工具的服务器,从而获取想要的用户数据。 - -Attribution:归因。但是实际上这个词被翻译成“归属”更好。归因是指在多种因素共同(或先后)作用造成的某一个结果时,各种因素应该占有造成该结果的多大的作用,即“功劳应该如何分配以及归属于谁”。为解决归因的问题而建立的模型被称为归因模型,即attribution modeling。但我一直可惜这个词没有翻译好,翻译成归属模型或许更容易理解。 - -Path:路径。任何构成先后次序的一系列事件或行为都可以用路径来描述。路径分析(path analysis)也是较为常用的一种分析方法。 - -UID:是User Identification的缩写,即用户ID。 - -Bots:机器人。非人产生的流量,都被称为机器流量,即bots traffic。Bots是互联网虚假流量主要的创造者之一。 - -Spider:常翻译为蜘蛛,蜘蛛是一个自动程序,它的作用是访问收集整理互联网上的网页、图片、视频等内容。比如百度蜘蛛会将互联网的各种内容抓取回来并分门别类建立索引数据库,使用户能在百度搜索引擎中搜索到想要的内容。 - -IP:是Internet Protocol(网络互联协议)的缩写。IP地址就是给每个连接在互联网上的主机分配的一个地址,过去用于判断不同的访问行为属于同一个人(因为都是同一个IP记录产生的访问)。但由于各种动态IP和虚拟IP技术,用它判断用户人数已经很不可行。现在游戏领域也常常说起 IP,不过那是另外一个意思,intellectual property,知识产权,往往指的是著名的小说、影视、游戏等作品的人物故事等等。 - -Tracking:翻译为跟踪,就是数据分析工具跟踪用户各种行为的“跟踪”,用户所有的线上行为都可以被跟踪。监测这个词的“监”这个字,就是tracking。而测,则是measurement。所以监测这个汉语词,最准确的翻译就是tracking and measurement。监测需要用一定的技术手段实现,其中核心技术之一就是监测代码(tracking code),是一串可以发挥监测功能的程序(很多都是脚本语言编写,比如JavaScript语言)。 - -Pixel:本意是像素,但是在监测领域,是tracking code(监测代码)的同义词。 - -VAST:即Digital Video Ad Serving Template。一种实现视频程序化广告的基础性协议。目前是4.0版本。 - -Part4 流量与用户行为领域的名词 - -Bounce Rate:跳出率。会在课堂上简单介绍。 - -Referral:翻译为引荐来源。现实生活中,如果我推荐你使用了某个产品,或者我介绍你加入我们光荣的党,我就是引荐人(referral)。而在数字营销中,referral是指那些给我的网站带来了流量的其他网站,通常这些网站上会有链接到我的网站的链接。如果没有做特殊的标记(如使用link tag标记)或者不是特殊的流量源(比如搜索引擎),那么大部分的流量来源都会被监测工具记录为referral。 - -Retention:指用户的留存。如何让用户能够留存,是一个重要的课题。在这两期公开课培训中会跟大家介绍如何提升retention。 - -Engagement:没有特别合适的中文翻译,这个指标指的是用户在网站或APP上的交互程度或者参与度,可以由多个指标组合而成。比如一个网站有很多交互行为,包括下载文档、观看视频、咨询等,那么会根据每个交互的重要程度给每个交互行为赋值,用户每完成一个交互及赋予相应的数值,这样可以判断不同类别用户的交互程度以及不同页面的交互差异。Engagement和其他一些名词比如effectiveness、performance、acquisition等相似,都是泛指性的名词。 - -Session:session实际上和visit是一回事。本来,各类工具都是将用户的一次访问(网站)称为visit,但是随着app的普及,visit app听起来很别扭(因为我们都是use app),所以app也就不存在visit了,于是就用session代替。为了统一表述visit和session,有些监测工具把visit改称session。 - -Visit:即访问。指对用户对网站的访问,通常以30分钟为区隔。如果超过30分钟在网站上没啥动静,则一次访问结束。 - -Direct:翻译为直接访问,比如用户直接在浏览器输入网址访问,或者用户直接点击收藏夹里的网址进行访问,都会被记为直接访问。除了上述情况,从QQ客户端聊天窗口或微信客户端的链接直接访问网站的也会被记为直接访问。 - -Exit:退出,即用户离开网站或APP的行为,用户离开网站前的最后一个页面称为退出页(exit page),离开APP时所在的最后一个screen叫做exit screen。 - -Part5 策略与运营 - -Acquisition:泛指用户获取。在用户运营中使用的极为广泛,做任何产品的运营的第一步就是获取用户,比如在网页端的推广流量的获取、App推广中用户的下载等。 - -Goal:目标,是想要达到某种效果,每个网站都会有一些作为目标的交互,比如点击下载说明书、登录、注册、提交订单等。那我们就可以将这些设定为目标,那么这里引出另一概念:转化(conversion)。每完成一次上述的目标,就可以认定为完成一次转化。 - -KBR:Key Business Requirement。关键商业需求。是一个企业商业目标中最关键的。KBR决定了一个企业的其他目标,并且也决定了我们应该如何制定digital marketing的目标,以及针对这些目标选用什么样的指标或KPI。 - -KPI:Key Performance Indicator的缩写,译为关键绩效指标,是若干个用于衡量业务表现的最重要的度量。不同的商业目标,不同的业务,所对应的KPI不同。如何设置KPI是一门技术,也是一门科学。在这次的培训中也会做详细介绍。 - -Part6 互联网广告领域的名词 - -Display Ads:展示广告。展示广告主要指静态的图片广告、动画广告,以及富媒体广告(就是能互动一下的flash神马的)。这一广告形式与文字广告(就是文字链)和视频贴片广告形式是并列的不同类广告形式。 - -Banner:广义上是图片或者动画展示类广告的统称。这个词的含义源于上街游行队伍中拉着写有标语的大横幅,后来扩展到互联网广告商,并与display ads同义。 - -Pre-roll:也叫pre-roll ads,即前贴片广告。就是视频播放之前的长达10秒到丧心病狂的120秒的视频广告。 - -Content Feeds:信息流广告。信息流(主要是在社交网站和APP上)是内容并列排列自上而下像瀑布流一般,而在信息流中插入跟信息内容形态一样的广告,这种形式就是信息流广告。课堂上会介绍。 - -Native Ads:原生广告,通俗说是那些看起来就像网站或者app中正常内容一样的广告。原生广告容易和信息流广告混为一谈,但它们并不是一回事。原生广告可以采用信息流来实现,但不仅仅局限于此。 - -Reach:人群触达。如果做互联网广告,能够让广告触达到多少人是广告主关心的。触达实际上等同于unique impression,所以它不是动词,而是一个名词,一个用来记录广告触及到了多少人的计数度量。 - -Coverage:人群覆盖。跟触达非常类似,只是它的含义更模糊一些。往往用百分比来表示,例如,希望reach到的人群是1个亿,而实际reach到的是6000万,那么coverage大约是60%。Coverage不是一个度量,而是一个约定俗成的说法。 - -Viewability:广告可视性。过去统计广告的曝光的时候,不考虑广告是不是真的被人看到了,所以有些广告处在一个很长的页面的第二屏或者更后面的位置,而某个同学只看了第一屏就离开了的情况下,这个广告其实是根本没有处于屏幕中的,这个同学根本看不到这个广告。在不考虑viewability的情况下,这个广告仍然因此而有增加一次曝光(impression),而若考虑viewability,这个广告不增加一次曝光。 - -Pre-click:点击前阶段。指流量入口(尤其是广告)在被用户点击之前(含点击本身)的相关用户行为及对应的营销监测与分析体系。 - -Post-click:点击后阶段。指流量入口在被用户点击之后的相关用户行为即对应的营销监测与分析体系。 - -Fraud:作弊,也有更通俗的写法即cheating,但fraud特别指流量作弊。反作弊是anti-fraud。另一个与fraud类似的反面词汇是spam,即垃圾短信、垃圾邮件之类的骚扰垃圾信息。 - -Campaign:特别难找到准确对应的汉语名词,大意是一次有始有终的营销活动。有始,是指营销活动是从严谨的策划和详细的执行计划开始的,有终,是指营销活动有清晰的执行结束的节点。所以心血来潮的营销“游击战”不能称为campaign,那些几乎永远不停止的营销行为(例如SEM投放)也不能称为campaign。 - -Audience:受众。就是广告的阅览者,普罗大众。受众这个词太书面化了,但是确实没有比这个更明确的词,所以在这两期公开课中都会用这个词。 - -Target Audience:目标受众。任何人都可能看到你的广告,但只有那些合适的人才会购买你的商品。所以,合适的人就是你的目标受众,是你最希望影响到的那群人。 - -Effectiveness:效果。这是广告主评估品牌推广类广告好坏的一个关键指标。效果的含义比较广泛,在不同的campaign目标下可能不尽相同。比如,能够覆盖到的人群情况(coverage)可以作为一种效果;或者,人们是否真正对你的品牌产生了认知(awareness)也被称为一种效果。类似的,人们也用performance来表示营销的好坏,二者是近义词,但又不完全相同。Performance更偏重有实际产出的具体效果,因此常常被翻译为“绩效”,例如campaign产生了多少的click,产生了多少的交易等等。因此,effectiveness较为抽象,几乎只在品牌推广中被提起,而performance较为具体,在效果类推广中更为常见。 - -Efficiency:效率,即达到某种效果所花费的成本(包括金钱与时间)。品牌推广类营销常用,效果推广类很少提及。 - -Branding:品牌推广。 - -Awareness:对品牌或产品的认知。做广告的首要目的,就是让消费者意识到你的品牌或者商品的存在,说白了就是搏存在感。看看近期密集发布的手机在各个新闻app、电商app中频频发力,就知道awareness对广告主有多重要了。 - -Buzz:消费者或网民对于品牌、产品等广告主在乎的事情在网上发出的各种声音。与IWOM是一个意思。Buzz是苍蝇蜜蜂之类的嗡嗡声,无数网民每天在网上发出的各种意见, 在上帝看来就像苍蝇蜜蜂般嗡嗡作响。 - -IWOM:Internet Word of Mouth的简称。即网络口碑。 - -Survey:调研。这个词是一个有意思的词,主要在它的发音。作名词的时候重音在前——[?s??ve?],作动词的时候重音在后——[s??ve?]。 - -ePR:通过互联网进行的PR。 - -IP:Intellectual Property,即知识产权。就是过去说的那些原创的,有知识产权的东西。现在天天出现在各种口语和报道中的这个词指各种在互联网上创作的内容。例如,我的这个公开课也可以称得上是IP。Papi酱的网红视频?当然也是咯!与上篇的IP写法一样,意义完全不同。 - -Minisite/Microsite:没有对应的汉语名词,而且大家也从来不用汉语描述它。就是指为campaign专门定制的campaign网站,这些网站规模都不大,所以被称为mini(迷你)或者micro(微)。 - -Programmatic:程序化(广告)。一种革命性的广告运作方式。在课堂中会有详细的介绍。 - -DSP:Demand Side Platform(需求方平台)。程序化广告的广告投放管理系统平台以及相应的服务提供方。具体解释这里不多说了,到时候课堂上会详细介绍。 - -SSP:Supply Side Platform(供应方平台)。程序化广告的广告资源管理系统平台以及相应的服务提供方。具体课上介绍。 - -RTB:Real Time Bidding(实时竞价广告),这是程序化广告最重要的一种方式,也是理论上最佳的广告资源变现方案。但具体如何实现,优劣问题,以及国内的情况,课上详细讲。 - -Bid/Bidding:竞价。搜索引擎PPC广告,或者RTB广告,都需要竞价。类似于拍卖,但需要在预置条件的前提下通过程序来实现。课堂上详细说。 - -Bidder:Bidder即竞价者,在PPC广告范畴内,bidder就是普通SEM的操作从业者。在程序化广告范畴内,bidder一般就是DSP服务提供商。 - -DMP:Data Management Platform,数据管理平台。程序化广告(programmatic advertising)中为实现定向受众所需要倚仗的数据平台。但它能做的还远远不止这么多。培训课程中会专门涉及。 - -Verification:特指广告的验证。验证有两类,一类是验证广告是否真实被投放出去了,以及投放出去之后广告所处的环境是什么。什么是广告所处的环境?——对于PC web上的广告而言,环境就是这个网站以及具体承载广告的这个页面。另一类是验证广告覆盖的人群的情况是不是跟预想的一样。 - -Part7 效果营销领域的名词 - -Conversion Rate:转化率。是指从流量到实际销售转化的能力。与ROI本质是一样的。只是ROI衡量的是现金(收入)对现金(支出)的对比,而转化率衡量的是销售的数量与进入销售漏斗的人数(或者次数)的比例关系。 - -Churn和Churn Rate:客户流失和客户流失率。所有需要尽可能让用户反复购买(或付费)的生意,都有这个度量。看名字就知道,这个度量用来描述失去客户的情况。具体如何定义,以及如何分析,在课堂上会有详细说明。 - -SERP:Search Engine Result Page。就是搜索引擎的搜索结果页面。 - -Search Query:用户的搜索词。人们在各种搜索框(典型的如搜索引擎的搜索框)内填入的词,这些词可能很不结构化,且非常随意。而keyword,则是使用搜索引擎竞价排名的广告主设定的关键词。 - -Keyword:使用搜索引擎竞价排名的广告主设定的关键词,较为结构化,较规范。这些词不可能穷尽用户的search queries,因此搜索引擎会把用户的search queries转变为与之最相近(不过是否真的是最相近,那就只有搜索引擎知道了)的keywords,然后显示搜索的结果。 - -Organic Search:自然搜索流量源,即用户点击了自然搜索结果产生的流量,而不是点击了竞价排名(PPC)而产生的流量。 - -Affiliate Marketing:有时也就直接简称为Affiliate。这个词在国内没有对应的名词,在台湾被译作“联署营销”,但是这个翻译似乎仍然莫名其妙。Affiliate marketing就是典型的代销模式——你的东西,我帮你卖,卖出多少,你给我按照一定比例提成。在互联网上,affiliate marketing变成了我帮你引流量,我给你的流量如果有转化了,你给我提成。国内的亿起发、领克特等就是做affiliate marketing的专门平台。 - -EDM:Email Direct Marketing(电子直邮营销)的缩写,是利用电子邮件(Email)与受众进行商业交流的一种营销方式,电子邮件营销是网络营销手法中最古老的一种。 - -Performance:绩效,即通过营销之后获得“战果”。ROI就是一种典型的performance,销售额之类的也是。 - -GMV:Gross Merchandise Volume。这是电商经常会用到的词,书面是“毛销售量”,实际就是销售流水。当然,销售流水不等于最后赚到的钱。GMV=1销售额+2取消订单金额+3拒收订单金额+4退货订单金额。GMV是流水,只要你下了订单,生成订单号,就算了GMV。而这个订单转化为平台的实际收入还会有2、3、4这些流失量。下单以后后悔了取消订单,订单送到你面前了后悔了拒收订单,签收订单以后后悔了要退货(这个步骤不同的电商平台计算方法不一样,有的平台是不管退不退货都搜算进销售额中)。总之,人艰不拆,GMV数字大,好看,而且我们监测起来也最容易,所以这是最常用的。 - -AOV:Average Order Value。平均订单价格。 - -Monetization:变现。 - -MRR:Monthly Reoccurring Revenue,直译是每月都会产生的收入,实际就是用户要交的月费。比如我办了一个158元的包月电话套餐,对于电信公司而言,我就给他们贡献了MRR 158元。 - -Part8 移动端常用的 - -Screen:如果说web端用page view来记录页面被浏览的次数,那么screen就是app的页面,screen view就是app的页面浏览的次数。但因为screen没有page这个东西,所以就用screen来表示。我也不知道应该对应什么汉语名词,或者应该用“屏显”?反正相信你懂的。。 - -DAU:Daily Active User(日活跃用户数量)的缩写,通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),是用来衡量产品的用户粘性的重要指标。 - -MAU:Monthly Active User(月活跃用户数量)的缩写,概念与DAU相仿,区别在于时间跨度。MAU除了能衡量用户粘性,还可以分析产品衰退周期。 - -H5:是HTML5的简称。它实现的功能与Flash类似(用于实现动画和各种酷炫的人机交互界面等),但是比Flash具有更强的兼容性,可扩展性,稳定性以及安全性,因为该技术是HTML的延展,而非如同Flash一样是一个单独创立出来的事物。目前各大互联网钜子们——包括Adobe(Flash的所有者)——都已经加入支持H5,H5在移动端几乎已经完全取代了Flash。 - -ASO:App Store Optimization。狭义上指针对苹果应用商店的app排名所做的优化工作。广义则指对所有的应用市场的优化。与SEO类似,都是排名优化,只是优化的对象变成了应用市场。 - -LBS:Location Based Service,基于位置的服务。低逼格的讲就是用手机定位之后,能否关联一些服务或广告的。当然实际的应用比我说的肯定逼格高很多。 - -Part9 企业、组织机构与产品 - -Google Analytics:谷歌分析,简称GA,是全球用户量最大的网站和APP上流量用户行为的监测与分析工具。 - -Universal Analytics:简称UA,是GA在2013年左右做的一次大升级版本,目前无论是免费还是付费版的GA,都是基于Universal Analytics的。GA的付费版叫Google Analytics Premium,简称GAP。 - -GTM:Google Tag Manager,是谷歌公司用于管理网页上各种广告、监测和分析代码的平台型工具。课堂上会简单介绍。 - -DCM:DoubleClick Campaign Manager的简称 (即新版 DoubleClick for Advertisers 7),DCM 是一个管理及投放广告的全面解决方案,覆盖从 广告策划、管理、定位、投放、优化到生成报告等。广告的impression和click等几乎所有的度量,都可以通过它来进行监测。 - -AdWords:全称Google Adwords,是谷歌搜索引擎的关键词竞价系统,按点击收费(CPC)。 - -AdSense:全称Google Adsense,是谷歌推出的针对网站主(简称发布商)联盟的一个互联网广告服务,通过程序来分析网站的内容,并且投放与网站内容相关的广告。 - -DAA:Digital Analytics Association,数据分析协会。美国的互联网营销数据分析行业协会,号称是全球协会,但主要章程和成员都在美国,对其他国家的影响力较小。 - -IAB:Interactive Advertising Bureau,美国的互动广告局,也是类似于DAA的行业协会,主要领域是数字广告。这个协会在美国,但对全球数字广告的影响力巨大,尤其是标准和技术上。 - -#### 如何发布 APP 到 Apple AppStore - -#### 如何发布 APP 到 Google Play Store - -#### 如何发布 APP 到 360 应用商店 - -#### 如何用 Google Analytics 做用户数据分析 - - diff --git a/README.md b/README.md index d8778a7..c204438 100644 --- a/README.md +++ b/README.md @@ -1,158 +1,154 @@ -# 从编码到变现:程序员财务自由之路 +# From Coding to Monetization:Programmer's Financial Freedom Approach -From Coding to Monetization:Programmer's Financial Freedom Approach +【从编码到变现:程序员财务自由之路】 -[英文版本 / English Version](./README.en.md) +[中文版本/Chinese Version](./README.zh.md) -![大富豪](demo/richman.jpg) +![rich](demo/richman.jpg) -### 目录 +## Content -* [前言](#前言) -* [定位](#定位) -* [基础篇](#基础篇) - * [语言与工具选择](#语言与工具选择) +* [Foreword](#Foreword) +* [Positioning](#Positioning) +* [Getting Started](#Getting-Started) + * [Language and Tools](#Language-and-Tools) * [Hello, World!](#hello-world) - * [单机版APP](#单机版APP) - * [加个广告条](#加个广告条) - * [注册广告账号](#注册广告账号) - * [验证地址和设置收款信息](#验证地址和设置收款信息) - * [发布APP](#发布APP) - * [广告收益的计算](#广告收益的计算) -* [进阶篇](#进阶篇) - * [需求是根本](#需求是根本) - * [用户体验](#用户体验) - * [哪种广告最适合](#哪种广告最适合) - * [哪家广告商最靠谱](#哪家广告商最靠谱) - * [营销你的产品](#营销你的产品) - * [联网版APP](#联网版APP) - * [云服务](#云服务) -* [高级篇](#高级篇) - * [数据分析](#数据分析) - * [广告优化](#广告优化) - * [支付与内购](#支付与内购) - * [社交营销](#社交营销) - * [广告投放](#广告投放) -* [附录](#附录) - * [互联网营销常用术语](#互联网营销常用术语) - * [如何发布 APP 到 Apple AppStore](#如何发布-app-到-apple-appstore) - * [如何发布 APP 到 Google Play Store](#如何发布-app-到-google-play-store) - * [如何发布 APP 到 360 应用商店](#如何发布-app-到-360-应用商店) - * [如何用 Google Analytics 做用户数据分析](#如何用-google-analytics-做用户数据分析) + * [Simple APP](#simple-APP) + * [Add Ad Banner](#add-ad-banner) + * [Register Ad Account](#register-ad-account) + * [Settings for Payment](#settings-for-payment) + * [Publish APP](#publish-app) + * [Calcuate Ad Revenue](#calculate-ad-revenue) +* [Advanced](#advanced) + * [Demand is Fundamental](#demand-is-foundamental) + * [User Experience](#user-experience) + * [What Ad is Best](#what-ad-is-best) + * [Which Ad Network Shall I Choose](#which-ad-netowrk-shall-i-choose) + * [Promote Your APP](#promote-your-app) + * [Online APP](#online-app) + * [Cloud Service](#cloud-service) +* [Expert](#exert) + * [Data Analysis](#data-analysis) + * [Ad Optimization](#ad-optimization) + * [In-App Purchase](#in-app-purchase) + * [Social Marketing](#social-marketing) + * [Advertising](#advertising) +* [Appendix](#appendix) + * [Internet Marketing Terminology](#internet-marketing-terminology) + * [How to Publish APP to Apple AppStore](#how-to-publish-app-to-app-store) + * [How to Publish APP to Google Play Store](#how-to-publish-app-to-google-play-store) + * [How to Google Analytics for Data Analysis](#how-to-use-google-analytics-for-data-analysis) -### 前言 +### Forword -这本书,是写给程序员看的。 +This book, is written for programmer. -这并不是关于一门编程语言,也不是关于一种设计模式,更不是关于如何评估工程量、如何做项目管理。 +It's not about a programming language, not about a design pattern, and not about how to estimate man-hour, or how to manage project. -这本书是关于:变现(monetization),通俗的说,就是赚钱。 +This book is about: monetization. Simply speaking, how to earn money. -作为程序员,你一定花了大量的时间去学习,掌握了若干种编程语言、用过数十种开发工具。为了设计稳定灵活的架构,你也认真学习和掌握了各种设计模式;为了提高工作效率,你也用了各种成熟的框架以及自动化测试的工具;总之,通过学习,你成为了一个牛B的程序员。 +As a programmer, you must have spent much time to learn, mastered several programming lanugages, used dozens of developing tools. In order to design stable and flexible architecture, you may have learned various design patterns. In order to boost working efficiency, you may have used many mature frameworks and automation testing tools. In short, you become an excellent programmer. -甚至,你也积累了管理的经验,主动学习了项目管理的理论知识、各种研发组织模式,也许会进阶到管理岗位,成为研发团队的负责人或者经理人。 +And, you may even accumulate experience in management, take the initiative to learn the theoretical knowledge of project management, mastered a variety of R&D organizating model, become the R&D team leader or manager. -在大部分的情况下,作为程序员或者研发团队,你按照项目经理 或者 产品经理给的需求,进行需求分析、架构设计、模块划分、接口设计、编码实现、测试、提交版本。这些环节,毫无疑问,是做研发的程序员最为熟悉的流程。 +In most cases, as a programmer or R&D team, you work on requirements analysis, architecture design, module demarcation, interface design, coding implementation, testing, and release versions, as required by the project manager or product manager. These tasks, no doubt, are the most familiar routine work for programmers. -不幸的是,你日常所关注的,仅仅只是研发环节。接受需求,交付版本,这就是产品经理或者甲方让你干的事情。很多在研发领域侵淫多年的研发大牛,也往往并不熟悉软件怎样能够直接带来经济回报。绝大多数的开发者,仅仅关注研发这个环节,甚至仅仅关注在编码这个环节,这是非常局限的。 +Unfortunately, for most programmers, your everyday concerns are just development. Accept requirements, deliver versions, that's all the product manager or the client has you to do. Even many excellent programmers or technical guru, they seldom care how software brings revenue directly. Most developers, just focus on R&D technical work, or even just focus on coding work, which is very limited. -事实上,研发环节,再加上销售、收款、推广、用户支持、维护,这才是软件产生经济回报的完整闭环。 +In fact, R&D, plus sales, payment, promotion, customer support, and maintenance, is the complete closed-loop of software's value chain. -然而,软件怎样直接带来经济回报,这方面的技术文章或者书籍并不多见。这也是我为什么会选择这个角度,作为本书下笔的核心内容。 +This book is about how to start from coding, to get paid, and how to get users. Step by step, on every details. -这本书是关于,如何从编码、到如何接受付款,以及如何获取用户。手把手,教你每一个步骤。 +Once you have mastered how to monetize from your software, youo will be more concerned with user feedback, caring about market needs, and the quality of your products. As they will bring you better financial returns. Then it's not far away to achieve financial freedom. -一旦你掌握软件如何变现的能力,你会更加关心用户反馈、关心市场需求、关心产品质量,因为这些都会为你带来更好的经济收益。实现财务自由,也就并不遥远了。 +If you feel that the content of this book is helpful, please give you support, by staring it. -如果你觉得本书的内容有所帮助,请点赞支持。 +### Positioning -### 定位 +Since it is to talk about earning money, we will not discuss the hard way of outsourcing, in which the business model is to sell limited life time as money. -既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 +Considering factor of limited man power, time and resource, we will not discuss carrier-class, or enterprise-class large-scale systems. As they require large investment and long research cycle for complex requirement, which is beyond congrol of individuals and small teams. -考虑到人力、时间、成本等因素,我们也暂时不讨论运营级、或者企业级的大型系统。研发周期长、投入大、需求复杂,也超过个人和小团队的掌控。 +We focus on individuals or small teams. In the era of mobile internet, we have heard many miracle stories about individuals or small teams earn lots of money or even grow fast to unicorn enterprise. -在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 +Real story 1: +[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) legend, a small mobile game developed by a Vietnam programmer in 2-3 days, swept the globe in just a few weeks, and bring income of $50,000 US dollors each day. This is undoutedly by chance, lucky guy, but at least, there is a probability of occurrence. -真实案例 1: +Real story 2: +I know a Polish programmer, who uses the web page technology to make an uncomplicated calculator APP, doing something like calculating tip or percentage. The APP stays in the financial apps top list of App store in several Eroupe countries, made a lot of money. -[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 +Real story 3: +Around 2010, I worked for a company that developed insurance software. The company has developed quite well. It was founded in 2000 and has grown to a scale of 1,000 people after 10 years. The management tried to go public. However, it was not smooth, and after many years, it has not yet been able to IPO. I personally think that it is a business model problem. There are too many customized developments around the needs of large insurance company customers. This is too close to the outsourcing model, not the product model or the platform model, and it is difficult to scale expansion. -真实案例 2: +When I worked in this company, I had two colleagues Yang Luyu and Zhu Jun. They left the company in 2014 and established a start-up company to develop a short video app on mobile phones and become a short video community platform. The team was only 6 people, but they have developed a small product that has brought explosive growth. After 3 years of innovation and hard work, in 2017, they were acquired by Bytedance for $1 billion. -我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 +The initial name of the APP was Musical.ly. You may not be familiar with it, but you must know its later very famous name, Tiktok. Yes, it is the app that surpasses Facebook and often ranks first in the app store. Its influence in the world is so great that even Trump threatened for sanctions. -真实案例 3: +You can find other similar success stories, about making good money from mobile apps or games. You may heard, or just google the internet. -在2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,2000年创立,经过10年发展到1000人的规模,管理层试图上市。 然而并不顺利,又过了许多年,它还没有能够IPO。我个人以为,是商业模式的问题,围绕着大保险公司客户的需求,有太多的定制开发。这与外包模式太接近了,而不是产品模式或平台模式,难以规模化扩张。 +In this book, what we want to explore, is to make full use of limited time and resource, focus on a very narrow area of requirement, to develop a very unique mobile app or small game, publish to global app store, acquire users, and make money. -我在这家公司工作的时候,有两位同事阳陆育与朱骏。他们在2014年离开了这家公司,成立了一家初创公司,开发一个手机上的短视频APP,成为一个短视频社区平台。团队仅仅6个人,他们开发出的一个小小的产品,却带来了爆炸式的增长。在经过3年的创新和努力之后,也就是2017年,他们被今日头条以10亿美元的估值收购了。 +Perhaps, you are a technical guru, who masetered dozens of programming languages, design patterns, front-end to back-end full stack development capabilies. However, not every technology can be used to make quick money. The hardest or most intersting technology, may not be the easiest technology to make money. Sometimes, we need most flexible and scalabe architecture. Sometimes, we have to choose the most rapid development methods. -最初APP的名字叫Musical.ly,也许你不一定熟悉它,但是你一定知道后来它的鼎鼎大名,Tiktok。对,就是那个超越了 Facebook、经常排在应用商店第一名的APP。它在全世界的影响力,甚至大到曾经被特朗普威胁要制裁。 +Maybe, you are a newbie, just getting started, and only know how to write a webpage. It does not matter. The programming skills required to make money, can also be very simple. Just one thing, if any knowledge is required, we have to learn it quickly. We are in a era of fast changing world, programmers must be good at learning new things. -你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 +## Getting Started -在这本书里,我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 +### Language and Tools -也许你是技术的大牛,掌握了数十种编程语言、设计模式、前端到后端的全栈开发能力。然而,并不是每项技术,都能够实现快速赚钱的。最艰深、最有趣的技术,未必是最容易赚到钱的技术。有时候,我们要做最容易扩展的架构。有时候,我们要选择最快速开发的技术手段。 +The language and tools for developing apps are often tied to the platform. +* If it is iOS, it is usually Objective C, and the development tools are [Xcode](https://developer.apple.com/xcode/) from Apple (development tools only run on Mac) toolset. +* If it's Android, it's usually Java, and development tools are Google's [Android Studio](http://developer.android.com/tools/studio/index.html) (a cross-platform development tool) toolset. +* If it is Windows Phone, that is C #, the development tool is Microsoft's [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx) toolset (only run On Windows)。 -也许你是刚入门的菜鸟,只会做做网页什么的。那也没有关系,赚钱真正需要的编程技术,其实也可以非常简单。只是有一点,需要什么知识,我们就恶补什么知识。由于技术日新月异,程序员必须是最善于学习的群体。 +In addition, there are some cross-platform languages and tools, more friendly to developers. Develope once, package and release on multiple platforms: +* HTML5, can be used to develop apps and games, javascript is the core language. +* [Cocos2d-X](http://www.cocos2d-x.org/) for game development, C++ is the core language. +* [Unity3D](http://unity3d.com/) IDE and integrated MonoDevelop, C# is the core language. +* [Xamarin](https://www.xamarin.com/) acquired by Microsoft, and its sponsored open source project [Mono](http://www.mono-project.com/), used to develop APP, C# is the core language. -### 基础篇 +In the following tutorials, we choose the simplest javascript as the main development language for the follow-up introduction. -### 语言与工具选择 +Notice: +Don't have a stereotype about javascript and think that it is just a simple script program for making web pages. -开发 APP 的语言与工具,通常与平台密切相关。 -* 如果是 iOS,那通常是 Objective C,开发工具是苹果推出的 [Xcode](https://developer.apple.com/xcode/) (开发工具仅运行于 Mac)。 -* 如果是 Android,那通常是 Java,开发工具是 谷歌推出的 [Android Studio](http://developer.android.com/tools/studio/index.html)(开发工具有跨平台版本)。 -* 如果是 Windows Phone,那就是 C#,开发工具是 微软推出的 [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx)(开发工具仅运行于 Windows)。 +In fact, it is an extremely versatile language for programming and the most active language on github. It can be used to develop: +* Web pages running in the browser; +* Single-page WebApp running and embedded browser; +* Command line tools based on [nodejs](https://nodejs.org/), such as Cordova CLI command line tools; +* Network cloud services based on nodejs, such as Amazon's Bluestacks cloud service; +* Based on [cordova](http://cordova.apache.org/) technology, hybrid APP. +* Based on [react-native](http://www.reactnative.com/) to develop apps with native UI experience. +* Even, you can use [Electron](https://www.electronjs.org/) to develop desktop applications, such as Atom, Visual Studio Code code editor. -除此之外,还有一些跨平台语言与工具,对于开发者更加友善,可以开发一次,多平台打包发布: -* 可以开发游戏与APP的 HTML5,以 javascript 作为主要的开发语言。 -* 用于开发游戏的 [Cocos2d-X](http://www.cocos2d-x.org/),用的是 C++ 作为主要的开发语言。 -* 用于开发游戏的 [Unity3D](http://unity3d.com/) IDE 以及集成的 MonoDevelop,用的是 C# 作为主要的开发语言。 -* 微软收购的 [Xamarin](https://www.xamarin.com/) 以及赞助的开源项目 [Mono](http://www.mono-project.com/),用来开发 APP,以 C# 作为主要的开发语言。 +Because javascript can be used to develop front-end and back-end at the same time, code logic can also be used for front-end and back-end reuse, thereby reducing skill thresholds and development costs. The development environment required for getting started is also very low, as long as there is a friendly code editor and a browser for running and debugging. -在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。 +The following are the environment and tools needed for development with javascript: +* Chrome browser, comes with developer tools and javascript console for running and debugging. +* [Adobe Brackets](http://brackets.io/) text editor (if you are used to [Sublime Text](http://www.sublimetext.com/) or [Atom](https://atom.io /) Or [Visual Studio Code](http://code.visualstudio.com/), no problem) +* iMac desktop, huge 27-inch screen, unrestricted view; Mac OS X command line is very powerful and convenient, through [MacPorts](https://www.macports.org/) or [Homebrew](http:// brew.sh/), command line tools or libraries on Linux basically support it. +* Xcode (Mac version only), to debug the iOS APP, an iMac computer or MacBook laptop is also necessary. +* Android Studio, used to debug Android APP. -注意: -千万不要对 javascript 有刻板印象,而认为它仅仅是做网页的简单脚本程序。 - -实际上,它是编程用途极为广泛的语言,也是 github 上最为活跃的语言。它可以用来开发: -* 运行于浏览器内的 Web网页; -* 运行与内嵌浏览器的 单页WebApp; -* 基于 [nodejs](https://nodejs.org/) 的命令行工具,例如 Cordova CLI 命令行工具; -* 基于 nodejs 的网络云服务,例如 亚马逊 的 Bluestacks 云服务; -* 基于 [cordova](http://cordova.apache.org/) 技术的,混合(hybrid) APP。 -* 基于 [react-native](http://www.reactnative.com/) 开发 native UI体验的 APP。 -* 甚至,也能够使用[Electron](https://www.electronjs.org/)开发出桌面应用,例如 Atom,Visual Studio Code 代码编辑器。 - -因为使用 javascript 可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。入门所需要的开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 - -以下是用 javascript 来做开发的所需要的环境和工具: -* Chrome浏览器,自带开发者工具 和 javascript 控制台,用来运行和调试。 -* [Adobe Brackets](http://brackets.io/) 文本编辑器(如果你习惯 [Sublime Text](http://www.sublimetext.com/) 或者 [Atom](https://atom.io/) 或者 [Visual Studio Code](http://code.visualstudio.com/),也没问题) -* iMac台式机,巨大的27寸屏幕,视野不受限制;Mac OS X命令行非常强大方便,通过 [MacPorts](https://www.macports.org/) 或者 [Homebrew](http://brew.sh/),Linux 上有的命令行工具或者 library 都基本支持。 -* Xcode(只有 Mac 版本),要调试 iOS APP,有台 iMac电脑或者 MacBook笔记本电脑,这也是必备的。 -* Android Studio,用来调试 Android APP。 - -如果你习惯了 Windows 也没有一台 Mac,那就会稍微麻烦一点。虽然也是有方法的,有一些专门提供编译、打包的云服务,但是这些服务往往出于商业利益的关系,会调整策略终止服务。 -例如: +If you are used to Windows and don't have a Mac, it will be a little troublesome. Although there are also methods, there are some cloud services that provide compilation and packaging, but these services are often due to commercial interests and will adjust their strategies to terminate the services. +For example: * Adobe PhoneGap Build -已失效。从 2020.10.1 之后,Adobe 已经停止服务 该云服务。 +Out-dated. Since 2020.10.1, Adobe has stopped serving the cloud build service. * Intel XDK -已失效。XDK 已被英特尔重新用于物联网开发,核心移动开发功能已被英特尔弃用且不再受支持。 随附的跨平台 Cordova 云构建服务已下线。 不建议将 XDK 用于新的手机/平板应用程序开发项目。 +Out-dated. XDK has been re-used by Intel for IoT development, and core mobile development functions have been deprecated by Intel and are no longer supported. The accompanying cross-platform Cordova cloud construction service has been offline. It is not recommended to use XDK for new mobile/tablet application development projects. * [Ionic AppLow](https://ionic.io/appflow) -Appflow 是 Ionic 开发团队的持续集成 (CI) 和持续部署 (CD) 平台。它声称 Ionic Appflow 可以将构建部署到目的地,例如 Apple App Store 和 Google Play Store,完全在云中。 +Appflow is the continuous integration (CI) and continuous deployment (CD) platform of the Ionic development team. It claims that Ionic Appflow can deploy builds to destinations, such as the Apple App Store and Google Play Store, completely in the cloud. + +But, a Mac is still recommended, for both Android and iOS development. ### Hello, World! -用 javascript 开发前端,其实需要的是 3 项相关的语言:HTML / javascript / CSS。 -* HTML 负责内容 -* javascript 负责逻辑 -* CSS 负责渲染表现 +To development frond-end app with javascript, in fact, there are three closely related languages: HTML / javascript / CSS. +* HTML is responsible for the content. +* javascript is responsible for logic. +* CSS is responsible for rendering. -以下是一个简单的例子: +Here is a simple example: ```html @@ -189,62 +185,67 @@ h1 { } ``` -用 Chrome 浏览器打开它,于是我们看到如下的展示: -* 上面的浏览器主窗口,显示了 HTML 的内容,并且用 CSS 指定的格式和效果进行了渲染。 -* 下面打开 Chrome 的 console 窗口,则显示了 javascript 调用 console.log() 输出的调试信息。 +Open it with Chrome and we see the following display: +* The main browser window above shows the contents of the HTML and is rendered in the format and effect specified by the CSS. +* Open the Chrome console window, it shows the javascript call console.log () output debugging information. ![HelloWorld](demo/helloworld.png) -用 HTML5 / javascript 做开发,入门就是这么简单。 +Using HTML5 / javascript to do development, getting started is as simple as that. + +If you need to develop high-quality apps, you need to master HTML / CSS and javascript, especially HTML5 / CSS3, master HTML DOM and some javascript libraries, such as [jQuery](https://jquery.com/), etc. Here are some free tutorials for getting started: +* [HTML series tutorial](http://www.w3school.com.cn/h.asp) +* [JavaScript Tutorial](http://www.w3school.com.cn/js/index.asp) +* [JavaScript Advanced Tutorial](http://www.w3school.com.cn/js/index_pro.asp) -如果需要开发出高质量的 APP,需要熟练掌握 HTML/CSS 和 javascript,尤其是 HTML5 / CSS3,掌握 HTML DOM 以及 javascript 的一些常见库,例如 [jQuery](https://jquery.com/),等等。这里有一些免费的入门教程: -* [HTML 系列教程](http://www.w3school.com.cn/h.asp) -* [JavaScript 入门教程](http://www.w3school.com.cn/js/index.asp) -* [JavaScript 高级教程](http://www.w3school.com.cn/js/index_pro.asp) +Through these tutorials, you can learn: +* A simple index.html page; +* A unified main.css file that controls and adjusts the presentation of interface elements +* A set of javascript files that enable dynamic presentation and switching of content through access to the HTML DOM. -通过这些教程的学习,你能够做到: -* 一个简单的 index.html 页面; -* 一个统一的 main.css 文件,能够对界面元素的表现加以控制和调整; -* 一组 javascript 文件,能够通过对 HTML DOM 的访问,实现内容的动态展示和切换。 +For you, as a programmer, this is not hard at all. -对于作为程序员的你,这根本不是什么难的事情。 +### Simple APP -### 单机版APP +Next, we want to turn such a simple web app into a mobile app. To be exact, it should be called Hybrid APP, a hybrid program. Because it's native app, it wraps a webview, which runs the web app we wrote. -下一步,我们要把这样一个简单的网页程序 (web app),变成一个手机上的 APP。准确的说,它应该是叫 Hybrid APP,即混合程序。因为它的外面是 native app 封装了一个 webview,里面运行的是 我们写的 web app。 +We need to use a technical framework called Cordova. -我们需要用到 cordova 技术框架。它原本是 Adobe 公司收购的一个小团队开发的产品,被重新命名为 [PhoneGap](http://phonegap.com/)。后来 Adobe 将其开源,并捐赠给 Apache 基金会,然后被称为 [Apache Cordova](https://cordova.apache.org/),现在已经成为一个非常流行的技术框架,也得到很多商业公司的追捧,除了 Adobe 之外,Intel、微软、IBM 等公司也都推出了支持 Cordova 的产品。 +Originally a product developed by a small team acquired by Adobe, it was renamed [PhoneGap](http://phonegap.com/). Adobe later turned it open source and donated it to the Apache Foundation, then called [Apache Cordova](https://cordova.apache.org/). -Cordova 技术框架提供了一个命令行的工具,是用 nodejs 开发的。 +Now Cordova has become a very popular technical framework, but also sought after by many commercial companies, in addition to Adobe, Intel, Microsoft, IBM and other companies have also introduced support Cordova products. -我们首先要装 [nodejs](https://nodejs.org/en/),安装之后,会提供 2 个基本的命令: +The Cordova technology framework provides a command-line tool developed using nodejs, as well as a variety of plug-ins. + +We first have to install [nodejs](https://nodejs.org/en/), after installation, it will provide two basic commands: ```bash $ which node /usr/local/bin/node $ node -v -v4.2.1 +v4.8.4 $ npm -v -2.14.7 +2.15.11 ``` -* node --- 负责 javascript 程序的编译/解释/执行。它是基于谷歌开源的 Chrome V8 引擎的,基于事件驱动、不阻塞 IO模式运行,轻量而高效。 -* npm --- NodeJs Package Manager, 安装包管理器。所有的 nodejs 包都是用 npm 来下载和安装(你也可以用它来发布你自己的包到 npm 库)。 -接下来,用 npm 安装 [cordova](https://cordova.apache.org/): +* node --- the javascript engine, compile / interpret / execute. It is based on Google's open source Chrome V8 engine, event-driven, non-blocking IO mode operation, lightweight and efficient. +* npm --- NodeJs Package Manager, install package manager. All nodejs packages are downloaded and installed using npm (you can also use it to publish your own packages to the npm repository) + +Next, use npm to install [cordova](https://cordova.apache.org/): ```bash $ npm install -g cordova $ which cordova /usr/local/bin/cordova $ cordova -v -5.4.1 +7.1.0 ``` -用 cordova 创建一个项目: +Create a project with Cordova CLI: ```bash -# 格式为:cordova create <目录名> +# Syntax:cordova create $ cordova create temp com.rjfun.demo Demo ``` -然后编译,并在 iOS 模拟器中运行这个项目: +Compile and build, then run the app in iOS emulator: ```bash $ cd temp $ cordova platform add ios @@ -252,20 +253,20 @@ $ cordova build ios $ cordova emulate ios ``` -于是可以看到 iOS 模拟器被启动,然后 APP 运行: +Now we will see the iOS emulator is started, and APP launched: ![Cordova iOS](demo/cordovaios.png) -或者你也可以把 iPhone 用 USB 线连接到 Mac,然后用这个命令安装、启动刚刚编译的 APP: +Or, you can also connect your iPhone device to Mac, the use following command to install and launch the APP: ```bash $ cordova run ios --device ``` -现在运行的是 Cordova 自带的 Demo 工程。打开 Cordova 项目,可以看到这样的目录结构: +Now the running one is Cordova's Demo project. Open Cordova project, you can see this directory structure: ![Cordova Proj](demo/cordovaproj.png) -接下来,删去 www 目录下的内容,用我们前面写的 index.html, main.js, main.css 替换,并略作修改: +Next, delete the contents of the www directory, replace with the index.html, main.js, main.css we wrote earlier and make a few changes: ```html @@ -273,13 +274,13 @@ $ cordova run ios --device - + - + Hello @@ -296,11 +297,11 @@ $ cordova run ios --device // main.js console.log('hello, world!'); -// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in document.addEventListener('deviceready', function(){ console.log('deviceready'); - // TODO: 开始我们 web app 的业务逻辑 + // TODO: Start the business logic of our web app }); ``` @@ -323,116 +324,118 @@ h1 { } ``` -重新运行 cordova 项目(会自动编译、安装、运行): +Rerun the cordova project (it will compile, install, run automatically): ```bash $ cordova emulate ios ``` -于是,可以看到 Web App 在 iOS 模拟器中运行了: +So, you can see that Web App is running in the iOS simulator: ![Hello World Cordova](demo/helloworldcordova.png) -做个最简单的APP,其实也很简单,是不是?! +To write an easiest APP, in fact, is really simple, isn't it? -### 加个广告条 +### Add Ad Banner -作为程序员,我们毫不怀疑,你可以通过掌握的 HTML/CSS 以及 javascript 编程能力,提供一些有趣、有用的功能。 +As a programmer, we have no doubt that you have mastered the HTML / CSS and javascript programming capabilities to provide some interesting and useful features. -接下来,我们要给这个 APP 加上变现(monetization)的功能,即实现赚到真金白银。 +Next, we want to add monetization to the app, which is to make real money. -变现最简单的方法,就是加上广告条,例如谷歌的AdMob。 -* 通过展示广告,用户对有兴趣的广告点击,浏览产品、或者安装其他的 APP。 -* 投放广告的个人/公司(简称广告主,Advertizer)会支付广告费给谷歌。 -* 而谷歌则会将其中的一部分,支付给发布广告的个人/公司(简称发布商, Publisher)。 -* 谷歌在其中扮演的角色,则称之为广告平台(Ad Platform)、或者广告中介(Ad Network)。 +The easiest way to realize is to add an ad banner, such as Google's AdMob. +* By showing ads, users click on interesting ads, browse the product, or install other apps. +* Advertisers / advertisers (advertisers, Advertizer) pay advertising costs to Google. +* Google will pay a portion of it to the person / company (publisher, publisher) who posted the ad. +* Google's role in it is called the Ad Platform, or Ad Network. -Cordova 框架的技术架构,是 Web APP 加上一些通用的插件,提供手机特定功能的访问、与第三方系统的集成。 +The technical architecture of the Cordova framework is a web app with some common plug-ins that provide access to specific functions of the handset and integration with third-party systems. -我们通过插件 cordova-plugin-admobpro 来实现与谷歌 AdMob 的集成。这是基于谷歌 AdMob SDK 开发的一个插件,也是目前变现插件中最流行、最容易使用的。通过它,只需一行 javascript 代码就可以完成对 SDK API 的调用。 +We implemented integration with Google AdMob via the plug-in cordova-plugin-admobpro. This is a plug-in based on the Google AdMob SDK, and is the most popular and easiest to use plug-in for the moment. Through it, just a line of javascript code to complete the SDK API call. -现在让我们往 cordova 项目工程中加入插件。 +Now let's add plugins to the cordova project. ```bash $ cordova plugin add cordova-plugin-admobpro ``` -然后修改 main.js,在 APP 初始化完毕时,我们加几行代码。 +Modify main.js, let's add a few lines into the initialization: ```javascript // main.js console.log('hello, world!'); -// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +// When the app is initialized, the 'deviceready' event is fired and we can call the cordova framework and the APIs and functionality provided by the plug-in document.addEventListener('deviceready', function(){ console.log('deviceready'); - // 在 APP 初始化完毕时,在屏幕下方创建一个广告条 + // When the app is initialized, create an ad banner below the screen if(AdMob) AdMob.createBanner({ - adId: 'ca-app-pub-6869992474017983/4806197152', // 需要到 AdMob 官方网站注册用户,并创建广告单元 Ad Unit Id - position: AdMob.AD_POSITION.BOTTOM_CENTER, // 展示在屏幕下方中央 - overlap: false, // 不要覆盖 Web APP 的内容 - isTesting: true, // 展示测试广告,在正式发布时,去掉这行 - autoShow: true // 广告资源就绪时,自动开始展示 + adId: 'ca-app-pub-6869992474017983/4806197152', // need to register as a user on the AdMob website and create an Ad Unit Id + position: AdMob.AD_POSITION.BOTTOM_CENTER, // show at bottom / center + overlap: false, // no overlap the web app content + isTesting: true, // show testing ad, please remove this line when formal release + autoShow: true // auto show it when ad resource downloaded and ready }); }); ``` -重新运行 cordova 项目(会自动编译、安装、运行): +Rerun the cordova project (it will compile, install, run automatically): ```bash $ cordova emulate ios ``` -于是,可以看到 Web App 在 iOS 模拟器中运行了: +So, you can see that Web App is running in the iOS simulator: ![AdMob Banner](demo/admobbanner.png) -看,屏幕下方的广告条展示出来了。 +Look, at the bottom of the screen, the banner is displayed. -这里只是仅供调试用的测试广告。我们需要到 [AdMob官方网站](https://apps.admob.com/)注册用户,并创建广告单元(Ad Unit Id),并用来替换掉 代码中 adId 后面的这串数字。并在发布的正式版本中,去掉 `isTesting:true` 这行代码。 +This is just a test advertisement for debugging purposes only. -### 注册广告账号 +We need to register the user on [AdMob official website] (https://apps.admob.com/) and create an Ad Unit Id that replaces the string of digits following adId in the code. And in the official version of the release, remove the `isTesting: true` line of code. -下面我们就介绍,如何注册账号,如何创建广告单元,如何设置银行收款信息。 +### Register Ad Account -由于价值观方面的原因,谷歌的网站基本上都是被隔离在中国大陆局域网之外,通常是无法访问的。需要通过 VPN 等科学上网的方式才能够访问。如果你不知道如何科学上网,可以写邮件给我,单独讨论这个问题,这里暂不展开。 +Here we introduce, how to register account, how to create ad unit, how to set bank receipt information. -访问谷歌AdMob官网( https://www.google.com/admob/ ),注册新账号。 +Visit Google's AdMob website (https://www.google.com/admob/) to sign up for a new account. ![AdMob Site](demo/admobsite.png) -注册完成之后,登陆 AdMob 网站( https://apps.admob.com/ ),点击菜单“获利”,点击左上角的红色按钮“+通过新应用获利” 添加新APP: +After registering, visit the AdMob website (https://apps.admob.com/), click on the menu "monetization", click on the red button in the upper left corner "+ monetize new application" to add a new APP: ![AdMob New App](demo/admobnewapp.png) -然后创建横幅广告: +Then create banner ads: ![AdMob New Banner](demo/admobnewbanner.png) -即可获得广告单元 ID,将其 copy 到源代码中: +You can get the ad unit ID, copy it to the source code: ![AdMob Ad Unit ID](demo/admobadunitid.png) -### 验证地址和设置收款信息 +### Set Payment Info -注册账号之后,广告单元进入APP投放实际使用,即可积累广告收益。 +After registering your account, you can accumulate ad revenue by putting the ad unit into the APP for user actual usage. -要收到谷歌支付的广告分成,还有 2 个步骤要完成: -* 验证地址。谷歌会生成一个 PIN 码,打印在卡片上,邮寄到你的通信地址。 -* 设置收款信息。可以是 西联汇款 或者 银行账号。 +There are two more steps to complete the Google advertising payment you receive: +* Verify address. Google will generate a PIN code printed on the card, send to your mailing address. +* Set up payment information. Can be Western Union or bank account. -不过,刚注册的账号还不允许设置这个信息。只有你的累计广告收入达到基本的门槛(目前是 10美金),谷歌才会允许进入设置支付信息的环节。谷歌通过这个方法,可以过滤掉大量的无效账号。 +However, newly registered account has no access to set bank information. Only your cumulative advertising revenue reached the basic threshold (currently 10 US dollars), Google will allow you to set up payment information. Through this method, Google can filter out a large number of non-active accounts. -#### 验证 PIN 码: +#### Verify PIN Code ![Verify PIN](demo/verifypin.png) -点击“立即改正此问题”,进入 PIN 码输入界面。 +Click "Fix It", enter PIN input UI. ![Verify PIN](demo/verifypin2.png) -验证 PIN 码这个过程比较缓慢,通常需要 2-4 周的时间。所以如果显示了最近生成 PIN 码的日期,就耐心等待吧。收到 PIN 码之后,就将其输入上面这个框,提交验证。 +This process of verifying your PIN is slow and typically takes 2-4 weeks. + +So, if the date of the most recent PIN was displayed, wait patiently. After receiving the PIN code, it will be entered in the box above, submitted for verification. -#### 设置收款信息: +#### Set Payment Info ![AdMob Payment](demo/admobpay1.png) @@ -440,168 +443,172 @@ $ cordova emulate ios ![AdMob Payment](demo/admobpay3.png) -等这 2 个步骤设置完成,当产生广告收益的时候,谷歌就会在每个月的月末,计算当月的广告收益,然后在下个月的 20日左右支付给你。 +After the two steps are set up, when the advertising revenue, Google will calculate the advertising revenue of the month at the end of each month, and pay you around the 20th of next month. -### 发布APP +### Publish APP -我们完成的 APP,要被用户安装使用并产生收益,还缺少一个重要的环节:发布 到应用商店。 -* 如果是 Android APP,通常是 Google Play Store。中国大陆用户通常访问不到,则可以选择发布到大陆的一些应用商店,例如 360、豌豆荚 等等。 -* 如果是 iOS APP,则是发布到苹果 AppStore。 +The APP we developed, to be installed by user and generate revenue, needs an important part: released to the app store. +* If Android APP, usually Google Play Store. +* If iOS APP, released to Apple AppStore. -这里我们以苹果 AppStore 为例,来说明如何注册开发者账号,并发布 APP。 +Here we use the Apple AppStore as an example, to illustrate how to register a developer account and publish an app. -访问苹果开发者网站( https://developer.apple.com/ ),并注册登录。要在 苹果AppStore发布应用,需要支付每年 99 美金的年费,对于个人开发者、公司开发者,这个费用都是一样的。 +Visit the Apple Developers Web site (https://developer.apple.com/) and sign up for login. To release an app on the Apple AppStore, you pay an annual fee of $ 99 a year, which is the same for individual developers and corporate developers. ![Apple Developer](demo/appledev.png) -注册成功的开发者,需要下面几个步骤,才能将 APP 发布到 AppStore: -* 生成开发者数字证书,用于安装包的签名。 -* 为你的 APP 创建 APP ID,如果不涉及内购,也可以用 “*” 或者 “com.rjfun.*” 作为一个通用的 APP ID,在多个 APP 中使用。 -* 为你的 APP 生成 Provisioning Profiles,并下载到 本地用 Xcode 打开、管理。 +The following steps are needed to publish APP to the AppStore: +* Generate developer digital certificate for installation package signature. +* Create an APP ID for your APP, or use "*" or "com.rjfun. *" As a generic APP ID for more than one app, if no in-app purchase. +* Generate Provisioning Profiles for your APP, download it locally, open it in Xcode, and manage it. -然后用 Xcode 打开 Cordova 项目里的 XXX.xcodeproj 工程文件,编译并存档(Archive)。成功存档的 APP 包,才能提交到 AppStore 进行审核。 +Then use Xcode to open the XXX.xcodeproj project file in the Cordova project, compile and archive (Archive). Successfully archived APP packages can be submitted to AppStore for review. -APP 提交前,需要到 iTunesConnect ( https://itunesconnect.apple.com/ ),准备、发布和管理你的 APP。 +You need to log into iTunesConnect (https://itunesconnect.apple.com/), to prepare, publish and manage your APP. ![iTunes Connect](demo/itunesconnect.png) -创建新的 APP,加上名字、介绍、图标、定价等信息,并将其设置为准备提交的状态,然后就可以通过 Xcode 中的 Organizer 将成功存档(Archive)的安装包提交到 AppStore 进行审核了。 +Create a new APP, add the name, introduction, icon, pricing and other information, and set it as ready to submit the status, and then you can Organizer Xcode in the successful archive (Archive) installation package submitted to the AppStore for review . ![Xcode Organizer](demo/xcodeorganizer.png) -苹果审核 APP 的流程大约 1 周左右的时间。如果审核通过,就可以在 AppStore 里面看到你发布的 APP 了。 +Usually it will take Apple 2 or 3 days to review your app. If the review passes, you can see your app in the AppStore. -### 广告收益的计算 +### Calculate Ad Revenue -当用户在设备中下载、安装APP并运行的时候,就会从谷歌的广告服务器请求正式的广告内容,并用于展示了。 +When a user downloads, installs and runs an app on his device, he or she requests the official ad content from Google's ad server for display. -你可以登陆谷歌 AdMob 网站,查看每天的广告展示量、点击率、以及产生的收益。这个网站也提供了非常强大的报表功能,可以根据国家、广告单元、时间段,显示非常详细的报告。谷歌在 AppStore 上发布有一个 AdSense 的 APP,你可以安装这个 APP,每天查看你的 AdMob 收益。 +You can visit the Google AdMob website to see daily ad impressions, clickthrough rates, and revenue. This site also offers very powerful reporting capabilities that show very detailed reports based on country, ad unit, time period. Google has an AdSense app on the AppStore, and you can install this app on your phone to see your AdMob earnings daily. -每次用户对感兴趣的广告进行点击,就会产生广告收益。大部分的广告投放,是按照点击次数计算费用的,即所谓的 CPC 广告。 +Each time a user clicks on an ad of interest, it generates advertising revenue. Most of your ad serving is calculated based on the number of clicks, the so-called CPC ads. -在计算广告收益的时候,有几个常见的基本术语: -* CPC(Cost Per Click,每次点击费用),大约是 US$ 0.06 ~ 1.0; -* CTR(Click Through Rate,展示点击率),大量统计的结果大约是 1%; -* CPM (Cost Per Mile, 每千次展示费用),通过 CPC 和 CPR 也能够推算出 CPM,大致范围是 US$ 0.5 ~ 5。 +In calculating advertising revenue, there are several common basic terms: +* CPC (Cost Per Click, cost-per-click) is about US $ 0.06 ~ 1.0; +* CTR (Click Through Rate, show CTR), the result of a large number of statistics is about 1%; +* CPM (Cost Per Mile, CPM), CPM can also be calculated by CPC and CPR, the approximate range is US $ 0.5 ~ 20. -每次点击的价格,根据广告投放的价格不同而不同。全球不同国家由于经济水平不同,也存在很大的差异。例如, -* 在美国,一次广告点击可能产生 0.2 美元的收益; -* 在巴西,也许只有 2 美分,相差 10 倍。 -* 而日本,广告点击的收益是相当高的。 +The price per click varies based on the type of ad, the price that is served, and so on. Since different countries in the world have different economic levels, there are also big differences. -下面是一组数据的对比: +E.g, +* In the United States, an ad click may yield a gain of $0.2; +* In Brazil, maybe only 2 cents, a difference of 10 times. +* In Japan, clicks on advertising revenue is quite high. -美国 | 巴西 +The following is a comparison of a set of data: + +USA | Brazil ---|--- ![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) -日本 | 德国 +Japan | Germany ![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) -如果我们按照 CPM (每千次展示费用)1美元 来估算,每天 10万次广告展示,大约可以产生 $100美元现金收益。按照 6.45 的汇率计算,一个月30天(包括周末和节假日!),大约可以产生的收益是 ¥19,350。 +If we conservatively estimate $1 CPM (cost per thousand impressions), 100,000 ads per day will generate about $100 in cash. Then it will generate $3,000 in a month (including weekends and holidays!). -而在上海,5年经验的、技术能力还不错的程序员,薪资大约也就 15,000 左右。如果你做的 APP,每天能够有 1万个用户使用,基本上产生的广告收益和现金流,就可以达到一个程序员的工资水平。 +Let's compare it with the average programmer's salary. In Shanghai, an experienced programmer with 5 year experience, the salary is about $2,300 or so. If you make such the APP, with 10,000 DAU (daily active user), the revenue generated from advertising can exceed the salaries of a programmer. Or even more, if optimized very well. -我认识一个巴西人,他用 HTML5 技术实现的小游戏,简单,但是非常有趣。每天的活跃用户大约是 10万,广告收益已经超过每个月 15万,从而实现了财务自由。 +I know a Brazilian, develop his game with HTML5 technology, simple, but very interesting. Daily active users is about 100,000, advertising revenue has more than $25,000 per month, so as to achieve the financial freedom. -### 进阶篇 +### Advanced -### 需求是根本 +### Demand is fundamental -前面我们介绍了如何为 APP 增加了变现(monetization)的能力。但要真正获得可观的收益,还必须得有足够多的用户。也就是说,你必须开发出足够好的 APP,能够真正解决用户的问题,才会有更多的用户使用、更高频度的使用。 +Earlier we described how to add monetization to APP. But to really get a decent return, you still have to get enough users. In other words, you have to develop enough good APP, can really solve the user's problem, will have more users, more frequent use. -如何能够开发出更受用户欢迎的 APP 呢?其实这不是一个编程问题。 +How to develop a more popular APP? In fact, this is not a programming problem. -也许你是一个技术的大牛,但是最艰深、最牛X的技术,开发出来的软件产品未必是受到用户欢迎的产品。有时候,你用了一种其实比较简单的技术,但是真正关注了用户的痛点,解决了用户关心的问题,很可能你的产品就会受到用户的欢迎,创造出口口相传的良好口碑,在社交网络得到自然传播。 +Perhaps you are a technical expert, using the most difficult, coolest technology, but the software products developed, may not be welcomed by users of the product. Sometimes, you use a technology that is actually relatively simple, but really pay attention to the user's pain points, to solve the user's concerns, it is possible your product will be welcomed by users, because of good reputation in the social network to get the natural spread. -我推荐一本书,《需求-缔造伟大商业传奇的根本力量》,作者是亚德里安•斯莱沃斯基。 +I recommend a book, "Demand - the Fundamentals of Creating Great Business Legends," by Adrian Silesivski. -以下是某些创业成功者的推荐: +Here are some tips from entrepreneurs: -> 这是一本好书,每个创业者和每个公司管理者都值得一看,甚至公司中的每个人都应该了解和体会其中的概念。书中给出了一些创造需求的模式,这对读者是非常有价值的,我们需要好的理念,但我们更需要可以践行理念的方法。这两点本书都做到了,非常值得一读,特荐之。 -——孙陶然 ,拉卡拉支付有限公司创始人、董事长兼总裁,《创业36条军规》作者 +> This is a good book worth every entrepreneur and every manager of the company to read, and even everyone in the organization should understand the concepts. The book gives some models for creating needs, which are very valuable to readers, we need good ideas, but we need more ways to practice ideas. These two books are done, very worth reading, especially recommended. +- Sun Taoran, founder, chairman and president of La Cara Pay Ltd., author of "Entrepreneurship 36 Military Regulations". -> 每一个抱怨的背后都隐藏着一个未被满足的需求,而每一个需求的背后必然隐藏着一个不可忽视的市场。其实任何产品,在一开始满足了用户的功能性需求以后,就应该着手升级到精神层面,用户拒绝麻烦,用户需要安慰,这看起来跟利润无关,但是对不起,它跟你的市场有关。你不去满足,创业者就会自己去进行开拓性满足。那么等待你的,或将是个生死存亡的巨大危机。因此,请一定重视麻烦所带来的希望,而不是去抵触他们的抱怨。这正是《需求》给我们带来的最有价值的东西。 -——杜子建,华艺传媒创始人,社会化媒体营销研究者,畅销书《微力无边》作者 +> Behind every complaint is hidden an unmet need, and behind every need inevitably hides a market that can not be ignored. In fact, any product that meets the functional needs of the user from the outset should be upgraded to the spirit level, the user refuses to trouble, the user needs comfort, it does not seem to have anything to do with the profit, but I'm sorry, it is related to your market. You do not meet, entrepreneurs will go to their own ground-breaking satisfaction. Then waiting for you, or will be a huge crisis of life and death. Therefore, please pay attention to the hope of trouble, rather than to their complaint. This is exactly the most valuable thing that "demand" brings to us. +- Du Zijian, founder of Huayi Media, social media marketing researcher, bestseller "Boundless" author. -### 用户体验 +### User Experience -为什么苹果手机卖得贵,依然热卖?无疑它是以优秀的用户体验取胜的。如果你看过《乔布斯传》,你可以知道,苹果手机的诞生,其实是解决了传统手机难于使用的痛点。 +Although the sale of Apple mobile phone is very expensive, but still very popular, why? It is undoubtedly the best user experience to win. If you read "Steve Jobs Biography", you can know that the birth of Apple's mobile phone, in fact, is to solve the pain of traditional phones difficult to use. -自然我们在手机上开发的 APP 或者 游戏,也必须要高度关注用户体验,并且把它放到战略重点的位置上来。手机 APP,不追求功能的强大、齐全,可以只做一个小小的功能,但是要切实关注用户的需求点、并提供优秀的用户体验。 +Naturally, the app or game we develop on our mobile phone must also be highly user-focused and put it in a strategic position. Mobile APP, not the pursuit of powerful features, complete, you can only do a small feature, but to effectively focus on the needs of users, and provide excellent user experience. -一个相当典型的例子是这款《手电筒》APP,就是打开手机的 LED灯泡,用来临时照亮黑暗。 +A rather typical example is this "Flashlight" APP, which is to turn on the phone's LED bulb to temporarily light up the darkness. ![Torch APP](demo/torchapp.png) -这款 APP 的用户已经超过好几亿,自然收益也是极其可观。 +This APP has more than hundreds of millions of users, of course, its economic return is also extremely impressive. -评价的数量超过600万人次,它的用户是这样写的: -* Jennifer Baylis: 易于使用。#1 最棒的手电筒APP!非常容易使用,打开很快! -* Kitty Davis: 我正是需要这样一个手电筒 APP。 -* Dennis Castello: 它正是做到了需要它做的事,而且做的真的很好。 -* Joseph Low: 易于使用。轻松地让它干活!强烈推荐! +The number of user comments exceeded 6 million and the users wrote: +* Jennifer Baylis: easy to use. # 1 The best Flashlight APP! Very easy to use, open very fast! +* Kitty Davis: I just need such a flashlight APP. +Dennis Castello: It's exactly what it takes and it's done really well. +* Joseph Low: easy to use. Let it work easily! highly recommended! -### 哪种广告最适合 +### What Ad is Best -在移动广告领域,存在多种形式的广告,并且也在不断的发展。 -* banner Ad,横幅广告 -* interstitial Ad,插屏广告 -* native Ad,原生广告 -* reward video Ad,奖励视频广告 -* IAP (in-app purchase) Ad,内购广告 +In the mobile advertising arena, there are many forms of advertising, and are also constantly evolving. +* banner Ad +* interstitial Ad +* native Ad +* reward video Ad +* IAP (in-app purchase) Ad -哪种广告适合你的 APP,需要很好的权衡用户体验和收益之间的关系。如果广告展示不当,或者展示过于频繁,影响了用户体验甚至招致用户反感,就本末倒置了。 +Which ad is best for your app, depending on the situation. This requires a good balance of user experience and revenue. If the ad is displayed improperly, or show too often, affecting the user experience or even cause the user offensive, it is the cart before the horse. -横幅广告 | 插屏广告 +banner Ad | interstitial Ad ---|--- ![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) -这两种广告是最为基本和经典的,各有千秋。相对来说,横幅广告只占用屏幕下方的一小片空间,可以一直滚动展示,默认的是每 60 秒更换一次广告内容。优点是不太会影响用户界面和体验,缺点则是因为不太起眼,不容易引起用户的注意和点击。 +These two kinds of advertisements are the most basic and classic, each has its pros an cons. Banner ads occupy only a small space at the bottom of the screen, changing the ad content every 60 seconds. The advantage is not too affect the user interface and experience, the disadvantage is because less obtrusive, not easy to arouse the user's attention and clicks. + +Interstitial ad is full-screen, pop-up at a specific time, more able to attract the user's attention and click. Because of this, the interstitial ad has better effects and click revenue is higher than the banner ads more than 5 times, so more recommended. -插屏广告则是全屏的,在特定的时间弹出,更能够吸引用户的眼球和点击。也正是因为这个原因,插屏广告的点击收益比横幅广告要高 5 倍以上,比较推荐使用。 +When using interstitial ad, please pay special attention to the pop-up time, do not interrupt the user's continuous operation and gaming experience, otherwise it will cause the user's strong aversion. Best practice is to put it in transition between the two stages, such as the game is just over, pop-up screen ads, and then continue to the next level. -使用插屏广告的时候,要特别注意弹出的时间,千万不要打断用户的连续操作和游戏体验,否则不仅不会引起用户的点击,还会引起用户的反感。最佳做法是将其放在 2个阶段之间的过渡时机,例如游戏的一关刚刚结束,弹出插屏广告,然后再继续下一关。 +Using cordova-plugin-admobpro to display interstitial ads is also straightforward, requiring just two lines of javascript to complete. One line of code prepares inventory and the other line of code shows ads. -通过插件 cordova-plugin-admobpro,要展示插屏广告也是非常简单的,只需要 2 行 javascript 代码就可以完成了。其中一行代码负责准备广告资源,另一行代码负责展示。示范代码如下: +Here is the example: ```javascript -// 在游戏启动时或者进行中,开始准备插屏广告,通过后台线程下载广告资源 +// When the game starts, it starts to prepare for interstitial ads, and the background thread downloads the inventory if(AdMob) AdMob.prepareInterstitial({ adId: "__ad_unit_id_here__", autoShow: false }); -// 在游戏关卡结束时,调用 API 进行插屏广告的展示 +// At the end of the game level, call API to display the interstitial ad if(AdMob) AdMob.showInterstitial(); ``` -以上这 2 种广告,是最容易使用的广告形式,集成到 APP 中的工作也最为容易。 +The above two kinds of advertisements are the easiest to use forms of advertisement, and the work integrated into the APP is also the easiest. -原生广告(native Ad),就是将广告内容以较为和谐的方式,展示在APP自身的内容之间,不会显得过于突兀和突然,这是对用户体验影响最小的一种广告形式。 Facebook AudienceNetwork 和 Flurry 比较早就推出了原生广告,不过谷歌 AdMob 对此持谨慎态度,仅仅在部分开发者中进行 beta 试用。 +Native Ad is a new way to show your ads in a more harmonious way between their own content. It does not seem obtrusive or abrupt. It's the type of advertising that has the least impact on user experience. Facebook AudienceNetwork and Flurry launched native ads long before, and later Google AdMob also introduced it to developers. -奖励视频广告(reward video Ad),是谷歌新推出的一种广告。就是鼓励用户看完广告视频,然后开发者在游戏中或者 APP 中给予某种虚拟物品的奖励。在以前的广告推广中,谷歌并不支持在用户接受广告方面给予鼓励的行为,甚至将对点击广告给予奖励的做法定为违规的行为。因为这很可能违背用户本身的兴趣、造成虚假无效点击。新的奖励视频广告方面,谷歌采取了相对灵活和务实的态度。不过这方面的广告视频来源,基本上都是通过广告中介的方式来自于其他的广告网络。 +Reward video Ad, a new ad in the mobile advertising industry. It encourages users to watch ad videos and reward them with some kind of virtual item in the game or app. In previous advertising campaigns, Google did not support giving users encouragement, and even made it illegal to give rewards. Because this is likely to violate the user's own interest, resulting in false invalid clicks. For the new rewarded video ad, other advertisers first introduced and succeeded in the market, Google adopted a relatively flexible and pragmatic attitude. However, advertising video sources are not very rich, many are mediation way from other ad networks. -内购广告(IAP House Ad)是一种新颖、创新的广告形式,应用内购买广告可让用户直接在应用内购物。因为需要和支付系统、或者谷歌Play Store结合起来,所以仅在 Android 系统支持。通过内购广告,应用开发商可在以下方面获益: -* 通过在同一款应用中实施广告投放和应用内购,可以最大程度地增加您的收入和用户的生命周期价值。 -* Google 会自动帮助您确定哪些用户有可能购买应用内购商品,并向其余用户展示普通的付费广告。 -* 不需要开发自己的应用内购支持系统,也不需要在应用中加入应用内购支持代码。 -* 利用不同的自家内购广告,可以轻松定位用户群体中的各种细分受众群。通过将应用内购广告与 AdMob 受众群体构建工具结合使用,可以向高消费群体投放价格高的应用内购商品,而向其他用户展示价格低的商品。 +IAP Ad is an innovative form of advertising. IAP Ad allows users to shop directly in-app. Because it needs to be integrated with the payment system or the Google Play Store, it's only supported on the Android system. With in-app advertising, app developers can benefit from: +* Maximize your revenue and user lifecycle value by implementing ad serving and in-app purchases in the same app. +* Google automatically helps you determine which users are likely to purchase in-app purchases and show ordinary paid ads to the remaining users. +* No need to develop your own in-app support system or add in-app support code to your app. +* Easily target various segments of the user community with different in-app purchases. By using In-App Ads with the AdMob Audience Builder, you can serve high-priced, in-app products to high-spending groups while showing them to you at lower prices. -如果要尝试原生广告、奖励视频广告、内购广告,请移步 Google [AdMob 官方文档网站](https://developers.google.com/mobile-ads-sdk/),进行深入研究,学习如何使用。 +If you want to learn more about native ads, rewarded video ad, buy ads, go to Google [AdMob official documentation website](https://developers.google.com/mobile-ads-sdk/) for in-depth research and study how to use. -### 哪家广告商最靠谱 +### Which Ad Most Reliable -因为移动广告领域的利润可观,移动广告平台的发展也是非常快的。过去的这些年,也发生了不少并购案。例如 Google先后收购了 DoubleClick 和 AdMob,Flurry 被 Yahoo! 收购,MobFox 被 Matomy 收购,Millennial Media 被 AOL 收购。 +Because of the profitable mobile advertising sector, the mobile advertising industry is also growing very fast. Over the past few years, there have been many mergers and acquisitions. For example, Google has successively acquired DoubleClick and AdMob, Flurry acquired by Yahoo!, MobFox acquired by Matomy, and Millennial Media acquired by AOL. ![Top Ad Networks](demo/topadnetworks.jpg) -通常广告平台会提供: -* 接入广告系统的 SDK; -* 注册、登录和管理广告的系统; -* 接入指南、例程、FAQ; +Usually the ad platform will provide: +* SDK, providing API for accessing advertising system; +* Register, login and manage advertising system; +* Integration Guide, examples, FAQ; -各种移动广告平台的相关介绍,可以通过搜索活着其他不同的渠道去了解(例如 StackOverflow.com),并可以有选择性的进行尝试。 +Information about the various mobile ad platforms can be found through search or through a number of different sources (eg, StackOverflow.com) and try selectively. -以下是我试用过的一些广告平台: +Here are some of the advertising platforms I've tried: * Google AdMob * Facebook AudienceNetwork * Yahoo! Flurry @@ -614,76 +621,78 @@ if(AdMob) AdMob.showInterstitial(); * Smart AdServer * ... ... -使用下来比较满意的有 AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox。尤其是 AdMob,非常值得推荐。 +By trying to use, I am more satisfied with AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox. Especially AdMob, is highly recommended. -AdMob之所以最值得强烈推荐,主要有这样一些突出的优点: -* 广告填充率高(基本上在 98% 以上,有个别国家略低于90%),因此可以充分利用用户流量。毕竟广告是谷歌公司的主要业务和利润来源,其广告客户遍及全球,这也不足为怪了; -* 付款及时,每个月的月底结算,次月 20日支付; -* SDK 非常稳定,接入文档以及参考代码易于使用,并且有不同语言的文档和系统界面; -* 报表系统功能强大、易于使用,可以通过不同的维度进行数据分析; -* 有专门的 APP 可以用来跟踪收益; -* 有专门的技术支持人员,有官方支持的技术论坛,专门解答 SDK 接入方面的技术问题; -* 定期会组织一些宣讲、培训活动,也定期有线上视频讲座; -* 客户服务非常到位,非常的耐心和友善,我和他们也基本上一直保持联系。 +The reason why AdMob is the most highly recommended, there are some prominent advantages: +* Ad fill rate is high. Basically more than 98%, some countries slightly less than 90%, so you can take full advantage of user traffic. After all, it is no surprise that advertising is a major source of revenue and revenue for Google, with advertisers around the world. +* Payment promptly. The monthly earnings are settled at the end of the month and paid on the 20th of the following month; +* SDK is very stable. Integrated documentation and reference code Easy to use, with documentation and system interfaces in different languages; +* Reporting system powerful and easy to use. Data can be analyzed in different dimensions; +* Easy to use. A dedicated APP can be used to track earnings; +* Support in place. A dedicated technical support staff, technical forums with official support, dedicated to answer the technical aspects of SDK access; +* Regularly organize some preaching and training activities, as well as regular online video lectures; +* Customer service is in place. Very patient and friendly, I keep in touch with them. -由于谷歌在各个领域的卓越创新、一贯的优质服务,在开发者中有良好的口碑。 +Because of Google's excellence in innovation and consistent quality service, it has very high reputation among develoeprs. -而基于 AdMob SDK 开发的 cordova-plugin-admobpro 这款插件,不仅把 Objective-C / Java / C# 的原生 API 封装为统一的 javascript API,而且更加简单易用,只需 1-2 行代码即可完成广告展示。这款插件在 Cordova 全球社区也广受欢迎,是使用率最高的变现插件。以下是插件的下载趋势曲线图: +The cordova-plugin-admobpro plug-in, built on the AdMob SDK, not only encapsulates Objective-C / Java / C # native APIs into a unified javascript API but is also much easier to use. Just 1-2 lines of code to complete the ad display. Popular in Cordova's global community, this plug-in is the most-used monetization plug-in. The following is a plug-in download trend curve: ![AdMob Download Trend](demo/admobprodltrend.png) -Facebook 的 AudienceNetwork 也挺不错。Facebook 不仅仅是最大、最活跃的社交媒体,也提供各种相关 SDK,包括广告用的 AudienceNetwork。其开发者网站为:https://developers.facebook.com/docs/audience-network 。 -* Facebook 的 广告填充率(Fill Rate)没有 AdMOb 那么高,大约在45~75% 之间。 -* Facebook 付款也很及时,也是在每个月的 21日左右支付上个月的广告收益; -* Facebook 的 SDK 更新非常频繁,大约 2 周左右就会发布一个新的版本,因此如果有什么 bug 修复也很快。不过更新的频度实在有点高,有时候有点跟不上的感觉。相对来说,谷歌 AdMob 的 SDK 更加稳定一些; -* 管理界面和报表系统也比较清楚易用,一目了然。报表系统没有 AdMob 的那么强大和灵活,貌似仅有英文界面,看上去是下面这样的。 +Facebook AudienceNetwork is not bad. + +Facebook is not only the largest and most active social media, but also offers a variety of related SDKs, including AudienceNetwork for Advertising. Its developer website is https://developers.facebook.com/docs/audience-network. +* Facebook's Fill Rate is not as high as AdMob, about 45-75%. +* Facebook payment is also timely, but also in the 21st of each month to pay last month's advertising revenue; +Facebook's SDK updates are very frequent. A new version will be released in about two weeks, so if there are any bugs, the fix is fast. However, the update frequency is a bit high, sometimes feeling a little behind. Relatively speaking, Google AdMob SDK more stable; +* Management interface and reporting system is also relatively clear and easy to use. The reporting system is not as strong and flexible as Google Admob, seemingly only English interface, it looks like the following. ![Facebook AudienceNetwork](demo/fbaudnet.png) -Flurry 是一家被 Yahoo!收购的移动广告公司,其官方网站是 http://www.flurry.com/ 。其主要的产品有 2 个,一个是数据分析(Flurry Anlytics),一个是广告系统(Flurry Ads)。 -* Flurry SDK 接入也还算比较容易,报表系统中规中矩。就是网站访问稍微有点慢,比较花时间。 -* 付款略慢,在广告收益产生的 60天之后才付款。 -* 值得一提的是,Flurry 是比较早支持原生广告的(Native Ad)的。 +Flurry is a mobile advertising company that has been acquired by Yahoo, the official site is http://www.flurry.com/. There are 2 main products, one is Flurry Anlytics and one is Flurry Ads. +* Flurry SDK integration is still relatively easy, the reporting system quite satisfactory. Site visit is a bit slow, more time-consuming. +* Payments are slightly slower and are not paid until 60 days after the advertising revenue. +* It is worth mentioning that, Flurry is a relatively early support Native ads (Native Ad). -MobFox 是一家欧洲的移动广告公司,总部位于奥地利。曾经它的 CEO 联系过我,希望能够就某项产品达成合作。后来因为收购事宜暂停,再后来,再后来就知道 MobFox 被 Matomy 收购,项目合作的事情就没有下文了。这家公司还是不错,付款也比较及时。虽然号称是欧洲最大的移动广告公司,并且全球位于 Top 10,但和 Google、Facebook 这样的巨头比起来,在全球范围内的影响力实在有点弱。 +MobFox is a European mobile advertising company headquartered in Austria. I used to contact its CEO, he wants me to develop plug-ins for them. Later, because of the acquisition, then later, we knew that MobFox was acquired by Matomy. This company is still good, payment is more timely. Although known as Europe's largest mobile advertising company, and the world is located in the Top 10, but compared with giants such as Google, Facebook, the global influence is really a bit weak. -Apple 的 iAd,只是在 iOS 系统上进行投放。由于 iPhone 的市场定位和定价明显要高于 Android 系统,也就决定了 iOS 用户有较强的购买力,所以 iAd 广告的点击回报比较高,也就不言而喻了。不过如果你开发的 APP 需要同时投放 iOS 和 Android 系统,用 AdMob 管理起来相对容易一点。也可以通过 AdMob 的广告中介(mediation)功能,把部分流量通过 iAd 进行展示,从而使得广告收益的利益最大化。 +Apple's iAd just launches on iOS. As the iPhone's market positioning and pricing significantly higher than the Android system, it also determines the iOS users have a strong purchasing power, so iAd ad click returns relatively high, it goes without saying. However, if you develop an app that needs to run on iOS and Android at the same time, managing it with AdMob is a bit easier. You can also use AdMob's mediation feature to show some of your traffic through iAd, maximizing the benefits of advertising. Later, Apple adjusted the advertising business and stopped iAd service. -像 OpenX 和 Smart AdServer 仅对欧美的签约客户开放,并不针对全球用户和开发者。只是曾经有美国和欧洲的客户在 GitHub 上看到我的开源项目,特意找到我要求我定制产品,通过项目合作的方式,我才得以了解和熟悉。不过因为不对全球开发者,所以也无法推荐使用。 +Like OpenX and Smart AdServer, open only to European and American business customers, not for global users and individual developers. Formerly, customers in the United States and Europe saw my open source project on GitHub, specifically looking for me to customize the adware plug-in. Through project cooperation, I was able to understand and become familiar with it. However, because it is not for global developers, it is not recommended. -至于 MoPub,它的 SDK 的是在 GitHub 上开源的,这是它与众不同的地方。不过也正是因为这一点,其文档和 SDK 接入就要稍微麻烦一些。必须要把这些 SDK 从源代码编译成 jar 和 framework,然后才能在自己的项目中使用。 +As for MoPub, its SDK is open source on GitHub, and it's something different. Its documentation and SDK was not very mature. For some time, you have to compile these SDKs from source code into a jar and framework before using them in your projects, which is really inconvenient. Recently, they have supported their SDK to be loaded into your project with gradle and cocoapods, a lot easier than before. -Millennial Media(简写为 mMeida),其 SDK Demo 的美观度做得不错,不过客服和技术支持的响应实在不敢恭维。曾经碰到过技术问题,通过 Web Form 提交了问题,一直没有得到过答复,所以我后来也就懒得用它了。 +Millennial Media (abbreviated mMeida), its SDK Demo aesthetics done well, but customer service and technical support response is really flattered. Have encountered technical problems, submit a question through the Web Form, has not been answered, so I am not happy to use it. I heard later they were acquired by AOL. -另外像 Charboost、TapJoy 等等广告平台,也或多或少的接触过。不过精力有限,没有逐一进行具体的试用。Charboost 是 2011 年才创业的广告公司,只专注在移动游戏领域,2014年被 VentureBeat 指数报告定为 Top 10 的移动广告公司。通过 Chartboost 发布的广告,点击收益比较不错,不过反过来说,也就是广告投放、获取用户的成本是比较高的。我所认识的专门做重度游戏、专门投放海外市场的朋友,通过 Facebook 和 Chartboost 投放广告用得比较多。 +In addition, such as Charboost, TapJoy advertising platform, also more or less seen. However, each person's energy is limited, so did not try them one by one. Charboost, an advertising startup that started up in 2011, focuses exclusively on mobile games and was named Top 10 mobile advertising company by the VentureBeat Index in 2014. Advertised by Chartboost, click revenue is relatively good, but conversely, that is, advertising, access to the user's cost is relatively high. Some of my friends I know are specialized in heavy games, devoted to overseas markets and used more ads on Facebook and Chartboost. -上面介绍了不少移动广告平台,完全是个人经验和主观体会,有兴趣的可以自行尝试。 +These mobile advertising platform described above is entirely personal experience and subjective experience. If you are interested, ou can try more by your own. -### 营销你的产品 +### Promote Your App -(待续) +(To be continued) -### 联网版APP +### Online APP -### 云服务 +### Cloud Seervice -### 高级篇 +### Expert Topics -### 用户数据分析 +### User Data Analysis -### 广告优化 +### Ad Optimization -### 支付与内购 +### In-App Purchase -### 社交营销 +### Social Marketing -### 广告投放 +### Cast Advertising -### 附录 +### Appendix -#### 互联网营销常用术语 +#### Popular Mobile Marketing Terms -Part1 最基本的名词 +Part1 Basic Terms ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) diff --git a/README.zh.md b/README.zh.md new file mode 100644 index 0000000..0d0325d --- /dev/null +++ b/README.zh.md @@ -0,0 +1,926 @@ +# 从编码到变现:程序员财务自由之路 + +From Coding to Monetization:Programmer's Financial Freedom Approach + +[英文版本 / English Version](./README.md) + +![大富豪](demo/richman.jpg) + +### 目录 + +* [前言](#前言) +* [定位](#定位) +* [基础篇](#基础篇) + * [语言与工具选择](#语言与工具选择) + * [Hello, World!](#hello-world) + * [单机版APP](#单机版APP) + * [加个广告条](#加个广告条) + * [注册广告账号](#注册广告账号) + * [验证地址和设置收款信息](#验证地址和设置收款信息) + * [发布APP](#发布APP) + * [广告收益的计算](#广告收益的计算) +* [进阶篇](#进阶篇) + * [需求是根本](#需求是根本) + * [用户体验](#用户体验) + * [哪种广告最适合](#哪种广告最适合) + * [哪家广告商最靠谱](#哪家广告商最靠谱) + * [营销你的产品](#营销你的产品) + * [联网版APP](#联网版APP) + * [云服务](#云服务) +* [高级篇](#高级篇) + * [数据分析](#数据分析) + * [广告优化](#广告优化) + * [支付与内购](#支付与内购) + * [社交营销](#社交营销) + * [广告投放](#广告投放) +* [附录](#附录) + * [互联网营销常用术语](#互联网营销常用术语) + * [如何发布 APP 到 Apple AppStore](#如何发布-app-到-apple-appstore) + * [如何发布 APP 到 Google Play Store](#如何发布-app-到-google-play-store) + * [如何发布 APP 到 360 应用商店](#如何发布-app-到-360-应用商店) + * [如何用 Google Analytics 做用户数据分析](#如何用-google-analytics-做用户数据分析) + +### 前言 + +这本书,是写给程序员看的。 + +这并不是关于一门编程语言,也不是关于一种设计模式,更不是关于如何评估工程量、如何做项目管理。 + +这本书是关于:变现(monetization),通俗的说,就是赚钱。 + +作为程序员,你一定花了大量的时间去学习,掌握了若干种编程语言、用过数十种开发工具。为了设计稳定灵活的架构,你也认真学习和掌握了各种设计模式;为了提高工作效率,你也用了各种成熟的框架以及自动化测试的工具;总之,通过学习,你成为了一个牛B的程序员。 + +甚至,你也积累了管理的经验,主动学习了项目管理的理论知识、各种研发组织模式,也许会进阶到管理岗位,成为研发团队的负责人或者经理人。 + +在大部分的情况下,作为程序员或者研发团队,你按照项目经理 或者 产品经理给的需求,进行需求分析、架构设计、模块划分、接口设计、编码实现、测试、提交版本。这些环节,毫无疑问,是做研发的程序员最为熟悉的流程。 + +不幸的是,你日常所关注的,仅仅只是研发环节。接受需求,交付版本,这就是产品经理或者甲方让你干的事情。很多在研发领域侵淫多年的研发大牛,也往往并不熟悉软件怎样能够直接带来经济回报。绝大多数的开发者,仅仅关注研发这个环节,甚至仅仅关注在编码这个环节,这是非常局限的。 + +事实上,研发环节,再加上销售、收款、推广、用户支持、维护,这才是软件产生经济回报的完整闭环。 + +然而,软件怎样直接带来经济回报,这方面的技术文章或者书籍并不多见。这也是我为什么会选择这个角度,作为本书下笔的核心内容。 + +这本书是关于,如何从编码、到如何接受付款,以及如何获取用户。手把手,教你每一个步骤。 + +一旦你掌握软件如何变现的能力,你会更加关心用户反馈、关心市场需求、关心产品质量,因为这些都会为你带来更好的经济收益。实现财务自由,也就并不遥远了。 + +如果你觉得本书的内容有所帮助,请点赞支持。 + +### 定位 + +既然是谈赚钱,类似于外包这种把有限的生命折算成man hour来卖钱的苦逼方式,我们暂不讨论。 + +考虑到人力、时间、成本等因素,我们也暂时不讨论运营级、或者企业级的大型系统。研发周期长、投入大、需求复杂,也超过个人和小团队的掌控。 + +在移动互联网时代,以个人或者小团队,实现赚钱、甚至创造奇迹的故事,屡见不鲜。 + +真实案例 1: + +[Flappy Bird](https://zh.wikipedia.org/wiki/Flappy_Bird) 传奇,一个花2-3天开发出来的小游戏,在短短几周时间席卷全球,并获得了每天 5 万美金的广告收益。这无疑有偶然、运气的成分,但至少这是有概率发生的事情。 + +真实案例 2: + +我认识一个波兰的老外,用做网页的技术,做了个并不复杂的计算器,大概也就是按照百分比计算下小费之类的。在欧洲好几个国家的应用商店上财务类APP,排名前几,通过广告条变现,赚了不少钱。 + +真实案例 3: + +在2010年左右,我在一家开发保险软件的公司工作。 公司发展得相当好,2000年创立,经过10年发展到1000人的规模,管理层试图上市。 然而并不顺利,又过了许多年,它还没有能够IPO。我个人以为,是商业模式的问题,围绕着大保险公司客户的需求,有太多的定制开发。这与外包模式太接近了,而不是产品模式或平台模式,难以规模化扩张。 + +我在这家公司工作的时候,有两位同事阳陆育与朱骏。他们在2014年离开了这家公司,成立了一家初创公司,开发一个手机上的短视频APP,成为一个短视频社区平台。团队仅仅6个人,他们开发出的一个小小的产品,却带来了爆炸式的增长。在经过3年的创新和努力之后,也就是2017年,他们被今日头条以10亿美元的估值收购了。 + +最初APP的名字叫Musical.ly,也许你不一定熟悉它,但是你一定知道后来它的鼎鼎大名,Tiktok。对,就是那个超越了 Facebook、经常排在应用商店第一名的APP。它在全世界的影响力,甚至大到曾经被特朗普威胁要制裁。 + +你可以找到其他类似的成功故事,从移动应用程序或游戏中成功的赚到钱。 稍微留意一下,你很可能从朋友圈听说过一些,或者可以从互联网搜索一下,这样的故事不胜枚举。 + +在这本书里,我们要探讨的是,集中非常有限的时间、精力,聚焦到非常狭窄的需求领域,开发移动应用 APP、小游戏,发布到全球应用商店、获取用户、并实现盈利。 + +也许你是技术的大牛,掌握了数十种编程语言、设计模式、前端到后端的全栈开发能力。然而,并不是每项技术,都能够实现快速赚钱的。最艰深、最有趣的技术,未必是最容易赚到钱的技术。有时候,我们要做最容易扩展的架构。有时候,我们要选择最快速开发的技术手段。 + +也许你是刚入门的菜鸟,只会做做网页什么的。那也没有关系,赚钱真正需要的编程技术,其实也可以非常简单。只是有一点,需要什么知识,我们就恶补什么知识。由于技术日新月异,程序员必须是最善于学习的群体。 + +### 基础篇 + +### 语言与工具选择 + +开发 APP 的语言与工具,通常与平台密切相关。 +* 如果是 iOS,那通常是 Objective C,开发工具是苹果推出的 [Xcode](https://developer.apple.com/xcode/) (开发工具仅运行于 Mac)。 +* 如果是 Android,那通常是 Java,开发工具是 谷歌推出的 [Android Studio](http://developer.android.com/tools/studio/index.html)(开发工具有跨平台版本)。 +* 如果是 Windows Phone,那就是 C#,开发工具是 微软推出的 [Visual Studio](https://www.visualstudio.com/en-us/visual-studio-homepage-vs.aspx)(开发工具仅运行于 Windows)。 + +除此之外,还有一些跨平台语言与工具,对于开发者更加友善,可以开发一次,多平台打包发布: +* 可以开发游戏与APP的 HTML5,以 javascript 作为主要的开发语言。 +* 用于开发游戏的 [Cocos2d-X](http://www.cocos2d-x.org/),用的是 C++ 作为主要的开发语言。 +* 用于开发游戏的 [Unity3D](http://unity3d.com/) IDE 以及集成的 MonoDevelop,用的是 C# 作为主要的开发语言。 +* 微软收购的 [Xamarin](https://www.xamarin.com/) 以及赞助的开源项目 [Mono](http://www.mono-project.com/),用来开发 APP,以 C# 作为主要的开发语言。 + +在下文的教程中,我们选择最简单的 javascript 作为后续介绍的主要开发语言。 + +注意: +千万不要对 javascript 有刻板印象,而认为它仅仅是做网页的简单脚本程序。 + +实际上,它是编程用途极为广泛的语言,也是 github 上最为活跃的语言。它可以用来开发: +* 运行于浏览器内的 Web网页; +* 运行与内嵌浏览器的 单页WebApp; +* 基于 [nodejs](https://nodejs.org/) 的命令行工具,例如 Cordova CLI 命令行工具; +* 基于 nodejs 的网络云服务,例如 亚马逊 的 Bluestacks 云服务; +* 基于 [cordova](http://cordova.apache.org/) 技术的,混合(hybrid) APP。 +* 基于 [react-native](http://www.reactnative.com/) 开发 native UI体验的 APP。 +* 甚至,也能够使用[Electron](https://www.electronjs.org/)开发出桌面应用,例如 Atom,Visual Studio Code 代码编辑器。 + +因为使用 javascript 可以同时用来开发前端和后台,代码逻辑也可以用来前后端复用,从而降低技能门槛和开发成本。入门所需要的开发环境也要求非常低,只要有个友好的代码编辑器,有个浏览器可以用来运行和调试,就可以了。 + +以下是用 javascript 来做开发的所需要的环境和工具: +* Chrome浏览器,自带开发者工具 和 javascript 控制台,用来运行和调试。 +* [Adobe Brackets](http://brackets.io/) 文本编辑器(如果你习惯 [Sublime Text](http://www.sublimetext.com/) 或者 [Atom](https://atom.io/) 或者 [Visual Studio Code](http://code.visualstudio.com/),也没问题) +* iMac台式机,巨大的27寸屏幕,视野不受限制;Mac OS X命令行非常强大方便,通过 [MacPorts](https://www.macports.org/) 或者 [Homebrew](http://brew.sh/),Linux 上有的命令行工具或者 library 都基本支持。 +* Xcode(只有 Mac 版本),要调试 iOS APP,有台 iMac电脑或者 MacBook笔记本电脑,这也是必备的。 +* Android Studio,用来调试 Android APP。 + +如果你习惯了 Windows 也没有一台 Mac,那就会稍微麻烦一点。虽然也是有方法的,有一些专门提供编译、打包的云服务,但是这些服务往往出于商业利益的关系,会调整策略终止服务。 +例如: +* Adobe PhoneGap Build +已失效。从 2020.10.1 之后,Adobe 已经停止服务 该云服务。 +* Intel XDK +已失效。XDK 已被英特尔重新用于物联网开发,核心移动开发功能已被英特尔弃用且不再受支持。 随附的跨平台 Cordova 云构建服务已下线。 不建议将 XDK 用于新的手机/平板应用程序开发项目。 +* [Ionic AppLow](https://ionic.io/appflow) +Appflow 是 Ionic 开发团队的持续集成 (CI) 和持续部署 (CD) 平台。它声称 Ionic Appflow 可以将构建部署到目的地,例如 Apple App Store 和 Google Play Store,完全在云中。 + +### Hello, World! + +用 javascript 开发前端,其实需要的是 3 项相关的语言:HTML / javascript / CSS。 +* HTML 负责内容 +* javascript 负责逻辑 +* CSS 负责渲染表现 + +以下是一个简单的例子: +```html + + + + + +Hello + + + + +

Hello, World!

+ + +``` +```javascript +// main.js +console.log('hello, world!'); +``` +```css +/* main.css */ +body { + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; +} +h1 { + color: blue; + padding: 40px; + margin: 10px; + border: 1px solid gray; + display: inline-block; +} +``` + +用 Chrome 浏览器打开它,于是我们看到如下的展示: +* 上面的浏览器主窗口,显示了 HTML 的内容,并且用 CSS 指定的格式和效果进行了渲染。 +* 下面打开 Chrome 的 console 窗口,则显示了 javascript 调用 console.log() 输出的调试信息。 + +![HelloWorld](demo/helloworld.png) + +用 HTML5 / javascript 做开发,入门就是这么简单。 + +如果需要开发出高质量的 APP,需要熟练掌握 HTML/CSS 和 javascript,尤其是 HTML5 / CSS3,掌握 HTML DOM 以及 javascript 的一些常见库,例如 [jQuery](https://jquery.com/),等等。这里有一些免费的入门教程: +* [HTML 系列教程](http://www.w3school.com.cn/h.asp) +* [JavaScript 入门教程](http://www.w3school.com.cn/js/index.asp) +* [JavaScript 高级教程](http://www.w3school.com.cn/js/index_pro.asp) + +通过这些教程的学习,你能够做到: +* 一个简单的 index.html 页面; +* 一个统一的 main.css 文件,能够对界面元素的表现加以控制和调整; +* 一组 javascript 文件,能够通过对 HTML DOM 的访问,实现内容的动态展示和切换。 + +对于作为程序员的你,这根本不是什么难的事情。 + +### 单机版APP + +下一步,我们要把这样一个简单的网页程序 (web app),变成一个手机上的 APP。准确的说,它应该是叫 Hybrid APP,即混合程序。因为它的外面是 native app 封装了一个 webview,里面运行的是 我们写的 web app。 + +我们需要用到 cordova 技术框架。它原本是 Adobe 公司收购的一个小团队开发的产品,被重新命名为 [PhoneGap](http://phonegap.com/)。后来 Adobe 将其开源,并捐赠给 Apache 基金会,然后被称为 [Apache Cordova](https://cordova.apache.org/),现在已经成为一个非常流行的技术框架,也得到很多商业公司的追捧,除了 Adobe 之外,Intel、微软、IBM 等公司也都推出了支持 Cordova 的产品。 + +Cordova 技术框架提供了一个命令行的工具,是用 nodejs 开发的。 + +我们首先要装 [nodejs](https://nodejs.org/en/),安装之后,会提供 2 个基本的命令: +```bash +$ which node +/usr/local/bin/node +$ node -v +v4.2.1 +$ npm -v +2.14.7 +``` +* node --- 负责 javascript 程序的编译/解释/执行。它是基于谷歌开源的 Chrome V8 引擎的,基于事件驱动、不阻塞 IO模式运行,轻量而高效。 +* npm --- NodeJs Package Manager, 安装包管理器。所有的 nodejs 包都是用 npm 来下载和安装(你也可以用它来发布你自己的包到 npm 库)。 + +接下来,用 npm 安装 [cordova](https://cordova.apache.org/): +```bash +$ npm install -g cordova +$ which cordova +/usr/local/bin/cordova +$ cordova -v +5.4.1 +``` + +用 cordova 创建一个项目: +```bash +# 格式为:cordova create <目录名> +$ cordova create temp com.rjfun.demo Demo +``` + +然后编译,并在 iOS 模拟器中运行这个项目: +```bash +$ cd temp +$ cordova platform add ios +$ cordova build ios +$ cordova emulate ios +``` + +于是可以看到 iOS 模拟器被启动,然后 APP 运行: + +![Cordova iOS](demo/cordovaios.png) + +或者你也可以把 iPhone 用 USB 线连接到 Mac,然后用这个命令安装、启动刚刚编译的 APP: +```bash +$ cordova run ios --device +``` + +现在运行的是 Cordova 自带的 Demo 工程。打开 Cordova 项目,可以看到这样的目录结构: + +![Cordova Proj](demo/cordovaproj.png) + +接下来,删去 www 目录下的内容,用我们前面写的 index.html, main.js, main.css 替换,并略作修改: +```html + + + + + + + + + + + + + + + + Hello + + + + +

Hello, World!

+ + +``` + +```javascript +// main.js +console.log('hello, world!'); + +// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +document.addEventListener('deviceready', function(){ + console.log('deviceready'); + + // TODO: 开始我们 web app 的业务逻辑 +}); +``` + +```css +/* main.css */ +body { + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; + background-color: silver; +} +h1 { + padding: 40px; + margin: 30px; + background-color: yellow; + color: blue; + border: 1px solid gray; + display: inline-block; +} +``` + +重新运行 cordova 项目(会自动编译、安装、运行): +```bash +$ cordova emulate ios +``` + +于是,可以看到 Web App 在 iOS 模拟器中运行了: + +![Hello World Cordova](demo/helloworldcordova.png) + +做个最简单的APP,其实也很简单,是不是?! + +### 加个广告条 + +作为程序员,我们毫不怀疑,你可以通过掌握的 HTML/CSS 以及 javascript 编程能力,提供一些有趣、有用的功能。 + +接下来,我们要给这个 APP 加上变现(monetization)的功能,即实现赚到真金白银。 + +变现最简单的方法,就是加上广告条,例如谷歌的AdMob。 +* 通过展示广告,用户对有兴趣的广告点击,浏览产品、或者安装其他的 APP。 +* 投放广告的个人/公司(简称广告主,Advertizer)会支付广告费给谷歌。 +* 而谷歌则会将其中的一部分,支付给发布广告的个人/公司(简称发布商, Publisher)。 +* 谷歌在其中扮演的角色,则称之为广告平台(Ad Platform)、或者广告中介(Ad Network)。 + +Cordova 框架的技术架构,是 Web APP 加上一些通用的插件,提供手机特定功能的访问、与第三方系统的集成。 + +我们通过插件 cordova-plugin-admobpro 来实现与谷歌 AdMob 的集成。这是基于谷歌 AdMob SDK 开发的一个插件,也是目前变现插件中最流行、最容易使用的。通过它,只需一行 javascript 代码就可以完成对 SDK API 的调用。 + +现在让我们往 cordova 项目工程中加入插件。 + +```bash +$ cordova plugin add cordova-plugin-admobpro +``` + +然后修改 main.js,在 APP 初始化完毕时,我们加几行代码。 + +```javascript +// main.js +console.log('hello, world!'); + +// 当 APP 初始化完成,会触发 'deviceready' 事件,我们可以调用 cordova 框架以及插件提供的 API 和功能 +document.addEventListener('deviceready', function(){ + console.log('deviceready'); + + // 在 APP 初始化完毕时,在屏幕下方创建一个广告条 + if(AdMob) AdMob.createBanner({ + adId: 'ca-app-pub-6869992474017983/4806197152', // 需要到 AdMob 官方网站注册用户,并创建广告单元 Ad Unit Id + position: AdMob.AD_POSITION.BOTTOM_CENTER, // 展示在屏幕下方中央 + overlap: false, // 不要覆盖 Web APP 的内容 + isTesting: true, // 展示测试广告,在正式发布时,去掉这行 + autoShow: true // 广告资源就绪时,自动开始展示 + }); +}); +``` + +重新运行 cordova 项目(会自动编译、安装、运行): +```bash +$ cordova emulate ios +``` + +于是,可以看到 Web App 在 iOS 模拟器中运行了: + +![AdMob Banner](demo/admobbanner.png) + +看,屏幕下方的广告条展示出来了。 + +这里只是仅供调试用的测试广告。我们需要到 [AdMob官方网站](https://apps.admob.com/)注册用户,并创建广告单元(Ad Unit Id),并用来替换掉 代码中 adId 后面的这串数字。并在发布的正式版本中,去掉 `isTesting:true` 这行代码。 + +### 注册广告账号 + +下面我们就介绍,如何注册账号,如何创建广告单元,如何设置银行收款信息。 + +由于价值观方面的原因,谷歌的网站基本上都是被隔离在中国大陆局域网之外,通常是无法访问的。需要通过 VPN 等科学上网的方式才能够访问。如果你不知道如何科学上网,可以写邮件给我,单独讨论这个问题,这里暂不展开。 + +访问谷歌AdMob官网( https://www.google.com/admob/ ),注册新账号。 + +![AdMob Site](demo/admobsite.png) + +注册完成之后,登陆 AdMob 网站( https://apps.admob.com/ ),点击菜单“获利”,点击左上角的红色按钮“+通过新应用获利” 添加新APP: + +![AdMob New App](demo/admobnewapp.png) + +然后创建横幅广告: + +![AdMob New Banner](demo/admobnewbanner.png) + +即可获得广告单元 ID,将其 copy 到源代码中: + +![AdMob Ad Unit ID](demo/admobadunitid.png) + +### 验证地址和设置收款信息 + +注册账号之后,广告单元进入APP投放实际使用,即可积累广告收益。 + +要收到谷歌支付的广告分成,还有 2 个步骤要完成: +* 验证地址。谷歌会生成一个 PIN 码,打印在卡片上,邮寄到你的通信地址。 +* 设置收款信息。可以是 西联汇款 或者 银行账号。 + +不过,刚注册的账号还不允许设置这个信息。只有你的累计广告收入达到基本的门槛(目前是 10美金),谷歌才会允许进入设置支付信息的环节。谷歌通过这个方法,可以过滤掉大量的无效账号。 + +#### 验证 PIN 码: + +![Verify PIN](demo/verifypin.png) + +点击“立即改正此问题”,进入 PIN 码输入界面。 + +![Verify PIN](demo/verifypin2.png) + +验证 PIN 码这个过程比较缓慢,通常需要 2-4 周的时间。所以如果显示了最近生成 PIN 码的日期,就耐心等待吧。收到 PIN 码之后,就将其输入上面这个框,提交验证。 + +#### 设置收款信息: + +![AdMob Payment](demo/admobpay1.png) + +![AdMob Payment](demo/admobpay2.png) + +![AdMob Payment](demo/admobpay3.png) + +等这 2 个步骤设置完成,当产生广告收益的时候,谷歌就会在每个月的月末,计算当月的广告收益,然后在下个月的 20日左右支付给你。 + +### 发布APP + +我们完成的 APP,要被用户安装使用并产生收益,还缺少一个重要的环节:发布 到应用商店。 +* 如果是 Android APP,通常是 Google Play Store。中国大陆用户通常访问不到,则可以选择发布到大陆的一些应用商店,例如 360、豌豆荚 等等。 +* 如果是 iOS APP,则是发布到苹果 AppStore。 + +这里我们以苹果 AppStore 为例,来说明如何注册开发者账号,并发布 APP。 + +访问苹果开发者网站( https://developer.apple.com/ ),并注册登录。要在 苹果AppStore发布应用,需要支付每年 99 美金的年费,对于个人开发者、公司开发者,这个费用都是一样的。 + +![Apple Developer](demo/appledev.png) + +注册成功的开发者,需要下面几个步骤,才能将 APP 发布到 AppStore: +* 生成开发者数字证书,用于安装包的签名。 +* 为你的 APP 创建 APP ID,如果不涉及内购,也可以用 “*” 或者 “com.rjfun.*” 作为一个通用的 APP ID,在多个 APP 中使用。 +* 为你的 APP 生成 Provisioning Profiles,并下载到 本地用 Xcode 打开、管理。 + +然后用 Xcode 打开 Cordova 项目里的 XXX.xcodeproj 工程文件,编译并存档(Archive)。成功存档的 APP 包,才能提交到 AppStore 进行审核。 + +APP 提交前,需要到 iTunesConnect ( https://itunesconnect.apple.com/ ),准备、发布和管理你的 APP。 + +![iTunes Connect](demo/itunesconnect.png) + +创建新的 APP,加上名字、介绍、图标、定价等信息,并将其设置为准备提交的状态,然后就可以通过 Xcode 中的 Organizer 将成功存档(Archive)的安装包提交到 AppStore 进行审核了。 + +![Xcode Organizer](demo/xcodeorganizer.png) + +苹果审核 APP 的流程大约 1 周左右的时间。如果审核通过,就可以在 AppStore 里面看到你发布的 APP 了。 + +### 广告收益的计算 + +当用户在设备中下载、安装APP并运行的时候,就会从谷歌的广告服务器请求正式的广告内容,并用于展示了。 + +你可以登陆谷歌 AdMob 网站,查看每天的广告展示量、点击率、以及产生的收益。这个网站也提供了非常强大的报表功能,可以根据国家、广告单元、时间段,显示非常详细的报告。谷歌在 AppStore 上发布有一个 AdSense 的 APP,你可以安装这个 APP,每天查看你的 AdMob 收益。 + +每次用户对感兴趣的广告进行点击,就会产生广告收益。大部分的广告投放,是按照点击次数计算费用的,即所谓的 CPC 广告。 + +在计算广告收益的时候,有几个常见的基本术语: +* CPC(Cost Per Click,每次点击费用),大约是 US$ 0.06 ~ 1.0; +* CTR(Click Through Rate,展示点击率),大量统计的结果大约是 1%; +* CPM (Cost Per Mile, 每千次展示费用),通过 CPC 和 CPR 也能够推算出 CPM,大致范围是 US$ 0.5 ~ 5。 + +每次点击的价格,根据广告投放的价格不同而不同。全球不同国家由于经济水平不同,也存在很大的差异。例如, +* 在美国,一次广告点击可能产生 0.2 美元的收益; +* 在巴西,也许只有 2 美分,相差 10 倍。 +* 而日本,广告点击的收益是相当高的。 + +下面是一组数据的对比: + +美国 | 巴西 +---|--- +![USA](demo/datausa.jpg) | ![Brazil](demo/databrazil.jpg) +日本 | 德国 +![Japan](demo/datajapan.jpg) | ![Germany](demo/datagermany.jpg) + +如果我们按照 CPM (每千次展示费用)1美元 来估算,每天 10万次广告展示,大约可以产生 $100美元现金收益。按照 6.45 的汇率计算,一个月30天(包括周末和节假日!),大约可以产生的收益是 ¥19,350。 + +而在上海,5年经验的、技术能力还不错的程序员,薪资大约也就 15,000 左右。如果你做的 APP,每天能够有 1万个用户使用,基本上产生的广告收益和现金流,就可以达到一个程序员的工资水平。 + +我认识一个巴西人,他用 HTML5 技术实现的小游戏,简单,但是非常有趣。每天的活跃用户大约是 10万,广告收益已经超过每个月 15万,从而实现了财务自由。 + +### 进阶篇 + +### 需求是根本 + +前面我们介绍了如何为 APP 增加了变现(monetization)的能力。但要真正获得可观的收益,还必须得有足够多的用户。也就是说,你必须开发出足够好的 APP,能够真正解决用户的问题,才会有更多的用户使用、更高频度的使用。 + +如何能够开发出更受用户欢迎的 APP 呢?其实这不是一个编程问题。 + +也许你是一个技术的大牛,但是最艰深、最牛X的技术,开发出来的软件产品未必是受到用户欢迎的产品。有时候,你用了一种其实比较简单的技术,但是真正关注了用户的痛点,解决了用户关心的问题,很可能你的产品就会受到用户的欢迎,创造出口口相传的良好口碑,在社交网络得到自然传播。 + +我推荐一本书,《需求-缔造伟大商业传奇的根本力量》,作者是亚德里安•斯莱沃斯基。 + +以下是某些创业成功者的推荐: + +> 这是一本好书,每个创业者和每个公司管理者都值得一看,甚至公司中的每个人都应该了解和体会其中的概念。书中给出了一些创造需求的模式,这对读者是非常有价值的,我们需要好的理念,但我们更需要可以践行理念的方法。这两点本书都做到了,非常值得一读,特荐之。 +——孙陶然 ,拉卡拉支付有限公司创始人、董事长兼总裁,《创业36条军规》作者 + +> 每一个抱怨的背后都隐藏着一个未被满足的需求,而每一个需求的背后必然隐藏着一个不可忽视的市场。其实任何产品,在一开始满足了用户的功能性需求以后,就应该着手升级到精神层面,用户拒绝麻烦,用户需要安慰,这看起来跟利润无关,但是对不起,它跟你的市场有关。你不去满足,创业者就会自己去进行开拓性满足。那么等待你的,或将是个生死存亡的巨大危机。因此,请一定重视麻烦所带来的希望,而不是去抵触他们的抱怨。这正是《需求》给我们带来的最有价值的东西。 +——杜子建,华艺传媒创始人,社会化媒体营销研究者,畅销书《微力无边》作者 + +### 用户体验 + +为什么苹果手机卖得贵,依然热卖?无疑它是以优秀的用户体验取胜的。如果你看过《乔布斯传》,你可以知道,苹果手机的诞生,其实是解决了传统手机难于使用的痛点。 + +自然我们在手机上开发的 APP 或者 游戏,也必须要高度关注用户体验,并且把它放到战略重点的位置上来。手机 APP,不追求功能的强大、齐全,可以只做一个小小的功能,但是要切实关注用户的需求点、并提供优秀的用户体验。 + +一个相当典型的例子是这款《手电筒》APP,就是打开手机的 LED灯泡,用来临时照亮黑暗。 + +![Torch APP](demo/torchapp.png) + +这款 APP 的用户已经超过好几亿,自然收益也是极其可观。 + +评价的数量超过600万人次,它的用户是这样写的: +* Jennifer Baylis: 易于使用。#1 最棒的手电筒APP!非常容易使用,打开很快! +* Kitty Davis: 我正是需要这样一个手电筒 APP。 +* Dennis Castello: 它正是做到了需要它做的事,而且做的真的很好。 +* Joseph Low: 易于使用。轻松地让它干活!强烈推荐! + +### 哪种广告最适合 + +在移动广告领域,存在多种形式的广告,并且也在不断的发展。 +* banner Ad,横幅广告 +* interstitial Ad,插屏广告 +* native Ad,原生广告 +* reward video Ad,奖励视频广告 +* IAP (in-app purchase) Ad,内购广告 + +哪种广告适合你的 APP,需要很好的权衡用户体验和收益之间的关系。如果广告展示不当,或者展示过于频繁,影响了用户体验甚至招致用户反感,就本末倒置了。 + +横幅广告 | 插屏广告 +---|--- +![iPhone Banner](demo/iphonebanner.jpg) | ![iPhone Interstitial](demo/iphoneinterstitial.jpg) + +这两种广告是最为基本和经典的,各有千秋。相对来说,横幅广告只占用屏幕下方的一小片空间,可以一直滚动展示,默认的是每 60 秒更换一次广告内容。优点是不太会影响用户界面和体验,缺点则是因为不太起眼,不容易引起用户的注意和点击。 + +插屏广告则是全屏的,在特定的时间弹出,更能够吸引用户的眼球和点击。也正是因为这个原因,插屏广告的点击收益比横幅广告要高 5 倍以上,比较推荐使用。 + +使用插屏广告的时候,要特别注意弹出的时间,千万不要打断用户的连续操作和游戏体验,否则不仅不会引起用户的点击,还会引起用户的反感。最佳做法是将其放在 2个阶段之间的过渡时机,例如游戏的一关刚刚结束,弹出插屏广告,然后再继续下一关。 + +通过插件 cordova-plugin-admobpro,要展示插屏广告也是非常简单的,只需要 2 行 javascript 代码就可以完成了。其中一行代码负责准备广告资源,另一行代码负责展示。示范代码如下: +```javascript +// 在游戏启动时或者进行中,开始准备插屏广告,通过后台线程下载广告资源 +if(AdMob) AdMob.prepareInterstitial({ + adId: "__ad_unit_id_here__", + autoShow: false +}); + +// 在游戏关卡结束时,调用 API 进行插屏广告的展示 +if(AdMob) AdMob.showInterstitial(); +``` + +以上这 2 种广告,是最容易使用的广告形式,集成到 APP 中的工作也最为容易。 + +原生广告(native Ad),就是将广告内容以较为和谐的方式,展示在APP自身的内容之间,不会显得过于突兀和突然,这是对用户体验影响最小的一种广告形式。 Facebook AudienceNetwork 和 Flurry 比较早就推出了原生广告,不过谷歌 AdMob 对此持谨慎态度,仅仅在部分开发者中进行 beta 试用。 + +奖励视频广告(reward video Ad),是谷歌新推出的一种广告。就是鼓励用户看完广告视频,然后开发者在游戏中或者 APP 中给予某种虚拟物品的奖励。在以前的广告推广中,谷歌并不支持在用户接受广告方面给予鼓励的行为,甚至将对点击广告给予奖励的做法定为违规的行为。因为这很可能违背用户本身的兴趣、造成虚假无效点击。新的奖励视频广告方面,谷歌采取了相对灵活和务实的态度。不过这方面的广告视频来源,基本上都是通过广告中介的方式来自于其他的广告网络。 + +内购广告(IAP House Ad)是一种新颖、创新的广告形式,应用内购买广告可让用户直接在应用内购物。因为需要和支付系统、或者谷歌Play Store结合起来,所以仅在 Android 系统支持。通过内购广告,应用开发商可在以下方面获益: +* 通过在同一款应用中实施广告投放和应用内购,可以最大程度地增加您的收入和用户的生命周期价值。 +* Google 会自动帮助您确定哪些用户有可能购买应用内购商品,并向其余用户展示普通的付费广告。 +* 不需要开发自己的应用内购支持系统,也不需要在应用中加入应用内购支持代码。 +* 利用不同的自家内购广告,可以轻松定位用户群体中的各种细分受众群。通过将应用内购广告与 AdMob 受众群体构建工具结合使用,可以向高消费群体投放价格高的应用内购商品,而向其他用户展示价格低的商品。 + +如果要尝试原生广告、奖励视频广告、内购广告,请移步 Google [AdMob 官方文档网站](https://developers.google.com/mobile-ads-sdk/),进行深入研究,学习如何使用。 + +### 哪家广告商最靠谱 + +因为移动广告领域的利润可观,移动广告平台的发展也是非常快的。过去的这些年,也发生了不少并购案。例如 Google先后收购了 DoubleClick 和 AdMob,Flurry 被 Yahoo! 收购,MobFox 被 Matomy 收购,Millennial Media 被 AOL 收购。 + +![Top Ad Networks](demo/topadnetworks.jpg) + +通常广告平台会提供: +* 接入广告系统的 SDK; +* 注册、登录和管理广告的系统; +* 接入指南、例程、FAQ; + +各种移动广告平台的相关介绍,可以通过搜索活着其他不同的渠道去了解(例如 StackOverflow.com),并可以有选择性的进行尝试。 + +以下是我试用过的一些广告平台: +* Google AdMob +* Facebook AudienceNetwork +* Yahoo! Flurry +* MobFox +* Apple iAd +* MoPub +* Millennial Media +* InMobi +* OpenX +* Smart AdServer +* ... ... + +使用下来比较满意的有 AdMob, Facebook AudienceNetwork, Yahoo! Flurry, MobFox。尤其是 AdMob,非常值得推荐。 + +AdMob之所以最值得强烈推荐,主要有这样一些突出的优点: +* 广告填充率高(基本上在 98% 以上,有个别国家略低于90%),因此可以充分利用用户流量。毕竟广告是谷歌公司的主要业务和利润来源,其广告客户遍及全球,这也不足为怪了; +* 付款及时,每个月的月底结算,次月 20日支付; +* SDK 非常稳定,接入文档以及参考代码易于使用,并且有不同语言的文档和系统界面; +* 报表系统功能强大、易于使用,可以通过不同的维度进行数据分析; +* 有专门的 APP 可以用来跟踪收益; +* 有专门的技术支持人员,有官方支持的技术论坛,专门解答 SDK 接入方面的技术问题; +* 定期会组织一些宣讲、培训活动,也定期有线上视频讲座; +* 客户服务非常到位,非常的耐心和友善,我和他们也基本上一直保持联系。 + +由于谷歌在各个领域的卓越创新、一贯的优质服务,在开发者中有良好的口碑。 + +而基于 AdMob SDK 开发的 cordova-plugin-admobpro 这款插件,不仅把 Objective-C / Java / C# 的原生 API 封装为统一的 javascript API,而且更加简单易用,只需 1-2 行代码即可完成广告展示。这款插件在 Cordova 全球社区也广受欢迎,是使用率最高的变现插件。以下是插件的下载趋势曲线图: + +![AdMob Download Trend](demo/admobprodltrend.png) + +Facebook 的 AudienceNetwork 也挺不错。Facebook 不仅仅是最大、最活跃的社交媒体,也提供各种相关 SDK,包括广告用的 AudienceNetwork。其开发者网站为:https://developers.facebook.com/docs/audience-network 。 +* Facebook 的 广告填充率(Fill Rate)没有 AdMOb 那么高,大约在45~75% 之间。 +* Facebook 付款也很及时,也是在每个月的 21日左右支付上个月的广告收益; +* Facebook 的 SDK 更新非常频繁,大约 2 周左右就会发布一个新的版本,因此如果有什么 bug 修复也很快。不过更新的频度实在有点高,有时候有点跟不上的感觉。相对来说,谷歌 AdMob 的 SDK 更加稳定一些; +* 管理界面和报表系统也比较清楚易用,一目了然。报表系统没有 AdMob 的那么强大和灵活,貌似仅有英文界面,看上去是下面这样的。 + +![Facebook AudienceNetwork](demo/fbaudnet.png) + +Flurry 是一家被 Yahoo!收购的移动广告公司,其官方网站是 http://www.flurry.com/ 。其主要的产品有 2 个,一个是数据分析(Flurry Anlytics),一个是广告系统(Flurry Ads)。 +* Flurry SDK 接入也还算比较容易,报表系统中规中矩。就是网站访问稍微有点慢,比较花时间。 +* 付款略慢,在广告收益产生的 60天之后才付款。 +* 值得一提的是,Flurry 是比较早支持原生广告的(Native Ad)的。 + +MobFox 是一家欧洲的移动广告公司,总部位于奥地利。曾经它的 CEO 联系过我,希望能够就某项产品达成合作。后来因为收购事宜暂停,再后来,再后来就知道 MobFox 被 Matomy 收购,项目合作的事情就没有下文了。这家公司还是不错,付款也比较及时。虽然号称是欧洲最大的移动广告公司,并且全球位于 Top 10,但和 Google、Facebook 这样的巨头比起来,在全球范围内的影响力实在有点弱。 + +Apple 的 iAd,只是在 iOS 系统上进行投放。由于 iPhone 的市场定位和定价明显要高于 Android 系统,也就决定了 iOS 用户有较强的购买力,所以 iAd 广告的点击回报比较高,也就不言而喻了。不过如果你开发的 APP 需要同时投放 iOS 和 Android 系统,用 AdMob 管理起来相对容易一点。也可以通过 AdMob 的广告中介(mediation)功能,把部分流量通过 iAd 进行展示,从而使得广告收益的利益最大化。 + +像 OpenX 和 Smart AdServer 仅对欧美的签约客户开放,并不针对全球用户和开发者。只是曾经有美国和欧洲的客户在 GitHub 上看到我的开源项目,特意找到我要求我定制产品,通过项目合作的方式,我才得以了解和熟悉。不过因为不对全球开发者,所以也无法推荐使用。 + +至于 MoPub,它的 SDK 的是在 GitHub 上开源的,这是它与众不同的地方。不过也正是因为这一点,其文档和 SDK 接入就要稍微麻烦一些。必须要把这些 SDK 从源代码编译成 jar 和 framework,然后才能在自己的项目中使用。 + +Millennial Media(简写为 mMeida),其 SDK Demo 的美观度做得不错,不过客服和技术支持的响应实在不敢恭维。曾经碰到过技术问题,通过 Web Form 提交了问题,一直没有得到过答复,所以我后来也就懒得用它了。 + +另外像 Charboost、TapJoy 等等广告平台,也或多或少的接触过。不过精力有限,没有逐一进行具体的试用。Charboost 是 2011 年才创业的广告公司,只专注在移动游戏领域,2014年被 VentureBeat 指数报告定为 Top 10 的移动广告公司。通过 Chartboost 发布的广告,点击收益比较不错,不过反过来说,也就是广告投放、获取用户的成本是比较高的。我所认识的专门做重度游戏、专门投放海外市场的朋友,通过 Facebook 和 Chartboost 投放广告用得比较多。 + +上面介绍了不少移动广告平台,完全是个人经验和主观体会,有兴趣的可以自行尝试。 + +### 营销你的产品 + +(待续) + +### 联网版APP + +### 云服务 + +### 高级篇 + +### 用户数据分析 + +### 广告优化 + +### 支付与内购 + +### 社交营销 + +### 广告投放 + +### 附录 + +#### 互联网营销常用术语 + +Part1 最基本的名词 + +ROI:Return On Investment的简称。一般而言on这个词是应该小写的,所以ROI似乎应该是RoI,不过大家都约定俗成了,不必较真。ROI是典型的追求效果类的营销的关键指标。在中国的互联网营销,这个值一般指的是,我花了多少钱推广费,直接产生了多少的销售。比如花了1万元做SEM推广,直接卖了3万元的货。ROI会被认为做到了3(即3:1)。这一点与财务计算上的ROI是不同的,后者是利润和投入的比值,但在互联网营销上,大家没有把利润作为R,而是用GMV。关于GMV是什么,本文的下篇有。:) + +Impression:意思是“曝光”,也被称为“展示”或“显示”,是衡量广告被显示的次数,一个广告被显示了多少次,它就计数多少。比如,你打开新浪的一个页面,这上面的所有广告就被“显示”了1次,每个广告增加1个Impression。 + +Click:点击,是指互联网用户点击某个广告的次数。 + +CTR:Click Through Rate,点击率。就是用click除以impression的比例。 + +CPM:Cost Per Mille,这次实际上省略了impression,全文应该是cost per mille impression。Mille是千的意思,在英语中它只跟着per一起用,即per mille,就是汉语的“每千……”的意思。所以CPM是每千次展示的成本。 + +CPC:Cost Per Click,每次点击的成本。 + +Ads:就是广告(名词)的英语复数啦。Ads = Advertisements。如果是“做广告”(动词),应该用Advertising。 + +SEM:Search Engine Marketing的简称。就是搜索引擎营销。不过在中国,SEM其实仅仅指PPC。但是SEM事实上是PPC和SEO的统称。PPC和SEO是什么,下面有解释。 + +PPC:Pay Per Click的简称。一般是特指搜索引擎的付费竞价排名广告推广形式,因为搜索引擎竞价排名只有一种收费方式,即按照点击付费。虽然也有其他广告形式也是按照点击数量来进行收费,一般不被称为PPC,而被称为CPC,即Cost Per Click。为什么?似乎是约定俗成。 + +SEO:Search Engine Optimization的简称。就是搜索引擎优化,特别指搜索引擎搜索结果自然排名的优化。所谓自然排名,就是不通过给搜索引擎付钱就能获得的排名。不花钱就能被搜索引擎排到前面当然是好事,但大家(每个网站)都这么想,所以要出头还挺难的。懂得这个领域的高手过去能挣很多钱,但今天SEO却越来越短时间内就出效果,所以想要通过SEO挣快钱越来越难。 + +Social:社会化,是social marketing(社会化营销)或者social media(社会化媒体)的简称,具体指二者的哪一个要看场合。社会化媒体,在中国过去是人人网、开心网之类,现在是微信、微博、图片分享类网站应用等。 + +WA:Web Analytics的缩写。就是网站分析。 + +DA:Digital Marketing Analytics的缩写。数字营销分析。 + +Part2 数据分析领域 + +Dimension:维度。维度是对一指一个事物的不同的方面、特征或者属性。这么说太抽象。简单说,人可以分成男人和女人,性别就是人的一种维度。或者汽车可以分为白色、黑色、红色等,颜色就是汽车的一种维度。维度是最基本的数据结构,任何一个度量(指标)必须要依附于一个具体的维度才有意义。比如说,我说visit=100,这没有任何意义。我说搜索引擎给我的网站带来的visit=100,就有了意义。搜索引擎流量就是维度(即流量来源)的具体的值(就如同男人是性别这个维度的具体的值)。 + +Metric(常用作复数,即Metrics):通常翻译为度量或者指标,但是因为指标含义更宽泛,例如KPI或者benchmark都可能被称为指标,所以在我的培训中metrics都是用度量来表示,这样更严谨。度量绝大多数都能能用数字表示,比如汽车的速度,速度就是度量。课程中涉及到的度量分为两类,一类是计数度量(比如常见的PV、UV、访次、停留时间等)和复合度量(两个度量四则运算而成,常见的有转化率、跳出率、留存率、活跃率等)。另外有些度量使用布尔量表示,即是或非。度量必须依附于维度才有意义。 + +Unique:Unique是指排重(排除重复)。Unique很少单独用,常用在计数类度量的前面,比如unique visitor,指排除对同一个访问者重复计数之后的访问者数量——同一个人今天到网站一次,明天又来一次,不能就因此变成两个人,unique visitor仍然是1。Unique visitor通常可以简化为visitor,两个可以通用。Unique visitor和unique user是唯一的两个可以加不加unique都算unique的度量。另一个例子是unique impression,即同一个人多次看同一个广告,还是计算为1次。Unique impression和impression是两个不同的度量,因为后者不排重。 + +Benchmark:我在大学的时候这个词被翻译为“定标比超”,真是不明觉厉的感觉呀。Benchmark就是“可以作为对比的参照值”。我的很多客户会问,这个指标在行业中的平均情况是什么样呀?他们的问题可以同样表述为:这个指标在行业中的benchmark是多少? + +Pattern:指某种会重复出现的模式或规律。Pattern常常用于发现用户行为上的某些趋同特征。比如,我们发现用户都喜欢在晚上10点到11点打开某个app应用,这就是一种pattern。如果我说发现了一个pattern,很兴奋,实际上的意思就是说我发现了一个规律。规律这词,几十年前就有了,pattern这洋文多有逼格呢…… + +Random:随机数,或者随机性。但是老外们也用它来形容“混沌”之类的意思。 + +Cohort:很难翻译,也很难形容,我暂且把它翻译成“队列”。跟Segmentation有点类似,但内涵要多一点,多点排队的意思。你懂的,课堂上讲清楚。Cohort一般是一种分析方法,所以一般不单独出来,而是跟analysis在一起,即cohort analysis。 + +Filter:过滤。过滤是指摒弃掉不需要的数据,只留下需要的。过滤都需要遵循一定的规则(这是废话),而且过滤掉的数据往往不能找回。过滤是一种常用的定位某个细分领域的方法,与细分(segmentation)的区别在于,segmentation是把总体分成并列的若干块(segment),而Filter则只保留符合规则的块,而丢弃其他不符合规则的块。 + +Segmentation:细分。这是我们最基本的方法,即把总体按照一定的规则分成并列的若干块。做了segmentation之后,每一个块就是一个segment。所以segmentation和segment不是同义词。Segmentation怎么用?怎么发挥最大价值?课堂上有很多案例。 + +Part3 互联网和互联网营销分析技术领域 + +Cookie:Cookie并没有真正的中文翻译,cookie是在你浏览网页的时候,网站服务器放在你电脑(或移动设备)的浏览器里面的一个小小的TXT文件。这个文件里面存储了一个标识你这个人的匿名的ID,以及一些与你访问的这个网站有关的一些东西,这样当你下一次访问这个网站的时候,cookie就会知道你又来了,并且记住你上次访问时候的一些状态或者设置。Cookie以及与cookie类似的东西是互联网营销的最重要技术之一,几乎所有识别人和标记人的工作都需要cookie及类cookie技术完成。在这次培训中会有详细的说明。 + +Deep link:没有汉语直接对应名词,我觉得直接叫“深链”好了,但不能叫做“内链”,后者是另外一个东西。Deep link历史悠久,过去把能够链接到网站的内页(即非首页的页面)的链接都称为deep link,但此后很快deep link这个词的意义就消失了,因为这样的链接实在太普通,都不需要用一个专用的名词来表述。但随着移动端的app的出现,deep link又“东(si)山(hui)再(fu)起(ran)”,特指那些能够跨过app首屏而直接链接到app的内屏(类似于网站的内页)的链接。嗯?如果这个app还没有安装过怎么办?这两期的公开课会专门讲。 + +Link Tag:Link Tag特指在流量源头的URL后面加上的标记,用来标明流量源头的名称和属性。最典型的link tag是Google Analytics的UTM格式的标记。目前已经成为标明paid media(花钱购买的广告流量)的标准配置。如何用好它,比你想的丰富,课堂上详解。 + +Heat map:热图。在一个图上标明这个图上哪些是获得更多关注的部分。关注可以是眼光,也可以是鼠标点击或者手指的指指点点。热图是做行为统计学研究的好可视化工具。大家都看得懂的东西,但用好则要水平。 + +JavaScript:简称JS,网站页面上的程序,能够让页面除了展示内容之外,还能实现更多的程序运行和功能。网站分析工具监测代码就是JS代码,将JS代码部署在你要监测的网页中,就可以把用户在页面上的互动访问行为不间断的发送到相应数据分析工具的服务器,从而获取想要的用户数据。 + +Attribution:归因。但是实际上这个词被翻译成“归属”更好。归因是指在多种因素共同(或先后)作用造成的某一个结果时,各种因素应该占有造成该结果的多大的作用,即“功劳应该如何分配以及归属于谁”。为解决归因的问题而建立的模型被称为归因模型,即attribution modeling。但我一直可惜这个词没有翻译好,翻译成归属模型或许更容易理解。 + +Path:路径。任何构成先后次序的一系列事件或行为都可以用路径来描述。路径分析(path analysis)也是较为常用的一种分析方法。 + +UID:是User Identification的缩写,即用户ID。 + +Bots:机器人。非人产生的流量,都被称为机器流量,即bots traffic。Bots是互联网虚假流量主要的创造者之一。 + +Spider:常翻译为蜘蛛,蜘蛛是一个自动程序,它的作用是访问收集整理互联网上的网页、图片、视频等内容。比如百度蜘蛛会将互联网的各种内容抓取回来并分门别类建立索引数据库,使用户能在百度搜索引擎中搜索到想要的内容。 + +IP:是Internet Protocol(网络互联协议)的缩写。IP地址就是给每个连接在互联网上的主机分配的一个地址,过去用于判断不同的访问行为属于同一个人(因为都是同一个IP记录产生的访问)。但由于各种动态IP和虚拟IP技术,用它判断用户人数已经很不可行。现在游戏领域也常常说起 IP,不过那是另外一个意思,intellectual property,知识产权,往往指的是著名的小说、影视、游戏等作品的人物故事等等。 + +Tracking:翻译为跟踪,就是数据分析工具跟踪用户各种行为的“跟踪”,用户所有的线上行为都可以被跟踪。监测这个词的“监”这个字,就是tracking。而测,则是measurement。所以监测这个汉语词,最准确的翻译就是tracking and measurement。监测需要用一定的技术手段实现,其中核心技术之一就是监测代码(tracking code),是一串可以发挥监测功能的程序(很多都是脚本语言编写,比如JavaScript语言)。 + +Pixel:本意是像素,但是在监测领域,是tracking code(监测代码)的同义词。 + +VAST:即Digital Video Ad Serving Template。一种实现视频程序化广告的基础性协议。目前是4.0版本。 + +Part4 流量与用户行为领域的名词 + +Bounce Rate:跳出率。会在课堂上简单介绍。 + +Referral:翻译为引荐来源。现实生活中,如果我推荐你使用了某个产品,或者我介绍你加入我们光荣的党,我就是引荐人(referral)。而在数字营销中,referral是指那些给我的网站带来了流量的其他网站,通常这些网站上会有链接到我的网站的链接。如果没有做特殊的标记(如使用link tag标记)或者不是特殊的流量源(比如搜索引擎),那么大部分的流量来源都会被监测工具记录为referral。 + +Retention:指用户的留存。如何让用户能够留存,是一个重要的课题。在这两期公开课培训中会跟大家介绍如何提升retention。 + +Engagement:没有特别合适的中文翻译,这个指标指的是用户在网站或APP上的交互程度或者参与度,可以由多个指标组合而成。比如一个网站有很多交互行为,包括下载文档、观看视频、咨询等,那么会根据每个交互的重要程度给每个交互行为赋值,用户每完成一个交互及赋予相应的数值,这样可以判断不同类别用户的交互程度以及不同页面的交互差异。Engagement和其他一些名词比如effectiveness、performance、acquisition等相似,都是泛指性的名词。 + +Session:session实际上和visit是一回事。本来,各类工具都是将用户的一次访问(网站)称为visit,但是随着app的普及,visit app听起来很别扭(因为我们都是use app),所以app也就不存在visit了,于是就用session代替。为了统一表述visit和session,有些监测工具把visit改称session。 + +Visit:即访问。指对用户对网站的访问,通常以30分钟为区隔。如果超过30分钟在网站上没啥动静,则一次访问结束。 + +Direct:翻译为直接访问,比如用户直接在浏览器输入网址访问,或者用户直接点击收藏夹里的网址进行访问,都会被记为直接访问。除了上述情况,从QQ客户端聊天窗口或微信客户端的链接直接访问网站的也会被记为直接访问。 + +Exit:退出,即用户离开网站或APP的行为,用户离开网站前的最后一个页面称为退出页(exit page),离开APP时所在的最后一个screen叫做exit screen。 + +Part5 策略与运营 + +Acquisition:泛指用户获取。在用户运营中使用的极为广泛,做任何产品的运营的第一步就是获取用户,比如在网页端的推广流量的获取、App推广中用户的下载等。 + +Goal:目标,是想要达到某种效果,每个网站都会有一些作为目标的交互,比如点击下载说明书、登录、注册、提交订单等。那我们就可以将这些设定为目标,那么这里引出另一概念:转化(conversion)。每完成一次上述的目标,就可以认定为完成一次转化。 + +KBR:Key Business Requirement。关键商业需求。是一个企业商业目标中最关键的。KBR决定了一个企业的其他目标,并且也决定了我们应该如何制定digital marketing的目标,以及针对这些目标选用什么样的指标或KPI。 + +KPI:Key Performance Indicator的缩写,译为关键绩效指标,是若干个用于衡量业务表现的最重要的度量。不同的商业目标,不同的业务,所对应的KPI不同。如何设置KPI是一门技术,也是一门科学。在这次的培训中也会做详细介绍。 + +Part6 互联网广告领域的名词 + +Display Ads:展示广告。展示广告主要指静态的图片广告、动画广告,以及富媒体广告(就是能互动一下的flash神马的)。这一广告形式与文字广告(就是文字链)和视频贴片广告形式是并列的不同类广告形式。 + +Banner:广义上是图片或者动画展示类广告的统称。这个词的含义源于上街游行队伍中拉着写有标语的大横幅,后来扩展到互联网广告商,并与display ads同义。 + +Pre-roll:也叫pre-roll ads,即前贴片广告。就是视频播放之前的长达10秒到丧心病狂的120秒的视频广告。 + +Content Feeds:信息流广告。信息流(主要是在社交网站和APP上)是内容并列排列自上而下像瀑布流一般,而在信息流中插入跟信息内容形态一样的广告,这种形式就是信息流广告。课堂上会介绍。 + +Native Ads:原生广告,通俗说是那些看起来就像网站或者app中正常内容一样的广告。原生广告容易和信息流广告混为一谈,但它们并不是一回事。原生广告可以采用信息流来实现,但不仅仅局限于此。 + +Reach:人群触达。如果做互联网广告,能够让广告触达到多少人是广告主关心的。触达实际上等同于unique impression,所以它不是动词,而是一个名词,一个用来记录广告触及到了多少人的计数度量。 + +Coverage:人群覆盖。跟触达非常类似,只是它的含义更模糊一些。往往用百分比来表示,例如,希望reach到的人群是1个亿,而实际reach到的是6000万,那么coverage大约是60%。Coverage不是一个度量,而是一个约定俗成的说法。 + +Viewability:广告可视性。过去统计广告的曝光的时候,不考虑广告是不是真的被人看到了,所以有些广告处在一个很长的页面的第二屏或者更后面的位置,而某个同学只看了第一屏就离开了的情况下,这个广告其实是根本没有处于屏幕中的,这个同学根本看不到这个广告。在不考虑viewability的情况下,这个广告仍然因此而有增加一次曝光(impression),而若考虑viewability,这个广告不增加一次曝光。 + +Pre-click:点击前阶段。指流量入口(尤其是广告)在被用户点击之前(含点击本身)的相关用户行为及对应的营销监测与分析体系。 + +Post-click:点击后阶段。指流量入口在被用户点击之后的相关用户行为即对应的营销监测与分析体系。 + +Fraud:作弊,也有更通俗的写法即cheating,但fraud特别指流量作弊。反作弊是anti-fraud。另一个与fraud类似的反面词汇是spam,即垃圾短信、垃圾邮件之类的骚扰垃圾信息。 + +Campaign:特别难找到准确对应的汉语名词,大意是一次有始有终的营销活动。有始,是指营销活动是从严谨的策划和详细的执行计划开始的,有终,是指营销活动有清晰的执行结束的节点。所以心血来潮的营销“游击战”不能称为campaign,那些几乎永远不停止的营销行为(例如SEM投放)也不能称为campaign。 + +Audience:受众。就是广告的阅览者,普罗大众。受众这个词太书面化了,但是确实没有比这个更明确的词,所以在这两期公开课中都会用这个词。 + +Target Audience:目标受众。任何人都可能看到你的广告,但只有那些合适的人才会购买你的商品。所以,合适的人就是你的目标受众,是你最希望影响到的那群人。 + +Effectiveness:效果。这是广告主评估品牌推广类广告好坏的一个关键指标。效果的含义比较广泛,在不同的campaign目标下可能不尽相同。比如,能够覆盖到的人群情况(coverage)可以作为一种效果;或者,人们是否真正对你的品牌产生了认知(awareness)也被称为一种效果。类似的,人们也用performance来表示营销的好坏,二者是近义词,但又不完全相同。Performance更偏重有实际产出的具体效果,因此常常被翻译为“绩效”,例如campaign产生了多少的click,产生了多少的交易等等。因此,effectiveness较为抽象,几乎只在品牌推广中被提起,而performance较为具体,在效果类推广中更为常见。 + +Efficiency:效率,即达到某种效果所花费的成本(包括金钱与时间)。品牌推广类营销常用,效果推广类很少提及。 + +Branding:品牌推广。 + +Awareness:对品牌或产品的认知。做广告的首要目的,就是让消费者意识到你的品牌或者商品的存在,说白了就是搏存在感。看看近期密集发布的手机在各个新闻app、电商app中频频发力,就知道awareness对广告主有多重要了。 + +Buzz:消费者或网民对于品牌、产品等广告主在乎的事情在网上发出的各种声音。与IWOM是一个意思。Buzz是苍蝇蜜蜂之类的嗡嗡声,无数网民每天在网上发出的各种意见, 在上帝看来就像苍蝇蜜蜂般嗡嗡作响。 + +IWOM:Internet Word of Mouth的简称。即网络口碑。 + +Survey:调研。这个词是一个有意思的词,主要在它的发音。作名词的时候重音在前——[?s??ve?],作动词的时候重音在后——[s??ve?]。 + +ePR:通过互联网进行的PR。 + +IP:Intellectual Property,即知识产权。就是过去说的那些原创的,有知识产权的东西。现在天天出现在各种口语和报道中的这个词指各种在互联网上创作的内容。例如,我的这个公开课也可以称得上是IP。Papi酱的网红视频?当然也是咯!与上篇的IP写法一样,意义完全不同。 + +Minisite/Microsite:没有对应的汉语名词,而且大家也从来不用汉语描述它。就是指为campaign专门定制的campaign网站,这些网站规模都不大,所以被称为mini(迷你)或者micro(微)。 + +Programmatic:程序化(广告)。一种革命性的广告运作方式。在课堂中会有详细的介绍。 + +DSP:Demand Side Platform(需求方平台)。程序化广告的广告投放管理系统平台以及相应的服务提供方。具体解释这里不多说了,到时候课堂上会详细介绍。 + +SSP:Supply Side Platform(供应方平台)。程序化广告的广告资源管理系统平台以及相应的服务提供方。具体课上介绍。 + +RTB:Real Time Bidding(实时竞价广告),这是程序化广告最重要的一种方式,也是理论上最佳的广告资源变现方案。但具体如何实现,优劣问题,以及国内的情况,课上详细讲。 + +Bid/Bidding:竞价。搜索引擎PPC广告,或者RTB广告,都需要竞价。类似于拍卖,但需要在预置条件的前提下通过程序来实现。课堂上详细说。 + +Bidder:Bidder即竞价者,在PPC广告范畴内,bidder就是普通SEM的操作从业者。在程序化广告范畴内,bidder一般就是DSP服务提供商。 + +DMP:Data Management Platform,数据管理平台。程序化广告(programmatic advertising)中为实现定向受众所需要倚仗的数据平台。但它能做的还远远不止这么多。培训课程中会专门涉及。 + +Verification:特指广告的验证。验证有两类,一类是验证广告是否真实被投放出去了,以及投放出去之后广告所处的环境是什么。什么是广告所处的环境?——对于PC web上的广告而言,环境就是这个网站以及具体承载广告的这个页面。另一类是验证广告覆盖的人群的情况是不是跟预想的一样。 + +Part7 效果营销领域的名词 + +Conversion Rate:转化率。是指从流量到实际销售转化的能力。与ROI本质是一样的。只是ROI衡量的是现金(收入)对现金(支出)的对比,而转化率衡量的是销售的数量与进入销售漏斗的人数(或者次数)的比例关系。 + +Churn和Churn Rate:客户流失和客户流失率。所有需要尽可能让用户反复购买(或付费)的生意,都有这个度量。看名字就知道,这个度量用来描述失去客户的情况。具体如何定义,以及如何分析,在课堂上会有详细说明。 + +SERP:Search Engine Result Page。就是搜索引擎的搜索结果页面。 + +Search Query:用户的搜索词。人们在各种搜索框(典型的如搜索引擎的搜索框)内填入的词,这些词可能很不结构化,且非常随意。而keyword,则是使用搜索引擎竞价排名的广告主设定的关键词。 + +Keyword:使用搜索引擎竞价排名的广告主设定的关键词,较为结构化,较规范。这些词不可能穷尽用户的search queries,因此搜索引擎会把用户的search queries转变为与之最相近(不过是否真的是最相近,那就只有搜索引擎知道了)的keywords,然后显示搜索的结果。 + +Organic Search:自然搜索流量源,即用户点击了自然搜索结果产生的流量,而不是点击了竞价排名(PPC)而产生的流量。 + +Affiliate Marketing:有时也就直接简称为Affiliate。这个词在国内没有对应的名词,在台湾被译作“联署营销”,但是这个翻译似乎仍然莫名其妙。Affiliate marketing就是典型的代销模式——你的东西,我帮你卖,卖出多少,你给我按照一定比例提成。在互联网上,affiliate marketing变成了我帮你引流量,我给你的流量如果有转化了,你给我提成。国内的亿起发、领克特等就是做affiliate marketing的专门平台。 + +EDM:Email Direct Marketing(电子直邮营销)的缩写,是利用电子邮件(Email)与受众进行商业交流的一种营销方式,电子邮件营销是网络营销手法中最古老的一种。 + +Performance:绩效,即通过营销之后获得“战果”。ROI就是一种典型的performance,销售额之类的也是。 + +GMV:Gross Merchandise Volume。这是电商经常会用到的词,书面是“毛销售量”,实际就是销售流水。当然,销售流水不等于最后赚到的钱。GMV=1销售额+2取消订单金额+3拒收订单金额+4退货订单金额。GMV是流水,只要你下了订单,生成订单号,就算了GMV。而这个订单转化为平台的实际收入还会有2、3、4这些流失量。下单以后后悔了取消订单,订单送到你面前了后悔了拒收订单,签收订单以后后悔了要退货(这个步骤不同的电商平台计算方法不一样,有的平台是不管退不退货都搜算进销售额中)。总之,人艰不拆,GMV数字大,好看,而且我们监测起来也最容易,所以这是最常用的。 + +AOV:Average Order Value。平均订单价格。 + +Monetization:变现。 + +MRR:Monthly Reoccurring Revenue,直译是每月都会产生的收入,实际就是用户要交的月费。比如我办了一个158元的包月电话套餐,对于电信公司而言,我就给他们贡献了MRR 158元。 + +Part8 移动端常用的 + +Screen:如果说web端用page view来记录页面被浏览的次数,那么screen就是app的页面,screen view就是app的页面浏览的次数。但因为screen没有page这个东西,所以就用screen来表示。我也不知道应该对应什么汉语名词,或者应该用“屏显”?反正相信你懂的。。 + +DAU:Daily Active User(日活跃用户数量)的缩写,通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),是用来衡量产品的用户粘性的重要指标。 + +MAU:Monthly Active User(月活跃用户数量)的缩写,概念与DAU相仿,区别在于时间跨度。MAU除了能衡量用户粘性,还可以分析产品衰退周期。 + +H5:是HTML5的简称。它实现的功能与Flash类似(用于实现动画和各种酷炫的人机交互界面等),但是比Flash具有更强的兼容性,可扩展性,稳定性以及安全性,因为该技术是HTML的延展,而非如同Flash一样是一个单独创立出来的事物。目前各大互联网钜子们——包括Adobe(Flash的所有者)——都已经加入支持H5,H5在移动端几乎已经完全取代了Flash。 + +ASO:App Store Optimization。狭义上指针对苹果应用商店的app排名所做的优化工作。广义则指对所有的应用市场的优化。与SEO类似,都是排名优化,只是优化的对象变成了应用市场。 + +LBS:Location Based Service,基于位置的服务。低逼格的讲就是用手机定位之后,能否关联一些服务或广告的。当然实际的应用比我说的肯定逼格高很多。 + +Part9 企业、组织机构与产品 + +Google Analytics:谷歌分析,简称GA,是全球用户量最大的网站和APP上流量用户行为的监测与分析工具。 + +Universal Analytics:简称UA,是GA在2013年左右做的一次大升级版本,目前无论是免费还是付费版的GA,都是基于Universal Analytics的。GA的付费版叫Google Analytics Premium,简称GAP。 + +GTM:Google Tag Manager,是谷歌公司用于管理网页上各种广告、监测和分析代码的平台型工具。课堂上会简单介绍。 + +DCM:DoubleClick Campaign Manager的简称 (即新版 DoubleClick for Advertisers 7),DCM 是一个管理及投放广告的全面解决方案,覆盖从 广告策划、管理、定位、投放、优化到生成报告等。广告的impression和click等几乎所有的度量,都可以通过它来进行监测。 + +AdWords:全称Google Adwords,是谷歌搜索引擎的关键词竞价系统,按点击收费(CPC)。 + +AdSense:全称Google Adsense,是谷歌推出的针对网站主(简称发布商)联盟的一个互联网广告服务,通过程序来分析网站的内容,并且投放与网站内容相关的广告。 + +DAA:Digital Analytics Association,数据分析协会。美国的互联网营销数据分析行业协会,号称是全球协会,但主要章程和成员都在美国,对其他国家的影响力较小。 + +IAB:Interactive Advertising Bureau,美国的互动广告局,也是类似于DAA的行业协会,主要领域是数字广告。这个协会在美国,但对全球数字广告的影响力巨大,尤其是标准和技术上。 + +#### 如何发布 APP 到 Apple AppStore + +#### 如何发布 APP 到 Google Play Store + +#### 如何发布 APP 到 360 应用商店 + +#### 如何用 Google Analytics 做用户数据分析 + + From 30ddd6119584c0a3fb469fd2151e192491cc67e7 Mon Sep 17 00:00:00 2001 From: Raymond Xie Date: Thu, 12 Jun 2025 09:05:19 +0800 Subject: [PATCH 24/24] Create joyrun_dpgr.md --- joyrun_dpgr.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 joyrun_dpgr.md diff --git a/joyrun_dpgr.md b/joyrun_dpgr.md new file mode 100644 index 0000000..68ed8a9 --- /dev/null +++ b/joyrun_dpgr.md @@ -0,0 +1,70 @@ +根据《个人信息保护法》《数据安全法》等法律法规,结合悦跑圈APP的实际功能及法律合规要求,分析如下: + +--- + +### 一、悦跑圈APP是否提供运动数据导出功能? +1. **官方未直接提供数据导出途径** + 根据公开信息和用户实测,悦跑圈APP**未在应用内设置一键导出个人运动数据(如GPX/FIT等格式文件)的功能**。用户无法直接通过官方界面导出完整的跑步轨迹、心率等原始数据。 + +2. **间接导出需依赖第三方工具** + - 用户可通过技术手段(如GitHub开源项目`running_page`)调用悦跑圈API,输入手机号及验证码后批量导出GPX格式的运动轨迹文件。 + - 另有工具如“佳速通”支持将悦跑圈数据迁移至佳明等平台,但需手动操作且非官方提供。 + +3. **数据同步功能有限** + 悦跑圈支持从跑表(如颂拓、佳明)、跑步机导入数据,但**反向导出至其他运动平台(如Strava、RQrun)的官方接口缺失**,导致用户需借助复杂流程实现跨平台迁移。 + +--- + +### 二、是否涉嫌违反《个人信息保护法》? +#### (一)法律依据核心条款 +《个人信息保护法》第45条明确规定用户享有: +- **查阅复制权**:个人有权要求处理者提供其个人信息副本; +- **可携带权**:在符合网信部门规定条件下,个人可要求将数据转移至指定平台。 + +#### (二)悦跑圈的合规性分析 +1. **未完全履行“可携带权”义务** + - 若悦跑圈**未提供任何数据导出或转移途径**,则涉嫌违反第45条关于“提供转移途径”的强制性规定。 + - 当前其依赖用户自行通过第三方脚本导出,**将合规成本转嫁给用户**,不符合“便捷转移”的立法精神。 + +2. **敏感个人信息的特殊保护要求** + 运动数据包含行踪轨迹、健康生理信息等敏感内容(《个保法》第28条),处理者需承担更高保护义务。**拒绝用户控制权可能加重侵权风险**。 + +3. **合规例外尚不适用** + 法律允许豁免的场景限于国家安全、公共利益等(第18条),而运动数据导出**不涉及此类例外**,故悦跑圈难以主张免责。 + +#### (三)违法性认定 +综合判断,**悦跑圈未提供官方数据导出功能的行为涉嫌违反《个保法》第45条**,尤其在以下方面: +- 侵犯用户对个人数据的控制权与可携带权; +- 未满足“最小必要、便捷转移”的合规要求。 + +--- + +### 三、法律风险与改进建议 +1. **企业风险** + - 用户可向网信部门投诉,若查实违规,企业可能面临**最高5000万元或年营业额5%的罚款**(《个保法》第66条)。 + - 损害品牌公信力,触发用户流失(如案例中用户因无法同步数据转向RQrun)。 + +2. **改进建议** + - **增加数据导出接口**:提供GPX/TCX等标准格式导出,或接入国家网络身份认证公共服务实现安全转移; + - **开放API互联**:与Strava、佳明等平台合作,满足用户无缝迁移需求。 + +--- + +### 四、用户当前维权方案 +- **投诉渠道**:向属地网信部门或消协提交书面投诉,要求责令悦跑圈履行数据转移义务; +- **技术自救**:使用开源工具(如`running_page`)导出数据,但需注意信息安全风险; +- **平台迁移**:转向支持数据可携性的APP(如Strava、RQrun)。 + +--- + +### 结论 +悦跑圈当前**未提供官方数据导出功能,涉嫌违反《个人信息保护法》第45条**。用户可依法主张权利,同时建议企业尽快完善数据可携机制以实现合规。运动数据作为用户数字资产,其自主控制权是数字时代的基本法治保障。 + +> 法律要求与现状对比表: +> +> | **合规要求** | **悦跑圈现状** | **是否合规** | +> |----------------------------|------------------------------|--------------| +> | 提供个人信息副本 | 仅支持App内查看,无导出选项 | ❌ 否 | +> | 支持跨平台数据转移 | 需用户依赖第三方工具 | ❌ 否 | +> | 敏感信息特殊保护 | 未提供更高阶数据控制权 | ❌ 否 | +> | 响应可携带权请求 | 未建立官方转移途径 | ❌ 否 |