小编Ner*_*ken的帖子

iOS 10上的AVFAudio播放崩溃

我有一个带有非常基本音频组件的应用程序:使用AVAudioPlayer播放的一组循环背景歌曲(歌曲文件名存储为数组).一切都运行良好数月,但iOS 10正在为我的大量用户(每天数千个)崩溃.

问题是,我无法弄清楚在iOS 10中发生了什么变化.每次用户锁定他们的设备时都会发生这种情况,特别是在音乐完成淡出的瞬间发生(它不会播放背景音频,所以离开该应用程序自动淡出音乐).

那一刻,我每次都得到这个:

2016-09-22 17:06:39.439979 TerraGenesis[8533:2459778] [aurioc] 889: failed: '!pla' (enable 2, outf< 2 ch,      0 Hz, Float32, non-inter> inf< 2 ch,      0 Hz, Float32, non-inter>)
2016-09-22 17:06:39.443348 TerraGenesis[8533:2459778] [aurioc] 889: failed: '!pla' (enable 2, outf< 2 ch,  44100 Hz, Float32, non-inter> inf< 2 ch,      0 Hz, Float32, non-inter>)
2016-09-22 17:06:39.445339 TerraGenesis[8533:2459778] [central] 54:   ERROR:    [0x1b50d6c40] >avae> AVAudioEngineGraph.mm:2515: PerformCommand: error 561015905
2016-09-22 17:06:39.446646 TerraGenesis[8533:2459778] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'error 561015905'
*** First throw …
Run Code Online (Sandbox Code Playgroud)

objective-c avfoundation avaudioplayer ios ios10

17
推荐指数
2
解决办法
2848
查看次数

在哪里可以了解有关WebCoreSharedBufferData的更多信息?

我有一个在iOS 6上完美运行的应用程序,但是在iOS 7上,如果用户采取了非常具体的操作(太复杂而无法进入,但它使用的UIWebView是一致的),应用程序崩溃了错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[WebCoreSharedBufferData getBytes:range:]: range {0, 8} exceeds data length 0'
Run Code Online (Sandbox Code Playgroud)

现在我非常乐意自己做一些研究和实验,但我找不到WebCoreSharedBufferData.谷歌搜索显示有几个人(比如这里,这里,这里这里)有类似的问题,但他们的问题要么没有得到回答,要么他们正在使用他们的应用程序(如缩放地图或使用第三方代码) )我不是在做.

Xcode文档从未听说过WebCoreSharedBufferData,对我的项目的搜索显示没有引用它.谷歌的搜索也让我没有开心,大多数只是问题和GitHub项目与我没有使用的第三方代码.我认为这是苹果公司UIWebView功能的深层原因,但由于无法了解更多信息,我很难继续进行.

所以我的问题是:有谁知道我在哪里可以找到信息/教程/描述等WebCoreSharedBufferData?我觉得如果我理解得更好,我就能找到解决方案,在黑暗中调试很难......

或者,有没有人只是直接知道WebCoreSharedBufferDataiOS 7中可能会产生这样的错误的变化?

编辑: kcbanner(他遇到过类似问题)提供的线索在下面的评论中:我们的两个问题都涉及有画布的页面和onclick带有这些画布的事件.也许iOS 7中的画布点击处理有些变化了吗?

xcode uiwebview ios

16
推荐指数
1
解决办法
1104
查看次数

通过上(电话)扬声器播放音频

我正试图在我的应用程序中通过iPhone上的上扬声器播放音频,这是您在通话期间按下的那个.我知道这是可能的,因为我已经从App Store玩了一个游戏(通过"点击水龙头"的"The Heist")来模拟电话,并且正是如此.

我已经在网上做了很多研究,但我很难找到一个甚至讨论过这种可能性的人.绝大多数帖子似乎都是关于免提扬声器和插入式耳机(就像这个这个这个),而不是上部"电话"扬声器和免提扬声器.(部分问题可能没有一个好名字:"手机扬声器"通常意味着设备底部的免提扬声器等,所以很难做一个非常有针对性的搜索).我已经看过Apple了Audio Session Category Route Overrides,但是那些似乎(纠正我,如果我错了)只处理底部的免提扬声器,而不是手机顶部的扬声器.

我找到了一个似乎与此有关的帖子:链接.它甚至提供了一堆代码,所以我认为我在家是免费的,但现在我似乎无法让代码工作.为简单起见,我只是将DisableSpeakerPhone方法(如果我理解正确应该将音频重新路由到上层扬声器)复制到我的方法中viewDidLoad,看看它是否可行,但第一个"断言"行失败,音频继续发挥出底线.(我也按照评论中的建议导入了AudioToolbox框架,因此这不是问题.)

这是我正在使用的主要代码块(这是我复制到我viewDidLoad的测试中),尽管在我链接到的文章中还有一些方法:

void DisableSpeakerPhone () {
    UInt32 dataSize = sizeof(CFStringRef);
    CFStringRef currentRoute = NULL;
    OSStatus result = noErr;

    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, &currentRoute);

    // Set the category to use the speakers and microphone.
    UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
    result = AudioSessionSetProperty (
                                      kAudioSessionProperty_AudioCategory,
                                      sizeof (sessionCategory),
                                      &sessionCategory
                                      );
    assert(result == kAudioSessionNoError);

    Float64 sampleRate = 44100.0;
    dataSize = sizeof(sampleRate);
    result = …
Run Code Online (Sandbox Code Playgroud)

avfoundation media-player audiotoolbox ios

9
推荐指数
2
解决办法
3万
查看次数

为参数'appIdName'提供了"无效值"?

我已经在这个应用程序上工作了几个星期,一切都很棒.我一直在建造和存档并拥有一个球.所有证书和配置文件以及ID(看似)都已按顺序运行并且运行良好.

然后几天前,似乎没有任何我能看出的变化,Xcode说我没有任何"配置文件具有有效的签名身份",当我告诉它"修复问题"时,我每次都会收到此错误:

An invalid value 'Xcode: Wildcard AppID' was provided for the parameter 'appIdName'.
Run Code Online (Sandbox Code Playgroud)

我发现了一些看起来很相似的问题,但我没有找到任何关于这个错误的具体内容.Google,SO,没什么.我在开发人员门户网站上有一个名为"Xcode:Wildcard AppID"的AppID,ID为*,我尝试制作另一个(如其他问题所示),但它没有帮助.

任何人都可以解释这个错误意味着什么,以及我如何解决它?对于奖励积分,是什么导致它,所以我可以在将来避免这种情况?

xcode ios

8
推荐指数
3
解决办法
1万
查看次数

iOS SceneKit中的纹理缝

我在SceneKit中应用于球体的纹理中出现了间歇性的接缝外观.它始终位于球体的"后面",纹理的两个边缘相遇.看起来纹理与自身并不完全连接,您可以通过细线看到背景.问题似乎存在于所有设备和所有最近的iOS版本中.我的实验表明,纹理的分辨率似乎是一个因素,但我还没有确切地确定了这种影响.

为了清晰起见,我附上了一个截图来说明白色背景,但是接缝本身并不是白色,它只是让背景显示出来:

行星缝

有谁知道为什么SceneKit会以这种方式渲染纹理?我有一个相当简单的实现,只是创建一个球体和一个材料,并应用漫反射和法线贴图.这是我的代码:

// create planet
SCNNode *baseNode = [SCNNode node];
[baseNode setName:name];

// Planet
SCNSphere *planet = [SCNSphere sphereWithRadius:5];
SCNNode *planetNode = [SCNNode nodeWithGeometry:planet];
[planetNode setName:@"planetNode"];
[baseNode addChildNode:planetNode];

SCNMaterial *material = [SCNMaterial material];
material.shininess = 1;
material.normal.intensity = 0.5;
material.normal.contents = normalMap;
material.diffuse.contents = diffuseMap;

planetNode.geometry.materials = @[material];
Run Code Online (Sandbox Code Playgroud)

有没有人有任何可能导致这种"缝"出现的经验,以及我如何摆脱它?我的纹理通常是1000x500或2048x1024,具体取决于具体情况,并且两种分辨率都出现了接缝.是否有一个理想的SceneKit纹理分辨率,或众所周知的可能导致此行为的东西?

textures texture-mapping ios scenekit

8
推荐指数
1
解决办法
360
查看次数

使用自定义布局缩放 UICollectionView,但以捏合为中心

我正在使用 制作一个大网格UICollectionView,我希望它可以UICollectionView使用标准的捏缩放手势进行缩放(整个,而不仅仅是单个单元格)。有问题的网格有一个 custom UICollectionViewLayout,因为我需要它来水平和垂直滚动。

我的布局与这个 SO answer完美配合,所以我有一个可以四处移动的网格。简短的版本是每行单元格是section视图的一个,并且所有单元格都基于cellSize(开始时)50的统一定位。

然后我使用这个 SO answer的修改版本计算了捏缩放能力,我基本上在cellSize收到捏手势时更改布局的值,然后使布局无效,以便它重新绘制略大或小布局。因此,所有的单元格都会变大或变小,我们就可以缩放了。

这是捏合手势方法的代码:

-(void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture {
    double newCellSize = [(IMMapViewLayout *)_mainCollectionView.collectionViewLayout cellSize] * gesture.scale;
    newCellSize = MIN(newCellSize, 100);
    newCellSize = MAX(newCellSize, 15);

    [(IMMapViewLayout *)_mainCollectionView.collectionViewLayout setCellSize:newCellSize];
    [_mainCollectionView.collectionViewLayout invalidateLayout];
}
Run Code Online (Sandbox Code Playgroud)

一切都(几乎)完美地工作。

我的问题是:它从左上角放大,而不是从夹点所在的位置放大。我想是有道理的,因为我们正在重新绘制所有内容,而且都变大了一点,但这显然不是预期的效果。

我的第一个想法是简单地检测正下方的单元格,然后使用它scrollToItemAtIndexPath:atScrollPosition:animated:立即移回该单元格,但它似乎不起作用,而且动画无论如何都会变得非常断断续续。此外,如果您捏住屏幕中央以外的任何地方,则在缩放过程中很难将其直接移回该确切位置。

这是我现在所拥有的:

-(void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture {
    double newCellSize = [(IMMapViewLayout *)_mainCollectionView.collectionViewLayout cellSize] * gesture.scale;
    newCellSize = MIN(newCellSize, 100);
    newCellSize = MAX(newCellSize, 15);

    [(IMMapViewLayout *)_mainCollectionView.collectionViewLayout setCellSize:newCellSize];
    [_mainCollectionView.collectionViewLayout invalidateLayout]; …
Run Code Online (Sandbox Code Playgroud)

uigesturerecognizer ios pinchzoom uipinchgesturerecognizer uicollectionview

6
推荐指数
0
解决办法
1223
查看次数

UITableView 在一个地方的 reloadData 上关闭键盘,但在另一个地方却没有?

我正在筛选刚刚开始的新工作中预先存在的代码,我遇到的第一个错误是附加到子UITableView类的搜索栏,它在每次击键后都会关闭键盘。经过一番搜索后,我发现了这个问题,似乎我找到了答案:该应用程序用于reloadData在每次击键后刷新结果,并且重新加载正在调用resignFirstResponder and dismissing the keyboard. Frustrating, but explained and understood.

但后来我的老板指出,我们在应用程序的其他地方使用了几乎完全相同的代码,而且它运行得很好。怎么可能呢?我发现自己处于一个不寻常的位置,需要解释为什么某些东西确实有效,因为上面的链接表明在期间关闭键盘reloadData是“正常”行为。

下面是两个 ViewController 中的相关方法,每个 ViewController 都是同一自定义 的子类UITableView。(方法已被简化,但不同的行为仍然存在。)我的一部分认为它一定是埋藏在两个子类之间的差异中的东西,但是如果是reloadData问题所在并且它没有在任何地方被重写,则不会这意味着子类不相关?

查找视图:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [self.tableView reloadData];
    NSLog(@"Lookup Reloaded");
}
Run Code Online (Sandbox Code Playgroud)

搜索视图:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [self.tableView reloadData];
    NSLog(@"Search Reloaded");
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它们是相同的。每次击键后都会成功调用两者,但前者会关闭键盘,而后者则不会。

这些视图控制器中的每一个都超过一千行长,因此我很难缩小可能导致不同行为的原因。了解 FirstResponders 和 TableView 重新加载的人可以帮助我了解在哪里查看吗?这似乎是一个相当简单的过程(按下一个键>调用该方法>它重新加载表格>在此过程中关闭键盘)没有太多空间来改变该行为,但显然有一种方法可以防止最后一步,因为搜索视图已经在这样做了。

知道我应该将搜索重点放在哪里以找出原因吗?

uitableview ios

6
推荐指数
1
解决办法
4415
查看次数

UIImage"imageNamed:"适用于iOS 8,但不适用于7?

SO上已经有几个答案关于"imageNamed:"不起作用,但没有一个包含我特别的皱纹:

我是nil从iOS 7上的"imageNamed:" 获得的,但同样的版本适用于iOS 8.

显然,所有内容都可以正常连接,因为它可以在iOS 8上运行,但它可以在iOS 7上持续返回nil大范围(可能是24打)的图像.值得注意的是,我将资产移动到AssetCatalog开始的时间.iOS 7上的资产目录是否有一些不寻常的行为需要考虑?

以下是一些细节,基于本网站上类似问题的答案:

  • 此问题出现在为用户以及模拟器存档和导出的实际构建中.两个版本都显示iOS 7/8分裂行为.
  • 图像是PNG,资产目录包含1x,2x和3x版本.
  • 我已经确认拼写和大小写匹配(在iOS 8上进一步确认).

到目前为止,大多数的SO的答案是,将阻止其工作的错误可言.任何人都可以帮助进行仅适用于iOS 8的图像调用吗?

uiimage imagenamed ios ios7 ios8

5
推荐指数
1
解决办法
1310
查看次数

使用高分辨率纹理优化SceneKit性能

我是一个相当有经验的iOS开发人员,但是一个完整的SceneKit新手,试图在一个基本的应用程序中模拟一些行星.

为此,我正在使用适用于基本球体的高分辨率火星,金星等的普通和漫反射贴图.他们工作!它们看起来很棒,正是我想要的.

在此输入图像描述 在此输入图像描述

问题是,我被质量/内存权衡所打死.

我可以缩小纹理的尺寸以减少内存占用,但是在某个分辨率以下,结果(特别是法线贴图)开始变得非常糊涂和可怕.应用程序需要能够至少缩放到行星的屏幕宽度,但为了保持山脉和山谷的任何清脆度,我需要使用大约6000 x 3000的PNG法线贴图(上图).我可以缩放漫反射地图的方式下降到大约1000 x 500,但即使这样,也会从单个球体轻轻旋转中获得周期性的记忆崩溃,只有一个光,没有背景,没有物理,没有其他几何.

现在,我知道这是一张超高分辨率的普通地图.我知道了.但与此同时,它只是一个领域,什么都不做.这甚至没有接近我见过的其他应用程序执行完美的复杂性,即使有一些非常详细的纹理.似乎必须有一些方法可以为单个对象获取高细节表面纹理,而不会使应用程序崩溃.

所以,作为一个完整的SceneKit新手,我想知道:有没有任何技巧可以获得良好的SceneKit纹理质量而不使用世界上所有的内存? 也许一种处理图像纹理,重新编码文件,更改场景/节点设置等的方法?任何方式都可以通过较小的图像获得清晰的质量,或者使用相同的图像降低内存使用率?

我很乐意引用一些代码,但现在没有太多要显示的.我以标准方式将纹理应用于SceneKit节点,并且它可以工作.我只是因缺乏记忆或缺乏图像质量而死亡.

谁能帮我吗?

memory out-of-memory uiimage ios scenekit

5
推荐指数
1
解决办法
1340
查看次数

出于 ScreenTime 的目的,我如何将我的 iOS 应用与特定网站 URL 相关联?

我注意到,在 iOS 和 macOS 上使用 ScreenTime 时,系统知道某些应用程序已连接到某些网站。例如,限制 Reddit 应用程序也会阻止我访问 Reddit.com。在停机期间将 Facebook 应用程序设置为始终允许也可以让我访问 Facebook.com。

我想以相同的方式将我的应用程序与我的网站相关联,但我不知道操作系统如何建立这些连接。我知道 ScreenTime 框架基本上不存在,所以这似乎不是答案,但不仅仅是 Apple 应用程序这样做,所以它似乎是开发人员可以访问的东西。

如何以这种方式将我的应用与特定网站 URL 相关联?

macos ios

5
推荐指数
1
解决办法
101
查看次数