javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

iOS Push Notification Banner一次显示两次

我注意到发送推送通知会导致以下行为:

Push Banner is shown twice?

看到广告在短暂的延迟后又如何显示?

起初我以为我们的后端错误地发送了2个推送通知,一个接一个。

但是,这似乎是单个Push通知的默认iOS行为。 显示横幅,然后立即“再次显示”。 这会导致显示在gif中的抖动UI。 标语似乎收到了两次。

使用iOS 9.0.2测试。

我不记得在向我发送推送通知的其他应用程序中看到过这种行为。 我做错了什么会导致横幅显示两次吗?

雷达:

工程确定您的错误报告(23133694)与另一个问题(23130766)是重复的,将被关闭。

trans by 2020-08-12T00:22:07Z

一次关闭后,如何取回“允许推送通知”对话框?

我正在构建一个严重依赖APN的应用程序。 在我的应用程序首次启动时,iOS会询问是否允许该应用程序使用APN(作为registerForRemoteNotificationTypes:调用的结果)。 但是,一旦关闭,此对话框就永远不会弹出。 我必须手动转到Settings->Notifications->MyApp才能在此处启用/禁用操作。 那么,有没有一种方法可以避免这种烦恼,并在每次以调试模式启动应用程序时,真正体验用户在首次启动时会遇到的体验?

trans by 2020-08-10T04:38:07Z

iOS-didReceiveRemoteNotification:fetchCompletionHandler在应用程序处于后台且未连接到Xcod时未调用

我有一个非常奇怪的问题,我实现了:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler

用于静默远程推送通知。当应用程序在后台并连接到Xcode时,它可以完美工作。当我拔下任何iOS设备并运行该应用程序时,移至后台并发送远程通知,不会调用{ aps = { "content-available" = 1; }; pushCode = 12; }

我的代码如下:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSInteger pushCode = [userInfo[@"pushCode"] integerValue];
    NSLog(@"Silent Push Code Notification: %i", pushCode);
    NSDictionary *aps = userInfo[@"aps"];
    NSString *alertMessage = aps[@"alert"];

    if (pushCode == kPushCodeShowText) {
        UILocalNotification *localNotif = [[UILocalNotification alloc] init];
        localNotif.fireDate = [NSDate date];
        localNotif.timeZone = [NSTimeZone defaultTimeZone];
        localNotif.alertBody = alertMessage;
        localNotif.alertAction = @"OK";
        localNotif.soundName = @"sonar.aiff";
        // localNotif.applicationIconBadgeNumber = 0;
        localNotif.userInfo = nil;
        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotif];

        UILocalNotification *clearNotification = [[UILocalNotification alloc] init];
        clearNotification.fireDate = [NSDate date];
        clearNotification.timeZone = [NSTimeZone defaultTimeZone];
        clearNotification.applicationIconBadgeNumber = -1;
        [[UIApplication sharedApplication] presentLocalNotificationNow:clearNotification];
    }
    else  if (pushCode == kPushCodeLogOut) {
        [[MobileControlService sharedService] logoutUser];
        [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
    }
    else if (pushCode == kPushCodeSendLocation) {
        [[MobileControlService sharedService] saveLocation];
    }
    else if (pushCode == kPushCodeMakeSound) {
        [[MobileControlHandler sharedInstance] playMobileControlAlertSound];
        // [[MobileControlHandler sharedInstance] makeAlarm];
        [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
    }
    else if (pushCode == kPushCodeRecordAudio) {
        if ([MobileControlHandler sharedInstance].isRecordingNow) {
            [[MobileControlHandler sharedInstance] stopRecord];
        } else {
            [[MobileControlHandler sharedInstance] startRecord];
        }
        [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
    }
    completionHandler(UIBackgroundFetchResultNewData);
}

- (void)saveLocation {
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
    }];

    char *hostname;
    struct hostent *hostinfo;
    hostname = "http://m.google.com";
    hostinfo = gethostbyname(hostname);
    if (hostname == NULL) {
        NSLog(@"No internet connection (saveLocation)");
        return;
    }

    if (self.locationManager.location.coordinate.latitude == 0.0 || self.locationManager.location.coordinate.longitude == 0.0) {
        NSLog(@"saveLocation - coordinates are 0.0.");
        return;
    }

    NSLog(@"saveLocation - trying to get location.");
    NSString *postBody = [NSString stringWithFormat:@"Lat=%@&Lon=%@&Date=%@&userID=%@&batteryLevel=%@&version=%@&accuracy=%@&address=%@", self.myInfo.lat, self.myInfo.lon, self.myInfo.date, self.myInfo.userID, self.myInfo.batteryLevel, self.myInfo.version, self.myInfo.accuracy, self.myInfo.address];

NSURL *completeURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/saveLocation", WEB_SERVICES_URL]];
NSData *body = [postBody dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:completeURL];
[request setHTTPMethod:@"POST"];
[request setValue:kAPP_PASSWORD_VALUE forHTTPHeaderField:kAPP_PASSWORD_KEY];
[request setHTTPBody:body];
[request setValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];


if (__iOS_7_And_Heigher) {
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"saveLocation Error: %@", error.localizedDescription);
        } else {
            NSString *responseXML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"\n\nResponseXML(saveLocation):\n%@", responseXML);
            [self cloudAcknowledge_whoSend:kPushCodeSendLocation];
        }
    }];
    [dataTask resume];
}
else {
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        if (connectionError) {
            NSLog(@"saveLocation Error: %@", connectionError.localizedDescription);
        } else {
            NSString *responseXML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"\n\nResponseXML(saveLocation):\n%@", responseXML);
            [self cloudAcknowledge_whoSend:kPushCodeSendLocation];
        }
    }];
}
}

- (void)startBackgroundTask {
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
    }];
}

- (void)endBackgroundTask {
    if (bgTask != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }
}

并且{ aps = { "content-available" = 1; }; pushCode = 12; }cloudAcknowledge函数的末尾。知道这里到底发生了什么吗?

编辑:

有效负载是这样的:{ aps = { "content-available" = 1; }; pushCode = 12; }

trans by 2020-07-29T00:03:40Z

如何在ios推送通知中显示图像?

iOS 10引入了推送通知框架更新,

UserNotificationsUI.framework

如苹果文档中所写,它使我们可以自定义本地和远程通知在用户设备上显示时的外观。

因此,如果有人知道在锁定屏幕上时如何在推送通知中显示图像。 像android推送通知一样。

谢谢,

trans by 2020-07-14T11:08:43Z

ios-如果应用程序已在后台运行,如何响应推送通知视图

我有一些想做的很简单的事情。 我将自定义数据附加到我处理的一些推送通知中

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

我在寻找UIApplicationLaunchOptionsRemoteNotificationKey,嘿,在那之前。

仅在我的应用程序首次启动时才调用该方法。 如果收到通知时我的应用程序已经在后台运行,并且用户按下通知上的“查看”按钮,我该如何读取相同的键? 我想将它们发送到打开了该数据的特定视图控制器,就像我从通知中首次启动该应用程序一样。

trans by 2020-07-04T19:18:16Z

ios-缺少推送通知权利

提交二进制版本后,我收到了来自Apple的警告邮件。

    Missing Push Notification Entitlement - Your app appears to include API used to register with the Apple Push Notification service, but the app signature's entitlements do not include the "aps-environment" entitlement.
If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the "aps-environment" entitlement. 
See "Provisioning and Development" in the Local and Push Notification Programming Guide for more information. 
If your app does not use the Apple Push Notification service, no action is required. 
You may remove the API from future submissions to stop this warning. 
If you use a third-party framework, you may need to contact the developer for information on removing the API.

    After you’ve corrected the issues, you can use Xcode or Application Loader to upload a new binary to iTunes Connect.

我没有使用推送通知或任何类似Coredova的第三方框架,但是我不确定为什么会一次又一次收到此警告。 我已经浏览了以下链接,但是到处都是第三方框架问题。

我不想启用推送通知服务,因为我不会在我的应用程序中使用它。 任何帮助将不胜感激以解决此警告。 提前致谢。

注意:我已经尝试过几次删除并重新创建个人资料和证书。

缺少推送通知权利警告

缺少推送通知权利

iOS缺少推送通知权利

trans by 2020-07-04T01:25:38Z

iPhone-如何测试生产推送通知?

到目前为止,我一直使用开发推送证书,并且推送通知非常有效。

现在,我想将应用程序提交给Apple,因此我创建了生产证书,并将其设置在“代码签名身份”->“发布”下

我还将.p12文件放置在生产服务器中。
但是现在推不起作用。

从xcode运行时是否可以正常工作? 还是从App Store下载该应用程序时可以使用? 如果可以,我该如何测试?

trans by 2020-07-03T15:05:36Z

ios-如何在Swi中设置推送通知

我正在尝试为我的应用程序设置推送通知系统。 我有服务器和开发人员许可证来设置推送通知服务。

我目前正在Swift中运行我的应用。 我希望能够从服务器远程发送通知。 我怎样才能做到这一点?

trans by 2020-02-22T20:29:14Z

iPhone-从推送通知中获取错误

在我的应用中,我需要推送通知。 我正在执行推送通知文档中的所有说明。 但是我从推送通知中收到了一个错误:

Fail To Register For Remote Notifications With Error:
  Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment'
  entitlement string found for application" UserInfo=0x2340a0
  {NSLocalizedDescription=no valid 'aps-environment' entitlement string
  found for application}

我做错了什么?

trans by 2020-02-20T02:02:26Z

ios-Firebase:无法上载生产APN证书

我目前正在TestFlight中测试应用程序,并且需要生产APNs证书才能在Firebase中测试通知。

我已按照此视频中的所有步骤操作,并成功配置了开发APNs证书:[https://www.youtube.com/watch?v=LBw5tuTvKd4]

我还检查了我遵循Firebase支持指南的步骤。 尽管我注意到自编写本指南以来,Apple Developer网站已稍作更改:[https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications]

我已经使用与开发证书相同的方法在developer.apple.com上生成了生产APNs证书,但是当我尝试将.p12文件上传到Firebase时,出现以下错误:

“证书环境不匹配。请确保您获得正确的开发或生产APNS证书。”

我肯定要上载从生产APNS证书生成的.p12,对于生产证书我还需要做其他事情吗?

trans by 2020-02-15T15:08:28Z

ios-didReceiveRemoteNotification:fetchCompletionHandler:从图标vs推送通知打开

我正在尝试实现后台推送通知处理,但是在确定用户是否从发送的推送通知中打开应用程序而不是从图标中打开应用程序时遇到问题。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    //************************************************************
    // I only want this called if the user opened from swiping the push notification. 
    // Otherwise I just want to update the local model
    //************************************************************
    if(applicationState != UIApplicationStateActive) {
        MPOOpenViewController *openVc = [[MPOOpenViewController alloc] init];
        [self.navigationController pushViewController:openVc animated:NO];
    } else {
        ///Update local model
    }

    completionHandler(UIBackgroundFetchResultNewData);
}

使用此代码,无论用户如何打开应用程序,应用程序都可以打开MPOOpenViewController。 我该如何做,以便只有在用户通过滑动通知打开应用程序时才推动视图控制器?

使用相同的代码,它可以在iOS 6上运行,但是使用新的iOS 7方法,则无法达到我想要的方式。

编辑:我现在尝试在iOS 7上运行该应用程序,并且我们不支持iOS 7之前的任何版本。我在该方法的iOS 6版本中使用了相同的代码(没有完成处理程序),并且它的行为 我期望的那样。 您只要轻扫通知,就会收到通知。 如果从图标打开,则永远不会调用该方法。

trans by 2020-01-29T01:59:23Z

iPhone-为什么不使用开发配置而不是临时使用?

我的印象是,当您使用开发配置文件来构建应用程序时,只有指定的开发人员才能将该构建程序部署到手机上。

但是我只是使用Xcode Organizer将使用开发配置文件的构建部署到电话中,即使我不是该配置文件的有效开发人员之一。 我的一位甚至没有安装Xcode的同事都使用iTunes用手机进行了相同的操作。

在这种情况下,为什么不使用开发配置文件将您的应用分发到例如 您的质量检查团队,而不是临时分配?

编辑:在回答之前,请仔细阅读粗体部分。 我不是在问一个基本的“如何工作”的问题。 我已经进行了很多开发,临时和应用商店构建,现在我发现我似乎做出了一些错误的假设。

trans by 2020-01-28T12:18:26Z

ios-什么是静默推送通知? 设备什么时候收到?

我想清除通知栏中的本地通知。 为了这个实现后,我正在考虑使用无提示推送通知。 所以我要确认设备何时收到以及我可以使用该设备做什么?

trans by 2020-01-23T23:33:45Z

PHP-具有发送自定义D的Apple推送通知

我正在从php作业应用程序向iPhone发送推送通知。 我正在发送有关新工作的推送通知。 当用户单击推送通知视图时,是否有可能将用户重定向到设备中的特定作业。

我的意思是我想知道我可以发送带有push通知的任何自定义数据,如jobId等等。

谢谢。

trans by 2020-01-18T06:17:46Z

iPhone-在后台运行didReceiveRemoteNotification

这类问题已被问过很多次,但我有一些具体情况在进行。

当我的应用程序处于活动状态并且收到PUSH消息时,我就能够成功解析自定义有效负载等。

但是,当我的应用程序在后台且PUSH到达时,用户必须单击“查看/打开”按钮才能调用didReceiveRemoteNotification,然后再调用didFinishLaunchingWithOptions

我需要让我的应用程序决定在后台时是否必须使用UIAlert提示用户,或者是否基于某些本地设置禁止显示推送消息。

任何帮助,将不胜感激,

trans by 2020-01-15T06:24:35Z

ios-仅在设备正在充电和/或应用处于前台状态时才传递静默推送通知

我已经实现了无提示推送通知,但是我注意到了一些奇怪的行为。 静默推送通知通过以下方式处理:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

仅当设备正在充电(即,已连接电缆)和/或我的应用程序为前台时,才会收到静默推送消息。

如果我断开设备与充电器(或Mac)的连接,则除非应用程序处于前台状态,否则将不再收到静默推送通知。

在这两种情况下,我通常都会收到非静音的推送通知。

如果我再次插入USB电缆,那么我将获得预期的行为,并且无论应用程序是前台还是后台,都将收到无提示推送通知。

我正在使用UILocalNotification,所以我知道收到了什么。

在连接的设备上一切正常,这表明我的无声推送通知配置正确,并且该应用在plist等中设置了正确的背景模式。

在均运行IOS 8或8.1的iPhone 5s,6和iPad 2上,此行为是可重复的。

其他人有没有经历过? 它应该很容易复制。 为什么将设备插入充电器的简单行为会改变接收静默推送通知的能力?

trans by 2020-01-01T05:32:32Z

ios-找不到Apple Development Push Services的私钥

我已经咨询了许多消息来源,但仍然无法弄清楚。

[http://code.google.com/p/apns-php/wiki/CertificateCreation]

基本上,当我从iOS Provisioning Portal> App IDS(选择了“启用Apple Push Notification服务”)下载Development Push SSL证书后,双击证书(文件名aps_development.cer)将其打开,便会打开钥匙串。 然后,在左侧面板上选择“登录”和“证书”。 在右侧面板上,我看到“ Apple Development IOS Push Services:...”,到目前为止,我所查阅的所有说明都告诉我通过单击名称旁边的箭头以显示私钥来“扩展”此选项,但是 此证书没有扩展选项。 谁能帮我找到这个私钥? 我下载了错误的证书吗?

谢谢

trans by 2019-11-06T02:51:08Z

ssl-连接到gateway.sandbox.push.apple.com时出现“验证错误:num = 20”

我正在尝试运行在iOS 6教程:第1/2部分的Apple Push Notification Services中找到的Ray Wenderlich教程。

我在本地目录中创建了AppID和SSL证书以及密钥和PEM文件。 之后,我进入测试证书是否有效的步骤,并从此本地目录调用了以下命令:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 
-cert PushChatCert.pem -key PushChatKey.pem

这产生了很多输出。 在输出的中间是以下内容:

verify error:num=20:unable to get local issuer certificate
verify return:0

这是错误,还是测试错误? 如果是错误,将是什么原因或您将建议如何解决?


这是完整的输出(减去证书数据):

Enter pass phrase for PushChatKey.pem:    
CONNECTED(00000003)
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.push.apple.com
   i:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
 1 s:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
   i:/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048)
---
Server certificate
-----BEGIN CERTIFICATE-----

<Long string of data removed>

-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.push.apple.com
issuer=/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
---
No client certificate CA names sent
---
SSL handshake has read 2731 bytes and written 2215 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: <removed>
    Key-Arg   : None
    Start Time: 1398633302
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

该教程继续说:“如果连接成功,您应该可以输入几个字符。按Enter键时,服务器应该断开连接。” 我能够做到这一点,并且服务器已断开连接。

但是本教程继续说,您可能必须查看输出以发现错误。 因此,这个问题的原因。

trans by 2019-10-06T23:57:00Z

目标c-未调用didReceiveRemoteNotification,iOS 10

在iOS 9.3中,以下两种情况都会调用didReceiveRemoteNotification方法。

1)收到推送通知时2)当用户通过点击通知启动应用程序时。

但是在iOS 10上,我注意到当用户通过点击通知启动应用程序时,不会启动didReceiveRemoteNotification方法。 仅在收到通知时调用。 因此,从通知启动应用程序后,我无法采取任何进一步的措施。

该如何解决? 任何想法?

trans by 2019-10-03T17:03:30Z

ios-为什么推送通知在testflight上不起作用?

我已经将推送通知作为开发者帐户进行了测试,并且可以正常工作,但是当我尝试将其放在TestFlight上以供测试人员进行测试时,它没有显示推送通知,但是数据已正确接收,所以有一种 我需要为TestFlight生成的证书?

trans by 2019-10-01T20:29:02Z

1 2 下一页 共2页