在开始讨论之前,我将先声明免责声明:这不是您的典型的I-a-a-fant-new-thing科技博客,具有非典型,晦涩的图案。 不,这是一篇有关采用常见的基本范式并将其应用于我们以前可能从未想到过的地方的文章,或者更准确地说,是在我们忘记了它们与之相关的地方。 软件产品往往会经历总结能力成熟度模型的相同阶段,转化为软件开发。 我们通常会坚持不懈地进行尝试并进行创新。 这是因为我们不想浪费时间和金钱来为尚未得到的答案过度设计解决方案。 我们希望将精力集中在发明新事物上,因此我们会避免为重新发明轮子做任何努力。 在我开发和制造的所有移动产品中,其中一个轮子始终存在: 网络。 在MINDBODY,我们已经维护和扩展了许多不同的移动产品超过四年。 同样,大多数软件产品具有相同的根源,我们的移动应用程序也不例外。 根据年龄的不同,每种产品在某种程度上都很大程度上依赖于许多人认为是事实上的开源网络库: AF网络 Alamofire MKNetworkKit 这些功能强大且受社区支持的第三方可解决任何Cocoa开发人员的大部分联网问题-Cocoa HTTP库的全地形轮胎。 但是,我们是一家企业,以此类推完整的圆圈,不能在Peterbilt上打一堆全地形轮胎并且期望行驶很远。 多年来,我们一直在不断改进这些常见要求: 将具有不同范例和传输格式的多个API整合到一个网络会话中的能力。 在单个会话中应用不同级别的授权和其他一次性装饰的能力。 具有满足以上两个要求的具有不同主机/客户端配置的多个会话的能力。 最重要的是,我们渴望拥有SOLID基础。 建立一个全新的网络层听起来很昂贵,冒险且彻头彻尾,这在很大程度上缩小了故障间隔。 最终,这意味着我们需要从以下两个问题的明确答案入手: 我们如何设计新车轮,以及如何将东西砸在行驶的汽车上? 设计车轮 曾经有人告诉我,“只有在第三次失败之后,新架构才能成功。”作为坚定地支持这一说法的人,我将转变话题,并略谈一下Node.js。 为什么选择Node.js? 不,我不会开始赞扬JavaScript及其动态的,松散类型的,嵌套回调的荣耀。 Node.js如此流行的原因是容易和简单,通常要付出代价。 但是在某些情况下,语言和平台为出色的模式提供了基础。 在我们的案例中,我们决定招待Express.js及其中间件模式的实现。 没有花哨的全局请求管理器到处都是路由规则,序列化模式,全局请求标头,过于简化的嵌入式授权机制,缓存策略等; 没有请求操作会承担太多责任,无法尝试使摆锤向模块化方向摆动太远; 无需花三个小时阅读有关所有工作原理的文档。 网络管道架构 当简化为体系结构时,我们发现针对任何给定请求有四个主要参与者: 管道 中间件的集合 请求 响应 在我们的Swift实现中, 会话与请求管道同义。 管道中显示的任何更改或全局行为将影响该会话内的所有请求。 会话客户端使用提供的URLSessionConfiguration管理单个管道,并且它直接接受URLRequests作为输入。 这意味着,网络架构是Apple网络库之上非常薄的一层 。 客户端只是简单地通过串行队列来收集请求,通过提供的中间件链来处理它们(每个请求可以不同),最后将它们传输到URLSession。 这满足了我们的第一个要求。 中间件范式 中间件组件具有基于具体实现的职责范围,但是它们都可以做三件事: 修改请求 冻结/清空输出管道 用错误使响应短路 中间件被定义为一个简单的协议,并且可以从任何地方定义和注入自定义中间件。 […]
我试图做一个推送通知,我已经在parse-server / certs文件夹中设置我的.p12文件。 这是我的index.js中的代码: var api = new ParseServer({ databaseURI: process.env.DATABASE_URI || 'mongodb://localhost:27017/dev', cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js', appId: 'xx', masterKey: 'xx', fileKey: 'xx', clientKey: 'xx', serverURL: 'xx', push: { ios: [ { pdx: 'certs/ParsePushDevelopmentCertificate.p12', // Dev PFX or P12 bundleId: 'bundleId', production: false // Dev } ] } }); 我想通过云代码发送推送通知。 所以这里是我的main.js: Parse.Cloud.define("pushToAll", function […]
我有一个最近出现的问题。 在我的代码中,我从HTTP服务器加载一些图像: let urlPicture = "http://images.mydomain.com/" + self.currentUser.pic imageView.sd_setImageWithURL(NSURL(string: urlPicture)) 我不使用HTTPS为我的图像服务器,因为我猜它会太慢,但也许我在这一点上是错误的。 nodejs服务器正在AWS EC2实例中运行,并侦听端口80以pipe理映像。 由于ATS限制,我在Info.plist文件中为我的图像子域声明了一个exception: <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>images.mydomain.com</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSExceptionRequiresForwardSecrecy</key> <true/> <key>NSIncludesSubdomains</key> <true/> <key>NSRequiresCertificateTransparency</key> <false/> <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> <false/> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <true/> </dict> </dict> </dict> 最近,我在同一个 AWS实例上添加了一个新的子域: https ://api.mydomain.com另一个nodejs服务器在443端口上侦听并pipe理API。 由于这个改变,当我调用API时,在我的应用程序中一切正常,但是当我加载图像时,我面临以下问题: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 任何想法解决这个问题?
我是一名学生,今天刚从离子开始。 我没有使用命令行的经验,所以我很难在这里。 当我尝试运行基本模板(标签)时: sudo ionic platform add ios sudo ionic build ios sudo ionic emulate ios (如果没有sudo,这些都不起作用)。 最后一个在日志中产生这个(上面的其他东西): ** BUILD SUCCEEDED ** No target specified for emulator. Deploying to iPhone-6 simulator An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=159): Invalid device state An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=159): Invalid device state […]
我对这个框架很陌生。 我正在使用React-Native中的dataSource制作一个基本的ListView,并提取数据。 constructor(props){ super(props); var dataSource = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2, }); this.state = { searchString: '', isLoading: false, message: '', jsonData: '', }; } _fetchData(query){ console.log(query); this.setState({ isLoading: true }); fetch(query) .then(response => response.json()) .then(responseData => { this._handleResponse(responseData); this.setState({ message: 'seems like it worked!', dataSource: this.state.dataSource.cloneWithRows( responseData ), }); […]
我非常高兴看到迄今在Ionic框架上看到的一切,他是一个发现球的孩子。 但是,我正面临一些工具configuration问题: 在我的Mac上用Xcode 7.2.1和Yosemite安装了Apache Cordova 6.2.0; 安装了Ionic 1.7.15客户端; 节点4.4.5和NPM 3.9.3; 我设法创build了一个应用程序,打开离子和离子实验室视图,没有问题。 但是当我尝试安装在xCode中构build的组件时,出现了一些问题: a)ios-yes – 没问题 b)ios-deploy – 各种错误消息: Npm WARN lifecycle ios-deploy@1.8.6~preinstall: can not run in wd% s% s (% s = wd) ios-deploy@1.8.6 ./src/scripts/check_reqs.js xcodebuild && / usr / local /lib/node_modules/.staging/ios-deploy-298c9491 npm ERR! Darwin 14.5.0 npm ERR! argv "/ usr / local / bin […]
我已经在我的iOS应用程序上使用我的后端的别名子域名(如sudomain.mydomain.com来设置Universal Links。 我想让没有安装应用程序的用户redirect到App Store中的页面,而不是在我们的服务器上触发一些不存在的端点(我们没有webapp只有一个移动后端)。 我正在考虑做这样的事情: app.get('*', (request, response) => { const domain = request.headers.host, subdomain = domain.split('.'); if ( subdomain[0] === 'subdomain'){ response.redirect('www.linktoappstore.com'); } … }); 不过,我不希望这会干扰通用链接的人安装了应用程序。 通用链接是否get发送到我的服务器的请求,或iOS是否在这种情况发生之前拦截它们?
我有一个Node.js服务器,当用户login时,发送JWT(JSON Web Token)作为响应。如何在我的Swift 4 iOS应用程序中获得响应? func handleLogin() { guard let username = usernameTextField.text, let password = passwordTextField.text else { print("Invalid form") return } guard let url = URL(string: "http://localhost:3000/users/authenticate") else { return } var request = URLRequest(url: url) request.httpMethod = "POST" request.addValue("application/json", forHTTPHeaderField: "Content-Type") let authUser = Login(username: username, password: password) do { let jsonBody […]
我有一个运行WebSocket的Node.js服务器。 (使用柚子)。 我能够运行一个Web应用程序并连接到它(localhost @port 3104)。 但是,当我尝试使用socket.io(SocketRocket)的IOS和连接到相同的本地主机和端口,我得到这个错误: > http://127.0.0.1:3014/socket.io/1/?t=16807 > "ERROR: handshake failed … The request timed out" 错误的细节: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x6c723c0 {NSErrorFailingURLStringKey=http://127.0.0.1:3014/socket.io/1/?t=16807, NSErrorFailingURLKey=http://127.0.0.1:3014/socket.io/1/?t=16807, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x6c72400 "The request timed out."} 我试过了。 127.0.01,本地主机…甚至明确的IP地址..都失败 任何想法我应该检查? 并应该是“http”协议? 或者wss?
我正在Swift中开发一个iOS应用程序,并尝试实现应用内购买的接收validation。 我无法弄清楚如何在Swift中实现这个function,所以我试着在看到Giulio Roggero的例子之后,让我的应用程序通过Node.js中的Lambda函数写入请求。 我的Swift代码如下所示: let receiptPath = Bundle.main.appStoreReceiptURL?.path if FileManager.default.fileExists(atPath: receiptPath!){ var receiptData:NSData? do{ receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, options: NSData.ReadingOptions.alwaysMapped) } catch{ print("ERROR: " + error.localizedDescription) } let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed) let invocationRequest = AWSLambdaInvokerInvocationRequest() invocationRequest?.functionName = "sendReceiptRequest" invocationRequest?.invocationType = AWSLambdaInvocationType.requestResponse invocationRequest?.payload = ["receipt-data" : receiptString!, "password" : SUBSCRIPTION_SECRET] let lambdaInvoker = AWSLambdaInvoker.default() […]