記錄下,當別人要求喚起某個應用,但沒提供太多資訊(除了應用名稱之外)的情況下,可能會用的上,
第一步,查看包名和Scheme,需要下載對應App的apk,ipa,
Android:解壓apk,找出AndroidManifest.xml檔案,使用AXMLPrinter2.jar對xml檔案進行反編譯,(環境要求:能運行java命令,在網上下載AXMLPrinter2.jar)
編譯命令:
java -jar AXMLPrinter2.jar AndroidManifest.xml > main.txt
運行完畢后得到的main.txt里就是反編譯后的明文xml,在其中找scheme和package就行;其中scheme可能有多個,你需要逐個去試下能不能喚起對應應用的期望界面;(按經驗來說,含有“notification”字樣的scheme大多符合喚起界面的要求)
IOS:將ipa移至macbook上,把后綴名改成zip,利用歸檔工具解壓;點進去,有個“顯示包內容”選項,里面找到info.plist檔案;URL Types里找對應的URL Scheme就行;包名的話,就找“CFBundleIdentifier”這個欄位對應的值;
第二步,撰寫喚起代碼,(例子:包名:com.aaa.bbb;scheme:xxx)
Android應用: 根據包名喚起的方法:openAppcation("com.aaa.bbb");
public static boolean openAppcation(String packname){
try {
PackageManager packageManager = mContext.getPackageManager();
Intent intent = new Intent();
intent = packageManager.getLaunchIntentForPackage(packname);
if (intent != null) {
mContext.startActivity(Intent.createChooser(intent, ""));
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
根據scheme喚起:
public static void openXXX() {
try {
PackageManager packageManager = mContext.getPackageManager();
Intent intent = new Intent();
intent = packageManager.getLaunchIntentForPackage("com.aaa.bbb");
if (intent == null) {
//Toast提示之類("請安裝XXX客戶端");
} else {
mContext.startActivity(Intent.createChooser(intent, ""));
}
} catch (Exception e) {
e.printStackTrace();
}
}
手機網頁:根據scheme喚起:(TS版)
window.open("xxx://");
IOS內應用:根據包名喚起:[openAppcation:@"com.aaa.bbb"];
#import <objc/runtime.h> //objc_getClass 用到
//喚起應用
+(NSString *)openAppcation:(NSString *)packname{
Class lsawsc = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [lsawsc performSelector:NSSelectorFromString(@"defaultWorkspace")];
// iOS6 沒有defaultWorkspace
if ([workspace respondsToSelector:NSSelectorFromString(@"openApplicationWithBundleID:")])
{
[workspace performSelector:NSSelectorFromString(@"openApplicationWithBundleID:") withObject:packname];
return @"1";
}
//0 失敗 1 成功 2其他平臺默認
return @"0";
}
根據URL Scheme喚起:
//打開XXX
+(void) openXXX:(NSString *)num{
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"xxx://"]]) {
NSURL *url1 = [NSURL URLWithString:@"xxx://"];
[[UIApplication sharedApplication] openURL:url1 options:@{} completionHandler:^(BOOL success) {
if(success)
NSLog(@"open xxx successed");
else{
NSLog(@"open xxx failed");
}
}];
}else{
NSLog(@"open xxx failed");
//或者跳到APPSTORE里下載該應用
//[XXX jumpAppStoreDL:@"該應用的appid"];
}
}
//跳轉app store 下載應用
+(void) jumpAppStoreDL:(NSString *)appid{
NSString *url = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/app/id%@",appid];
//應用 在App Store的 app ID
NSURL *url2 = [NSURL URLWithString:url];
if (@available(iOS 10.0, *)){
[[UIApplication sharedApplication]openURL:url2 options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:^(BOOL success) {
if (success) {
NSLog(@"10以后可以跳轉 App Store下應用 id:%@",appid);
}else{
NSLog(@"10以后不可以跳轉App Store下應用 id:%@",appid);
}
}];
}else{
BOOL success = [[UIApplication sharedApplication]openURL:url2];
if (success) {
NSLog(@"10以前可以跳轉 App Store下應用 id:%@",appid);
}else{
NSLog(@"10以前不可以跳轉 App Store 下應用 id:%@",appid);
}
}
}
并且還要在你應用的Info.plist里白名單(LSApplicationQueriesSchemes)加上它的URL Scheme,
<key>LSApplicationQueriesSchemes</key>
<array>
<string>xxx</string>
<string>itms-apps</string>
<string>weixinULAPI</string>
<string>weixin</string>
<string>wechat</string>
<string>mqq</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqqapi</string>
<string>mqqopensdkapiv2</string>
<string>mqqopensdkapiV3</string>
<string>mqqopensdkapiV4</string>
<string>mqzoneopensdk</string>
<string>mqzoneopensdkapiV2</string>
<string>mqqopensdkminiapp</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqqOpensdkSSoLogin</string>
</array>
至此,記錄完畢,😄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/295437.html
標籤:其他
