环境:ios9
重要的提示:
应用A:和应用B:都同时写上同样的url schemes为URLSA,然后在应用C中通过]openURL:@“URLSA”,那么此时应用会跳到哪个应用了?
答案是,应用A或者应用B,谁先安装到手机,然后点击应用C就是跳到先安装的(A或者B)应用里去。
常用的app启动有2种,
1:点击图标启动;
{
1:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
【launchOptions 没有值】
}
2:通过url打开
{
1:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
【launchOptions 有值】
2:- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options;
有url
}
利用[[UIApplication sharedApplication]openURL:url];来进行打开另一个app
URL Scheme是类似http://, ftp://这样的东西,同样你也可以为自己的应用自定URL Scheme,其他应用通过此标识就可以访问你的应用,如果自定的URL Scheme 和系统应用的相同,则会调用系统应用,而不会调用自定的应用程序。
例如:invoking://com.hello/yourpath/?username=WT&password=123456&callback=myapp
其中invoking是URL Scheme 即[url scheme],
com.hello是host,即[url host],
yourpath是path,即[url path],
username=WT&password=123456&callback=myapp是query,即[url query]。
【链接格式:Native app URL string:
http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=156093464&id=156093462&s=143441】【接收方的接收格式http://www.2cto.com/kf/201403/283996.html
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSLog(@
"%@"
, url);
if
([[url scheme] isEqualToString:@
"invoked"
]) {
if
([[url host] isEqualToString:@
"com.hello"
]) {
NSString *query = [url query];
NSArray *array = [query componentsSeparatedByString:@
"&"
];
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:
10
];
for
(NSString *item in array) {
NSArray *valueArray = [item componentsSeparatedByString:@
"="
];
[dic setValue:[valueArray objectAtIndex:
1
] forKey:[valueArray objectAtIndex:
0
]];
}
[self application:application didFinishLaunchingWithOptions:dic];
}
return
YES;
}
return
NO;
}
【1
传:scheme://host/path/?name=txj&age=20
收:接收获取如上
2:
传:scheme://host/path/?将字典变成jsonString
收:怎么加密就怎么解密【将jsonString
变成字典】
+ (NSMutableDictionary *)dictionaryWithJsonString:(NSString *)jsonString{
if (jsonString ==nil) {
return nil;
}
NSData * jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError * err;
NSMutableDictionary * dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
if (err) {
NSLog(@"json解析失败:%@",err);
return nil;
}
return dic;
}
】
例子:
TestA:
配置
1:App Transport Security Settings Dic
Allow Arbitrary Loads bool=yes
2:LSApplicationQueriesSchemes array
添加 TestB(应用的名字、例如weixin)
3:在 url types 的URL Schemes 添加TestB(例如微信的urlschema是wx0fff8fc7685bb2c6)
代码:
vc中的点击:
- (IBAction)show:(id)sender {
NSLog(@"打开A");
NSString *urlString = [NSString stringWithFormat:@"TestB://%@",self.textB.text];
NSURL * url = [NSURL URLWithString:[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
if
([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
else
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@
"message"
message:[NSString stringWithFormat:@
"%@"
, url] delegate:self cancelButtonTitle:@
"确定"
otherButtonTitles:nil, nil];
[alertView show];
}
在AppDelegate获取 从B传过来的值
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
NSString *strs = [[url host] stringByRemovingPercentEncoding];
NSLog(@"B穿过来的值--》%@",strs);
return YES;
}
TestB:
配置
1:App Transport Security Settings Dic
Allow Arbitrary Loads bool=yes
2:LSApplicationQueriesSchemes array
添加 TestA3:在 url types 的URL Schemes 添加TestB
代码:
vc中的点击:
- (IBAction)show:(id)sender {
NSLog(@"打开A");
NSString *urlString = [NSString stringWithFormat:@"TestB://%@",self.textB.text];
NSURL * url = [NSURL URLWithString:[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
if
([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
else
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@
"message"
message:[NSString stringWithFormat:@
"%@"
, url] delegate:self cancelButtonTitle:@
"确定"
otherButtonTitles:nil, nil];
[alertView show];
}
在AppDelegate获取 从B传过来的值
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
NSString *strs = [[url host] stringByRemovingPercentEncoding];
NSLog(@"B穿过来的值--》%@",strs);
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
NSString *strs = [[url host] stringByRemovingPercentEncoding];
NSNumber *strs1 = [url port] ;
NSString *strs2 = [[url password] stringByRemovingPercentEncoding];
NSString *strs3 = [[url fragment] stringByRemovingPercentEncoding];
NSString *strs4 = [[url query] stringByRemovingPercentEncoding];
NSString *strs5 = [[url relativePath] stringByRemovingPercentEncoding];
NSLog(@"A穿过来的值strs-》%@",strs);
NSLog(@"A穿过来的值strs1-》%@",strs1);
NSLog(@"A穿过来的值strs2-》%@",strs2);
NSLog(@"A穿过来的值strs3-》%@",strs3);
NSLog(@"A穿过来的值strs4-》%@",strs4);
NSLog(@"A穿过来的值strs5-》%@",strs5);
NSLog(@"A穿过来的值options--》%@",options);
return YES;
}
options:(NSDictionary<NSString*, id> *)options中的optiongs打印结果:
{
UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
UIApplicationOpenURLOptionsSourceApplicationKey = "com.***.***";
}
=============
检测当前是否有有安装软件canOpenURL
BOOL iscanOpen = [[UIApplication sharedApplication]openURL:url];
if (iscanOpen) {
NSLog(@"iscanOpe有安装");
}else{
NSLog(@"iscanOpen没有安装");
[self addWebView];
// [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.baidu.com"]];
}
----------------
怎样判断iOS App是通过哪种途径启动的?【http://www.cnblogs.com/daguo/p/3759514.html】
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
说明:当应用程序启动时执行,应用程序启动入口。只在应用程序启动时执行一次。application参数用来获取应用程序的状态、变量等,值得注意的是字典参数:(NSDictionary *)launchOptions,该参数存储程序启动的原因。
1.若用户直接启动,lauchOptions内无数据;
2.若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);
3.若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);
4.若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);
其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
UIApplicationLaunchOptionsNewsstandDownloadsKey。 如果要在启动时,做出一些区分,那就需要在下面的代码做处理。 比如:应用可以被某个其它应用调起(作为该应用的子应用),要实现单点登录,那就需要在启动代码的地方做出合理的验证,并跳过登录。
【http://www.cnblogs.com/letougaozao/p/3979096.html 参考】
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
if(url)
{
}
NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
if(bundleId)
{
}
UILocalNotification * localNotify = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if(localNotify)
{
}
NSDictionary * userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo)
{
}
}
/----//
http://blog.csdn.net/tenfyguo/article/details/9063675
ios应用间通信和分享数据的机制
iOS平台无法直接通过文件系统来分享数据。
1, 使用UIDocumentInteractionController
受到UIDocumentInteractionController的UI设计限制,其只能支持最多6个第三方应用,IOS6上UIDocumentInteractionController被抛弃了,取而代之的是UIActivityViewController,它提供了更灵活的解决方案
2, 使用UIActivityViewController
上面提到了第一种方案在iOS6被抛弃了,取代方案就是UIActivityViewController,因此这和第一种方案非常类似。在UI方面通过分页面板解决了最多6个第三方应用的问题,另外你可以通过创建自己的UIActivity子类来提供客制化的服务
3, 使用KeychainGroup Access
自iOS3.0始我们在同一家族的App间分享Keychain数据,这里说的同一家族的App指的是具有相同Bundle Seed ID的应用[苹果制定的应用ID是由两部分组成,<Bundle Seed ID>.<Bundle Identifier>]。
4, 客制化的URLScheme
允许应用间通过URL进行数据传输。URL Scheme是iOS平台目前应用间通讯的常用解决方案。
5, Web Service
通过第三方服务(例如dropbox)或者自己定制的服务器来进行数据分享,[当然也可以在本地App内创建Web Server,但是如果App切入后台之后,尤其是内存吃紧时,一切就变得不靠谱了]。
6, UIPasteBoard + URL Scheme
上面的方案或许足以满足你的应用需求,但这些方案或多或少存在某些明显短板,都为另一潜在的解决方案留有余地。如果你想精确的控制App间数据通讯并且不受离线的影响,可以选择UIPasteBoard+URL Scheme的方案。[遵循x-callback-url规范的应用iPGMail就使用了这种方案]
像上面提到过的URL Scheme方案一样,我们可以通过URL来进行应用间通讯,而对于数据的传输,可以使用剪贴板来进行,可以选择成熟的数据结构序列化反序列化方案来封装通讯及数据传输协议,可以定义回调方法