我正在使用RMSPushNotificationsBundle来处理推送通知.我正在从一台服务器向多个应用程序发送pushNotifications.我正在使用选择正确证书的setAPNSPemAsString方法.但推送通知仅在第一次发送.谁能告诉我为什么?谢谢!
public function sendIOS($appName){
$notifications = $this->container->get('rms_push_notifications');
$message = new iOSMessage();
$message->setMessage($this->message);
$message->setData($this->getData());
$message->setAPSSound("default");
$message->setDeviceIdentifier($this->pushToken);
if ($appName !="appName") {
$pemFile = $this->container->getParameter("rms_push_notifications.ios.".$appName.".pem");
$passphrase = $this->container->getParameter("rms_push_notifications.ios.".$appName.".passphrase");
$pemContent = file_get_contents($pemFile);
$notifications->setAPNSPemAsString($pemContent, $passphrase);
}
return $notifications->send($message);
}
Run Code Online (Sandbox Code Playgroud) 我正在调查一个崩溃的错误,UICollectionView
通过一个通常采用这种形式的通过Crashlytics:
致命异常:NSInternalInconsistencyException无效更新:第0部分中的项目无效.更新后现有部分中包含的项目数(25)必须等于更新前该部分中包含的项目数(27),再加上或减去从该部分插入或删除的项目数量(插入1个,删除1个)以及加入或减去移入或移出该部分的项目数量(0移入,0移出).
我相信这是因为我有一个collectionView,它定期刷新来自服务器的数据,并且来自服务器的数据可能包含比客户端中包含的更多或更少的项目UICollectionViewDataSource
.
当我从服务器获取新数据时,我会调用reloadData
我的集合视图.
但是,有可能由于用户在网络下载完成之前与我的集合视图进行交互,我之前就打过电话reloadItemsAtIndexPaths
.reloadItemsAtIndexPaths
似乎没有完成至少几百毫秒和许多处理器周期.因此,当数据源在中间更新时崩溃reloadItemsAtIndexPaths
.
有"直接"形式reloadItemsAtIndexPaths
吗?或者我必须始终根据reloadData
我的用例进行调用,这似乎会立即更新所有内容并UICollectionView
在最后保持良好状态.
编辑
根据TwoStraws的建议,这就是我所做的:
// Prevent data source from batch updating while we work
self.dataSource.locked = YES;
[self.collectionView performBatchUpdates:^{
[self.collectionView reloadItemsAtIndexPaths:@[indexPath]];
} completion:^(BOOL finished) {
self.dataSource.locked = NO;
}];
Run Code Online (Sandbox Code Playgroud)
然后在我的数据源类中,收到服务器的结果后,我总是打电话assignResults
:
- (void)assignResults:(NSMutableArray *)newResults {
if (!self.locked) {
self.results = newResults;
[self.delegate handleDataSourceUpdated:self];
} else {
self.pendingResults = newResults;
}
}
- (void)setLocked:(BOOL)locked {
_locked = locked; …
Run Code Online (Sandbox Code Playgroud) 我的应用程序使用Geojson
文件.我使用MapBox SDK添加MGLPolyline
到地图.但问题是我的文件太大,以至于应用程序崩溃并收到错误:Message from debugger: Terminated due to memory issue
.我在第一次循环时面对66234个对象.我试图将数组块化为新数组,但没有成功.请帮我解决问题.这是我在地图上绘制的代码,这里是我在github上的测试项目使用Xcode 8.1 如果有任何不同的第三方可以解决我的问题,也欢迎:
func drawPolyline() {
// Parsing GeoJSON can be CPU intensive, do it on a background thread
DispatchQueue.global(qos: .background).async {
// Get the path for example.geojson in the app's bundle
let jsonPath = Bundle.main.path(forResource: "KMLMAPNew", ofType: "json")
let jsonData = NSData(contentsOfFile: jsonPath!)
do {
// Load and serialize the GeoJSON into a dictionary filled with properly-typed objects
guard …
Run Code Online (Sandbox Code Playgroud) 我很好奇,有没有办法将UIKeyboardTypeNamePhonePad文本字段键盘布局切换到PhonePad?默认情况下你会得到名称垫,然后当你点击它切换到电话垫的数字时,有没有办法将这种键盘默认为Phone Pad并能切换到名牌?
谢谢,
迈克尔
我有一个UITabBarController,我使用此代码来设置选择指标图像:
let selectedBG = UIImage(named:"tabbarbgtest.png")?.resizableImageWithCapInsets(UIEdgeInsetsMake(0, 0, 0, 0))
UITabBar.appearance().selectionIndicatorImage = selectedBG
Run Code Online (Sandbox Code Playgroud)
但是图像并没有填满整个空间 - 见下图:
图像只是一个红色正方形,在82x49px上有一个解决方案,但是如果图像更宽,它仍然无法填满整个空间.希望你们能帮忙 - 谢谢.
如果searchView只包含数字,我该如何检查?
我找到了这个:
if newText.isMatchedByRegex("^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$") { ... }
Run Code Online (Sandbox Code Playgroud)
但它检查文本是否包含任何数字.如果所有文本只包含Swift中的数字,我该怎么办?
我得到致命的错误:"无法在" if (NSKeyedUnarchiver.unarchiveObject(with: loadedData as! Data) as? CKRecord) != nil
" 行上将'NSTaggedPointerString'类型的值转换为'NSData' ".
还有另一个致命错误:"当我尝试将locationRecord保存为默认值时,尝试将非属性列表对象设置为键locationData的NSUserDefaults/CFPreferences值".
var locationRecord = CKRecord(recordType: "location")
func getRecordToUpdate(_ locations:CLLocation)
{
if defaults1.object(forKey: "locationData") == nil{
locationRecord.setObject(locations, forKey: "location")
defaults1.set(locationRecord, forKey: "locationData")
self.updateLocationRecord(locations: locations)
}else{
if let loadedData = defaults1.object(forKey: "locationData") {
print("continue")
if (NSKeyedUnarchiver.unarchiveObject(with: loadedData as! Data)) != nil
{
let publicDB = CKContainer.default().publicCloudDatabase
publicDB.fetch(withRecordID: locationRecord.recordID,completionHandler: {
(record, error) in
if error == nil
{
publicDB.delete(withRecordID: (record?.recordID)!, completionHandler: {
(record, error) in
if(error == nil){
print("old record …
Run Code Online (Sandbox Code Playgroud) 现在,我有一个工作区,里面有两个项目,一个叫"ProjectOne",另一个是"ProjectTwo",如下所示:
他们分别有一个故事板,现在我想通过按下"To Project Two"连接两个故事板,如下所示:
但当我点击按钮时,它会显示出来
"因未捕获的异常而终止应用程序'NSInvalidArgumentException',>原因:'无法在捆绑包中找到名为'two'的故事板NSBundle 8C6A5FDC9E06/ProjectOne.app>(已加载)'"
有可能吗?我寻求这种方法几天但也不知道......
我有时在我的应用程序中遇到以下崩溃:
Crashed Thread: 4 Dispatch queue: NSOperationQueue 0x7fc2d96277c0 :: NSOperation 0x7fc2d9704440 (QOS: UTILITY)
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000007fc2d968980
Exception Note: EXC_CORPSE_NOTIFY
Thread 4 Crashed:: Dispatch queue: NSOperationQueue 0x7fc2d96277c0 :: NSOperation 0x7fc2d9704440 (QOS: UTILITY)
0 libobjc.A.dylib 0x00007fff86bd720f objc_release + 31
1 libobjc.A.dylib 0x00007fff86bdeb81 object_cxxDestructFromClass(objc_object*, objc_class*) + 127
2 libobjc.A.dylib 0x00007fff86bd7383 objc_destructInstance + 116
3 libobjc.A.dylib 0x00007fff86bd72e5 object_dispose + 22
4 libobjc.A.dylib 0x00007fff86bdd224 objc_object::sidetable_release(bool) + 242
5 com.apple.CoreFoundation 0x00007fff9198d2dd -[__NSArrayM dealloc] + 205
6 libobjc.A.dylib 0x00007fff86bdd224 objc_object::sidetable_release(bool) + …
Run Code Online (Sandbox Code Playgroud) 使用 Xcode 7.2 (7C68)、OS X 10.11.2 (15C50)
tl;dr对于同一 Xcode 工作区中的多个项目,为什么我的构建配置的用户定义构建设置似乎不起作用?我在方案中正确设置了它们,但是当在模拟器上运行时,这些值是正确的;在设备上运行时,值是错误的。
你好。我正在尝试利用 Xcode 构建配置(.xcconfig 文件)来根据环境自定义应用程序的行为。这样我们就可以根据方案的构建配置自动在集成 URL 和生产 URL 之间切换。然而,我在让它正常工作时遇到了一些困难;我认为我的工作空间布局可能是罪魁祸首。这是布局/结构:
现在,我为每个项目都有以下 .xcconfig 文件:
Debug.xcconfig
Testing.xcconfig
Release.xcconfig
此外,还有以下方案(一对一映射到每个项目各自的配置):
对于框架,这些文件包含我们想要根据调试、测试或发布进行自定义的信息(例如 URL、API 令牌/密钥等)。现在,应用程序和框架都有自己的这些文件的副本。这是因为 Xcode 在处理依赖项或多个项目时,会在这种情况下隐式尝试使用同名的配置。我想部分问题是我不知道如何明确告诉 Xcode 对未设置配置的依赖项使用 X 配置。
换句话说,我如何告诉应用程序使用 X 配置和框架使用 Y 配置?
现在,当我在模拟器中运行该应用程序时,我知道该方案正在使用正确的 info.plist 值,因为 URL 和日志设置显示正确。但是,当我在device上存档或运行时,使用了错误的构建配置。我不知道为什么会发生这种情况。
屏幕截图和代码说明了它现在是如何工作的:
图3(部分方法的部分主体):
if let infoDict = NSBundle(identifier: Constants.uniformTypeIdentifier)?.infoDictionary,
let apiKey = …
Run Code Online (Sandbox Code Playgroud) ios ×7
swift ×4
objective-c ×2
xcode ×2
cloudkit ×1
function ×1
mapbox ×1
mapbox-gl ×1
nsoperation ×1
php ×1
regex ×1
symfony ×1
uiimage ×1
uikeyboard ×1
uistoryboard ×1
xcconfig ×1