app、H5、safari、appstore应用主页评分页之间拉起调用、打开手机某些系统功能、app打开文档
定义打开URL的方法
- (void)openURL:(NSString *)urlStr {NSURL *url = [NSURL URLWithString:urlStr];UIApplication *app = [UIApplication sharedApplication];if ([app canOpenURL:url]) {
#ifdef __IPHONE_10_0[app openURL:url options:[NSDictionary dictionary] completionHandler:nil];
#else[app openURL:url];
#endif}
}
调用方法为:
NSString *url = @"xxxxxx";[xx openURL:url];
1.打开email
NSString *url = [NSString stringWithFormat:@"mailto://admin@hzlzh.com"];
2.打开appstore 某应用的主页
NSString *appID = @"xxxxxxx";
NSString *url = [NSString stringWithFormat:@"https://itunes.apple.com/cn/app/id%@?mt=8", appID];
3.打电话
NSString *url = @"tel://8008808888";
4.调用 SMS
NSString *url = @"sms://800888";
5.自带safari打开网页
NSString *url = @"https://www.baidu.com";
6. 代开Remote
NSString *url = @"remote://xxx";
7.app之间拉起调用
1)在被调用app的plist文件中,注册对外接口
在TARGETS --> Info找到URL Types,然后展开URL types,增加一项,URLSchemes为:myapp,这个myapp就是对外接口,其它应用可以通过它
2)调用app方法
NSString *url = @"myapp:";
通过上述两个步骤,你可以在你的应用中,让用户打开你的其它应用。如果加参数的话,最好写成"myapp://login?account=xxx&password=123456",就好比http请求的“http”换成“myapp”.
3)处理URL请求
应用程序委托在application:handleOpenURL:方法中处理传递给应用程序的URL请求。如果您已经为自己的应用程序注册了定制的URL模式,则务必在委托中实现这个方法。
application:handleOpenURL:方法实现 中,传入的URL对象在其请求和片断部分带有具体应用程序的信息。
- (BOOL)application: (UIApplication * )application handleOpenURL: (NSURL *)url {if ([[url scheme] isEqualToString:@"myapp"]) {//处理链接
return YES;
}return NO;
}
第二种处理URL请求方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{//被其他应用调用NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];if(url) {//做出相应的判断if ([[url scheme] isEqualToString:@"myapp"]) {//处理链接
}
}return YES;
}
说明:iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
4).快速测试外部调用
1.回到Home屏幕,启动Safari(在iPhone仿真器上,在菜单上选择Hardware->Home命令就可以回到Home屏幕)。
2.在Safari的地址栏中,键入使用定制模式的URL,即“myapp:”,加参数的话则为“myapp://…”
3.确认您的应用程序是否启动,以及应用程序委托是否收到application:handleOpenURL:消息。
8. H5拉起调用app
[Mobile Safari 调用本地APP,否则进入App Store下载]
<!DOCTYPE html">
<html>
<body>
<body><div><a onClick="javascript:try_to_open_app();" href="mqq:open://">打开QQ
</a><a onClick="javascript:try_to_open_app();" href="myapp://">打开myapp
</a></div><script language="javascript">var timeout;function open_appstore() {window.location='itms-apps://itunes.apple.com/cn/app/qq-2011/
id444934666?mt=8';}function try_to_open_app() {timeout = setTimeout('open_appstore()', 300);}</script>
</body>
</html>
1.window.location连接的指向为打开应用
2.延时打开App Store下载应用页面
具体来说:
当你打开链接时,Mobile Safari通过window.location指向URL Scheme,直接打开本地应用,否则30ms后打开下载页面。如果应用成功打开,生命周期就是激活状态,那么浏览器的状态是进入后台,页面里的所有操作都被注销了,显然timeout会被clear掉,但如果你没成功打开应用即返回404,那么30ms后页面当然会自动跳转了。
这种方式使用有个缺点:
如果应用没有安装的话页面在跳转至App Store的同时会弹出打不开网址的提示。
当然将连接协议改成itms-apps://可以避免。即:
itms-apps://itunes.apple.com/cn/app/qq-2011/id444934666?mt=8
一篇完整的代码,可针对PC 和 Mobile单独做调整:
<!DOCTYPE html">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="width=device-width,minimum-scale=1.0"><title>Mobile Safari 调用本地APP,否则进入App Store下载</title><meta name="keywords" content="Mobile Safari 调用本地APP,否则进入App
Store下载" /><meta name="description" content="Mobile Safari 调用本地APP,否则进入AppStore下载" /><script type="text/javascript">/** 浏览器版本信息* @type {Object} * @return {Boolean} 返回布尔值 */function browser() {var u = navigator.userAgent.toLowerCase();var app = navigator.appVersion.toLowerCase();return {txt: u, // 浏览器版本信息version: (u.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) ||
[])[1], // 版本号 msie: /msie/.test(u) && !/opera/.test(u), // IE内核mozilla: /mozilla/.test(u) && !/(compatible|webkit)/
.test(u), // 火狐浏览器safari: /safari/.test(u) && !/chrome/.test(u), //是否为safairchrome: /chrome/.test(u), //是否为chromeopera: /opera/.test(u), //是否为opreapresto: u.indexOf('presto/') > -1, //opera内核webKit: u.indexOf('applewebkit/') > -1, //苹果、谷歌内核gecko: u.indexOf('gecko/') > -1 && u.indexOf('khtml') == -1,//火狐内核mobile: !!u.match(/applewebkit.*mobile.*/), //是否为移动终端ios: !!u.match(/\(i[^;]+;( u;)? cpu.+mac os x/), //ios终端android: u.indexOf('android') > -1, //android终端iPhone: u.indexOf('iphone') > -1, //是否为iPhoneiPad: u.indexOf('ipad') > -1, //是否iPadwebApp: !!u.match(/applewebkit.*mobile.*/) && u.indexOf('s
afari/') == -1 //是否web应该程序,没有头部与底部};}var timeout;function open_appstore() {var b=browser();if(b.ios||b.iPhone||b.iPad){window.location="itms-apps://itunes.apple.com/cn/app
/qq-2011/id444934666?mt=8";}else if(b.android){// }} function try_to_open_app() {var b=browser();if(b.ios||b.iPhone||b.iPad){window.location="mqq:open";}else if(b.android){// }timeout = setTimeout('open_appstore()', 30);}try_to_open_app();</script>
</head>
<body>
</body>
</html>
9.用我们的app打开word、pdf之类的文档,即点击word、pdf可以选用我们的app打开
概要点:
1. 注册申明app能够打开某种类型的文档,这样其他app才可能通过DIC(document interaction interface)把文件转给你app来打开
2. 注册就要在plist里声明CFBundleDocumentTypes
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>文档类型名称
<string>pdf</string>
<key>LSHandlerRank</key> //是拥有此类型文档,还是仅用于打开
<string>Default</string>
</dict>
</array
一般而言一个文档类型和一个文件类型对应,当然也可以是多个文件类型例如。doc和docx是word文档在两个不同版本下的文件后缀。这样你可以把这两个文件类型组合在一个文档类型中
A uniform type identifier (UTI) is a string that identifies a class of entities with a type. UTIs are typically used to identify the format for files or in-memory data types and to identify the hierarchical layout of directories, volumes or packages
这里有个基本的对照表,文件后缀和UTI的串
https://developer.apple.com/library/mac/#documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html
更多的对应可以参考:
Apple’s Uniform Type Identifiers Overview
<key>LSItemContentTypes</key>
<array>
<string>com.sunsetlakesoftware.molecules.pdb</string> //app id+.pdb
<string>org.gnu.gnu-zip-archive</string>
</array>
这里我们使用了一个系统定义的。org。gnu。。。。另外一个是程序定义的UTI,程序定义的UTI需要导出,系统其他程序才能知道
3. 需要为自定义的UtI在plist中申明:
<key>UTExportedTypeDeclarations</key>
<array><dict><key>UTTypeConformsTo</key><array><string>public.plain-text</string><string>public.text</string></array><key>UTTypeDescription</key><string>Molecules Structure File</string><key>UTTypeIdentifier</key><string>com.sunsetlakesoftware.molecules.pdb</string> // 自定义的type identifier<key>UTTypeTagSpecification</key><dict><key>public.filename-extension</key> //关键点<string>pdb</string><key>public.mime-type</key> //关键点<string>chemical/x-pdb</string></dict></dict>
</array>
关键是说明 com.sunsetlakesoftware.molecules.pdb UTI 是和.pdb后缀文件关联,且mime类型是 chemical/x-pdb.
这样一来,在邮件程序中,tap且hold等待弹出候选程序列表,可以打开特定的文件。
当附件被打开,你的app就启动了。一般而言,至少要在application:didfinishelaunchingwithoptions中处理文件路径等,看起来就像是文件被copy到你app目录下,然后打开了:
NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
再看另外一个例子,注释在其中
<dict>
<key>CFBundleTypeName</key>
<string>My File Format</string> //任意定义
<key>CFBundleTypeIconFiles</key> //icon图标资源,当用于显示此类文件的时候<array>
<string>MySmallIcon.png</string> //resource in bundle
<string>MyLargeIcon.png</string>
</array>
<key>LSItemContentTypes</key> //使用了UTI格式的,关联到文件格式</pre><array>
<string>com.example.myformat</string>
</array>
<key>LSHandlerRank</key></pre>
<string>Owner</string> //非默认,而是owner
</dict>
也可以通过MIME来指定文件类型CFBundleTypeMIMETypes
更多信息:
https://developer.apple.com/library/ios/#documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-SW1
案例: 在iOS app中导入/导出文档
我们经常会用到的文件操作,又希望本地有文档保存,可以离线操作,其实ibook/iannotation之类多有类似的东西,就是本地library;有时候,还希望可以导出文件去另g外一个地方
新建一个项目view based application:
打开nib文件,增加两控件:
WebView
Button
1. 通过拖拽,完成outlet action的声明;
增加一些message例如opendocument/handledocumentopenUrL2.注意到要实现protocol:UIDocumentInteractionControllerDelegate
@interface flyViewController : UIViewController<UIDocumentInteractionControllerDelegate>
{IBOutlet UIWebView *webview;}-(void)openDocumentIn;
-(void)handleDocumentOpenURL:(NSURL *)url;
-(void)displayAlert:(NSString *) str;
-(void)loadFileFromDocumentsFolder:(NSString *) filename;
-(void)listFilesFromDocumentsFolder;
- (IBAction)btnDisplayFiles:(id)sender;@end
-(void)openDocumentIn { NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Courses for Q2 2011" ofType:@"pdf"]; documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];documentController.delegate = self;[documentController retain];documentController.UTI = @"com.adobe.pdf";[documentController presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES];
}-(void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application {}-(void)documentInteractionController:(UIDocumentInteractionController *)controller didEndSendingToApplication:(NSString *)application {}-(void)documentInteractionControllerDidDismissOpenInMenu:
(UIDocumentInteractionController *)controller {}
10. 文档共享
1.通过itunes
Info.plist增加如下声明:
<key>UIFileSharingEnabled</key>
<true/>
当文件拖动到app后,会存储在default document目录下
-(void) displayAlert:(NSString *) str {UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:str delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil];[alert show];[alert release];
}- (void)handleDocumentOpenURL:(NSURL *)url {NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; [webView setUserInteractionEnabled:YES]; [webView loadRequest:requestObj];
}-(void)loadFileFromDocumentsFolder:(NSString *) filename {//---get the path of the Documents folder--- NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:filename]; NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; [self handleDocumentOpenURL:fileUrl];
}-(void)listFilesFromDocumentsFolder { //---get the path of the Documents folder--- NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSFileManager *manager = [NSFileManager defaultManager];NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];NSMutableString *filesStr = [NSMutableString stringWithString:@"Files in Documents folder \n"];for (NSString *s in fileList){ [filesStr appendFormat:@"%@ \n", s];}[self displayAlert:filesStr]; [self loadFileFromDocumentsFolder:@"0470918020.pdf"];
}- (IBAction) btnDisplayFiles {[self listFilesFromDocumentsFolder];
}
第二中方法就是自己作为一个文档接受方:主要是通过注册,在plist中声明通过CFBundledocumenttypes
其实当文档触发app起来后,文档会被复制到一个inbox的目录,在documents目录下的一个子目录,可以通过url来看到路径
#import "OfflineReaderAppDelegate.h"
#import "OfflineReaderViewController.h"@implementation OfflineReaderAppDelegate@synthesize window;
@synthesize viewController;-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { if (url != nil && [url isFileURL]) {[self.viewController handleDocumentOpenURL:url];} return YES;
}
相关文章:
XML学习总结
1、XML结构 2、XmlNodeType值为一个枚举类型: 假设我们对一个XML文件进行遍历,不推断节点是否为Element类型。就会将文本节点遍历出来,出现#test。 3、XmlElement和XmlNode的差别:(摘自CSDN论坛) ÿ…

Linux01-基本操作与Shell
目录 一、环境 二、Linux目录结构及基本操作 2.1 Linux目录结构 2.2 基本操作 三、shell 3.1 shell的意义 3.2 su - 一、环境 2019年搞下RHCE的证书,但是一直没有整理Linux学习的笔记,为了不让到手的知识被遗忘,从今天起整理Linux学习…

ORB_SLAM2中Tracking线程的三种追踪方式
1、参考关键帧追踪模式 bool Tracking::TrackReferenceKeyFrame()对参考关键帧中的路标点进行跟踪。在Tracking线程中,每传入一帧,都会进行位姿优化。 以上一帧的位姿为当前位姿进行优化。 (1)计算当前帧的词袋 mCurrentFra…

nodejs 中间件 反向代理 接口转发
背景 随着后端业务系统的增加,纵向需求不断扩展,一个业务系统已经无法满足需求了,衍生出多个业务系统,对外暴露的ip、端口就可能有多个,此时不方便外部接口调用,有些特殊行业客户出于安全性考虑不发提供多…

oneinstack
https://oneinstack.com/转载于:https://www.cnblogs.com/diyunpeng/p/9740895.html

最近在做托盘时,发现 CnTrayIcon1的OnClick 事件,不能被其它按钮来执行,蛋疼。...
比如: procedure TForm1.Button1Click(Sender: TObject);begin CnTrayIcon1.OnClick ; // 这句就是不能通过!!end; 有过路的高手,指点学生一下。谢谢转载于:https://www.cnblogs.com/hahy8008/p/6783614.html

Linux02-帮助手册
目录 一、man手册 1.1 man的基本使用 1.2 mandb更新文档 二、/usr/share/doc 三、access.redhat.com 门户 一、man手册 1.1 man的基本使用 man就是mannual的缩写,手册的意思。Linux的命令很多,参数选项更多,人脑一般是记不住的&…

ORB_SLAM2中Tracking线程
Tracking线程是ORB_SLAM2的主线程。在System.cc中,使用构造函数进行了初始化,开启了三个线程。 可执行程序—>System构造函数(初始化三个线程)—>处理输入的帧(TrackMonocular)—>调用Tracking线程…

selenium的基础知识点
from selenium import webdriver from scrapy.selector import Selector#模拟登陆 browser webdriver.Chrome(executable_pathChromedriver.exe) #路径是Chromedriver.exe的存放位置,windows下只要配置好这个环境就不需要了browser.get(http://w) #需要登陆的那个网…

iOS 直播专题2-音视频采集
从设备(手机)的摄像头、MIC中采集音频、视频的原始数据ios的音视频采集可以从AVFoundation框架里采集 视频采集 这里我们选取GPUImage来采集视频,因为这个框架集成了很多视频滤镜,例如美颜 采集流程: 摄像头采集视频代码 GPUImageVideoCamera.m // 从前摄像头或后摄像头…

bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec Memory Limit: 512 MBSubmit: 53 Solved: 9[Submit][Status][Discuss]Description 自从上次神刀手帮助蚯蚓国增添了上千万人口(蚯口?),蚯蚓国发展得越来越繁荣了!…

Linux03-本地账户和组
目录 一、本地账户/etc/passwd 二、本地组/etc/group 三、切换账户su - 四、增删改本地账户useradd、userdel、usermod 五、账户默认配置文件/etc/login.defs 六、设置密码passwd(5)命令 七、增删改组groupadd、groupdel和groupmod 八、通过sudo以root身份运行命令 九…

ORB_SLAM2单目初始化策略
基本流程 单目初始化程序存储在Initializer.cc中 需要注意,对于双目/RGB-D相机,初始化时,由于可以直接获得相机的深度信息,因此无需求H/F,直接作为关键帧插入就行。 使用RANSACDLT求解H,RANSAC八点…

Powerdesigner逆向工程64位Oracle数据库
Powerdesigner老版本不支持64位Client,新版本弄不到破解码 解决方法,用Powerdesigner32位Oracle Clent访问64位Oracle Server 遇到的坑分享下 安装完64位的Oracle Server ,32位的 Oracle Clent默认的listener.ora文件有PROGRAM和ENVS这两个节点 Plsql(3…

运行jsp时,报错404
The origin server did not find a current reprsentation for the target resource or is not willing to disclose that one exists. 解决: 1. web.xml文件位置是否放错,应该放在WebContent/WEB-INF文件夹中 2. web.xml文件中是否有拼写错误࿰…

iOS 直播专题3-前置处理
前置处理 对视频添加美颜、水印、滤镜等对音频进行混音、消除环境音、声音特效等上一篇iOS 直播专题2-音视频采集提到视频采集采用的是GPUImage框架,这个框架集成了很多滤镜效果 这里主要介绍美颜、水印处理 处理流程: 美颜 这里的美颜效果用的是GPUImageBeautyFilter 功…

ORA-10873解决办法
今天,发现SAP系统的oracle数据库宕掉了。报错ORA-10873,经过查证解决该问题。记录一下,备忘。 一、问题 Oracle版本为12.1.0.2.0,在启动服务器后启动数据库startup,报错ORA-10873。 二、查证 到SAP Support Portal上…

ORB_SLAM2局部建图线程
局部建图线程入口:可执行程序在初始化三个线程的时候,在System.cc的构造函数中进入局部建图线程 mpLocalMapper new LocalMapping(mpMap, //指定使iomanipmSensorMONOCULAR); // TODO 为什么这个要设置成为MONOCULAR??&#…

十一连测day1
这次测试,是福建第三中学的某同学出的,感觉难度还行吧,今天我就浅谈一下这场比赛的时间分配与心得 打开题目,看到了T1,这题是一道计数题吧,感觉心态一下子就崩了,100%的数据点应该是组合数学容斥…

iOS 直播专题5-推流
常用的推流协议有: 协议内容RTP实时流传输协议,但不保证服务质量RTCPRTP数据流协议的一个姐妹协议,为RTP提供服务质量反馈SRTP & SRTCPRTP和RTCP的安全版本,提供数据加密、消息认证功能RTSP控制声音或影像的多媒体数据串流协议RTMPADOBE公司播放器与服务器之间多媒体数…

centos6.5-vsftp搭建
我的机子是默认是没有的vsftp。 yum install -y vsftp 创建账户专为ftp而生。useradd ftp01 更改账户不可登录系统。usermod -s /sbin/nologin ftp01 vsftp默认是可以匿名登录的,也是默认的端口,这些不安全选项都要修改! anonymous_enableYES…

Linux04-文件系统权限与ACL权限
目录 一、文件系统权限 1.1、认识文件系统权限 1.2、管理文件系统权限 1.3、特殊权限 1.4、默认权限 二、ACL权限 2.1、ACL本质是文件系统的一个挂载选项 2.2、更改文件的ACL权限 2.3、设置文件和目录的默认ACL权限 Linux中的权限管理分为两种类型 用户自主访问控制&…

ORB_SLAM2帧Frame
在追踪线程的一开始就会创建一个帧 cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im,const double ×tamp)构造函数 在构造函数中,会对特征点进行提取。 ExtractORB(0,imGray);特征点分配至网格 将图像划分为48*64的网格,然后将…

Servlet的基本架构
Servlet的基本架构: package test;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Serv…

ORACLE 用户权限管理
Oracle创建用户的语法: CREATE USER username IDENTIFIED BY password OR IDENTIFIED EXETERNALLY OR IDENTIFIED GLOBALLY AS CNuser [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE temptablespace] [QUOTA [integer K[M] ] [UNLIMITED] ] ON tables…

iOS 直播专题6-流媒体服务器
常用的流媒体服务器有: nginx、SRS、BMS 这里主要介绍nginx、SRS 这里都用docker来运行流媒体服务器 docker 安装 下载Mac版docker stable 直接安装 注册一个docer账号直接登录SRS 安装 SRS guthub地址:https://github.com/ossrs/srs/ 启动上面安装的docker软件后,打开终端…

Linux05-进程管理
目录 一、进程 1.1、进程ID 1.2、列出进程 1.3、进程前后台 二、使用信号控制进程 三、以管理员身份注销用户(踢掉在线用户) 四、监控进程活动 4.1、负载平均值 4.2、实时进程监控 进程是已启动的可执行程序的运行中的实力。它由以下部分组成&a…

Mat常用赋值方式
参考https://blog.csdn.net/wanggao_1990/article/details/53264753 #include <iostream> #include <opencv2/opencv.hpp> #include <unordered_map> using namespace std; using namespace cv; int main(int argc,char** argv) {// 1Mat mat (Mat_<flo…

java modbus协议
概念 Modbus是一种串行通信协议,Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。 大多数Modbus设备通信通过串口EIA-485物理层进行。 通讯格式 地址域功能码数据CRC校验(低字节在前)1字节1字节N字节2字节 在单片机硬件通讯串口行业&…

layui栅格布局问题
在使用layer.open弹出到窗口中,使用布局一直不起作用。 开始到写法如下, 目的是一行分成左右两块,比例为8:4等分。 <div class"layui-fluid"><div class"layui-row layui-col-space10"><div class"layui-col-md…