ios urltypes 删除

2019-04-03 15:03:08 qijian_shashi 阅读数 126
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

/key - url中要删除的字段名称/

-(NSString*)removeParValue:(NSString*)urlStr Key:(NSString*)key{

//解码

NSString *decoerurl = [urlStr stringByReplacingOccurrencesOfString:@"+" withString:@" "];

decoerurl = [decoerurlstringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSArray*array = [decoerurlcomponentsSeparatedByString:@"&"];

NSMutableString *URLstr = [NSMutableString string];

NSMutableArray *tempArray = [NSMutableArray arrayWithArray:array];

[tempArrayenumerateObjectsUsingBlock:^(NSString* obj,NSUIntegeridx,BOOL*stop) {

    if([objhasPrefix:key]) {

        *stop =YES;

        if(*stop ==YES) {

            [tempArrayremoveObject:obj];
        }
    }
}];

NSString*par = [[NSString alloc]init];

for(inti =0; i < tempArray.count; i++)
{
    if(i !=0) {
        par =@"&";
    }
    [URLstrappendFormat:@"%@%@",pasa,tempArray[i]];
}
return  URLstr;
}
 

2014-08-18 11:28:06 u011883764 阅读数 3120
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

一直都有接触要设置app的url scheme,从最早的facebook开始。
当时的理解是SSO用的,当授权成功之后,facebook app或者safari可以利用给定的url scheme来回调程序。按照Facebook dev页的指南,在Info.plist中加入url scheme。


如何在info.plist中加入url scheme

直接将info.plist用源码打开,加入如下代码:

<key>CFBundleURLTypes</key>
   <array>
       <dict>
           <key>CFBundleURLName</key>
           <string>com.xxxx.xxxx</string>
           <key>CFBundleURLSchemes</key>
           <array>
               <string>yourURLScheme</string>
           </array>
       </dict>
   </array>

当然也可以在xCode中加入URL Type的row,不过遇到过xCode不自动提示补全,自己写的话,会无效,所以还是比较信任源码~

直接在xCode中操作添加URL Types

再后来xCode的工程属性Info页签下面有专门的URL Types条目添加URL Types,在Identifier中填入BundleID,URL Schemes中填入对应的Scheme。


Scheme的作用在之前facebook的使用中已经领悟了一部分,但是还有其他强大的功能,比如你想要在iOS设备的safari中输入一个URL(后面你会知道,就是你自己定义的URL Schemes)就能直接打开你的设备,就和启动众多系统应用一样!!没错,你的DIAO丝程序也能像挂着苹果老爹光环的“高帅富”应用一样启动。
系统URL Schemes

Stock
Some of these URL schemes doesn't work anymore in the latest iOS. Let's hope they get reintroduced.

itms-apps:// – Open the App Store
maps:// – Open the Maps app
sms:// – Open the compose window of the Messages app
music:// – Go to the currently playing song in the Music app
youtube:// – Open the YouTube app
itms-books:// – Open the iBooks app
facetime://
prefs:root=General&path=Bluetooth
prefs:root=General&path=AUTOLOCKS
prefs:root=NOTIFICATIONS_ID
prefs:root=General&path=USAGE
prefs:root=General&path=Bluetooth
prefs:root=AIRPLANE_MODE
prefs:root=Brightness
prefs:root=Wallpaper
prefs:root=INTERNET_TETHERING
prefs:root=CASTLE
prefs:root=CASTLE&path=STORAGE_AND_BA
prefs:root=General&path=About
prefs:root=General&path=USAGE/CELLULAR_USAGE
prefs:root=MUSIC&path=EQ
prefs:root=General&path=Network
prefs:root=LOCATION_SERVICES
prefs:root=Phone&path=CallerID
prefs:root=Phone&path=CallForwarding
prefs:root=Safari
prefs:root=General&path=Assistant
prefs:root=General&path=Keyboard
prefs:root=Sounds
prefs:root=General&path=Network/VPN
prefs:root=WIFI


想要实现上面的功能,在应用中仅仅加入scheme是不够的,还需要针对该scheme做对应的处理,有点类似广播通讯的原理,输入scheme后发出广播,你需要写接收该广播以及处理的代码。

  1. 不要实现applicationDidFinishLaunching:方法
  2. 实现application:didFinishLaunchingWithOptions:方法,并在其中检查url,如果能处理该url则返回YES,否则不做处理返回NO。
  3. 实现application:handleOpenURL:,处理url,成功返回YES,否则返回NO。

在iOS4中,URL分以下两种方式传入app中

  1. 如果是启动程序,则application:didFinishLaunchingWithOptions:被执行,返回YES当且仅当application:handleOpenURL:执行返回YES。
  2. 如果程序由后台挂起变为活动,则application:didFinishLaunchingWithOptions:不会被执行,但是application:handleOpenURL:会被执行。

处理代码如下:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
   NSLog(@"%@", [url absoluteString]);
   if ([[url host] isEqualToString:@"yourURLScheme"]) {
       return YES;
   }
   return NO;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   ...
   NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
   if ([self application:application handleOpenURL:url]) {
       return YES;
   }
   return NO;
} // End of application:didFinishLaunchingWithOptions:

注意:

在iOS4.2之后,application:handleOpenURL:将被DEPRECATED
可以使用

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
       sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

sourceApplication
The bundle ID of the application that is requesting your application to open the URL (url).

sourceApplication即为调用者发送给接收者的Bundle ID,比如MobileSafari就是com.apple.mobilesafari

annotation
A property-list object supplied by the source application to communicate information to the receiving application.

调用者发给接收者的plist对象


如果该程序没有被安装,那么在Safari中打开我们希望能跳转到下载界面。需要实现这个功能,我们可以利用JS的window.location和setTimeout函数。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
<script>
window.location = "URL Scheme:";
setTimeoutfunction(){ window.location="http://App Store地址";   } , 1500);
</script>
</body>
</html>

将该代码保存为index.html,放于网站上,利用Safari打开该文件,则可以实现如果安装了该应用,则打开,否则能够直接跳转到App Store的App下载页面。

注意

JS中的URL Scheme不要包含非转义字符,比如'-./'等,如果有非转义字符则需要转义后输入到Safari,直接在Safari中输入URL Scheme打开应用,如果提示

Safari打不开该网页,因为这是一个本地文件

那么很有可能因为你的URL Scheme中包含了非转义字符,最好全为英文字母数字最好。


代码如何调用

     NSURL *url = [NSURL URLWithString:@"URL Scheme://"];
[[UIApplication sharedApplication] openURL:url];
2017-01-11 12:25:47 sevenquan 阅读数 22272
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

URL Scheme的作用

我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。我们可以通过系统的OpenURL来打开该app,并可以传递一些参数。

例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝。如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载界面。

URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URL Scheme。

一般情况下,是会调用先安装的app。但是iOS的系统app的URL Scheme肯定是最高的。所以我们定义URL Scheme的时候,尽量避开系统app已经定义过的URL Scheme。

注册URL Scheme

1.在info.plist里添加URL types

每一个项目里面都会有一个info.plist配置文件。找到info.plist,右键选择Add Row,然后选择URL types。如图所示:

url1

2.添加URL Schemes

添加完URL types,点击展开。右键选择Add Row,添加URL Schemes:

url2

3.设置URL Schemes

设置URL Schemes为iOSDevTip

url3

4.设置URL Identifier

URL Identifier是自定义的 URL scheme 的名字,一般采用反转域名的方法保证该名字的唯一性,比如 com.iOSStrongDemo.www

url4

添加成功启动提示

为了方便测试,我们在AppDelegate里面添加一个UIAlertView,当app被成功打开时,会提出提示:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url
{
    // 接受传过来的参数
    NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"
                                           message:text
                                          delegate:nil
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
    [alertView show];
    return YES;
}

Safari启动自定义的URL Schemes APP

既然已经配置好URL Schemes,那么我们可以来款速测试一下,我们设置的URL Schemes是否有效。打开Safari,在地址栏里输入:iOSDevTip://

url6

果然成功打开:

url5

也可以在地址栏中输入:iOSDevTip://com.iOSStrongDemo.www。也是可以打开注册了URL Schemes的APP的。

通过另一个APP启动注册了URL Schemes的APP

 NSString *url = @"iOSDevTip://";
//    NSString *url = @"iOSDevTip://com.iOSStrongDemo.www";
if ([[UIApplication sharedApplication]
     canOpenURL:[NSURL URLWithString:url]])
{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
else
{
    NSLog(@"can not open URL scheme iOSDevTip");
}

打开注册iOSDevTip的APP格式为: URL Scheme://URL identifier,直接调用URL Scheme也可打开程序, URL identifier是可选的。

注册URL Scheme就是这么简单。下一篇会分享如何通过URL Scheme传递参数。demo下载地址:iOSStrongDemo


2018-04-11 09:32:41 fanqingtulv 阅读数 327
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

如果两个不同的应用注册了同样的URL Scheme,那么后安装的应用会响应符合这种协议格式的URL。

 

如果你的应用的iPhone和iPad版是各自独立的(即不是Universal类型的),那么你就不应该给两个版本的应用定义同样的URL协议。如果用户在同一个设备上先后安装了两个版本的应用,之后又删除了能够响应自定义URL Scheme的第二个应用,第一个应用还是会无法响应该协议。

 

需要说明的是,URL Scheme冲突的问题没什么好的解决方法,你只能选择一个尽可能独一无二的URL Scheme名称,并希望其他的应用开发者不要选得跟你一样。

 

假设我们定义的URL Scheme是cityguide.那么我们定义的URL Scheme不仅能在Safari中访问,而且在其他应用中同样能用以下的代码打开City Guide应用

 

NSString *string=@"cityguide://London";
NSURL *url=[NSURL URLWithString:string];
[[UIApplication shareApplication] openURL:url];

 

 

 

 

参考资料:《iOS编程指南》

2014-11-24 10:54:03 Mayerlucky 阅读数 3128
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

这两天用到了应用间的相互跳转,查了网上的好多资料,最后结合了一下自己的验证做了一下xcode6的总结,以此共享!

1. 我们知道iOS没一个应用程序都有一个自己的沙盒,且沙盒和沙盒之间(即是应用与应用之间)是相互独立的。苹果要求每一个应用都只能限制在自身的沙盒中活动,杜绝应用在沙盒外的活动。当然越狱除外!

2. 现在的问题是?很多时候我们都要由一个应用去跳转到另一个应用或者跳转到appStore去共享、分享、下载等。但是应用和应用之间又是这么绝缘。不过所幸的是苹果提供给我们一个非常好的方法:就是 URL Scheme 

3. 他就像一个地址,绑定url scheme 的应用就像是贴了一个独立logo的标签,通过访问应用的url scheme 我们就能跳转到对应的应用中。


说了这么多废话,下面我们开始配置url scheme 。(以Xcode6为基础,最后再说一下可能会遇到的错误)


1.首先打开工程进入tagets的info目录看到URL Tapes


2. 我们点击+号添加 在url identifier 中填入格式:com.company.xxx  在url scheme 中填入(这个可以随便填入,不过尽量和你的app保持一致)比如我填入的是 hztcTestApp 那么在调用的时候实际上是 hztcTestApp:// 格式



3.Role里面选择none就可以了


4.此时把这个工程给运行一下,运行成功以后,这个url scheme 就已经注册到模拟器上了(同理,在真机上安装后就已经注册到真及设备上了)


5.然后我们可以通过另一个工程来进行测试。 测试你设备上存在不存在刚刚注册了 url scheme的应用 可以根据此代码调试

BOOL isOpened = NO;

    

    isOpened = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"hztcTestApp://"]];

    if (isOpened) {

        NSLog(@"有此应用");//由此应用就直接打开    

    }else{

        NSLog(@"没有此应用");//若无此应用我跳到了商店的QQ

        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://itunes.apple.com/cn/app/qq/id451108668?mt=12"]];

    }


6.至此,差不多已经完成了。最后再说一下,可能会出现的问题 :(没有经过完全验证,不能100%肯定,还请见谅)

我认为在targets中的info目录有URLTayes的不要在.plist文件中添加这些 url identifier 和 url scheme 等 因为可能出现不了正确结果!  当然如果没有 在targets中的info目录有URLTayes 可以在.plist文件中进行配置