这是一些背景信息,否则以粗体向前跳到问题.我正在构建一个应用程序,我希望它可以访问远程控制/锁屏事件.棘手的部分是这个应用程序本身不播放音频,它控制附近另一台设备的音频.当应用程序位于前台时,设备之间的通信不是问题.正如我刚刚发现的那样,一个应用程序不会控制遥控器,直到它播放音频与播放音频会话,并且是最后一次这样做.这提出了一个问题,因为正如我所说,该应用程序控制另一个设备的音频,而不需要自己播放.
我的第一个倾向是让应用程序每次打开时播放一个静音剪辑,以便控制遥控器.事实上,我必须这样做,这让我想知道我是否会被苹果公司允许这样做,或者是否有另一种方法可以实现这一点,而不会用假音频片段欺骗系统.
问题:Apple会批准播放静音音频片段的应用程序,以便控制远程/锁定屏幕控制以控制其他设备的音频吗?有没有办法在没有音频会话的情况下控制遥控器?
PS我更喜欢在iOS 4.0及更高版本上使用此功能.
PPS我已经看到了这个类似的问题,它让我头脑风暴,但提供的答案并不是我需要知道的具体问题.
我在网络上有一个设备通过UDP组播一个非常小的文件.我正在开发的iOS应用程序负责读取这些数据包,我选择使用GCDAsyncUdpSocket来执行此操作.该文件每半秒发送一次,但我几乎没有经常收到它(大约每3-10秒接收一次).
认为这可能是设备的问题,我开始使用Wireshark监控流量.这似乎反映了我在我的应用程序中看到的内容,直到我在Wireshark中启用"监控模式",此时每个UDP数据包都被捕获.此外,iOS模拟器开始接收所有丢失的数据包,因为它与我正在开发的Mac共享NIC.
有没有办法在iOS设备上启用"监控模式"或者我缺少哪些可以让丢失的数据包进入?我还看到GCDAsyncUdpSocket中有一个readStream方法.也许我需要使用它而不是beginReceiving?虽然如果是这样的话,我不知道如何在Objective-C中设置流.
这是我现在的测试代码:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"View Loaded");
[self setupSocket];
}
- (void)setupSocket
{
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
if (![udpSocket bindToPort:5555 error:&error])
{
NSLog(@"Error binding to port: %@", error);
return;
}
if(![udpSocket joinMulticastGroup:@"226.1.1.1" error:&error]){
NSLog(@"Error connecting to multicast group: %@", error);
return;
}
if (![udpSocket beginReceiving:&error])
{
NSLog(@"Error receiving: %@", error);
return;
}
NSLog(@"Socket Ready");
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个具有一些非常基本的FTP功能的iOS 5应用程序,需要一些指导.它将连接到本地网络上的设备,并使用.dat/txt文件执行读/写操作.我已经做了一些搜索过去的几天,并看到了各种建议,但没有什么简单,我可以拿起并快速修改我个人使用.
我的问题是这些:
最后,我应该提一下,我已经花了相当多的时间来分析来自Apple的SimpleFTPSample,但是示例代码为每个示例提供了"连接失败"和"流开放错误"通知,因此我对它有点警惕实用性.
请原谅我,如果这已在其他地方得到解答.所有相关的帖子都有我需要的答案,但不是全部.先感谢您!
为清晰起见编辑:一个明确定义的示例或分步教程是我真正想要的.我自己的谷歌搜索没有发现,我迫切需要一些指导.
更新: 很久以前我发布了这个问题,但继续使用接受的答案中提到的FTPHelper.我最近刷掉了旧项目的灰尘,并意识到FTPHelper的获取功能中存在轻微的内存泄漏,如果反复调用,它可以成为app-killer.如果anybdy偶然发现这个问题并选择使用FTPHelper,请务必添加下面代码中的CFRelease行.
- (void) fetch: (NSString *) anItem
{
if (!self.uname || !self.pword) COMPLAIN_AND_BAIL(@"Please set user name and password first");
if (!self.urlString) COMPLAIN_AND_BAIL(@"Please set URL string first");
NSString *ftpRequest = [NSString stringWithFormat:@"%@/%@", self.urlString, [anItem stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
/* CFShow(ftpRequest); */
NSString *writepath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
self.filePath = [writepath stringByAppendingPathComponent:anItem];
CFURLRef writeURL = CFURLCreateFromFileSystemRepresentation (NULL, (const UInt8 *) [writepath UTF8String], [writepath length], NO);
MySimpleDownload((CFStringRef)ftpRequest, writeURL, (CFStringRef) self.uname, (CFStringRef)self.pword);
CFRelease(writeURL);//ADD THIS LINE TO FIX MEMORY LEAK …Run Code Online (Sandbox Code Playgroud) 注意:这与此问题类似,但不一样.我承诺.
我有一系列的表视图,它们调用一个模态视图来排序表的内容.为此,我在一个表视图控制器的头文件中设置了一个简单的协议,它工作得很好.然后我将此协议复制到我的其他表视图控制器并得到此警告:
忽略'ModalViewDelegate'的重复协议定义
现在我意识到这只是一个警告,但我不想每次编译都看不到它.为了摆脱警告,我导入了最初定义协议的头文件.再一次,我并不完全满意.将头文件导入每个表视图似乎很草率,所以我可以在没有警告的情况下使用协议.
如果你已经读过这篇文章,我感谢你.我的问题是'为什么会这样?有没有更好的方法在仍然使用相同的协议时摆脱这个警告?
我有一个iOS 4.0-5.1的应用程序,它使用HTTP Live Streaming播放视频.我有一个简单的设置,在视图中有一个按钮,当它被点击时开始播放流.这在iOS 5中运行良好,但在iOS 4开始播放流之前需要点击两次按钮.有人知道为什么会发生这种情况以及如何在第一次按下按钮时播放视频吗?
这是我正在做的事情:
.H
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController : UIViewController{
MPMoviePlayerController *moviePlayer;
}
@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;
-(IBAction)playApple:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
.M
-(IBAction)playApple:(id)sender{
if(self.moviePlayer){
self.moviePlayer = nil;
}
//Use Apple's sample stream
NSURL *mediaURL = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaURL];
//Begin observing the moviePlayer's load state.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerLoadStateChanged:)
name:MPMoviePlayerLoadStateDidChangeNotification
object:self.moviePlayer];
[self.moviePlayer setMovieSourceType:MPMovieSourceTypeStreaming];
[self.moviePlayer setShouldAutoplay:NO];//Stop it from autoplaying
[self.moviePlayer prepareToPlay];//Start preparing the video
}
#pragma mark Notification Center
- (void)moviePlayerLoadStateChanged:(NSNotification *)notification{
NSLog(@"State …Run Code Online (Sandbox Code Playgroud) 我正在优化iPad的应用程序,并希望使用带图像的UIBarButtonItem来呈现弹出框.如果我使用带有标题的按钮但我更喜欢使用我自己的图像或者使用UIBarButtonSystemItem提供的图像,那么我目前使用的代码效果很好.如果我根本没有设置按钮的标题,它就不会显示出来.如果我设置标题和图像,我会在真实硬件上获得标题,但图像显示在模拟器上.使用UIBarButtonSystemItem,我得到了我想要的按钮,但它也以横向模式显示(它不应该这样做,因为我使用横向视图的拆分视图).
使用setImage,setTitle的任意组合或将按钮初始化为系统预设都无效.当检测到旋转到横向但它仍然在屏幕上时,我也尝试将系统预设的按钮设置为nil.我不确定如何从这里开始,但我真的想避免在这个按钮上使用字符串,而且我很想知道为什么会这样.
这是代码:
#pragma mark Split view handling
-(void)splitViewController:(UISplitViewController *)svc
willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)pc
{
//If this bar button item doesn't have a title, it won't appear at all.
[barButtonItem setTitle:@"-"];
//barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemOrganize target:[barButtonItem target] action:[barButtonItem action]];
[barButtonItem setImage:[UIImage imageNamed:@"listing.png"]];
//Take this bar button item and put it on the left side of our nav item
[[self navigationItem] setLeftBarButtonItem:barButtonItem];
self.popoverController = pc;
}
-(void)splitViewController:(UISplitViewController *)svc
willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
//Remove the bar button item …Run Code Online (Sandbox Code Playgroud)