需求2具体是:因为用itms-services跳转的浏览器是空白页面,我想要在这空白的页面里面添加一些图片或者是文字提醒。
刚开始想着讲intall.html添加在本地然后直接用:file:///Users/luxiangting/Desktop/install.html
file协议来打开itms-services,然后想想真是脑袋坏了,这个和之前跳转代码认为和前面一大堆参数有关是相同道理的,无论用模拟器还是iPhone机器上都不能直接用file协议,你以为是Mac book打开文件夹那么好玩啊。。那么该怎么办了。搜了一下相关的资料,有两个知识点需要弄清楚:1.URL Scheme 2.openURL 的方法。
URL Scheme openURL的一个简单应用,如果看完了参考文章应该都可以明白和开始动手做了,动手才是真正容易了解和明白其原理的最好方法
1.
首先在第一个工程的info.plist里面修改URL Schemes,修改如下,具体就不解释了,望文可以生义,URL identifier肯定是唯一的,所以标志着应用自身,而URL Schemes说实话,直译是比较困难理解的,URL 机制? 且不急,等我们继续往下看
2.
分别在第一个和第二个工程添加一个按钮,点击事件分别附上如下代码和相应的 “地址”
第一个工程:
static NSString* itmsURL = @"QIPAO://com.qipao.qipaoTest";
- (void)itmsButtonClicked:(id)sender
{
NSLog(@"button Clicked !");
NSURL* url = [NSURL URLWithString:itmsURL];
if ([[UIApplication sharedApplication] canOpenURL:url])
{
[[UIApplication sharedApplication] openURL:url];
}
NSLog(@"123123 : %@", [[UIApplication sharedApplication] canOpenURL:url]? @"YES" :@"NO");
}
第二个工程:
static NSString* iosfighterURL = @"IOSFIGHTER://com.iosfighterlb.practise";
- (void)urlSchemeTest
{
NSLog(@"KeyBoard AddButton Clicked !");
NSURL* url = [NSURL URLWithString:iosfighterURL];
if ([[UIApplication sharedApplication] canOpenURL:url])
{
[[UIApplication sharedApplication] openURL:url];
}
}
分别实现了以后,就可以实现来回跳转的效果啦哈哈。相信看完代码也懂了URL Schemes 和 URL identifier 的意义了吧?
URL Schemes就是别人“跳”我们的应用时候用的前缀,但是地址格式是 URL Schemes + :// + URL identifier !
在接入一些SDK我们会发现跳转需要设置的 XXX + bundleID的格式,如:
这里也给出其实现的原理,用支付宝跳转来做例子:
- (void)callAliPayMethod:(NSString *)str
{
NSData* data = FBDecodeBase64(str); //加密的订单号
NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];//用这个方法可以直接获取infoPlist整个字段的参数
NSString* paramStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSArray* array=[[NSArray alloc] initWithArray:[infoDictionary objectForKey:@"CFBundleURLTypes"]];
NSString* appBunldId = [infoDictionary objectForKey:@"CFBundleIdentifier"];
NSString* callBackURLString = NULL;
for (int i = 0; i <[array count]; i++)
{
id object = [array objectAtIndex:i];
if ([object isKindOfClass:[NSDictionary class]])
{
NSDictionary* dic = (NSDictionary *)object;
NSArray *allKeysArray = [dic allKeys];
for (int k = 0; k < [allKeysArray count]; k++)
{
NSString *keyString = [allKeysArray objectAtIndex:k];
if ([keyString isEqualToString:@"CFBundleURLSchemes"])
{
NSArray *tempArray = [dic objectForKey:keyString];
for (int j= 0; j<[tempArray count] ; j++)
{
NSString* tempCallBackStr = [[tempArray objectAtIndex:j] substringWithRange:NSMakeRange(0,[[tempArray objectAtIndex:j] length])];
NSLog(@"JUMPSDK:Temp URLSchemes is %@",appBunldId);
if ([tempCallBackStr isEqualToString:[NSString stringWithFormat:@"JUMPProtocol%@",appBunldId]])
{
callBackURLString = tempCallBackStr;
k = -1; //设置-1来提前break掉循环
break;
}
}
if (k == -1)
{
i = -1;
break;
}
}
}
if (i == -1)
{
break;
}
}
}
NSLog(@" Bundleid is %@",appBunldId);
NSLog(@" URLSchemes is %@",callBackURLString);
}
//这里就可以发现设置的规格是因为alipay支付宝的方法使然
[[AlipaySDK defaultService] payOrder:paramStr fromScheme:callBackURLString callback:^(NSDictionary *resultDic) {
//Alipay operation .
}];
}
在iOS9 之后苹果对于URL Scheme的要求更进一步了,如图:
itms协议待续...
参考:
http://www.cocoachina.com/industry/20140522/8514.html
http://blog.csdn.net/zhibudefeng/article/details/7725008