• 产生随机数的几个函数:rand()、srand()、random()、...1、使用26个英文字母随机产生10位的字符串  int NUMBER_OF_CHARS =10;  char data[NUMBER_OF_CHARS];  for (intx=0;xchar)('A' +(arc4random_uniform(26))));
    产生随机数的几个函数:rand()srand()random()arc4random()
    1、使用26个英文字母随机产生10位的字符串

           int NUMBER_OF_CHARS =10;

          char data[NUMBER_OF_CHARS];

          for (intx=0;xchar)('A' +(arc4random_uniform(26))));

           NSString *dataPoint =[[NSString alloc]initWithBytes:data length:NUMBER_OF_CHARSencoding:NSUTF8StringEncoding];

    2、产生随机数字

     

    (1)、 获取一个随机整数范围在:[0,100)包括0,不包括100

               int x =arc4random() % 100;

    (2)、  获取一个随机数范围在:[500,1000),包括500,不包括1000

               int y =(arc4random() % 501) + 500;

    (3)、  获取一个随机整数,范围在[from,to),包括from,不包括to

             -(int)getRandomNumber:(int)from to:(int)to

             {

                return (int)(from + (arc4random() % (to – from +1)));

              }

    (4)、Getrandom value between 0 and 99

    <span style="color:#a61390;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">             int</span> x <span style="color:#0220;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">=</span> arc4random<span style="color:#0220;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">(</span><span style="color:#0220;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">)</span> <span style="color:#0220;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">%</span> <span style="color:#240d9;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">100</span>;
     <wbr>
    <em>      Get random number between 500 and 1000</em>
    </wbr>
    <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 15px;"><span style="font-family:monospace;color:#110000;">      </span></span><span style="color:#a61390;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">int</span><span style="color:#110000;"><span style="line-height: 1.333;"> y </span></span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">=</span><span style="color:#110000;"><span style="line-height: 1.333;">  </span></span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">(</span><span style="color:#110000;"><span style="line-height: 1.333;">arc4random</span></span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">(</span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">)</span><span style="color:#110000;"><span style="line-height: 1.333;"> </span></span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">%</span><span style="color:#110000;"><span style="line-height: 1.333;"> </span></span><span style="color:#240d9;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">501</span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">)</span><span style="color:#110000;"><span style="line-height: 1.333;"> </span></span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">+</span><span style="color:#110000;"><span style="line-height: 1.333;"> </span></span><span style="color:#240d9;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">500</span><span style="color:#0220;line-height: 1.333; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;">)</span><span style="color:#110000;"><span style="line-height: 1.333;">;</span></span>
    
    (5)、随机产生浮点数
    
          如果是一位小数:<span style="line-height: 1.333;">(float)(rand() + 10)/10.0f</span>
    
          如果是两位小数:<span style="line-height: 1.333;">(float)(rand() + 10)/100.0f</span>
    
    <span style="font-size:12px;color:#1100;white-space: pre; line-height: 1.333;">           </span><span style="color:#110000;"><span style="font-size:12px;line-height: 15px; white-space: pre;">rand() 是算出0-9的数,+10后就是 10_19的数,除10后就是1.0-1.9之间的数了</span></span>
    
    <span style="font-family:monospace;"><span style="line-height: 15px;">
    </span></span>
    
    <img src="https://img-blog.csdn.net/20160128163511367?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
    
    
    
    
    展开全文
  • 作为一个刚入门ios开发的人来说,对于ios开发,对于xcode一切都是那么的陌生,那么我们如何开始我们的第一步呢?首先对开发的ide是必须要了解的,其实要对开发的语言要慢慢熟悉起来,今天我们先来熟悉下ios的开发ide...

    作为一个刚入门ios开发的人来说,对于ios开发,对于xcode一切都是那么的陌生,那么我们如何开始我们的第一步呢?首先对开发的ide是必须要了解的,其实要对开发的语言要慢慢熟悉起来,今天我们先来熟悉下ios的开发ide--xcode。

    第一步 打开 Xcode ,点击红色框的部分,创建一个新工程。你也可以点击菜单里里的 File -> New -> Project,效果是一样的。

     

    第二步 选择 1 iOS下的 Application,然后选择 2 Single View Application,然后点击 Next。

     

    第三步 这里我们讲一下每个部分都是什么意思。

    Product Name 这里填入你的 App 的名字,建议使用英文字母,最好不要有空格和特殊字符。

    Organization Name 这里填入你的组织/公司的名字,比如 Google 公司就直接填 Google,当然你也可以随便填一个。

    Organization Identifier 这里是你的组织/公司的唯一标识,这部分和 Product Name 会混合成你的产品的唯一标识,这个标识在整个 iOS 的 App Store是唯一的,所以一般建议用你的域名的反向形式,比如 Google 公司的主域名是 google.com, 那么在这里就反过来填 com.google,如果你没有域名也可以编一个,比如我这里填的就是自己的名字,这一般也能保证不重复。

    Language 注意,我们这里选了 Swift,默认是 Objective-C。

    Device 我们选择只针对 iPhone 的,另外还有选项是 iPad 和 Universal(iPhone 和 iPad 都兼容)。

    Use Core Data, Include Unit Tests, Include UI Tests 我们暂时用不到,全都不选中。

    填完之后,点击 Next,我们进入下一步

     

     

    第四步 选择你的保存路径后,一个工程就建立成功了。默认会选中 Main.storyboard 这个文件,storyboard 主要是用于写 iOS 的 UI 布局的,红色框起的部分是 Xcode 的编辑器部分,我们可以在左边的文件列表里选择文件,如果选中 swift 后缀的文件,会进入大家都很熟悉的代码编辑界面。由于我们现在选中的是 storyboard,所以进入了一个可视化的编辑界面。这是个所见即所得的编辑器,最后在手机屏幕上的 UI 基本就是这个编辑器里的样子。

    大家的这个界面可能比截图里的大,这里分别点击 1 2,然后在 3 所在的下拉框里选择 iPhone 4.7-inch,这个部分主要是改变设计期间的外观的,不影响实际运行的结果,最终的大小取决于你所运行的设备屏幕大小。

     

     

    第五步 这次我们添加一个 button 到屏幕中去,首先选中 1 这里是所有 UI 组件的列表,然后再 2 的位置输入 button,在列表中找到 3 Button 这个条目,然后用鼠标左键点中把这个条目拖到屏幕中去。注意屏幕中的 Button 边缘,这八个点可以拖动来缩放 Button,基本上所有的 UI 组件都可以这样操作。

    添加完后,我们注意一下 4 的位置,这里多了一个 Button 条目,这个 Button 就是我们刚才拖进去的那个 Button,可以看到它是作为 View 的一个子项,这里简单讲下,View 是 iOS 里最基本的 UI 组件,所有像 Button,Label 这些最终都是继承自 View,而每一张页面,一般都有一个最顶层的屏幕大小的 View,我们添加的所有 UI 组件最终都会作为它的子项。

     

     

    第六步 按图中顺序分别点击 1 2,在 3 的输入框中把内容修改为 Greeting (或者任何你喜欢的文字),敲回车确定。这时候 Button 的内容就变成了你输入的部分。红色框的部分就是用于修改选中的 UI 组件的各种属性的,大家有兴趣可以修改下 Text Color 看看效果。

     

     

    第七步 这一步我们要把 storyboard 中的设计界面与实际的代码关联起来了,首先我们看一下红框的位置,最顶层的 View Controller Scene,这个表示的是一个 iOS 页面的所有组成部分,里边一般都有一个顶层元素 View Controller,这个 View Controller 可以理解为它所包含的那个定层 View 的控制部分,而这个 View Controller 正好和我们的 ViewController.swift 中的 ViewController 类是相关联的。

    接下来我们进入编辑器的辅助模式,点击图中 1 的图标,然后选中红框中的 View Controller,这时候右侧应该会打开 ViewController.swift,如果没有打开,选中 2,在 Automatic 下找到 ViewController.swift。

     

     

    第八步 我们为点击页面中的 Button 添加一个响应事件,右键点击 1 所示的 Button 所在的位置,再弹出来的菜单里鼠标左键按下选中 Touch Up Inside 后边的小圆圈,然后拖动到 3 的位置(注意这个位置要在最后一个大括号前边,也就是类的作用域里),松开鼠标。

    解释一下,这个右键弹出的菜单,里边 Touch 开头的就是指这个 UI 组件被用户进行对应操作将会响应的事件,这个事件可以和我们的代码关联起来。

     

     

    第九步 继续前边,松开鼠标会弹出如图所示的对话框,在 1 的位置输入你喜欢的名字,这个将会作为事件响应的函数名,在这里我们用 showAlert,之后点击 2 Connect,就会在 ViewController 类里生成一个叫 showAlert 的类方法。

     

     

    第十步 回到标准编辑器界面(点击 1),选择 ViewController.swift(点击 2),在 showAlert 中添加如下代码。

    let alert = UIAlertController(title: "Greeting", message: "Hello World", preferredStyle: .Alert)

    let action = UIAlertAction(title: "Ok", style: .Default, handler: nil)

    alert.addAction(action)

    presentViewController(alert, animated: true, completion: nil) 

    第一行,我们创建了一个 UIAlertController 的对象,UIAlertController 就是一个类似对话框的东西

    第二行,第三行,创建了一个 UIAlertAction 的对象,并把这个对添加到了刚才创建的 UIAlertController,UIAlertAction 表示了对话框上一个个按钮

    最后,我们调用 presentViewController 把这个对话框显示出来。

    添加完代码后,我们把 3 的地方换成 iPhone 6s 模拟器,然后点击 4 运行。

       

     

    第十一步 如果一切正确的话,Xcode 会启动一个 iPhone 的模拟器,然后显示如左图,点击 Greeting 会变为右图。至此,我们就完成了一个最简单的 Hello World 的 App。

    接下来,我们把这个 Hello World App 改造成一个简单的猜数字的游戏,每局游戏开始会随机生成一个 0-99 的数字,然后你输入一个你猜测的数字,系统会提示你猜大了还是猜小了,最后猜中,会显示出你一共猜了多少次才猜中的。

     

     

    第十二步 我们选中 Main.storyboard,在页面中添加一个新的 Button,并把它的内容改为 开始新的一局 ,然后在 1 的位置输入 Text,在 2 的位置找到 Text Field,然后把它拖到 3 的位置。Text Field 是一个负责接收用户输入的 UI 组件。同时我们把 Greeting 的内容修改为 提交 ,让这个 Button 用来提交我们的答案。

     

     

    第十三步 和之前生成 Button 的点击事件一样的步骤,为 开始新的一局 这个 Button 添加点击事件的响应函数,选择 1 进入编辑器的辅助模式,右键点击 2,拖动 3 到 4 的位置。

           

           

    第十四步 和之前类似,在弹出的对话框中输入 startNewGame,这样会 ViewController 类中生成一个叫 startNewGame 的方法。

     

     

    第十五步 这一次我们为 Text Fileld 在 ViewController 生成一个对应的成员变量。这次的做法和之前的添加 Button 的响应事件有点不同,选中 1 的 Text Field,然后按住 Ctrl 键不放,同时鼠标左键按住拖动到 2 的位置,松开鼠标和键盘,注意,和之前一样,要拖动到类的作用域里,不要不小心拖到方法的作用域中去。


       

    第十六步 在弹出的对话框中 1 的输入框中填入成员变量的名字,这里我们给它取名 guessNumTextField。

    然后大家就可以回到标准编辑器的界面了。后边都是敲代码的部分了 。

    var number = Int(arc4random_uniform(100))

    var times = 0 

       

    第十七步 接下来我们再刚才生成的 guessNumTextField 下边再添加两个成员变量 number(这个变量的目的是保存每一局生成的数字),times(这个变量保存已经猜过的次数)。

    简单解释一下 var times = 0,由于我们给 times 赋值 0,Swift 的自动类型推导功能会自动推导出 times 的类型为 Int,所以我们不需要给 times 标注类型了。

    然后在这里我们声明变量用了 var,而不是之前的 let,两者的区别在于可变性,使用 var 声明的变量,以后还可以再给它赋值,而使用 let 声明的变量只能赋值一次。

    最后我们给 number 赋值里的 arc4random_uniform(100) 是用于生成一个随机数,参数 100 的意思是在 0-99 中生成一个。

         

    第十八步 我们在 starNewGame 方法中把 times 初始化为 0,同时生成一个新的待猜数字。

    times = 0

    number = Int(arc4random_uniform(100)) 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    et resultText = guessNumTextField.text!
        
          if let result = Int(resultText) {
            
              times += 1
            
              var message = ""
            
              if result > number {
                  message = "你输入的数字(result)太大了"
              else if result < number {
                  message = "你输入的数字(result)太小了"
              else {
                  message = "猜中了,结果就是(result),你一共猜了(times)次"
              }
            
              let alert = UIAlertController(title: nil, message: message, preferredStyle: .Alert)
              let action = UIAlertAction(title: "确定", style: .Default, handler: nil)
              alert.addAction(action)
              presentViewController(alert, animated: true, completion: nil)
            
          else {
              let alert = UIAlertController(title: nil, message: "请输入0-99中的任意一个数字", preferredStyle: .Alert)
              let action = UIAlertAction(title: "确定", style: .Default, handler: nil)
              alert.addAction(action)
              presentViewController(alert, animated: true, completion: nil)
          }

    第十九步 这是我们最长的一段代码,这里包含了猜数字游戏的所有逻辑代码。接下来我们分别解释一下

    1 的部分是从输入框中取出用户输入的内容,返回结果为 String 类型

    2 是 Swift 里一种独特的用法,在 if 中直接声明变量,Int(resultText) 复杂将 String 类型转换为 Int,如果转换失败的话,result 就会为空,此时 if 分支就会失败,转入 else 分支

    3 我们先看一下 else 分支,如果用户输入非数字类型,或者根本没有输入内容,我们就弹出对话框,提示出错

    4 将猜测次数加一

    5 根据猜测结果生成对话框中要显示的内容,分别提示用户猜小了,猜大了,或者是猜中了。注意特殊语法 (result) ,Swift 在字符串中可以插入任何变量或者表达式,只要把他们放在 (),程序就会对他们自动求值,然后转换成对应的字符串进行替换。

    6 将刚才生成的内容在对话框中显示出来

             

     

    第二十步 好了,我们的小游戏到此就开发完毕了,点击运行,应该会得到这个结果。


    展开全文
  • iOS远程推送原理及实现过程  孟瑞瑞 发布于2016-05-11 922 移动 iOS 版权声明:此文章如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com 推送通知,是现在的应用必不可少的功能。那么...

    iOS远程推送原理及实现过程

     孟瑞瑞 发布于2016-05-11 922 移动 iOS

    版权声明:此文章如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com

    推送通知,是现在的应用必不可少的功能。那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题。那么首先让我们准备一些做推送需要的东西。我们需要一个付费的苹果开发者账号(免费的不可以做远程推送),有了开发者账号,我们可以去苹果开发者网站,配置自己所需要的推送的相关证书。然后下载证书,供我们后面使用,详细的证书配置过程,我们下面再说。

    首先我们要说说iOS推送通知的基本原理:

    苹果的推送服务通知是由自己专门的推送服务器APNs (Apple Push Notification service)来完成的,其过程是 APNs 接收到我们自己的应用服务器发出的被推送的消息,将这条消息推送到指定的 iOS 的设备上,然后再由 iOS设备通知到我们的应用程序,我们将会以通知或者声音的形式收到推送回来的消息。 iOS 远程推送的前提是,装有我们应用程序的 iOS 设备,需要向 APNs 服务器注册,注册成功后,APNs 服务器将会给我们返回一个 devicetoken,我们获取到这个 token 后会将这个 token 发送给我们自己的应用服务器。当我们需要推送消息时,我们的应用服务器将消息按照指定的格式进行打包,然后结合 iOS 设备的 devicetoken 一起发给 APNs 服务器。我们的应用会和 APNs 服务器维持一个基于 TCP 的长连接,APNs 服务器将新消息推送到iOS 设备上,然后在设备屏幕上显示出推送的消息。

    设备注册APNs的流程图:

    1.2222.png

    上图完成了如下步骤:

    1.Device(设备)连接APNs服务器并携带设备序列号(UUID)

    2.连接成功,APNs经过打包和处理产生devicetoken并返回给注册的Device(设备)

    3.Device(设备)携带获取的devicetoken发送到我们自己的应用服务器

    4.完成需要被推送的Device(设备)在APNs服务器和我们自己的应用服务器的注册

    推送过程图:

    1.333.png

    推送的过程经过如下步骤:

    1.首先,我们的设备安装了具有推送功能的应用(应用程序要用代码注册消息推动),我们的 iOS设备在有网络的情况下会连接APNs推送服务器,连接过程中,APNS 服务器会验证devicetoken,连接成功后维持一个基于TCP 的长连接;

    2.Provider(我们自己的应用服务器)收到需要被推送的消息并结合被推送的 iOS设备的devicetoken一起打包发送给APNS服务器;

    3.APNS服务器将推送信息推送给指定devicetoken的iOS设备;

    4.iOS设备收到推送消息后通知我们的应用程序并显示和提示用户(声音、弹出框)

    比较直观的流程图:

    1.33.png

    信息包结构图:

    1.2323.png

    上图显示的这个消息体就是我们的应用服务器(Provider)发送给APNs服务器的消息结构,APNs验证这个结构正确并提取其中的信息后,再将消息推送到指定的iOS设备。这个结构体包括五个部分,第一个部分是命令标示符,第二个部分是我们的devicetoken的长度,第三部分是我们的devicetoken字符串,第四部分是推送消 息体(Payload)的长度,最后一部分也就是真正的消息内容了,里面包含了推送消息的基本信息,比如消息内容,应用Icon右上角显示多少数字以及推送消息到达时所播放的声音等

    Payload(消息体)的结构:

    {
         “aps”:{
         “alert”:“听云给您发送了新消息”,
         “badge”:1,
         “sound”:“default”
         },
    }

    这其实就是个JSON结构体,alert标签的内容就是会显示在用户手机上的推送信息,badge显示的数量(注意是整型)是会在应用Icon右上角显示的数量,提示有多少条未读消息等,sound就是当推送信息送达是手机播放的声音,传defalut就标明使用系统默认声音。

    下面就是我们推送通知所需要的证书的推送过程:

    1.首先我们要新建一个Certificate Signing Request(也就是CSR)的请求文件

    在应用程序里的使用工具中找到钥匙串访问,选择从证书颁发机构请求证书

    1.45.png

    1.44.png

    注意:邮箱地址,填自己的开发者账号,常用名,随便填一个记住就行。然后选择存储到磁盘。继续就行。

    1.55.png

    保存位置在 tingyun(指定自己的文件夹,这里我选择的是我的文件夹),点击存储

    然后点击完成后我们会在 tingyun 里看到一个CertificateSigningRequest.certSigningRequest的请求文件,也就是我们说的CSR文件。在我们生成CSR文件的同时,会在钥匙串访问中生成一对秘钥,名称为刚才我们填写的常用名

    2.配置AppID

    到苹果开发者网站https://developer.apple.com

    点击Account 

    1.56.png

    选择 Certificates,identifiers&Profiles 

    1.78.png

    选择 Identifiers ->App IDs 点击上方的+号创建一个 App ID.

    1.888.png

    Name: 填写 App 的名字就行

    App ID Suffix 选择不用通配符的及 Explicit App ID

    Bundle ID:填写自己应用的 Bundle ID 一定要和自己应用的一致.

    1.555.png

    在下面的 App Services 中选择自己需要的服务

    我们需要推送服务,所以在Push Notifications上打勾

    然后点击continue

    1.666.png

    3.创建证书

    证书需要创建两种,一种是开发的、一种是发布的,开发的是做测试用的。

    选择Development 点击右上角的+号,创建证书,我们首先创建开发证书

    1.99.png

    选择Apple Push Notification service SSL (Sandbox),创建推送服务证书点击下一步

    1.00.png

    这儿的 App ID 选择我们刚才创建的 App ID

    然后点击下一步,下一步

    0.09.png

    这儿点击 Choose File,选择我们刚才创建的 CSR 文件.

    然后点击生成(Generate)

    最后点击下载,下载证书。将下载的证书,放到指定位置。

    0.08.png 

    发布证书的创建和开发证书一样,选择Production->Apple Push Notification service SSL (Production)后面和开发证书一样

    0.07.png

    0.9888.png

    4.添加 Devices:

    首先选中你要添加哪种设备,然后在左上角点击“+”号。

    0.006.png 

    Name 填写一个设备名字。

    UDID 填写自己需要加入测试的设备的 UDID。

    然后点击下一步

    0.005.png

    然后点击 Register 即可

    0.001.png 

    点击Done。

    0.002.png 

    000.png

    5.查找设备的 UDID:

    用自己的 iOS 设备连接到电脑上,打开 iTunes。

    在设备摘要处可以看见一个序列号,点击序列号就会变成 UDID。

    0091.png 

    6.生成配置文件

    配置文件也有两种,一种是开发的,一种是发布的,开发的使我们做测试需要的,发布的是我们在 Appstore 上发布时需要的,我们都需要生成。

    我们先生成开发配置文件,选择Provisioning Profiles->Development点击右上角的+号。

    0092.png 

    选择iOS App Development 点击下一步

    0093.png

    这儿的 App ID 仍然选择我们刚才创建的 App ID

    0094.png

    0095.png 

    这儿选择我们开发者的证书,如果不知道是哪个选择全部即可

    0096.png 

    这儿选择我们的测试设备,如果没有则在前面的Devices里面添加即可

    0097.png 

    0098.png

    随便取个名字即可,然后下载下来

    1123.png 

    发布配置文件和开发配置文件一样创建,选择Distribution->Ad Hoc即可,后面与发布配置文件一样。

    1125.png 

    1126.png 

    11250.png

    证书配置完成,打开我们创建的应用项目

    打开AppDelegate.m 文件,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中添加下面代码,注册消息推送

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
            /** 消息推送注册 */
        if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
            
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
            [application registerUserNotificationSettings:settings];
            [application registerForRemoteNotifications];
        }else {
            [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
        }
        
        return YES;
    }
    下面方法是返回 ANPs 苹果推送服务器生成的唯一标识
    /** 接收服务器传回的设备唯一标识 token */
    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
        
        // 第一次运行获取到DeviceToken时间会比较长!
        // 将deviceToken转换成字符串,以便后续使用
        NSString *token = [deviceToken description];
        NSLog(@"description %@", token);
    }
    
    下面方法是当有消息推送回来时,接收推送消息	
    /** 设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息 */
    
    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    
        NSLog(@"userInfo == %@",userInfo);
    }
    
    上面方法是当注册推送服务失败时,接收错误信息
    /** 注册推送服务失败 */
    -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
        NSLog(@"注册失败 %@",error);
    }

    服务器端(Java服务器)

    服务器端我们需要,一个后缀为. p12的证书,以及需要的 jar 包

    服务器端的证书生成方式:

    打开我们前面下载的证书,在钥匙串中找到它

    0.98888.png 

    点击鼠标右键选择导出

    0.998.png 

    导出后缀为.p12的文件保存到自己的电脑上,需要输入一个密码,在 Java 服务器端要用到

    0.9889.png 

    Java服务器端需要的 Jar 包

    0.87.png

    Java 服务器端代码:

    import javapns.back.PushNotificationManager;
    import javapns.back.SSLConnectionHelper;
    import javapns.data.Device;
    import javapns.data.PayLoad;
    public class pushService {
    	public static void main(String[] args) {
    		   
    		   
    		  try {
    		           String deviceToken = "eab6df47eb4f81e0aaa93bb208cffd7dc3884fd346ea0743fcf93288018cfcb6";
    		           //被推送的iphone应用程序标示符      
    		           PayLoad payLoad = new PayLoad();
    		           payLoad.addAlert("测试我的push消息");
    		           payLoad.addBadge(1);
    		           payLoad.addSound("default");
    		                    
    		           PushNotificationManager pushManager = PushNotificationManager.getInstance();
    		           pushManager.addDevice("iphone", deviceToken);
    		           
    		           		           //测试推送服务器地址:gateway.sandbox.push.apple.com /2195 
    		      	   //产品推送服务器地址:gateway.push.apple.com / 2195 
    		           String host="gateway.sandbox.push.apple.com";  //测试用的苹果推送服务器
    		           int port = 2195;
    		           String certificatePath = "/Users/hsw/Desktop/PushTest/PushTest.p12"; //刚才在mac系统下导出的证书
    		           
    		           String certificatePassword= "123456";
    		          
    		           pushManager.initializeConnection(host, port, certificatePath,certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
    		                     
    		           //Send Push
    		           Device client = pushManager.getDevice("iphone");
    		           pushManager.sendNotification(client, payLoad); //推送消息
    		           pushManager.stopConnection();
    		           pushManager.removeDevice("iphone");
    		          }
    		          catch (Exception e) {
    		           e.printStackTrace();
    		           System.out.println("push faild!");
    		            return;
    		          }
    		          System.out.println("push succeed!");
    		         }
    
    }

    想阅读更多技术文章,请访问听云技术博客,访问听云官方网站感受更多应用性能优化魔力。

    展开全文
  • 然后遍历数组,找到一个数字,把value更新为1,这样遍历完成后,就找到了那个被遗弃的数字了。 代码如下。 package go.derek; import java.util.*; public class FindNum { public int find(int[] arr){ Map map...

    利用hashmap,首先将100个数字存入map中,value初始为0;然后遍历数组,找到一个数字,把value更新为1,这样遍历完成后,就找到了那个被遗弃的数字了。

    代码如下。

    package go.derek;
    import java.util.*;
    public class FindNum {
    	public int find(int[] arr){
    		Map<Integer,Integer> map=new HashMap<>();
    		//初始化,将1-100都放到map里面,value初值为0
    		for(int i=1;i<=100;i++){
    			map.put(i, 0);
    		}
    		//遍历数组,找到一个数字,就更新对应的vaule为1
    		for(int i=0;i<arr.length;i++){
    			map.put(arr[i], 1);
    		}
    		//遍历map,如果发现value为0,则找到被遗弃数字了,返回
    		for(Map.Entry<Integer,Integer> m:map.entrySet()){
    			if(m.getValue()==0){
    				return m.getKey();
    			}
    		}
    		//找不到返回0
    		return 0;
    	}
    	//测试
    	public static void main(String[] args){
    		List<Integer> list=new ArrayList<>();
    		int[] arr=new int[99];
    		Random rd=new Random();
    		//随机生成长度99的数组,不包含重复数字
    		while(list.size()<99){
    			int a=rd.nextInt(100)+1;
    			if(!list.contains(a)){
    			list.add(a);
    			}
    		}
    		//将list中的值赋给数组
    		for(int i=0;i<99;i++){
    			arr[i]=list.get(i);
    		}
    		//将数组排序,以便观察检验
    		Arrays.sort(arr);
    		System.out.println(Arrays.toString(arr));
    		int x=new FindNum().find(arr);
    		//控制台打印出所求数字
    		System.out.println(x);
    	}
    }
    


    展开全文
  •  * 已知一个数组int[98],该数组里面存储了0~99共100个数字中的98个,数字不重复,请用算法算出0~99中缺少的2个数字是哪两个? 要求:数组自己用程序生成,数值介于0~99,相互之间不重复。  */ public class Test...

    黑马程序员---------数组和Random用法

       ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


    /**
     * 已知一个数组int[98],该数组里面存储了0~99共100个数字中的98个,数字不重复,请用算法算出0~99中缺少的2个数字是哪两个?
    要求:数组自己用程序生成,数值介于0~99,相互之间不重复。

     */

    import java.util.*;

    public class Test24 {


    public static void main(String[] args) {
    int[] num=in();//生成数组
    noNumber(num);//判断不同的数

    }



    public static int[] in()
    {
         int[] array = new int[98];//100
         Random r = new Random();
         array[0] = 0;
         for(int i =0;i<98;i++){
           array[i] = r.nextInt(100);//随机0到99一共100个数存入
           for(int j=0;j<i;j++){
              if(array[i] == array[j])//比较是否有相同的
              {
                 i--;
                 break;
              }
           }
         }
        
         return array;
    }
    public static void noNumber(int[] in)
    {
    ArrayList<Integer> list = new ArrayList<Integer>();

    for(int x=0;x<100;x++)
    {
    list.add(x);
    }
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    for(int x=0;x<98;x++)
    {
    list1.add(in[x]);
    }
    list.removeAll(list1);
    System.out.println("数组内数为:"+list1);
    System.out.println("缺少的数是:"+list);
    }
    }
    展开全文
  • 当我们把一款iOS应用开发完毕后,不是立即就上线App Store,这样的风险实在是太大,被苹果拒的可能性也很大。在上线前的一个重要步骤就是进行应用的分发与内测,大概的意思就是让组内的所有开发者或者公司中的其他...
  • IOS视图之UI基础

    2015-09-11 20:54:18
    IOS视图之基础整理 4.StoryBoard图形(可视化)界面开发方式  4.1 是什么  是将很多的xib文件集中一个文件中,这个文件就是storyBoard。  IOS5开始支持StoryBoard,xcode6以后强制使用StoryBoard。...
  • 数字炸弹-python实现

    2020-01-06 20:22:53
    比如范围是1~99, 炸弹是60,然后猜了一个数字是30,30不是炸弹,那么现在猜数字的范围就缩小30~100, 又猜了一个数字80,80也不是炸弹,那么现在又缩小范围30~80,每次猜不能猜边界上的值, 直到有人猜中这个...
  • 目前形势,参加到iOS队伍的人是越来越多,甚至已经供过于求了。今年,找过工作人可能会更深刻地体会今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡。矫情...
  • JUNOS、IOS、VRP对比

    2019-06-17 05:51:35
    1.*****************远程修改配置安全性********************JUNOS:commit confirmed命令可以允许设备配置文件在可以调整的时间内自动回退,避免远程维护中误操作IOS/VRP:无,远程维护中一...
  • 目前形势,参加到iOS队伍的人是越来越多,甚至已经供过于求了。今年,找过工作人可能会更深刻地体会今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡
  • Apple提供了各种API,以方便用户识别各种用途: 通用标识符(UDID) 在iOS的早期,苹果公司提供了一个...虽然这样的功能在今天看来是不可想象的,但该属性一直存在到IOS 5,直到它被废弃并被替换为identifie...
  • ios学习笔记--(基础题) //1、打印1 - 100中不能被7整除又不包含7的数 test1(); //2、输入两个数,求最大公约数和最小公倍数。(最大公约数,最大可以对两个整数约分的数字) test2(); ////3、随机产生20个...
  • iOS面试题

    2016-03-23 22:06:55
    目前形势,参加到iOS队伍的人是越来越多,甚至已经供过于求了。今年,找过工作人可能会更深刻地体会今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡。矫情...
  • iOS面试宝典

    2016-08-01 14:16:00
    iOS 面试常见问题最全梳理 2016-5-18 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经供过于求了。今年,找过工作人可能会更深刻地体会今年的就业形势不容乐观,加之,培训机构一火车地向用人...
  • 基于安全和宏观战略考虑,我国从 2010 年先后推出了 SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、ZUC(祖冲之密码算法)等密码算法,本文主要讨论 SM2 算法原理,iOS 端如何使用 SM2、SM4 加解密,及使用 SM3 生成 Hash ...
  • 与大家一起学习 ...最近公司的客户端安全性出现了严重的问题,如今这个出解决方案并自我测试验证可行性的重任落在了我的身上,学习了很多他人的文章,再经过多次讨论,最后才确定最终解决方案。...iOS
  • BAT机器学习面试1000题系列 整理:July、元超、立娜、德伟、贾茹、王剑、AntZ、孟莹等众人。本系列大部分题目来源于公开网络,取之分享,用之分享,且在撰写答案过程中若引用他人解析则必注明原作者及来源链接...
1 2 3 4 5 ... 20
收藏数 1,769
精华内容 707