日期: 2021 年 5 月 20 日

简单实现Android获取已安装APP清单列表显示

activity代码:

import android.app.ListActivity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.SimpleAdapter;

import com.mob.at.demo.util.AppInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class AppListActivity extends ListActivity {

private SimpleAdapter listItemAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_applist);
initListView();
this.setListAdapter(listItemAdapter);
}

private void initListView() {

PackageManager pm = getPackageManager();
List<PackageInfo> installedPackages = pm.getInstalledPackages(0); // 获取所以已安装的包
ArrayList<HashMap<String, Object>> listItems = new ArrayList<HashMap<String, Object>>();
ArrayList<AppInfo> list = new ArrayList<AppInfo>();
for (PackageInfo packageInfo : installedPackages) {
AppInfo info = new AppInfo();
String packageName = packageInfo.packageName; // 包名
ApplicationInfo applicationInfo = packageInfo.applicationInfo; // 应用信息
String name = applicationInfo.loadLabel(pm).toString(); // 应用名称
Drawable icon = applicationInfo.loadIcon(pm); // 应用图标
System.out.println(“name==========”+name);
System.out.println(“packageName==========”+packageName);
info.name = name;
info.packageName = packageName;
info.icon = icon;
// 状态机,通过01状态来表示是否具备某些属性和功能
int flags = applicationInfo.flags; // 获取应用标记
if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == ApplicationInfo
.FLAG_EXTERNAL_STORAGE) {
//安装在sdcard
info.isRom = false;

} else {
//安装在手机
info.isRom = true;
}

if ((flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo
.FLAG_SYSTEM) {
//系统应用
info.isUser = false;

} else {
//用户应用
info.isUser = true;
}

if (info.isUser) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(“ItemTitle”, name); //文字
map.put(“ItemImage”, icon); //图片
listItems.add(map);
}

}

System.out.println(“listItems==========”+listItems.size());

listItemAdapter = new SimpleAdapter(this, listItems,
R.layout.list_item,
new String[] {“ItemTitle”, “ItemImage”},
new int[ ] {R.id.ItemTitle, R.id.ItemImage}
);
}

}
list_item布局文件代码:
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout android:id=”@+id/LinearLayout01″
android:layout_width=”fill_parent”
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_height=”wrap_content”>
<ImageView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:src=”@mipmap/ic_launcher”
android:layout_alignParentLeft=”true”
android:id=”@+id/ItemImage” />
<TextView
android:layout_height=”wrap_content”
android:textSize=”20dip”
android:layout_width=”wrap_content”
android:layout_alignParentRight=”true”
android:text=”123″
android:id=”@+id/ItemTitle” />

</RelativeLayout>

评论:

le0102:请问有没有完整demo
le0102回复ovejur:谢谢,已经尝试过了,可行
ovejur回复:你可以直接拷贝到你的项目中运行即可
afrw4232:请问是用什么开发工具来实现?
ovejur回复:AS
qq_43050248:可以用

关于APP安装来源统计的分析

APP安装来源的统计原理
Android的安装来源统计
渠道包
原理:分发出去的渠道包中带有渠道信息。
优点:准确。
缺点:需要对程序包进行操作,不同的渠道给不同的包。对于市场上面的排名没有帮助。
另外海外的推广基本是基于google play的包,不会使用自己的渠道包。

分渠道链接

原理:需要将渠道推广链接中得到的用户信息与激活的包的用户信息进行拼接。得到渠道信息。
依赖拼接的准确度,并且需要有推广链接中的信息。

Android用户信息主要包括以下:
1)设备唯一标志符,如Android ID,Mac Address,IMEI等。
2)设备广告标志符,GAID等。
3)设备相关信息生成的用户标志符(Fingerprint),主要是IP + UA中的信息。具体可以参考Fingerprint

优点:操作简单,基于第三方统计。
缺点:准确度有一些偏差。

iOS的安装来源统计
由于iOS推广的基本都是App Store的包,所以基本都是基于分渠道链接。
iOS用户信息包括以下:
1)设备唯一标志符,如UDID(禁止获取),Mac Address(iOS7以后获取为Fake值)。基于设备唯一标志符已经基本不可行。
2)设备广告标志符,IDFA。
3)设备相关信息生成的用户标志符(Fingerprint),主要是IP + UA中的信息。具体可以参考Fingerprint

Html唤起手机APP,如果有就唤起,如果没有就跳到下载页

公司是做游戏的,*近给了一个需求,游戏里面开房间,点击分享到微信后,微信用户点击该链接。如果用户已经安装了APP就直接拉起APP直接进去游戏房间,如果没有就要跳转到下载页面。
对于一个java小白来说,直接懵逼。又不会写页面,只好百度,各种查询。愣是搞了2天,才出来。

直接贴源码,欢迎各位批评指导。

<!DOCTYPE html>
<html style=”height: 100%”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<style type=”text/css”>
.wtips{
position:absolute;
left:0;
top:0;
background-color:rgba(0,0,0,0.65);
width:100%;
height:100%;
z-index:100;
}
.wtips img{
width:90%;
height:50%;
margin:1% 5%;
}
</style>

</head>
<script type=”text/javascript”>
var isAndroid;
var isIOS;
var id;

function load(){
var ua = window.navigator.userAgent.toLowerCase();
var u = navigator.userAgent;
isAndroid = u.indexOf(‘Android’) > -1 || u.indexOf(‘Linux’) > -1; //g
isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
var micromessenger = ua.match(/MicroMessenger/i);
var weixin = micromessenger == ‘micromessenger’?true:false;
// 判断是否是微信内置浏览器
if (weixin) {
var u = navigator.userAgent;
isAndroid = u.indexOf(‘Android’) > -1 || u.indexOf(‘Linux’) > -1; //g
isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
if (isAndroid) {
//这个是安卓操作系统
document.getElementById(“tips_weix”).src=”./common/img/tips_weixin_android.png”
}
if (isIOS) {
//这个是ios操作系统
}
document.getElementById(“tipsdiv”).style.display=””;
}
// Safari 浏览器跳转IOS下载页
if(/webkit/i.test(ua) &&!(/chrome/i.test(ua) && /webkit/i.test(ua) && /mozilla/i.test(ua))){

document.getElementById(“down”).href=”苹果同事提供下载地址”;
}
if(!weixin){
var src = window.location.href;
var I = src.substr(src.indexOf(“?id=”) + 4).length;
var T = src.indexOf(“?id=”);
if (0 >= T) return “”;
if (I == src.length) return -1;
id = src.substr(src.indexOf(“?id=”) + 4);
var test = document.getElementById(“test”);
// alert(“id = “+id);
// test.href = “dfish://zy.app/openfish?roomid=”+id;
// alert(“a标签的href : “+test.href);
test.οnclick=openApp(“要监听的URL scheme协议”);
}

}

//判断手机上是否安装了app,如果安装直接打开,如果没安装,跳转到下载页面
function openApp(url) {
if(isAndroid){
var timeout, t = 1000, hasApp = true;
var openScript = setTimeout(function () {
if (!hasApp) {
var durl = “安卓同事提供下载地址”;
window.location.href=durl;
}
document.body.removeChild(ifr);
}, 2000)

var t1 = Date.now();
var ifr = document.createElement(“iframe”);
ifr.setAttribute(‘src’, url);
ifr.setAttribute(‘style’, ‘display:none’);
document.body.appendChild(ifr);
timeout = setTimeout(function () {
var t2 = Date.now();
if (!t1 || t2 – t1 < t + 100) {
hasApp = false;
}
}, t);
}
if(isIOS){
document.getElementById(“test”).href=url;
document.getElementById(“test”).click();
}

}

</script>
<body οnlοad=”load()” style=”height: 100%” id=”body”>
<a id=’test’ href=”javascript:void(0);” style=”display: none;” ></a>
<a id=’down’ href=”安卓下载的APK地址” ><img height=”100%” width=”100%” src=”./common/img/mahjong1.jpg”></a>
<div id=”tipsdiv” class=”wtips” style=”display: none”>
<img id=”tips_weix” src=”./common/img/tips_weixin_ios.png”>
</div>
</body>
</html>

本来if(isIOS)里面的是和if(isAndroid)的一样,但是后面发觉不能直接拉起游戏的URL scheme协议。就问老大,老大也百度了一堆,说IOS9屏蔽了 iframe这个标签。所以只好就用一个*原始的方法。直接在a标签里面用href去跳转。

如果用户没有安装APP,这个时候Safari页面会出一个改网址无效。如果安装了就能直接拉进房间。

2天终于搞好了,实在不容易。

DeepLink唤醒App的简单实现方法

DeepLink(深度链接技术),一般是通过Web页面调用原生App,并把需要的参数通过Uri的形式传递给App,主要使用方式有:两个App之间的广告、App的社交分享、页面跳转App、DSP广告投放、营销效果统计等。在App的运营推广中,DeepLink的意义十分重大。

使用DeepLink技术的App可以让用户在手机移动端点击广告或链接时,直接唤醒对应的手机App,并跳转到达App里对应的场景页面。

DeepLink技术目前也有比较成熟的第三方,这里重点介绍一下 openinstall 的“一键拉起”功能,这项功能集成scheme,universal link等技术,能快速实现一键拉起App、一键直达页面,近期已经免费开放给广大开发者。

%title插图%num

如上图所示,openinstall 这项功能的主要优势有:
1、同时兼容Android和iOS系统,两者都可以直达相应场景;
2、openinstall一键拉起功能适配大量主流社交平台和浏览器,如微信、QQ、钉钉、新浪微博、支付宝等;
3、目前该服务运行相当稳定,能完善用户安装全流程,大幅降低用户流失率;
4、openinstall能帮助开发者追踪渠道来源,统计用户是具体从哪篇文章、哪个链接点进来的,评估渠道广告和推广效果;
5、openinstall能实现点击链接安装后自动添加好友,让用户之间的关系链更加紧密;
6、11月份起,已经完全免费开放给开发者使用。

目前大多数App都能得到巧用。如:电商类App直达购物商品页面、游戏类App直达分享游戏房间、资讯类App直达对应新闻页面等,具体可以结合自身的App业务进行拓展。此外,openinstall提供的免填邀请码安装、广告效果统计等功能也能让这项技术的使用场景得到延伸。

%title插图%num

openinstall官网:https://www.openinstall.io

Deeplink(深度链接)拉起App,我是这样做到的

移动互联网时代,信息的分享传播无疑是 App 引流增长的关键,与其花费大量精力和成本找渠道、硬推广,不如从细节下手,用*快*简便的方法实现 Deeplink(深度链接)技术,打破信息孤岛、缩短分享路径、优化用户体验,*终提高流量转化率和留存率。

什么是 DeepLink(深度链接)技术
如果把 App 看成网站,那么 DeepLink 就是网站中的深入页面,比如商品购物页面、活动促销页面。简单理解,就是当用户点击手机中的某个链接时,可以帮他跳转到 App 内部中的目标页面,直接实现场景还原,而不是 App 首页,这是一种无障碍场景还原技术。

DeepLink 通常运用于App社交分享、App广告引流、App裂变活动、Web to App、分享效果统计、沉默用户唤醒等场景,对广告引流、活动推广、新闻类、电商类、游戏类、视频直播类App的引流推广和转化都有着奇效。

升级版 Deferred deeplink(延迟深度链接)技术
相比 Deeplink,Deferred deeplink 增加了一个判断,能在用户点击链接时判断设备是否安装了目标App,如果没有安装,则跳转应用市场或者浏览器中引导下载,用户安装后再次实现 Deeplink 的场景还原功能。

是否使用这两项技术的差别:

%title插图%num

可以看到,使用了深度链接后,用户操作成本明显降低了一至两步,做运营的小伙伴都知道,在用户转化的漏斗中,每多一个步骤,漏斗的路径就会多一层,用户流失率也就随之增加。

怎样为App快速实现这两项技术
我们以 openinstall 的一键拉起功能为例,这项功能集成了深度链接中的scheme,universal link等核心技术,能完美实现 Deeplink、Deferred deeplink 的所有技术场景效果,主要特点如下:

一键拉起功能同时兼容 Android、iOS 系统,不存在操作系统技术障碍;
适配了大量主流社交平台和浏览器,如微信、QQ、新浪微博、钉钉、支付宝等;
用户已安装该 App 的情况下,点击页面链接可直接拉起本地 App,并自动进入目标页面;
用户未安装该 App 的情况下,点击页面链接会引导到应用商店或默认浏览器下载,安装后首次打开将自动进入目标页面;
该功能目前以及免费开放给所有开发者,随时可以到 openinstall 官网访问集成 SDK 使用,*快十分钟即可集成体验。
openinstall:https://www.openinstall.io/pullUp.html

%title插图%num

不仅如此,作为成熟的第三方供应商,openinstall 在深度链接的基础上,完善出了更多定制化场景需求,比如:

能够根据需求满足开发者业务逻辑,如:既可实现下载优先,也可以实现拉起优先;
在社交分享页面上,openinstall 还能同时实现携带参数安装,帮助开发者实现渠道来源统计,具体到用户是被哪篇文章吸引来的、哪个广告页面的转化率*高、哪件产品付费效果*好;
甚至可以在业务上结合 openinstall 实现【社交平台快速下载 App、免填邀请码、App 安装后自动加群加好友、下载 App 后自动登录账号】等功能,进一步完善用户体验和关系链。
哪些产品或场景非常适合深度链接

社交平台我们以微信为例,产品以电商类京东 App、资讯类今日头条 App 为例,可以参考他们的结合效果:

%title插图%num

显而易见,电商类、资讯类、旅游类、服务类 App 结合社交分享传播具有非常大的价值,此外,游戏类 App 甚至可以利用一键拉起功能点击分享链接直接进入 App 内的游戏房间。

常见使用场景如下:

 

电商类:在分享商品链接中点击,进入 App 内对应店铺或购物页面
资讯类:在分享新闻链接中点击,进入 App 内对应内容页面
游戏类:在分享邀请组队的链接中点击,进入 App 内对应的游戏房间或战队队伍中
广告:在社交平台点击相关广告,进入 App 内对应内容页面
拉新活动:例如老带新邀请、福利抽*等 H5 页面活动,参与者可以点击进入 App 内对应活动参与页面

App 间的自由跳转,解决的不仅仅是用户体验问题,更是拓展 App 的应用宽度问题,有了深度链接后,App 之间不再是独立的个体平台,开发者可以在移动端再现网页端的自由跳转,将广告、活动营销、裂变拉新、用户唤醒等业务结合其中,创造一个更加完整、精简的转化链,能给 App 的运营和推广带来更多想象空间。

IOS 多图下载程序缓存处理

多图下载程序缓存处理
缓存处理有
​ 1.内存缓存(把下载好的image保存到字典中,程序关闭就会删除)

​ 2.磁盘缓存(把图片的NSData数据保存到caches文件上,程序关闭不会删除这里的数据)

​ 3.操作缓存(把下载的操作保存到字典里,避免出现重复下载的情况)

多图片下载(多线程处理)
//先判断缓存里是否已经下载好这张图片
UIImage *image = [self.icondict objectForKey:status.user.name];
if(image){
self.iconView.image = image;
}else{
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
NSString *filename = [user.profile_image_url lastPathComponent];
//拼接caches缓存的全路径
NSString *fullPath = [caches stringByAppendingString:filename];

//检查磁盘缓存里有没有数据
NSData *iconData = [NSData dataWithContentsOfFile:fullPath];
if(iconData){
//磁盘缓存中已存在数据
self.iconView.image = [UIImage imageWithData:iconData];
}else{
//磁盘缓存中不存在数据
NSString *imageUrl = user.profile_image_url;
//先判断缓存中是否有下载操作
NSBlockOperation *operation = [self.operationDict objectForKey:[imageUrl lastPathComponent]];
if (operation) {
return;
}else{
//实现异步下载图片
operation = [NSBlockOperation blockOperationWithBlock:^{
NSData *imagedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
UIImage *image = [UIImage imageWithData:imagedata];
//线程间通信(imageView设置image要在主线程中进行)
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.iconView.image = image;
}];
//把图片保存到内存缓存里面
[self.icondict setObject:image forKey:status.user.name];

//写数据到沙盒里面
[imagedata writeToFile:fullPath atomically:YES];

//删除下载操作缓存
[self.operationDict removeObjectForKey:[imageUrl lastPathComponent]];
}];
//添加操作到缓存中
[_operationDict setObject:operation forKey:[imageUrl lastPathComponent]];
//把线程加入到队列中
[self.queue addOperation:operation];
}
}

//在主控制器中做到释放内存
//释放缓存
-(void)didReceiveMemoryWarning
{
photosView *view = [[photosView alloc] init];
[view.photosDict removeAllObjects];
[view.cachesA removeAllObjects];
[view.photosA removeAllObjects];
[view.queue cancelAllOperations];

vbcell *cell = [[vbcell alloc] init];
[cell.icondict removeAllObjects];
}

IOS AFN框架学习

AFN框架
POST请求
//创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//拼接
NSString *newstr = [NSString stringWithFormat:@”%@ http://www.mob.com”,self.textView.text];
NSDictionary *dict = @{
@”access_token”:@”2.00rEQ4BGf5ulTCa0681d9d29h6xTwB”,
@”status”:newstr
};
// *个参数(POST):NSString类型的请求路径,AFN内部会自动将该路径包装为一个url并创建请求对象
// 第二个参数(parameters):请求参数,以字典的方式传递,AFN内部会判断当前是POST请求还是GET请求,以选择直接拼接还是转换为NSData放到请求体中传递
// 第三个参数(progress):请求的进度回掉
// 第四个参数(success):请求成功回调Block
// 第五个参数(responseObject):返回的数据
//发送POST请求
[manager POST:@”https://api.weibo.com/2/statuses/share.json” parameters:dict headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@”发送成功”);
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@”请求失败”);
}];

GET请求只是把上面的POST换成GET就行了

Android DeepLink介绍与使用

前段时间公司让调研一下DeepLink,说以后会用到,之前看了很久,并做了个demo,现整理一下,方便以后查阅,如果有幸帮助到其他人就更好了。

基本概念
Deep Link,又叫deep linking,中文翻译作深层链接。

简单地从用户体验来讲,Deep Link,就是可以让你在手机的浏览器/Google Search上点击搜索的结果,便能直接跳转到已安装的应用中的某一个页面的技术。

对于不懂技术的运营人员来说就是一个分享功能,而从技术层面上去简单理解是实现将某APP用户带到另外APP相对应的内容页面,实现APP之间无缝跳转!

商业价值
相信大家或多或少看到过这样的页面:

底部有一个“App内打开”,点击后如果安装过应用直接跳到应用的对应页面,如果没安装则跳到下载应用页。

Deeplink(深度链接)
对于已经安装APP,指向特定的页面,和上面说的一致。

Deferred deeplink( 延迟深度链接)
相比deeplink,它增加了判断APP是否被安装,用户匹配的2个功能;

1.当用户点击链接的时候判断APP是否安装,如果用户没有安装时,引导用户跳转到应用商店下载应用。
2.用户匹配功能,当用户点击链接时和用户启动APP时,分别将这两次用户Device Fingerprint(设备指纹信息)传到服务器进行模糊匹配,使用户下载且启动APP时,直接打开相应的指定页面。
通过上面的2个技术方案,不仅:①可以让被分享者更快更便捷的回到APP,且回到指定的活动页面,而且:②可以引导未安装APP的用户下载APP、③分享者和被分享者的关系链会通过设备指纹信息记录下来,在业务场景中给出相应的*励。

使用deeplink前后对比:

基本使用
具体见Demo:WebViewStudy

HTML页面:deeplink.html
<a href=”[scheme]://[host]/[path]?[query]”>启动应用程序</a>
1
示例:

<a href=”will://link/testId”>立即打开(直接打开)&gt;&gt;</a>

AndroidManifest.xml
<!–用于DeepLink,html跳到此页面 scheme_Adr: ‘will://link/testid’,–>
<activity android:name=”.DeepLinkActivity”>
<intent-filter>
<action android:name=”android.intent.action.VIEW” />
<category android:name=”android.intent.category.DEFAULT” />
<category android:name=”android.intent.category.BROWSABLE” />
<data
android:host=”link”
android:scheme=”will” />
</intent-filter>
</activity>
</application>

MyWebViewClient.class
@SuppressWarnings(“deprecation”)
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (TextUtils.isEmpty(url)) {
return false;
}
try {
// 用于DeepLink测试
if (url.startsWith(“will://”)) {
Uri uri = Uri.parse(url);
Log.e(“———scheme”, uri.getScheme() + “;host: ” + uri.getHost() + “;Id: ” + uri.getPathSegments().get(0));
}

Intent intent1 = new Intent();
intent1.setAction(“android.intent.action.VIEW”);
Uri uri = Uri.parse(url);
intent1.setData(uri);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity.startActivity(intent1);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}

DeepLinkActivity.java
/**
* 从deep link中获取数据
* ‘will://share/传过来的数据’
*/
private void getDataFromBrowser(TextView textView) {
Uri data = getIntent().getData();
try {
String scheme = data.getScheme();
String host = data.getHost();
List<String> params = data.getPathSegments();
// 从网页传过来的数据
String testId = params.get(0);
String text = “Scheme: ” + scheme + “\n” + “host: ” + host + “\n” + “params: ” + testId;
Log.e(“ScrollingActivity”, text);
textView.setText(text);
} catch (Exception e) {
e.printStackTrace();
}
}

页面具体显示:

Scheme:will
host:link
params:testId

实现原理
DeepLink用到的核心技术就是:URL SCHEMES。不论是IOS还是Android。
URL Schemes 有两个单词:

URL,我们都很清楚,http://www.apple.com 就是个 URL,也叫它链接或网址;
Schemes,表示的是一个 URL 中的一个位置——*初始的位置,即 ?/之前的那段字符。比如 http://www.apple.com 这个网址的 Schemes 是 http。
我们可以像定位一个网页一样,用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该这个应用的 URL 的 Schemes 部分,也就是开头儿那部分。但是需要注意的是应用的URL Schemes 并不唯一,也就是说一个应用可以“起多个名“,不同应用的URL Schemes也可能因为名字一样发生冲突。

Android系统级应用,有一些已经定义了URL Schemes,比如短信是 sms:、通话是tel:、email是mailto:,在定义自己APP的URL Schemes的时候要避免跟系统应用名称一样。

<a href=”tel:15088888888″>电话</a>
<a href=”sms:15088888888″>短信</a>
<a href=”mailto:15088888888@qq.com”>邮件</a>

与URL一样,URL Schemes也可以通过传参打开特定的APP界面。

URL:http://images.google.com/images?q=关键字
URL Schemes:weixin://dl/moments(打开微信朋友圈)
Applink
基本介绍
官网文档:Verify Android App Links

Android App Links是一种特殊的Deep Links,它使Android系统能够直接通过网站地址打开应用程序对应的内容页面,而不需要用户选择使用哪个应用来处理网站地址。

要添加Android App Links到应用中,需要在应用里定义通过Http(s)地址打开应用的intent filter,并验证你确实拥有该应用和该网站。如果系统成功验证到你拥有该网站,那么系统会直接把URL对应的intent路由到你的应用。

为了验证你对应用和网站的所有权,以下两个步骤是必须的:

1.在AndroidManifest里要求系统自动进行App Links的所有权验证。这个配置会告诉Android系统去验证你的应用是否属于在intent filter内指定的URL域名。
2.在以下链接地址里,放置一个数字资产链接的Json文件,声明你的网址和应用之间的关系:
https://domain.name/.well-known/assetlinks.json
与Deep Links的区别
Deep Links 是一种允许用户进入应用某个特定Activity的intent filter。点击这类链接时,系统可能会弹出一个选择列表,让用户在一堆能够处理这类链接的应用里(包括你的)选择一个来处理该链接。图一展示了这样一种情况:用户点击了一个地图相关的链接,系统弹出一个选择列表,让用户选择是要使用地图应用来处理,还是使用Chrome浏览器来处理。

App Links 是一种基于你的网站地址且验证通过的Deep Links。因此,点击一个这样的链接会直接打开你的应用(如果已经安装),系统将不会弹出选择列表。当然,后续用户可以更改配好设置,来指定由哪个应用程序处理这类链接。

下面这个列表描述更多差异:

%title插图%num

总结一下
1.APP要想被其他APP直接打开,自身得支持,让自己具备被人打开的能力。(URL Schemes)
2.APP要想打开其他的APP,自身也得支持。(判断设备是否安装、各种跳转的处理)
由于大部分应用,如微博、微信、第三方浏览器(包括Chrome),都不会将URL抛给系统处理(对scheme进行屏蔽),因此App Links生效的情况就很有限了,比如只能从记事本应用、短信应用这些进行跳转。一般商用实现的是打开系统浏览器,通过系统浏览器打开应用的对应页面。

京东及淘宝的CPS即是使用此方式实现的。
京东CPS商品推广接入流程
Android 阿里百川cps SDK接入流程

一些常用APP的URL Schemes
知乎:回答 zhihu://answers/{id}用户页 zhihu://people/{id}
微信:
weixin://dl/scan 扫一扫weixin://dl/feedback 反馈weixin://dl/moments 朋友圈weixin://dl/settings 设置weixin://dl/notifications 消息通知设置weixin://dl/chat 聊天设置weixin://dl/general 通用设置weixin://dl/officialaccounts 公众号weixin://dl/games 游戏weixin://dl/help 帮助weixin://dl/feedback 反馈weixin://dl/profile 个人信息weixin://dl/features 功能插件

腾讯微博:TencentWeibo://
淘宝:taobao://
支付宝:alipay://
微博:sinaweibo://
weico微博:weico://
QQ浏览器:mqqbrowser://
uc浏览器:ucbrowser://
海豚浏览器:dolphin://
搜狗浏览器:SogouMSE://
百度地图:baidumap://
Chrome:googlechrome://
优酷:youku://
京东:openapp.jdmoble://
人人:renren://
美团:imeituan://
1号店:wccbyihaodian://
我查查:wcc://
有道词典:ddictproapp://
点评:dianping://
微盘:sinavdisk://
豆瓣fm:doubanradio://
网易公开课:ntesopen://
名片全能王:camcard://
淘宝宝贝搜索:taobao://http://s.taobao.com/?q=[prompt]
淘宝店铺搜索:taobao://http://shopsearch.t

IOS 监听scrollerView的位置来实现底部加载

监听scrollerView的位置来实现底部加载
//监听tableView的高度来实现下拉刷新
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (fabs(scrollView.contentSize.height – scrollView.frame.size.height – scrollView.contentOffset.y) < scrollView.contentSize.height * 0.2) {
if (_isrequest) {
}else{
_isrequest = YES;
//底部加载调用的方法
[self downmoredata];
}
}
}

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速