我在WatchKit中有一个按钮,可以像这样向主iPhone应用程序发送通知。
-(IBAction) startSound
{
//turn sound on
NSString *requestString = [NSString stringWithFormat:@"startSound"]; // This string is arbitrary, just must match here and at the iPhone side of the implementation.
NSDictionary *applicationData = [[NSDictionary alloc] initWithObjects:@[requestString] forKeys:@[@"startSound"]];
[WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) {
//NSLog(@"\nReply info: %@\nError: %@",replyInfo, error);
}];
}
在我的iPhone app委托中,我添加了以下代码。
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
{
NSLog(@"handleWatchKitExtensionRequest ...");
NSMutableDictionary *mutDic = [[NSMutableDictionary alloc] init];
//This block just asks the code put after it to be run in background for 10 mins max
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
bgTask = UIBackgroundTaskInvalid;
}];
NSString *request = [userInfo objectForKey:@"startSound"];
if ([request isEqualToString:@"startSound"])
{
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource: @"warning" ofType: @"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
myAudioPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
myAudioPlayer1.numberOfLoops = -1; //inifinite
[myAudioPlayer1 play];
}
reply(nil); //must reply with something no matter what
//once code is all done and the reply has been sent only then end the bg-handler
[application endBackgroundTask:bgTask];
}
然而,当我的应用程序进行苹果审查时,它被拒绝的原因是我的应用程序必须在前台运行才能使声音功能正常工作。我错过了什么?
10.6 - Apple和我们的客户非常重视简单,精致,富有创意,深思熟虑的界面。他们需要做更多的工作但是 值得。苹果设置了很高的标准。如果您的用户界面很复杂或 不太好,可能会被拒绝
10.6详细信息
我们仍然发现您的Apple Watch应用需要包含应用 在iPhone上运行前景以播放警笛 声音,提供糟糕的用户体验。
后续步骤
请参阅UIApplicationDelegate协议参考以实现 这种方法并用它来响应Apple Watch的请求 应用程序。
因为在您的应用处于此状态时,可能会调用此方法 后台,调用beginBackgroundTaskWithName:expirationHandler: 实现开始时的方法和endBackgroundTask: 处理完回复并执行回复后的方法 块。启动后台任务可确保您的应用不会 在有机会发送回复之前暂停。
答案 0 :(得分:0)
音频片段有多长?在您共享的代码中,看起来几乎会立即调用reply(),这不会给剪辑提供播放的机会。您应该延迟调用reply()直到音频剪辑完成。
答案 1 :(得分:0)
我在WatchKit应用程序中做了类似的事情。当用户点击按钮时,我从我的iPhone应用程序播放音频,而我的iPhone应用程序不需要前台让它工作。为了让它发挥作用,我必须做两件事。第一个是使用beginBackgroundTaskWithName
设置后台任务,我可以看到你正在做的事情。第二个是在我的后台模式中启用背景音频功能。
我不记得做除了那两个以外的任何事情才能让它发挥作用。在添加支持之前,我已经在我的应用中使用了背景音频,因此可以使用MPNowPlayingInfoCenter
进行控制。