我对许多stackoverflow问题和网站进行了一些研究,试图弄清楚iOS推送通知如何影响AppDelegate生命周期方法以及何时触发哪种方法(而不是).该研究的主要焦点是"标准"iOS推送通知(带alert字段)和静默(通过content-available设置1)以及AppDelegate application:didReceiveRemoteNotification和application:didFinishLaunchingWithOptions方法.
我不想针对不同的场景问很多问题,而是试着写下我尝试过的不同测试用例的陈述,然后问你:
Is there any statement that is wrong and if yes, which one and why?
如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序在后台保持不活动状态.一旦点击推送通知并且应用程序因此而被打开,application:didReceiveRemoteNotification方法被调用并且application:didFinishLaunchingWithOptions不会被调用.我在将应用程序放到后台以及应用程序在后台运行超过一个小时之后立即测试了这种情况 - 相同的行为.我想如果由于某些原因iOS决定在后台杀死我的应用程序,这个测试用例就像场景2,从下面的声明1,对吧?
如果发送静默推送通知,则在推送通知到达的那一刻,application:didReceiveRemoteNotification方法被调用并且application:didFinishLaunchingWithOptions不被调用.
如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序仍然被杀死.一旦点击推送通知并且应用程序因此而被打开,application:didReceiveRemoteNotification方法被调用并且application:didFinishLaunchingWithOptions不会被调用.
如果发送静默推送通知,则无法触发任何方法,因为无法将静默推送通知发送到被杀死的应用程序.在发送通知后打开应用程序后,application:didFinishLaunchingWithOptions作为正常流程的一部分进行调用,并且没有任何推送通知信息.application:didReceiveRemoteNotification没有被召唤.
如果您可以想到其他一些我可能忘记提及的现实生活场景,我会非常感激地了解它们以及在这些情况下会发生什么.
干杯
感谢Sandeep Bhandari的更新和其他方案.我忘记在原来的问题中提到我正在探索应用程序到达目前not处于前台的应用程序的情况.
将Sandeep的场景添加到列表中:
如果发送标准推送通知,application:didReceiveRemoteNotification将调用方法.application:didFinishLaunchingWithOptions不会被打电话.
如果发送静默推送通知,application:didReceiveRemoteNotification则会调用方法.application:didFinishLaunchingWithOptions不会被打电话.
如果发送标准推送通知,application:didReceiveRemoteNotification将调用方法.application:didFinishLaunchingWithOptions不会被打电话.
如果发送静默推送通知,application:didReceiveRemoteNotification则会调用方法. …
我期待为iPhone编写应用程序,它将能够控制汽车中的收音机和CD播放器.收音机和播放器可以使用蓝牙连接.
我开始这个问题是为了获得这个地方所需的所有信息.我几乎没有问题,但如果您发现任何我认为开始开发此应用程序并不重要的事情,请告诉我.
我已经阅读了关于AVRCP配置文件和汽车支持AVRCP 1.3的蓝牙设备,这对我来说已经足够了,考虑到可以在该协议版本中执行的控制.
我读了很多关于人们说"Apple设备只能互相交互","Apple设备无法通过蓝牙连接到非Apple设备","MFi程序是必须的,如果你想这样做","MFi不需要"等我的第一个问题是:
1)甚至可以通过蓝牙和控制广播电台和任何iPhone版本的音乐将iPhone(4,4S)与收音机和CD播放器配对吗?如果是,那么成功建立这种蓝牙有什么限制?
关于iPhone可以工作的角色的信息也很少.对于AVRCP,有两种角色:控制器和目标角色.阅读本文:https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf我没有找到第二个问题的答案:
2)iPhone可以作为控制器并将AVRCP 1.3中规定的所有可用命令发送到目标设备(无线电和CD播放器)吗?
我还想了解这个特定问题的可用框架.我知道有几个,但如果有人认出我的问题是正确的,我想知道:
3)我应该使用哪种与目标设备交互的框架?
从开发人员的角度来看,我也对可用于与连接的蓝牙设备进行交互的API感兴趣.由于我正在创建自己的应用程序并为按钮分配操作,因此在分配给按钮的方法内部,我需要执行向目标设备发送消息.所以我的下一个问题是:
4)有没有人知道如何有一种方法将命令发送到目标设备(开始/停止/暂停/前进/后退等)作为XCode中提供的某些API的一部分,或者我通过蓝牙发送到目标的每条消息我需要根据协议文档制作的设备(自己制作整个消息(标题,正文,命令部分等))?
AVRCP是我完成此应用程序的想法.如果我错了,请告诉我.蓝牙具有不同的配置文件,并且当从一个设备发送消息时,据我所知,配置文件本身处理消息并将其解释并传送到目标设备,以便目标设备可以理解它.我不明白从我从Objective-C(或C)代码发送消息后,从iPhone发送到目标蓝牙设备的消息是如何处理的.这是我的主要疑问,它与问题4有关 - 我是否需要以正确的格式制作原始消息才能将AVRCP命令发送到设备,或者我可以使用某些API将这些消息识别为AVRCP(或任何其他类型) )并将其交付给目标设备?
最后一个问题(如果我认为对以前的所有问题都有任何积极的答案)从开发人员的角度来看最让我担忧.所以,如果有人有这个特定问题的经验,我会很感激任何答案或建议.
我真的很期待你的回答.我希望将就这一主题开始建设性和有用的讨论,并将编写许多有用的信息.
最好的祝福.
我有.jar文件,它在运行时读取一个.dylib库,我在OSX中用GCC编译器编译.
应用程序在OSX 10.6.8上运行没有任何问题.
Java版本:
java版"1.6.0_33"Java(TM)SE运行时环境(版本1.6.0_33-b10-424-10M3720)Java HotSpot(TM)64位服务器VM(版本20.8-b01-424,混合模式)
GCC版本:
i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.1.00)
我使用64位Java和libs,其中.jar需要为x86_64编译.所以,在Snow Leopard上,一切都运行良好.
我现在将我的应用程序切换到OSX 10.7.4.在那里我尝试了两个不同的Java版本:
第一个Java版本(与Snow Leopard相同):
java版"1.6.0_33"Java(TM)SE运行时环境(版本1.6.0_33-b10-424-10M3720)Java HotSpot(TM)64位服务器VM(版本20.8-b01-424,混合模式)
第二个Java版本(今天更新):
java版"1.6.0_35"Java(TM)SE运行时环境(版本1.6.0_35-b10-428-11M3811)Java HotSpot(TM)64位服务器VM(版本20.10-b01-428,混合模式)
GCC版本:
i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.9.00)
我首先尝试使用在Snow Leopard上编译的.dylib来运行应用程序,但是我收到了这个错误:
位置0x0的内存访问无效rip = 0x7fff894aa697分段错误:11
还有新的线路没有导致应用程序崩溃,但它们没有在Snow Leopard上显示:
java[1366] <Error>: CGContextGetCTM: invalid context 0x0
java[1366] <Error>: CGContextSetBaseCTM: invalid context 0x0
java[1366] <Error>: CGContextGetCTM: invalid context 0x0
java[1366] <Error>: CGContextSetBaseCTM: invalid context 0x0
Run Code Online (Sandbox Code Playgroud)
在这次崩溃之后,我尝试在Lion上重新编译依赖.dylib与GCC,但是没有改变.我仍然得到Segmentation fault:11错误.
我在网上读到了这个错误,据我所知,它经常出现在Lion上,因为Java更新可能搞砸了,但是因为我对Java不太熟悉 - 有没有人遇到过这些问题,如果有的话,有没有办法解决这个问题?
非常感谢.
[编辑#1:在OSX 10.7.4上尝试使用Java 7]
使用Java 7运行.jar时,会再次发生崩溃,这是错误报告:
#
# A fatal error has been …Run Code Online (Sandbox Code Playgroud) 我编写了简单的应用程序,它在MapKit上的两个位置之间绘制路径.我正在使用Google Map API.我使用了我在网上找到的资源,这里是我用来向Google提出请求的代码:
_httpClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://maps.googleapis.com/"]];
[_httpClient registerHTTPOperationClass: [AFJSONRequestOperation class]];
[_httpClient setDefaultHeader:@"Accept" value:@"application/json"];
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setObject:[NSString stringWithFormat:@"%f,%f", coordinate.latitude, coordinate.longitude] forKey:@"origin"];
[parameters setObject:[NSString stringWithFormat:@"%f,%f", endCoordinate.latitude, endCoordinate.longitude] forKey:@"destination"];
[parameters setObject:@"true" forKey:@"sensor"];
NSMutableURLRequest *request = [_httpClient requestWithMethod:@"GET" path: @"maps/api/directions/json" parameters:parameters];
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
NSInteger statusCode = operation.response.statusCode;
if (statusCode == 200)
{
NSLog(@"Success: %@", operation.responseString);
}
else
{
NSLog(@"Status code = %d", statusCode);
}
}
failure:^(AFHTTPRequestOperation …Run Code Online (Sandbox Code Playgroud) 我作为测试做的是:
我做了示例应用程序,我启用了推送通知并实现了处理它们的机制.
我正在测试向我的应用程序发送静默推送通知curl,这非常有效.我测试的是:
curl -v -d'{"aps":{"content-available":1}}'--cert"/Users/me/Desktop/mycert.pem":" - " - H"apns-topic:com.domain .name"--http2 https://api.development.push.apple.com/3/device/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
作为Apple的回答,我总是看到以下内容:
<HTTP/2.0 200
<apns-id:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX
根据Table 6-4官方文档的说法,这很好并且符合预期:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html
现在我从我的设备中删除该应用程序,然后我重试相同的请求,希望我将开始获取状态代码410和信息The device token is no longer active for the topic.然而,这种情况并没有发生,我总是得到200状态代码,就像一切都很好,推送令牌仍然可用.
删除后1 - 1.5小时,我仍然得到200答案.
您是否知道Apple刷新推送令牌列表的频率以及何时可以最终开始获取410?而且 - 在生产环境之外测试应用程序时,410状态(并且Instant Feedback通常)是可测试的吗?
提前感谢任何答案.
干杯
我想做的事情很简单 - 我想在从 iOS 和 Android 应用程序连接到服务器时获得完整的证书链。
在 iOS 中,我正在使用NSURLSession和覆盖URLSession:didReceiveChallenge:方法,在该方法中我能够获取证书链,在这种情况下,它看起来像预期的那样:
[leaf certificate] - [intermediate certificate] - [root certificate]
迷人的。
现在我正在尝试在 Android 设备上使用HttpsURLConnection. 连接到服务器后,我正在使用方法获取证书链(或者至少我希望这是它的getServerCertificates()方法)。这将返回我的Certificate[]对象,我在其中获得了如下所示的链:
[leaf certificate] - [intermediate certificate]
因此,Android 设备上没有根证书。
您知道如何从Android中的链中获取根证书吗?
先感谢您。