我是靠谱客的博主 单薄冬日,最近开发中收集的这篇文章主要介绍iOS应用程序间跳转总结应用程序间跳转的应用场景应用程序间跳转的实现原理应用程序间跳转的实现步骤快速测试外部调用调用iOS自己应用如何跳转到itunes提示下载app黑马iOS培训的实例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

应用程序间跳转的应用场景

  1. 使用第三方用户登录,如微信登录,返回用户名和密码
  2. 需要用户授权,返回到调用程序,同时返回授权的用户名
  3. 应用程序推广,跳转到itunes并显示指定app下载页
  4. 第三方支付,跳转到支付APP,如支付宝,微信钱包
  5. 显示位置及导航功能时,跳转到第三方地图应用。
  6. 打电话、发邮件、发短信、打开网页等,跳转到内置APP程序

应用程序间跳转的实现原理

苹果内置支持http,mailto,tel和sms这些URL schemes,还支持基于http的,指向Maps,YouTube,和iPod程序的URL。
应用程序也可以自己注册定制的URL schemes中,这些schemes的处理是固定不变的。


如果自己定义的url schemes和系统自定义的重名了,怎么办呢?

系统的URL schemes的优先级高于用户app定义的,所以重名时,系统会按自己方式跳转处理。



应用程序间跳转的实现步骤

(1)注册自定义URL schemes 

有两种方式:

1.在项目的info项下面,点击+



2.直接在info.plist中手动添加


打开xxxx-info.plist,添加一项URL types
打开URL types,将item0的URL identifier修改为URL Schems
展开URL Schemes,将item0的内容修改为xxxApp(此为跳转的key)如下图所示:


(2)处理URL请求


APP-A  发送跳转请求,同时可以通过URL传递参数

  1.   在你需要调用上面注册过对外接口的应用中,添加下面代码即可:   
  2.   NSURL *url  = [NSURL URLWithString:@"myapp:"];
      [[UIApplication sharedApplication] openURL:url]; 


  3.   通过上述两个步骤,你可以在你的应用中,让用户打开你的其它应用。
  4.   如果加参数的话,最好写成@"myapp://.........",就好比http请求的“http”换成@“myapp”.

APP-B处理请求 
第一种处理URL请求方法

使用 application:willFinishLaunchingWithOptions: 和 application:didFinishLaunchingWithOptions:方法接收URL信息并决定是否打开它。如果返回NO,您的应用URL处理不会被唤醒。
在iOS4.2版本之后,使用application: openURL: sourceApplication: annotation:打开应用
在iOS4.1版本之前使用application: handleOpenURL:打开应用


应用程序委托在application:handleOpenURL:方法中处理传递给应用程序的URL请求。
如果您已经为自己的应用程序注册了定制的URL模式,则务必在委托中实现这个方法。
 
基于定制模式的URL采用的协议是请求服务的应用程序能够理解的。URL中包含一些注册模式的应用程序期望得到的信息,这些信息是该程序在处理或响应URL请求时需要的。
 
在程序清单显示的application:handleOpenURL:方法实现中,传入的URL对象在其请求和片断部分带有具体应用程序的信息。应用程序委托抽出这些信息—在这个例子中,是指一个to-do任务的名称和到期日—并根据这些信息创建应用程序的模型对象。
 
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {  
    if ([[url scheme] isEqualToString:@"myapp"]) {  
        //处理链接  
          
        return YES;  
    }  
      
    return NO;  
}  
 

请务必对传入的URL输入进行验证。如果您希望了解如何避免URL处理的相关问题,请参见安全编码指南文档中的验证输入部分。如果要了解苹果定义的URL模式,请参见苹果的URL模式参考
 
第二种处理URL请求方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
{  
    //被其他应用调用   
    NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];  
    if(url) {//做出相应的判断   
        if ([[url scheme] isEqualToString:@"myapp"]) {  
            //处理链接   
        }  
    }  
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  
    // Override point for customization after application launch.   
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];  
    self.window.rootViewController = self.viewController;  
    [self.window makeKeyAndVisible];  
    return YES;  
}  
 


说明:iOS程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
 
 
若用户直接启动,lauchOptions内无数据;
若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);
若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);
若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);
其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
UIApplicationLaunchOptionsNewsstandDownloadsKey。
 
 

快速测试外部调用


1.回到Home屏幕,启动Safari(在iPhone仿真器上,在菜单上选择Hardware->Home命令就可以回到Home屏幕)。
2.在Safari的地址栏中,键入使用定制模式的URL,即“myapp:”,加参数的话则为“myapp://........”
3.确认您的应用程序是否启动,以及应用程序委托是否收到application:handleOpenURL:消息。

调用iOS自己应用

 1)调用 自带mail

[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto://admin@hzlzh.com"]];

2)调用 电话phone

[[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"tel://8008808888"]];


3)调用 SMS

[[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];


4)调用自带 浏览器 safari

[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"http://www.hzlzh.com"]];

5)调用 Remote

[[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"remote://fff"]];


如何跳转到itunes提示下载app


找到应用程序,点击应用程序下面的小三角图标,再选择”复制链接“,就可以获取此应用的链接了。

比如:

itunes.apple.com/cn/app/bai-du-wen-kuhd/id483064532?mt=8

然后将 https:// 替换为 itms:// 或者 itms-apps://:

 itms://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8
 itms-apps:// itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8  
然后在程序中写如下代码:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms://itunes.apple.com/cn/app/bai-du-wen-kuhd/id483064532?mt=8"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itunes.apple.com/cn/app/bai-du-wen-kuhd/id483064532?mt=8"]]

注意:只能在真机上调试出效果,模拟器上无效果。


黑马iOS培训的实例

定义两个app,模拟应用间跳转,一个app为新浪,一个app为网易


01-新浪 AppDelegate.m

//
//  AppDelegate.m
//  01-新浪
//
//  Created by apple on 14/11/2.
//  Copyright (c) 2014年 heima. All rights reserved.
//

#import "AppDelegate.h"
#import "ViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions
{
    return YES;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}


/**
 *  当被其他应用程序通过URL打开时就会调用
 *
 *  @param application 当前的应用程序
 *  @param url         打开当前程序的URL
 *
 *  @return 是否成功处理
 */
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    // 1.获取首页控制器
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
    UIViewController *vc = nav.topViewController;
    
    NSLog(@"%@", url);
    // 判断是通过哪一个URL打开的, 做出相应的处理(跳转到相应的控制器)
    NSString *urlStr = url.absoluteString;
    if ([urlStr hasPrefix:@"sina://login"]) {
        
        // 截取打开我们程序的应用的scheme
        NSRange range = [urlStr rangeOfString:@"sina://login?myScheme="];
        NSString *scheme = [urlStr substringFromIndex:range.length];
        
        NSLog(@"跳转到授权界面 %@", scheme);
//        if ([vc isKindOfClass:[ViewController class]] == YES) {
            [vc performSegueWithIdentifier:@"home2accounts" sender:scheme];
//        }
        
    }else if ([urlStr hasPrefix:@"sina://view?id="])
    {
        NSLog(@"跳转到详情界面");
        [vc performSegueWithIdentifier:@"home2detail" sender:nil];
        
    }
    
    return YES;
}

/**
 *  当被其他应用程序通过URL打开时就会调用(新方法)
 *
 *  @param application       当前的应用程序
 *  @param url               打开当前程序的URL
 *  @param sourceApplication 打开当前程序的Bundle identifier
 *  @param annotation
 *
 *  @return 是否成功处理
 */
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
#warning 注意: 如果实现了新方法, 旧方法旧失效了
    /*
     sourceApplication用途:
     当我们做一些广告, 积分墙等推广的时候, 可以利用这个唯一表一记录当前程序是被哪一个程序推广打开的
    */
    NSLog(@"%@ %@", url, sourceApplication);
    // 1.获取首页控制器
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
    UIViewController *vc = nav.topViewController;
    
    NSLog(@"%@", url);
    // 判断是通过哪一个URL打开的, 做出相应的处理(跳转到相应的控制器)
    NSString *urlStr = url.absoluteString;
    if ([urlStr hasPrefix:@"sina://login"]) {
        
        // 截取打开我们程序的应用的scheme
        NSRange range = [urlStr rangeOfString:@"sina://login?myScheme="];
        NSString *scheme = [urlStr substringFromIndex:range.length];
        
        NSLog(@"跳转到授权界面 %@", scheme);
        //        if ([vc isKindOfClass:[ViewController class]] == YES) {
        [vc performSegueWithIdentifier:@"home2accounts" sender:scheme];
        //        }
        
    }else if ([urlStr hasPrefix:@"sina://view?id="])
    {
        NSLog(@"跳转到详情界面");
        [vc performSegueWithIdentifier:@"home2detail" sender:nil];
        
    }
    
    return YES;
}
@end


01-新浪 ViewController.m

//
//  ViewController.m
//  01-新浪
//
//  Created by apple on 14/11/2.
//  Copyright (c) 2014年 heima. All rights reserved.
//

#import "ViewController.h"
#import "TableViewController.h"

@interface ViewController ()

- (IBAction)openWangYi;
@end

@implementation ViewController


/**
 *  打开网易新闻
 */
- (IBAction)openWangYi {
    
    // 1.获取application对象
    UIApplication *app = [UIApplication sharedApplication];
    // 2.创建需要打开的应用程序的URL
    // 在应用程序跳转中, 只要有协议头即可, 路径可有可无
    NSURL *url = [NSURL URLWithString:@"wangyi://"];
    // 3.利用application打开URL
    if ([app canOpenURL:url]) {
        // 3.1判断是否可以打开
        [app openURL:url];
    }else
    {
        // 3.2打开App STORE下载
        NSLog(@"根据App id打开App STORE");
    }
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"首页 %@", sender);
    UIViewController *vc = segue.destinationViewController;
    if ([vc isKindOfClass:[TableViewController class]]) {
        // 如果跳转的目标控制器是授权,才需要设置Scheme
        TableViewController *tbVc = vc;
        tbVc.callScheme = sender;
    }
}
@end

02-网易 ViewController.m


//
//  ViewController.m
//  02-网易
//
//  Created by apple on 14/11/2.
//  Copyright (c) 2014年 heima. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
- (IBAction)openSina;
- (IBAction)openDetail;
@end

@implementation ViewController
/**
 *  打开新浪授权界面
 */
- (IBAction)openSina
{
    // 每个程序都可以拥有一个自己唯一的URL
    // URL组成: 协议头://主机/路径
    // http://
    // file://
    // ftp://
    // ...
    // 1.获取application对象
    UIApplication *app = [UIApplication sharedApplication];
    // 2.创建需要打开的应用程序的URL
    // 在应用程序跳转中, 只要有协议头即可, 路径可有可无
    NSURL *url = [NSURL URLWithString:@"sina://login?myScheme=wangyi"];
    // 3.利用application打开URL
    if ([app canOpenURL:url]) {
        // 3.1判断是否可以打开
        [app openURL:url];
    }else
    {
        // 3.2打开App STORE下载
        NSLog(@"根据App id打开App STORE");
    }
    
}
/**
 *  打开新浪详情界面
 */
- (IBAction)openDetail
{
    // 1.获取application对象
    UIApplication *app = [UIApplication sharedApplication];
    // 2.创建需要打开的应用程序的URL
    // 在应用程序跳转中, 只要有协议头即可, 路径可有可无
    NSURL *url = [NSURL URLWithString:@"sina://view?id=123456"];
    // 3.利用application打开URL
    if ([app canOpenURL:url]) {
        // 3.1判断是否可以打开
        [app openURL:url];
    }else
    {
        // 3.2打开App STORE下载
        NSLog(@"根据App id打开App STORE");
    }

}

@end


最后

以上就是单薄冬日为你收集整理的iOS应用程序间跳转总结应用程序间跳转的应用场景应用程序间跳转的实现原理应用程序间跳转的实现步骤快速测试外部调用调用iOS自己应用如何跳转到itunes提示下载app黑马iOS培训的实例的全部内容,希望文章能够帮你解决iOS应用程序间跳转总结应用程序间跳转的应用场景应用程序间跳转的实现原理应用程序间跳转的实现步骤快速测试外部调用调用iOS自己应用如何跳转到itunes提示下载app黑马iOS培训的实例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部