iPhone App开发实战手册 PDF 英文高清版

  • 更新时间:
  • 8961人关注
  • 点击下载

给大家带来的一篇关于App开发相关的电子书资源,介绍了关于iPhone、App、App开发、App实战方面的内容,本书是由东南大学出版社出版,格式为PDF,资源大小159.42MB,霍肯贝瑞编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.1分

资源详情相关推荐
iPhone App开发实战手册
  • 出版社:东南大学出版社
  • 作者:霍肯贝瑞
  • 大小:159.42MB
  • 类别:App开发
  • 热度:666
  • HTML5 APP开发从入门到精通
  • 一个APP的诞生:从零开始设计你的手机应用
  • minapp API 文档
  • 大话移动APP测试 Android与iOS应用测试指南
  • 构建安全的Android APP
  • iPhone App开发实战手册(英文影印版)

    出版时间:2011年版

    任何具有编程经验的人都能学会编写iphone应用程序。但如果你想打造一个伟大的应用,就需要学习比简单编程更多的内容:还得学会如何设计和推销你的作品。这本易学易用的指南将带领你走完从勾画创意到推销产品的整个过程。 ·掌握开发iphone应用所需的工具 ·在开始编写代码之前设计一个伟大的应用 ·使用xcode和interface builder创建一个复杂的应用 ·决定如何命?你的应用——然后投放beta测试 ·了解如何让应用进入app store的独家内幕 ·推广你的产品、追踪销售动态,并建立强大的客户服务体系

    目录

    • The Missing Credits
    • Introduction
    • Part One: Getting Started with Cocoa Touch
    • Chapter 1: Building Your First iPhone App
    • Getting the Tools
    • Installing Xcode
    • Getting the iPhone SDK
    • What Lies Ahead for the SDK?
    • Exploring Your New Tools
    • Every Flashlight Needs a Parts List
    • Some Assembly Required
    • Taking It for a Run on Your Mac
    • Revision Decision
    • Chapter 2: The Power of Brackets
    • Objective-C: The Nuts and Bolts for Your iPhone App
    • The Land of Square Brackets
    • The Object of It All
    • Telling Your Objects to Do Things
    • Masses of Classes
    • Classes in Detail
    • The Methods Behind the Madness
    • Categorically Speaking
    • Implementation: The Brains Behind the Beauty
    • Creating New Classes
    • Managing Memory
    • Take a nil Pill
    • Autorelease with Ease
    • Properties and Dots
    • Methods of Class
    • Initializing Objects
    • Deallocation Location
    • Loops: For Better or For Worse
    • Your Exceptional Code
    • Learn by Crashing
    • Selector Projector
    • Show Your id
    • Where to Go from Here
    • Developer Documentation
    • Learn to Be Lazy
    • Chapter 3: Cocoa Touch: Putting Objective-C to Work
    • Get in Cocoa Touch
    • The Big Three: Models, Views, Controllers
    • Views
    • Models
    • Controllers
    • Value Objects
    • Let's Get Primitive
    • Objectified
    • Collections
    • Copying in Depth
    • Property Lists
    • Mutable Versus Immutable
    • Make It Mutable
    • Protect Your Data
    • Delegation and Data Sources
    • Targets and Actions
    • User Interface: The Hard Way
    • User Interface: The Easy Way
    • Notifications
    • Singletons
    • Singletons as Globals
    • Where to Go from Here
    • The Language of Design
    • Chapter 4: Design Tools: Building a Better Flashlight
    • Plan Before You Code
    • Why Call in a Designer?
    • Design Goals
    • What's Unique about iPhone Design?
    • The Design Process
    • Living in Harmony with Your Designer
    • Feedback: Don't Take Your Own Word for It
    • The Providers of Feedback
    • Rashlight 2.0
    • Bigger, Stronger, Faster
    • The Light Side
    • The Rip Side
    • The Drawing Board
    • Technical Design: Between Pictures and Code
    • Start Naming
    • Where to Go from Here
    • Ready to Code!
    • Part Two: Development in Depth
    • Chapter 5: 6erring Serious about Development
    • Beyond the Template
    • Pick Your SDK
    • Change Project Settings
    • Change Target Settings
    • Build Settings
    • Duplicity
    • Make It Official
    • Join the iPhone Developer Program
    • Open the Door
    • When It Fails
    • You're Now Mobile
    • Ready to Roll
    • Chapter 6: A Flashlight for Pros
    • A Guided Tour
    • Where to Start?
    • Open the Guide Book
    • Rashlight_ProAppDelegate
    • NIB Files: Something to Look At
    • MainWindow.xib
    • MainView.xib
    • View Sizing
    • Autoresizing
    • SettingsView.xib
    • AboutView.xib
    • Refine the Look
    • LightView
    • IFInfoView
    • Making Cocoa Touch Your Own
    • UlColor+Brightness
    • UIView+Brightness
    • UIView+Concealed
    • Fashion Your Models
    • SOSModel
    • FlashlightModel
    • Pull Yourself Together
    • MainViewController
    • SettingsViewController
    • AboutViewController
    • Localized Languages: Capisce?
    • Localizable.strings
    • AboutView.xib
    • Wrapping It Up
    • Part Three: The Business End
    • Chapter 7: Finishing Touches
    • Beta Testing
    • Your App Works for You...But
    • Ad Hoc & Roll
    • Clean Up Your Act
    • Beautification Committee
    • Speaking in Tongues
    • Web Development
    • The Site
    • App Store, Here You Come
    • Chapter 8: For Sale
    • Sign on the Dotted Line
    • Welcome
    • First Order of Business
    • Stake Your Claim
    • Export Compliance
    • Overview
    • Ratings
    • Upload-Show It Off
    • Pricing-Pick Your Price
    • Localization
    • Review
    • Tweak It
    • ……
       
    展开阅读
    精选笔记:APP转盘抽奖Java服务端接口详解

    7小时16分钟前回答

    应公司需求开发一个微信公众号中抽奖活动

    功能:奖品及中奖概率可在后台配置,滚动刷新中奖名单,控制用户每日抽奖次数等。

    规则:在活动期间,每日可抽奖一次,中奖后填写个人信息以便奖品的配送。

    1.获取抽奖页面数据

    /**
     * 获取抽奖页面数据
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    @RequestMapping(value="/queryLotteryActivity")
    @ResponseBody
    public AppIntReturn queryLotteryActivity(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
     AppIntReturn res = new AppIntReturn();
     
     // 用户同意授权后,能获取到code
     String code = request.getParameter("code");
     
     // 用户同意授权
     if (!"authdeny".equals(code)) {
     // 获取网页授权access_token
     WeixinOauth2Token weixinOauth2Token = CommonUtil
     .getOauth2AccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT, code);
     // 用户标识
     String openId = weixinOauth2Token.getOpenId();
     
     if(!StringUtil.isEmpty(openId)){
     
     // 查询用户信息
     List<CxhWechatMember> memberList = appLotteryService.getMemberList(openId);
     // 操作次数
     int operNum = 1; // 可写成后台可配置的
     if(memberList != null && memberList.size() > 0){
     operNum = operNum - memberList.size();
     /*// 获取用户信息
     String accessToken = CommonUtil.getAccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT).getToken();
     cxhWechatMember = CommonUtil.getWeChatMemberInfo(accessToken, openId);
     // 保存用户信息
     appLotteryService.saveMemberInfo(cxhWechatMember);*/
     }
     
     if (null == request.getParameter("activityId") || "".equals(request.getParameter("activityId"))){
     res.setResult("-2");
     res.setMsg("参数错误");
     return res;
     }
     // 查询活动信息
     CxhVoteActivity cxhVoteActivity = appLotteryService.getActivityInfo(request.getParameter("activityId"));
     if (null == cxhVoteActivity){
     res.setResult("-3");
     res.setMsg("暂无该类活动");
     return res;
     }
     CxhVoteAward cxhVoteAward = new CxhVoteAward();
     cxhVoteAward.setCxhVoteActivity(cxhVoteActivity);
     // 查询奖品列表
     List<CxhVoteAward> awardList = appLotteryService.findAwardList(cxhVoteAward);
     
     // 返回Map
     Map<String, Object> rtnMap = new HashMap<String, Object>();
     rtnMap.put("activity", cxhVoteActivity);
     rtnMap.put("awardList", awardList);
     rtnMap.put("operNum", operNum);
     rtnMap.put("openId", openId);
     
     res.setResult("0");
     res.setMsg("请求成功");
     res.setData(rtnMap);
     }else{
     res.setResult("-1");
     res.setMsg("授权失败");
     }
     
     }else{
     res.setResult("-1");
     res.setMsg("授权失败");
     }
     return res;
    }
    
    

    2.中奖名单接口

    /**
     * 中奖名单接口
     * @author lee
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/winningMemberList")
    public Object queryWinningMemberList(HttpServletRequest request, HttpServletResponse response) {
     AppListReturn appResult = new AppListReturn();
     try {
     CxhWechatMember cxhWechatMember = new CxhWechatMember();
     cxhWechatMember.setIswinning("1"); // 中奖
     // 查询中奖用户名单(分页)
     Page<CxhWechatMember> pageList = appLotteryService.findPage(new Page<CxhWechatMember>(request, response), cxhWechatMember);
     appResult.setData(pageList.getList());
     appResult.setPageNumber(pageList.getPageNo());
     appResult.setPageSize(pageList.getPageSize());
     appResult.setTotal((int) pageList.getCount());
     appResult.setTotalPages(pageList.getTotalPage());
     appResult.setResult(0);
     appResult.setMsg("成功");
     } catch (Exception e) {
     appResult.setResult(-9);
     appResult.setMsg("系统异常");
     logger.info(e.toString(), e);
     }
     return appResult;
    }
    
    

    3.抽奖接口

    /**
     * 抽奖接口
     * @author lee
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/doLottery")
    public Object doLottery(HttpServletRequest request, HttpServletResponse response) {
     AppListReturn appResult = new AppListReturn();
     // 返回Map
     Map<String, Object> rtnMap = new HashMap<String, Object>();
     String activityId = request.getParameter("activityId");
     String openId = request.getParameter("openId");
     try {
     
     if (null == activityId || "".equals(activityId) || null == openId || "".equals(openId)){
     appResult.setResult(-2);
     appResult.setMsg("参数错误");
     return appResult;
     }
     // 查询活动信息
     CxhVoteActivity cxhVoteActivity = appLotteryService.getActivityInfo(request.getParameter("activityId"));
     if (null == cxhVoteActivity){
     appResult.setResult(-3);
     appResult.setMsg("暂无该类活动");
     return appResult;
     }
     CxhVoteAward cxhVoteAward = new CxhVoteAward();
     cxhVoteAward.setCxhVoteActivity(cxhVoteActivity);
     // 查询奖品列表
     List<CxhVoteAward> awardList = appLotteryService.findAwardList(cxhVoteAward);
     
     Random rd = new Random();
     double dd = rd.nextDouble();
     double before = 0;
     double end = 0;
     cxhVoteAward.setLevel("5"); // 5-未中奖
     
     // 计算中奖概率
     for (int i = 0; i < awardList.size(); i++) {
     if(i > 0){
     before += awardList.get(i-1).getRate().doubleValue();
     }
     end += awardList.get(i).getRate().doubleValue();
     if(dd >= before && dd < end){
     if(awardList.get(i).getLeftnum() > 0){
      // 中奖奖品
      cxhVoteAward = awardList.get(i);
      // 修改奖品剩余数量
      cxhVoteAward.setLeftnum(cxhVoteAward.getLeftnum() - 1);
      appLotteryService.updateAwardNumber(cxhVoteAward);
     }
     break;
     }
     }
     
     // 新增用户操作记录
     String accessToken = CommonUtil.getAccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT).getToken();
     CxhWechatMember cxhWechatMember = CommonUtil.getWeChatMemberInfo(accessToken, openId);
     cxhWechatMember.setId(IdGen.uuid());
     cxhWechatMember.setJoindate(new Date());
     cxhWechatMember.setDelFlag("0");
     // 保存用户信息
     appLotteryService.saveMemberInfo(cxhWechatMember);
     
     rtnMap.put("awardLevel", cxhVoteAward.getLevel());
     rtnMap.put("awardId", cxhVoteAward.getId());
     appResult.setData(rtnMap);
     appResult.setResult(0);
     appResult.setMsg("成功");
     } catch (Exception e) {
     appResult.setResult(-9);
     appResult.setMsg("系统异常");
     logger.info(e.toString(), e);
     }
     return appResult;
    }

    4.保存中奖用户信息的接口

    /**
     * 保存中奖用户信息的接口
     * @author lee
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/saveMemberInfo")
    public Object saveMemberInfo(HttpServletRequest request, HttpServletResponse response) {
     AppListReturn appResult = new AppListReturn();
     try {
     
     // 用户同意授权后,能获取到code
     String openId = request.getParameter("openId");
     String username = request.getParameter("username");
     String phone = request.getParameter("phone");
     String address = request.getParameter("address");
     String awardLevel = request.getParameter("awardLevel");
     String awardId = request.getParameter("awardId");
     
     if (null == username || "".equals(username)
     || null == phone || "".equals(phone)
     || null == address || "".equals(address)
     || null == openId || "".equals(openId)
     || null == awardLevel || "".equals(awardLevel)
     || null == awardId || "".equals(awardId)){
     appResult.setResult(-2);
     appResult.setMsg("参数错误");
     return appResult;
     }
     
     // 查询用户信息
     List<CxhWechatMember> memberList = appLotteryService.getMemberList(openId);
     CxhWechatMember cxhWechatMember = memberList.get(0);
     cxhWechatMember.setUsername(username);
     cxhWechatMember.setPhone(phone);
     cxhWechatMember.setAddress(address);
     cxhWechatMember.setIswinning(awardLevel == "5" ? "0" : "1");
     cxhWechatMember.setAwardid(awardId);
     appLotteryService.update(cxhWechatMember);
     
     appResult.setResult(0);
     appResult.setMsg("成功");
     
     } catch (Exception e) {
     appResult.setResult(-9);
     appResult.setMsg("系统异常");
     logger.info(e.toString(), e);
     }
     return appResult;
    }
    
    

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

    展开阅读

    资源下载

    相关资源

    • App开发案例教程

      App开发案例教程

      《 App开发案例教程 》通过一个实例,介绍App设计、开发直至上线的全过程,引导读者在较短时间内熟悉一个较大规模的App应用系统的开发。本书包括项目需求分析、应用数据库设计与创建、服务器端程序设计、Android客户端设计、Android客户端模块实现、iOS客户端设计、iOS客户端模块实现和App提交等。从需求分析、系统设计、详细设计、代码编写,到最后发布上线,增加了服务器端、数据库部分和微信分享的开发内容,总结了App开发的整体流程。本书既适

      大小:37 MBApp开发

      立即下载
    • 精通引动APP测试实战:技术、工具和案例

      精通引动APP测试实战:技术、工具和案例

      精通引动APP测试实战:技术、工具和案例 全面讲解了移动平台测试方面的技术、技巧、工具和测试用例等实战知识。内容涵盖主流的测试工具,包括JUnit、Monkey、MonkeyRunner、Robotium、UIAutomator、

      大小:92.9 MBAPP测试

      立即下载
    • App架构师实践指南

      App架构师实践指南

      全方位详细介绍了在应用程序开发的架构模式和性能提升层面的知识,是架构师的必备书藉叙述了移动应用架构师必须掌握的专业技能、观念等总体的发展趋向,是挪动架构师成才的路线图用

      大小:235 MBApp开发

      立即下载
    • 构建跨平台APP:HTML5+PhoneGap移动应用实战

      构建跨平台APP:HTML5+PhoneGap移动应用实战

      大小:151 MBAPP开发

      立即下载
    • App后台开发运维和架构实践

      App后台开发运维和架构实践

      《App后台开发运维和架构实践 》通过阐述移动互联网中 App 后台开发的特点,梳理了 App 后台开发中会遇到的各个技术点,给出了生产环境常用软件的实战运维经验总结,剖析了常见 App 后台技

      大小:189.5 MBApp

      立即下载

    学习笔记

    19小时25分钟前回答

    Java利用happen-before规则如何实现共享变量的同步操作详解

    前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。 Java语言中有一个“先行发生”(happen—before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,“影响”包括修改了内存中共享变量的值、发送了消息、调用了方法等,它与时间上的先后发生基本没有太大关系。这个原则特别重要,它是判断数据是否存在竞争、线程是否安全的主要依据。 按照官方的说法: 当一个变量……

    20小时44分钟前回答

    浅谈Mybatis通用Mapper使用方法

    对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在对应工程的pom.xml文件中添加 dependency groupIdjavax.persistence/groupId artifactIdpersistence-api/artifactId version1.0/version/dependencydependency groupIdtk.mybatis/groupId artifactIdmapper/artifactId version3.1.2/version/dependency 配置拦截器 在mybatis-config.xml文件中添加通用Mapper plugin interceptor="tk.mybatis.mapper.mapperhelper.MapperInterceptor" !--================================================-- !--可配置参数说明(一般无需修改)-- !--================================================-- !--UUID生成策略-- !--配置UUID生成策略需要使用OGNL表达式-- !--默认值32位长度:@java.util.UUID@randomUUID……

    1小时49分钟前回答

    python实现Flappy Bird源码

    Flappy Bird是前段时间(好像一年or两年前....)特别火的有一个小游戏,相信大家都玩过。 Flappy Bird操作简单,通过点击手机屏幕使Bird上升,穿过柱状障碍物之后得分,碰到则游戏结束。由于障碍物高低不等,控制Bird上升和下降需要反应快并且灵活,要得到较高的分数并不容易。作为一个游戏渣,我最高纪录是8分...... 我记得当时还想,是谁发明了这个小游戏,逼死强迫症,记得当时本科时好多人在玩.... 无意间在GitHub上看到了python实现的代码,所以拿来学习了一番。代码思路比较简洁。 因为第一次接触pygame,所以代码注释写的比较详细,也算是一次新体验。 玩法: 空格键进入游戏,↑控制小鸟飞行……