我想在我的应用程序(Voip应用程序)中实现PushKit服务,但我有以下疑问:我看到我可以生成只有生产voip证书,如果我尝试在开发设备上测试voip推送通知服务,它是有效的?

这是我的实现测试:

使用这3行代码,我可以在我用来保存到我的服务器的didUpdatePushCredentials回调上获取推送令牌.

PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

服务器端我生成一个只有警报文本的“正常”有效载荷推送通知,我发送到存储在我的服务器中的voip令牌.

我使用回调与调试日志,但他们从来没有被调用!

- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(Nsstring *)type {

          NSLog(@"didInvalidatePushTokenForType");

}

-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(Nsstring *)type {

          NSLog(@"didReceiveIncomingPushWithPayload: %@",payload.description);

}

-(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(Nsstring *)type {
     if([credentials.token length] == 0) {
           NSLog(@"voip token NULL");

          return;
     }

      NSLog(@"didUpdatePushCredentials: %@ - Type: %@",credentials.token,type);

}

如果我尝试从我的服务器生成推送通知消息到以前上传的voip设备令牌,我从来没有通知didReceiveIncomingPushWithPayload回调,但是从服务器我得到200 ok消息(消息已成功发送)

解决方法

为了防止有人有兴趣通过Pushkit测试voip push通知,我留下了一个小程序,我顺利地遵循:

1 – 创建(如果您还没有)具有钥匙串访问权限的CSR,并在本地保存您的CSR.

2 – 转到Apple Developer,获取证书,标识符和配置文件.在会员中心

>内部标识符 – >应用ID创建一个新的应用ID
>内部设备 – >全部添加要用于测试voip推送的设备UDID
>内部证书 – >全部创建新的生产证书:VoIP服务证书.为您的voip服务证书选择先前创建的应用程序编号.选择先前创建的CSR(证书签名请求),一旦创建下载您的新的voip_services.cer

一旦下载,双击voip_services.cer以打开钥匙串访问应用程序并导出生成证书的私钥:右键导出certificate.p12文件.

将voip_services.cer和certificate.p12文件保存在文件夹中,以创建服务器推送通知生成器

最后再次到配置配置文件 – > distribution中的Apple Developer网站,创建一个新的Ad-Hoc分发配置文件,其中包含您要用于测试voip推送的所有设备UDID.下载此配置文件并将其拖放到您的xcode中,以便在您的应用程序中使用它.

现在可以创建将接收voip push通知的iOS应用程序:

>从Xcode新项目菜单创建一个新的单一视图应用程序.
>根据上一节中创建的应用程序ID填写其标识符.
>在General中添加PushKit.framework→>链接框架和库.
>功能启用后台模式并选择基于IP的语音选项.
>在构建设置 – >代码签名选择您以前下载的配置配置文件,并选择分发为代码签名身份.

让我们在应用程序中添加代码Pasquale在他的问题中添加:

在您的根视图控制器头(ViewController.h
)PushKit.framework的导入:

#import <PushKit/PushKit.h>

添加代表以实现其功能:

@interface ViewController : UIViewController <PKPushRegistryDelegate>

添加您的根视图控件(ViewController.m)的viewDidLoad函数push注册:

- (void)viewDidLoad {
    [super viewDidLoad];

    PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
    pushRegistry.delegate = self;
    pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
}

实施所需的委托功能:

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(Nsstring *)type{
    if([credentials.token length] == 0) {
        NSLog(@"voip token NULL");
        return;
    }

    NSLog(@"PushCredentials: %@",credentials.token);
}

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(Nsstring *)type
{
    NSLog(@"didReceiveIncomingPushWithPayload");
}

一旦所有的编译和确定,存档您的项目并导出您的ipa文件,以便安装在测试设备上(您可以使用例如Testflight来完成这项工作).

执行它并从日志中获取我们将用于发送推送的PushCredentials.

现在让我们去服务器端(我按照raywenderlich tutorials的这个很好的指导):

回到文件夹你放置了三个文件:

> voip_services.cer
> certificate.p12

1 – 打开终端并从证书文件创建pem文件:

#openssl x509 -in voip_services.cer -inform der -out PushVoipCert.pem

2 – 从导出的私钥文件创建pem文件:

#openssl pkcs12 -nocerts -out PushVoipKey.pem -in certificate.p12

3 – 将两个pem文件一起加入:

#cat PushVoipCert.pem PushVoipKey.pem > ck.pem

从raywenderlich tutorials获取Simplepush脚本教程并进行修改

> $devicetoken通过添加您的PushCredentials(从应用程序日志)
> $passphrase通过您在创建PushVoipKey.pem步骤2时添加的密码

而已.执行PHP脚本:

#PHP simplepush.PHP

你应该收到你的voip push通知(你应该看到应用程序日志:“didReceiveIncomingPushWithPayload”)

在测试之后,我想知道如何通过pushkit框架接收标准推送通知,但不幸的是我没有回答,因为注册推式时找不到任何其他PKPushType,但是PKPushTypeVoIP …

pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

就这样!谢谢阅读!

ios – 实现PushKit并在开发行为中进行测试的更多相关文章

  1. 配置iOS VoIP应用程序以在睡眠/后台模式下运行

    我正在开发基于VoIP的iOS(7.1)应用程序.它的底层套接字编程是用C而不是客观C编写的.应用程序在前台运行良好,但在进入睡眠/后台模式时,它无法从服务器接收任何通信.根据apple文档,我们必须为VoIP使用配置一个appsocket.我无法弄清楚如何配置C套接字.目的是在睡眠模式下运行应用程序,直到它被杀死.从SO中尝试了几个链接甚至几个链接,但由于我是新手,我希望这个配置有一步一步的过程.[注意:在某个地方我发现了CoreFoudation框架,我是否需要使用它?

  2. 可以在Mavericks(OS X 10.9)上使用XCode 5为iOS 6开发吗?

    这个问题已经过时了.小牛队发布,一切正常,在iPod4th上使用Xcode5和iOS6.我正在考虑将我的OSX升级到Mavericks,但我仍然想继续开发我的iOS应用程序.我在网上看到Xcode4.6.3与Mavericks不兼容.所以,这会迫使我使用新的Xcode5.然而,Xcode5附带了新的iOS7SDK.问题是我拥有一个与iOS7不兼容的iPod第四代.那么,有人试过这个吗?

  3. ios – 从iphone app store过渡到企业开发

    它应该覆盖手机上的相同应用程序,而不是创建第二个应用程序.我联系了Apple支持,他们说:“不,如果你没有指示客户卸载他们的旧应用程序,你将安装2个应用程序”.这是真的?

  4. ios – Marmalade SDK是否与游戏开发更相关或更常用?

    我是移动应用程序开发的新手,并且正在寻找一个适合的平台.我遇到了一个项目,人们希望将交换机和家庭自动化公司的自助广告实施到移动应用程序中.他们最初想要一个iPhone应用程序,但也希望随后在Android和其他平台上部署.一个类似的应用程序是这one.在投入大量时间研究各种SDK和开发人员计划之后,Marmalade通过它的多平台部署功能引起了我的注意.然而,在经历了一些教程之后,我发现these

  5. ios – 为什么在推出APNS通用客户端SSL证书时,Pushkit需要单独的Voip证书?

    只是一个小小的混乱.当我们为APNS提供支持主应用程序,voip等的通用客户端SSL证书时,为什么我们需要为Pushkit提供单独的Voip服务证书?这也将确保相同的连接可用于提供VoipPush和标准Push.解决方法你没有.通用将适用于APNS和PushKit.您的服务器通过在推送通知上设置适当的“主题”来发出它想要的信号.

  6. ios – 尝试在设备上运行我的应用程序时找不到此可执行文件的有效配置文件

    我正在敲打我的头一天超过一天,我几天前将应用程序上传到苹果商店,它被拒绝了.我做了更改,现在想再次在我的手机上测试应用程序,每次我都收到一条奇怪的消息,告诉我没有有效的配置文件.我是iOS的新手.我检查了各种问题,并按照解释设置了所有内容.为什么这个奇怪的错误.点击窗口>组织者我看到我的有效个人资料和我的iPhone带有绿色信号.我想知道问题出在哪里!

  7. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  8. ios – 什么是VOIP服务证书?

    在证书,标识符和创建证书以创建VOIP服务证书时,iOS开发者门户网站上的配置文件有一个新选项:我在iOS上使用VOIP应用程序,之前从未看过这个选项.有谁知道这个证书是必要的,它将用于什么?

  9. 调试 – iOS设备上的remote console.log()

    我正在开发涉及touchEvent的网络应用程序.如果我可以在我的Mac上远程查看控制台,那么调试它会更容易一些.我可以在iOS设备上使我的MobileSafari将控制台日志存储在系统中的某个位置.我已经越狱了我的iPad.谢谢!

  10. ios – iPhone:我可以通过编程方式禁用自动关闭显示屏吗?

    3个我最近开始在Objective-C开发iPhone应用程序,并组装了一个小型通用视频播放器,可以让我在iPhone上观看电视节目,电影等.除了一件小事之外,一切都在完美无缺.如果我在该时间范围内没有点击屏幕,显示屏会在一两分钟后关闭并变为黑色.我想知道在我的应用程序打开时是否可以以编程方式保持显示.我已经尝试将idleTimerdisabled设置为true,但没有成功.我的设备是越狱的,如果它有所作为,我也开放的解决方案只适用于越狱设备.解决方法在AppDelegate中添加:

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部