app和 ios 网页怎么握手
2016-10-07 19:58:00 weixin_34290000 阅读数 16

Mobile Safari- the iOS SDK provides APIs for you to open a specific URL in the built-inMobile Safari browser. In this case, your users temporarily leave the application andswitch to Safari.

UIWebView / WKWebView- Before the release of iOS 9, this is the most convenient

way to embed web content in your app. You can think ofUIWebViewas a stripped-down

version of Safari. It is responsible to load a URL request and display the web content.

WKWebView, introduced in iOS 8, is an improved version ofUIWebView. It has the benefit of

the Nitro JavaScript engine and offers more features. If you just need to display a specific

web page,UIWebVieworWKWebViewis the best option for this scenario.

iOS 9 才有 SFSafariViewController- this is a new controller introduced in iOS 9. While

UIWebViewallows you embed web content in your apps, you have to build a custom web

view to offer a complete web browsing experience. For example,UIWebViewdoesn't come

with the Back/Forward button that lets users navigate back and forth the browsing

history. In order to provide the feature, you have to develop a custom web browser using

UIWebView. In iOS 9, Apple introducedSFSafariViewControllerto save developers from

creating our own web browser. By usingSFSafariViewController, your users can enjoy all

the features of Mobile Safari without leaving your apps.

2017-12-08 17:38:00 weixin_34130269 阅读数 19

背景

第一次正式接触项目,修改了一点小BUG以后问题就是怎么把这个APP上架了。大佬说这个很简单让我自己百度看着做,完全没有做过啊以前,很慌啊!失败了咋办?咋开始啊?哪里开始啊?当时看到这个我也是一头雾水啊。

9007339-e11ad0c74f306e29.png
image.png
9007339-c29603cba8862dfc.png
image.png

1.证书(Certification)

开发证书(Developer Certification)

安装在电脑上可以给开发者提供权限实现真机测试的。

发布证书(Distribution Certification)

安装在电脑上提供发布iOS程序的权限,可以做测试版本和发布程序。

那怎么申请证书呢?
首先你要有苹果开发者账号


9007339-f7255775ee48adb0.png
image.png

然后就可以登录到这个界面了


9007339-059b9af0ff17e6e6.png
image.png

接着就是怎么创建证书了
9007339-53fed8deb2ea87a6.png
image.png

9007339-2bd53d0e772453eb.png
image.png
签名文件的创建
9007339-1086a256c36cc3aa.png
image.png

这个签名文件在哪里穿件呢?
点击你电脑的dock栏的Launchpad,选择其他,里面有一个钥匙串访问,然后就是如图。


9007339-127e684e345473d6.png
image.png

9007339-0e49f6a3b410d2b8.png
image.png
创建 App IDs
9007339-014cb7cac8f84d02.png
image.png

这里的Bundle ID一定要和项目上的Bundle ID一致。


9007339-d19660d91a0128af.png
image.png

这里选择APP要支持的服务,比如推送等。


9007339-51935ca4ff67abec.png
image.png
证书

依次创建四个证书,四个证书都需要之前创建的签名文件,把签名文件上传即可。其中有两个推送证书,创建推送证书的时候需要用到App IDs 注意Bundle ID 不要选择错了。


9007339-1fa59dedd0b2bce7.png
image.png

创建完四个证书后此时你会看到四个证书,然后双击证书将四个证书都添加到钥匙串访问中。如果双击的时候跳出什么窗口,没有将证书添加进去,就直接将证书拖到钥匙访问串中。


9007339-e438b2e3511204d1.png
image.png
添加测试设备
9007339-f554f3d30b5aa3e2.png
image.png

添加完成后 这台设备就可以测试了


9007339-2b600df63c5cf604.png
image.png

如果不知道怎么获取UDID可以将手机接入电脑ituns就会跳出来,点击小手机的图标就会手机详情,点击序列号就会出现UDID。

创建授权配置文件

创建好了证书此时还不能放到项目中,要创建授权文件


9007339-ef165d836df7656c.png
image.png

9007339-3105f73dc5f9d724.png
image.png

选择关联的APP IDs


9007339-19e4ac9d454da98d.png
image.png

选择关联的证书
9007339-682c6ee4d78d9a62.png
image.png

选择调试的设备 可以全选
9007339-c7ea2207e62f2b9e.png
image.png

给授权文件命名,只有授权文件才能添加到项目中


9007339-35e9caedc12aa1e0.png
image.png

到这里证书和配置文件就全部弄好了。接下来就是将证书放入到项目中。
9007339-936f409c1a1c40aa.png
image.png

2.打包项目

打包项目的时候不要选择真机或者模拟器,不然Archive会显示灰色 无法打包。

9007339-44e45efa1e790ebf.png
image.png

9007339-f3a70e037ead888a.png
image.png

登录到开发者账号 选择我的APP
9007339-3a9d99ff7fd765de.png
image.png

9007339-34e952655e96c900.png
image.png

9007339-f4934dc3a57f7c26.png
image.png

9007339-42c23bd93189c1a3.png
image.png

9007339-ce0fb239440052cf.png
image.png

APP信息具体情况具体填写
9007339-a536894e88260de7.png
image.png

9007339-e90bd0e116d955fb.png
image.png

9007339-eb421a70b511ac06.png
image.png

9007339-da8d41cb5eb39192.png
image.png

9007339-9fd16d3200f6b02a.png
image.png

9007339-44ebff09d44a72f0.png
image.png

成功以后就能选择构建版本发布了
9007339-0bf267c3a5bd4ed0.png
image.png

9007339-57a5362d217a219b.png
image.png

9007339-dd11a9f71fde3a04.png
image.png

大功告成!因为之前上线今天才想起来想写的所以借用了一点图(侵删)。
参考网址(证书):http://www.jianshu.com/p/01224fc523d4
参考网址(上架):http://www.jianshu.com/p/b1b77d804254

2018-03-03 10:31:00 weixin_33724046 阅读数 55

前言

  相信做iOS开发的基本都接入过支付宝、微信之类的一些第三方用于支付、分享等功能。最开始使用的时候,一知半解需要在app的URL Schemes中添加标记:


1863756-4e2224cbf7c5e83b.jpg
配置URL Schemes.jpg

  当时不明白这么做的原理。只知道这样配置之后在支付宝、微信完成相应操作后就可以回调打开我们自己的App。

URL Schemes介绍

很显然关键在于URL Schemes,那么它到底是什么呢?有什么用呢?以及怎么用?

URL Shemes是什么

  大家知道,苹果的app都是有沙盒机制的,相互之间无法访问数据。那么怎么实现app跳转呢?于是苹果给出了app间跳转的方法:URL Schemes。简单的说,URL Schems就是一个可以让app之间可以跳转的协议。每个app的URL Schemes 是不一样的,如果存在一样的URL Schemes,那么系统只会响应先安装的app的URL Schemes。

URL Schemes的作用

既然URL Schemes是一个跳转协议,那么像我们平时用到的第三方的支付、分享之类的东西都要用到,以及我们自己做的app想给手机上的其它app产品提供某些方面的服务时都能用到。

URL Schemes的用途

相信大家对下面几行代码都不会陌生

    1.打开Mail
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://info@icloud.com"]]
    2.打开电话
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18688886666"]];
    3.打开SMS
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://18688886666"]];

这不是调用系统一些功能的时候的代码吗?没错,从本质上来说,不管是email、电话、短信,都只是iPhone手机内的一个个的应用。那么这就是苹果对URL Shemes的一次使用。当然双斜杠后边的东西相当于app间通信的时候传递的参数。
相信到这里,大家基本已经明白怎么去玩app跳转了。
其中需要注意的一点是在iOS 9之前只要在plist文件中配置一下你的跳转协议,别人就可以根据这个协议打开你的app了。如下图所示:

1863756-4abc919e95f113fd.jpg
跳转协议配置.jpg

但是在iOS 9之后,是无法从Safari启动app的。需要在如下位置注册URL Schemes


1863756-ebdd9ed62a529166.jpg
注册URL Schemes.jpg

这就是我们文章最开始看到的那个截图,我想到这里基本对于跳转的配置已经从根本上理解了。

app间传值的参数接收

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    NSLog(@"%@",url.absoluteString);
    return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation
{
    NSLog(@"%@",url.absoluteString);
    return YES;
}

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    NSLog(@"%@",url.absoluteString);
    return YES;
}

相信这几个方法,大家也不陌生,当然app被另外的应用调用时,所配置的协议就是在此处被接收的。
查看苹果api会发现前两个方法在iOS 9之后就不推荐使用了,如果为了兼容不同的版本需要在前两个方法中做处理。但是iOS 9之后推荐使用最后一个方法。其中方法中传入的url即为包含着参数的自定义请求协议,协议头就是我们前边配置图中的那个。当你拿到事先约定好的参数,就可以按着要求去做任何你想做的操作了。

网页调用app的事例

附上在网页上的代码

<!DOCTYPE html>  
<html>  
<head>  
    <title>IOS 通过浏览器打开App</title>  
    <meta charset="utf-8">  
    <style type="text/css">  
        .back{  
            position:absolute; top:50px;left:360px;float:left;  
  
        }  
    </style>  
</head>  
<body>  
    <div class="back">  
    <p>  
        <font size="20px">  
        白日依山尽<br>  
        黄河入海流<br>  
        <a href="nnbApp://123456" >打开APP</a><br>  
        生活多回味<br>  
        </font>  
    </p>  
    </div>  
</body>  
</html>  

代码中关键的一步是<a href="nnbApp://123456" >打开APP</a>
其中的url的协议头就是我们提前注册的那个。这样当我们我们在点击时如果手机中安装了app,就可以调起app了。

写在最后的话

  现在回首发现其实好多知识点都是接触过的,但是没有穿起来。现在通过对URL Schemes的了解,彻底搞懂了这块东西,以后也能玩出更多的花样。
参考文章
认识URL Schemes
iOS中[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@""]]的使用
IOS 如何通过浏览器打开App

2018-01-20 15:05:00 weixin_34060299 阅读数 73

这篇文章,我不说最基本的怎么看crash的栈,怎么定位crash的thread,希望看这篇文章的童鞋都有这个基础。这篇文章我主要想记录一下,上传到Fabric或Bugly或者从手机里拷贝出来的crash log,只有地址,没有项目函数该怎么看。如下图:

1918076-b2f05eb4c19743ac.png
image.png
1918076-30babb0e1a39584d.png
image.png

看到这样的crash log,是不是一脸懵逼,只能猜出大概就是FMDB里出问题了,但是具体哪里出问题,出了啥问题,都不知道,没定位。

之所以出现这样的问题是因为没有符号化,符号化就是将系统的内存地址与项目的函数名、文件名、行号进行映射,快速并准确地定位用户APP发生Crash的代码位置,简单的说就是对APP发生Crash的程序堆栈进行解析和还原。一般在哪台机器打包的,就去哪台机器看crash log,Xcode会自动帮你解析,如果想了解更多,请参考文章 分析iOS Crash文件:符号化iOS Crash文件的3种方法
符号化需要三个文件:

  1. crash报告(.crash文件)
  2. 符号文件 (.dsymb文件)
  3. 应用程序文件 (appName.app文件,把IPA文件后缀改为zip,然后解压,Payload目录下的appName.app文件), 这里的appName是你的应用程序的名称。

项目集成第三方上传crash log(如Fabric /Bugly/友盟),一般都会要求你上传对应的符号化文件,它会自动帮你符号化crash log。

定位.dsymb文件

  • 方式一
    通过打包方式获取,
    Xcode -> Window -> Organizer -> Show xcarchive file in Finder -> Right Click Your xcarchive file -> Select "Show Package Contents"
    附上详细动画教程
    1918076-189ec2b875d40f44.gif
    定位dsymb文件.gif

如果进去还是没有.dsymb文件,请进入Project Build Settings -> Generate Debug Symbols 确保它的值是Yes

1918076-84326265f06097b7.png
image.png

  • 方式二
    如果不想通过打包方式拿到.dsymb文件,则直接定位Build后的.app文件,在该目录下面可以找到.dsymb文件,


    1918076-f3044cb81b49a015.png
    image.png

    1918076-f75d31072f490b83.png
    image.png

如果没有,请进入Project Build Settings > Build Options > Debug Information Format 确保它的值是DWARF with dSYM file,这样你在Products目录下,定位.app文件的目录下就有.dsymb文件了。

得到.dsymb文件就可以进行符号化了,不管是instrument还是第三方的,都可以使用。

但是有点特别需要说明,如果你的IPA包是支持bitcode的,那即便你上传了符号化文件,也是解析不了的,只会显示__hidden(排除上架了App Store,从iTunes下载.dsymb),如何解决?
用dsymutil命令:
在.dSYMs文件夹同目录下找到BCSymbolMaps文件夹(file.xcarchive/BCSymbolMaps)再用下面命令,就可以啦。

dsymutil --symbol-map PATH_TO_BCSYMBOLMAPS_DIR downloaded.dSYM

有多个的话,循环:

for d in dSYMs/*
   dsymutil --symbol-map path/to/file.xcarchive/BCSymbolMaps $d
end

参考文章:
分析iOS Crash文件:符号化iOS Crash文件的3种方法
crash log调用栈看不到的解决方案(debug symbols不起作用)
Bugly iOS 符号表配置
Xcode - There are no dSYMs available for download
Swift bitcode Crashlytics __hidden

2018-09-10 11:19:34 u011146511 阅读数 1483

方法一:Universal Links唤醒app参考https://www.jianshu.com/p/77b530f0c67b

方法二:直接在info中URLScheme添加协议名:比如qianjin(之前加了qianjin://跳不起来,把://去掉了就可以,这个可能h5那边加了://重复了)

 

H5中的代码:

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	<input  id="btn" type="button" value="唤起">
	<script>
		var btn = document.getElementById('btn');
		
		btn.onclick = function () {
			jump('lottrty://state:8080/gou_ti');
		};
		
		function  GetMobelType()  {                
			var  browser  =   {                    
				versions:   function()  {                        
					var  u  =  window.navigator.userAgent;    
					console.log(u);  //Safari浏览器 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Safari/605.1.15                  
					return  {                            
						trident:  u.indexOf('Trident')  >  -1, //IE内核
						presto:  u.indexOf('Presto')  >  -1, //opera内核
						Alipay:  u.indexOf('Alipay')  >  -1, //支付宝
						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  ||  u.indexOf('Linux')  >  -1, //android终端或者uc浏览器
						iPhone:  u.indexOf('iPhone')  >  -1  ||  u.indexOf('Mac')  >  -1, //是否为iPhone或者安卓QQ浏览器
						//iPhone: u.match(/iphone|ipod|ipad/),//
						iPad:  u.indexOf('iPad')  >  -1, //是否为iPad
						webApp:  u.indexOf('Safari')  ==  -1, //是否为web应用程序,没有头部与底部
						weixin:  u.indexOf('MicroMessenger')  >  -1, //是否为微信浏览器
						qq: u.match(/\sQQ/i) !== null, //是否QQ
						Safari:  u.indexOf('Safari')  >  -1,
						  ///Safari浏览器,
					};                    
				}()                
			};                
			return  browser.versions;            
		}
		
		
		function jump(myurl) { 
			var timeout = 2300, timer = null;
			if(GetMobelType().weixin) {
				// 微信浏览器不支持跳转
				// 可以显示提示在其他浏览器打开
			} else {
				var startTime = Date.now();
				if(GetMobelType().android) {
					var ifr = document.createElement('iframe');
					ifr.src = myurl;//这里是唤起App的协议,有Android可爱的同事提供
					ifr.style.display = 'none';
					document.body.appendChild(ifr);
					timer = setTimeout(function() {
						var endTime = Date.now();
						if(!startTime || endTime - startTime < timeout + 300) {
							document.body.removeChild(ifr);
							// window.open("唤起失败跳转的链接");
						}
					}, timeout);
				}
				if(GetMobelType().ios || GetMobelType().iPhone || GetMobelType().iPad) {
					if(GetMobelType.qq) { // ios的苹果浏览器
						// 提示在浏览器打开的蒙板
					} else {
						/*var ifr = document.createElement("iframe");
						ifr.src = myurl;
						ifr.style.display = "none";*/ // iOS9+不支持iframe唤起app
						window.location.href = myurl; //唤起协议,由iOS小哥哥提供
						//document.body.appendChild(ifr);
						
						timer = setTimeout(function() {
							// window.location.href = "ios下载的链接";
						}, timeout);
					};
				}
			}
		}
	</script>
</body>
</html>

 

没有更多推荐了,返回首页